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

时间:2016-10-24 06:55:30

标签: vim mapping

我知道在视觉阻止模式下,<S-i>I)可以插入多个选定的行,但我希望通过函数实现相同的效果,让我们说我有一个函数可以告诉三个子视觉模式(visual-charactervisual-linevisual-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时将soemthing插入到我选择的行中。

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>

1 个答案:

答案 0 :(得分:2)

通过:进入命令行模式的可视模式映射将自动插入可视范围('<,'>)。使用: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 ".