vim - 使用Vim命令将文本插入多行

标签 vim mapping

我知道在视觉 block 模式下,通过 <S-i> ( I ) 可以插入多个选定的行,但是我想通过一个函数来实现相同的效果,假设我有一个可以区分三种子视觉模式的函数( visual-character , visual-line , visual-block ) 如下,

function! VisualMappingSpace()
    let m = visualmode()
    if m ==# 'v'
        echo 'character-wise visual'
    elseif m == 'V'
        echo 'line-wise visual'
    elseif m == "\<C-V>"
        echo 'block-wise visual'
    endif
endfunction

我已经尝试了以下方法,但没有成功。当我在 <space> 模式下点击 visual-block 时,我想将一些东西插入到我选择的行中。

function! VisualMappingSpace()
    let m = visualmode()
    if m ==# 'v'
        exec "normal y"
    elseif m == 'V'
        exec "normal y"
    elseif m == "\<C-V>"
        let g:block_insert_content = input("")
        exec "normal I ".g:block_insert_content
    endif
endfunction   
vnoremap <silent> <Space> :call VisualMappingSpace()<CR>

最佳答案

通过:进入命令行模式的视觉模式映射将自动插入视觉范围 ( '<,'> )。与:call ,这意味着每个选定的行都会调用您的函数一次。通过重复的查询您应该已经注意到了。

要避免这种情况,请插入 <C-u>进入你的映射;它清除了范围。

第二个问题:当您插入查询的文本时,您需要重新创建选择(您的映射左视觉模式为命令行模式,还记得吗?)通过 gv ;那么,I会起作用:

function! VisualMappingSpace()
    let m = visualmode()
    if m ==# 'v'
        exec "normal y"
    elseif m == 'V'
        exec "normal y"
    elseif m == "\<C-V>"
        let g:block_insert_content = input("")
        exec "normal gvI ".g:block_insert_content
    endif
endfunction   
vnoremap <silent> <Space> :<C-u>call VisualMappingSpace()<CR>

另请注意,您查询的文本之前有一个额外的空格字符;我不确定你想要那个:gvI ".

关于vim - 使用Vim命令将文本插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40212328/

相关文章:

vim - 使Syntastic仅关闭错误窗口

javascript - 遍历对象数组并输出自定义对象

c# - NHibernate:在不使用第二个类的情况下映射一对多关系以填充集合

macos - 如何将所选内容复制到 OS X 剪贴板

c++ - C++/VIM 与其他 IDE 相比奇怪的 EOF 行为

vim - 在后台加载一个新的 vim 缓冲区

mysql - 与加入映射时的用例

python - 实现嵌套字典的最佳方法是什么?

mapping - 使用 Entity Framework 4.1 Codefirst,如何在 poco 类中创建未映射的字段?

vim - 使用 vim 编辑 id3 标签