【问题标题】:Check Visual mode检查视觉模式
【发布时间】:2012-04-21 19:56:47
【问题描述】:

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

我已经阅读了有关 mode() 的信息,但我无法让它发挥作用。
echo mode() 对我不起作用
if mode() == "v" 对我也不起作用。

【问题讨论】:

  • 如果可视块模式处于活动状态,您想做什么?
  • `@Pavan,如果可视块模式处于活动状态,我想计算块的开始结束(行 + 列)。如果可视模式处于活动状态,我只想计算可视选择的开始和结束行,而不是列。
  • 在那里找不到答案。

标签: vim mode


【解决方案1】:

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

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

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

【讨论】:

  • 是的,我知道,但不能让它工作。它不识别视觉块。 echo 命令行代码是什么?
  • 无法正常工作是什么意思?你是如何尝试触发它的?
  • '@Chris,像这样:if mode() == "CTRL-V" | echo "block" | else | "echo no block" | endif - 在命令行中效果不佳。
  • 但是你是怎么触发的呢?
  • 对不起,我的回答迟了。我在 vimscript 中触发它。 :call MyScript --> function! s:MyScript | if mode == "\<C-V>" | do this | else | do that | endfunction
【解决方案2】:

@Remonn 已经在 cmets 中说过,但我不太清楚。这就是我设法看到结果的方式:

function! F()
    normal! gv
    throw mode()
endfunction
vnoremap <F9> <ESC>:call F()<CR>

进入不同的视觉模式,然后点击F9查看。

我需要一个 throw 因为-- 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,如果选择很重要,您不希望在其中使用&lt;Esc&gt;。所以你的映射看起来更像nnoremap &lt;F9&gt; :call Fnormal()&lt;CR&gt;vnoremap &lt;F9&gt; :call Fvisual()&lt;CR&gt;。出于我的需要,以及我如何最终来到这里但在到达这里后意识到这一点,我将我的函数定义为function! F() range,然后执行nnoremap &lt;F9&gt; :F()&lt;CR&gt;vnoremap &lt;F9&gt; :'&lt;,'&gt;F()&lt;CR&gt;
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2015-01-23
    • 1970-01-01
    相关资源
    最近更新 更多