如何在vimscript中检查当前正在使用的可视模式(可视或可视块)?
我已经阅读了mode()
的相关文档,但是我无法让它起作用。
echo mode()
对我来说不起作用。
if mode() == "v"
对我也不起作用。
如何在vimscript中检查当前正在使用的可视模式(可视或可视块)?
我已经阅读了mode()
的相关文档,但是我无法让它起作用。
echo mode()
对我来说不起作用。
if mode() == "v"
对我也不起作用。
请查看mode()
的帮助文档。相关部分如下:
v Visual by character V Visual by line CTRL-V Visual blockwise
要检查块选择模式,你需要检查mode() == "\<C-V>"
(字面意义为^V
字符),而不是检查mode() == "v"
。
au CursorMoved * echo mode()
将在移动光标时显示模式。(还要注意我已经修复了代码;你需要的是 CTRL-V 字符,而不是字符串 CTRL-V。你可以使用 "\<C-V>"
来实现字面字符。) - Chris Morganfunction!s:MyScript | if mode == "\<C-V>" | do this | else | do that | endfunction
- Reman@Remonn在评论中已经说过了,但对我来说不太清楚。这是我如何看到结果的方法:
function! F()
normal! gv
throw mode()
endfunction
vnoremap <F9> <ESC>:call F()<CR>
进入不同的视觉模式,然后按下F9
查看。
我需要一个抛出,因为-- VISUAL --
行会覆盖任何回显消息。有人可以在VISUAL模式下进行回显吗?
总的来说,我认为当你需要mode()
时,最好的做法是制作两个不同的映射,然后要么制作两个完全不同的函数:
function! Fnorm()
endfunction
function! Fvis()
endfunction
nnoremap <F9> :call Fnorm()<CR>
nnoremap <F9> <ESC>:call Fvis()<CR>gv
或者只使用一个函数,根据映射给它不同的参数:
function! F(param)
endfunction
nnoremap <F9> :call F(1)<CR>
nnoremap <F9> <ESC>:call F(2)<CR>gv
另一个相关的技巧是当你在可视模式下想要执行一些操作,比如移动光标时该怎么做。我能给出的最佳建议是:
function! Fvis()
normal! gv
cursor(1, 1)
endfunction
nnoremap <F9> <ESC>:call Fvis()<CR>gv
v[no]remap
而不是n[no]remap
,如果选择很重要,就不要在其中加入<Esc>
。因此,您的映射看起来更像是nnoremap <F9> :call Fnormal()<CR>
和vnoremap <F9> :call Fvisual()<CR>
。对于我的需求以及我在这里结束后意识到的这一点,我将我的函数定义为function! F() range
,然后执行nnoremap <F9> :F()<CR>
和vnoremap <F9> :'<,'>F()<CR>
。 - dash-tom-bang这是一个旧问题。我通过DDG搜索来到这里。
mode函数在vim脚本中无法使用。
现在有一个新的函数visualmode,它可以用于vim脚本函数中。它返回最后使用的可视模式。因此,要检查块可视模式...
if visualmode() == "\<C-V>"
" we are in visual block mode
endif