检查视觉模式

11

如何在vimscript中检查当前正在使用的可视模式(可视或可视块)?

我已经阅读了mode()的相关文档,但是我无法让它起作用。
echo mode()对我来说不起作用。
if mode() == "v"对我也不起作用。


如果 Visual Block 模式处于激活状态,你想做什么? - Pavan Manjunath
@Pavan,如果Visual Block模式处于活动状态,我想计算块的起始和结束位置(行+列)。如果视觉模式处于活动状态,我只想计算视觉选择的起始和结束行,而不是列。 - Reman
找不到答案。 - Reman
请检查是否有当前活动的 Vim 可视选择,以便从函数调用中获取相关信息。 - Ciro Santilli OurBigBook.com
3个回答

10

请查看mode()的帮助文档。相关部分如下:

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

要检查块选择模式,你需要检查mode() == "\<C-V>"(字面意义为^V字符),而不是检查mode() == "v"


是的,我知道,但无法使其正常工作。它无法识别可视块。回显命令行代码是什么? - Reman
你说的“不能运行”的意思是什么?你尝试了什么来触发它? - Chris Morgan
你不能通过输入这样的命令来使它工作,因为这样必然会改变模式,但你可以用其他方式查看它;例如,au CursorMoved * echo mode() 将在移动光标时显示模式。(还要注意我已经修复了代码;你需要的是 CTRL-V 字符,而不是字符串 CTRL-V。你可以使用 "\<C-V>" 来实现字面字符。) - Chris Morgan
4
但是你是如何触发它的? - Chris Morgan
1
抱歉回复晚了。我在vimscript中触发它。:call <sid>MyScript<CR> --> function!s:MyScript | if mode == "\<C-V>" | do this | else | do that | endfunction - Reman
显示剩余4条评论

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

请记住,在可视模式下进行映射时,您应该使用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

0

这是一个旧问题。我通过DDG搜索来到这里。
mode函数在vim脚本中无法使用。
现在有一个新的函数visualmode,它可以用于vim脚本函数中。它返回最后使用的可视模式。因此,要检查块可视模式...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接