0

我有一个自定义命令,在命令中会调用一个函数。

我想确保仅当当前缓冲区处于可视模式(v, V or C-V)时才执行该命令。或者说,仅当当前缓冲区中的某些文本当前被选中时,才执行该函数。

  • visualmode()我不能使用,因为它提供了最后一种视觉模式类型。
  • 我尝试echo mode()输入该功能,它总是给出n.
  • 而且我不确定,如果我选择了一些东西,然后按下:它已经进入command模式,我如何检查缓冲区现在是否有选择的东西?

解决方案可能很简单,但我被困在这里....有人能给我一些启示吗?谢谢你。

4

2 回答 2

1

如果你想要那种功能,你必须使用一个映射(或者两个不同的映射用于正常和可视模式)。

正如你所说,只要你按下:,视觉模式就会留给命令行模式。但是,由于:'<,'>范围是自动插入的,您可以将该范围传递给您的函数并对其进行操作。这也将允许通过显式范围从正常模式使用,但这只是明智的,并且与内置命令一致。

于 2013-10-16T12:31:40.070 回答
1

我一直试图自己解决同样的问题,我想出了这个。

使用此自动命令:

autocmd CursorMoved * let s:Mode = mode()

像下面这样的命令也使用-range=0改变<count>参数的范围选项(当没有传递范围时为 0,否则与调用命令的行相同):

command! -range=0 CmdName call FuncName(<count>, <line1>, <line2>)

然后使用这样的逻辑,您可以检查视觉选择、通过的正常范围以及根本没有通过的范围:

function! FuncName(count, firstLine, lastLine)
    if a:count == 0 "no range given 
            "do stuff for no given range
    else
        if s:Mode  =~ '\vV|v|'  "range was given
            "do stuff for visual selection
        else 
            "do stuff for normal range
            " w/ a:firstLine & a:lastLine 
        endif
    endif
endfunction

笔记:

  • 已知问题 -我发现这不起作用的唯一情况是视觉选择只有一个字符(光标未移动),但在大多数情况下,这应该不是问题。

  • 命令说明 -您必须将 and 作为参数传递,而不是使用 before 调用,因此不会传递无效范围。

于 2013-11-21T23:05:09.623 回答