Vimscript:执行命令传递数字前缀

时间:2015-07-31 14:55:43

标签: vim

如果我输入@Value,vim会搜索第五个“某事”。 但是5/something会将5解释为模式的一部分,并从第5行开始搜索,就好像我输入了execute '5/something'一样。那很好,但现在:是否有可能以某种方式调用:5/something以获得execute行为?我知道我可以在这个特定的例子中重复搜索5次;问题不在于如何获得相同的效果,但通常情况下,如果可以使用5/something将前缀参数传递给目标命令。

2 个答案:

答案 0 :(得分:1)

正常vs命令行模式

5/foo:5/foo完全不同。当您使用:execute时,您可以想象以:开头的命令。例如execute foo将成为:foo。这意味着:5/foo是一个范围。

范围

通常将范围应用于ex-commands。例如:%s/foo/bar:'<,'>left:11-35g/foo/normal 3x。但是,您只能执行将光标移动到该位置的范围。有些人(像我一样)使用:{line-number}代替{line-number}G来跳转到特定的行。

范围可能超过数字。他们可以进行标记和搜索,并可以组合使用。让我们以:5/foo为例:

  • :5跳到第5行
  • /foo转到包含foo
  • 的下一行

重复前命令

有很多方法:

  • 使用@:执行最后一次命令行[count]次。
  • 使用循环!例如for i in range(5) | execute 'foo' | endfor
  • 如果您在线上执行,请使用:g。例如:g/foo/...
  • 使用宏

或创建自定义命令来帮助您:

命令! -count = 1 -nargs = + -complete = command对于范围()|中的i,重复执行| ENDFOR

如需更多帮助,请参阅

:h range
:h :execute
:h /
:h @:
:h :for
:h :g
:h q
:h :command

答案 1 :(得分:1)

我认为执行此操作的唯一方法是在:normal的参数中执行:exe,并将参数开头的前缀嵌入/连接到:normal。例如:

:exe 'normal 5/something^M'

其中^M是文字回车符。 (我知道有16种方法可以输入:

  1. ^ V 输入
  2. ^ V ^ M
  3. ^ V 0 1 3
  4. ^ V 0 0 1 5
  5. ^ V X 0 d
  6. ^ V û 0 0 0 d
  7. ^ V û 0 0 0 0 0 0 0 d
  8. ^ V S-Enter (适用于大多数vims,但在Cygwin mintty中发送NUL,并在Win32 CLI / GUI和Mac中发送文字<S-CR> OS X GUI命令行模式。)
  9. 再增加8个与上述8相同,但使用 ^ Q 而不是 ^ V 。假设没有重映射,并且在类似Unix的CLI中使用stty -ixon来允许 ^ Q 通过。十六进制字母不区分大小写。)您也可以

    :exe 'normal 5/something'.nr2char(13)
    

    现在,如果您想依赖于交互计数,比如说,从映射调用中继承,那么您可以将v:count1连接为前缀:

    nnoremap \t1 :<C-u>exe 'normal '.v:count1.'/something'.nr2char(13)<CR>
    

    功能相同的替代方案:

    nnoremap \t1 :<C-u>exe 'normal <C-r>=v:count1<CR>/something'.nr2char(13)<CR>
    

    现在输入 \ t 1 将向前搜索第一次出现的something 5 \ t 1 将向前搜索something的第五次出现。