我知道在视觉 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/