10

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

我读过mode()但我无法让它工作。
echo mode()对我
if mode() == "v"不起作用 对我也不起作用。

4

3 回答 3

9

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

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

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

于 2012-04-09T14:29:40.887 回答
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
于 2013-11-10T13:09:23.253 回答
0

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

if visualmode() == "\<C-V>"
   " we are in visual block mode
endif
于 2021-04-06T03:58:09.823 回答