检查可视模式

时间:2012-04-09 12:39:10

标签: vim mode

检查视觉模式当前处于活动状态(视觉或视觉阻止)的vimscript的最佳方法是什么?

我读过关于mode()但我无法使其发挥作用 echo mode()对我不起作用 if mode() == "v"对我也不起作用。

3 个答案:

答案 0 :(得分:5)

查看mode()的帮助。相关部分:

          v       Visual by character
          V       Visual by line
          CTRL-V  Visual blockwise

您需要检查mode() == "\<C-V>"(文字^V字符),而不是mode() == "v",以检查块状视觉模式。

答案 1 :(得分:1)

@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

答案 2 :(得分:0)

老问题。通过DDG搜索来到这里。
函数 mode 在 vi​​mscript 中不起作用。
有一个新函数 visualmode 旨在用于 vimscript 函数。它返回上次使用的视觉模式。所以要检查块视觉模式...

if visualmode() == "\<C-V>"
   " we are in visual block mode
endif