在 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"
检查块视觉模式。
@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
老问题。通过 DDG 搜索来到这里。
函数模式在 vimscript 中不起作用。
有一个新的函数visualmode用于 vimscript 函数。它返回最后使用的视觉模式。所以要检查块视觉模式......
if visualmode() == "\<C-V>"
" we are in visual block mode
endif