我知道在视觉阻止模式下,<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
时将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>
答案 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 ".