繁体   English   中英

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

[英]Using Vim command to insert text to multiple lines

我知道在可视块模式下,通过<Si>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

我尝试了以下方法,但是不起作用。 我想在visual-block模式下按<space>在选择的行中插入东西。

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 ,这意味着您的函数每选定一行调用一次 您应该已经通过重复查询注意到了。

为避免这种情况,请在映射中插入<Cu> 它清除了范围。

第二个问题:当插入查询的文本时, 您需要通过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 ".

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM