[英]Using Vim command to insert text to multiple lines
我知道在可视块模式下,通过<Si>
( 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
我尝试了以下方法,但是不起作用。 我想在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.