【问题标题】:Repeat a Command invoked from Menu重复从菜单调用的命令
【发布时间】:2011-03-16 19:24:51
【问题描述】:

我在 VIM 中创建了许多菜单命令。

. 在正常模式下重复最后一个命令。
@: 从命令行重复最后一个命令

有没有办法重复从 vim 的 menu 调用的最后一个命令?

更新:

示例菜单命令:

an 98.80.00 &MyMenu.Test\ :call <SID>Test("%")<CR>

如果我使用自己创建的这个菜单命令,我怎样才能再次重复它(重复上次使用的菜单命令)?
在上述情况下,它将是 :call &lt;SID&gt;Test("%")&lt;CR&gt;
我在命令行历史记录中找不到这些命令。
@::&lt;UP&gt; 不起作用

有人知道 Vim 在哪里保存函数调用/菜单命令动作吗?

更新2

Kent 提议围绕上述命令构建一个函数:

an 98.80.00 &MyMenu.Test\ :call SubExe('call <SID>Test("%")')<CR>

 function! SubExe(argument)
  let g:lastcommand = a:argument
  exe g:lastcommand
 endfun

似乎可以,缺点是我必须更改所有当前命令;)

【问题讨论】:

  • 我一直认为如果我可以重复一组命令,而不仅仅是最后一个命令,那就太好了。答案显然是使用宏(qaq 然后@a 重复),但我一直在寻找更简单、更快的东西。不能用宏吗?
  • 是的,但如果我没记错的话,您必须为需要重复的每个菜单命令创建一个宏。
  • 是的,这是写的,但我想你不会经常需要那个,是吗?否则,只需将一个键映射到菜单命令,然后按住该键。

标签: vim menu command repeat


【解决方案1】:

如果没有内置支持,您必须自己构建一个,如果它对您很重要的话。基本思路是:

你创建一个函数,比如ExecMenuCmd(cmd),参数是命令,比如wq,在函数中,你将命令保存到一个变量中,然后执行它。

然后您可以通过读取变量创建映射到“重复”最后一个菜单 cmd 并执行。

当您创建菜单项时,您会执行以下操作:

:menu File.SaveAndExit :call ExecMenuCmd('wq')

如果你喜欢,你可以维护一个堆栈来存储菜单触发的命令,以实现更多的功能。

【讨论】:

  • 您好,肯特,Tnx 回复。这意味着我必须更改我创建的所有命令,不是吗?在上面的例子中,命令是:call ExecMenuCmd(':call &lt;SID&gt;Test("%")&lt;CR&gt;') 不是吗?在这个函数中我执行:call &lt;SID&gt;Test("%")&lt;CR&gt; 对吗?顺便说一句,是否不能在调用的函数(Test())中也捕获命令并将其放入变量中?
  • 你可以像exec 'call F("arg")'一样执行:call F("arg")。是的,如果该功能对您来说足够重要,您需要更改菜单创建行。 @Remonn
  • @Remonn 你可以做一个列表,把每一个命令都推进去。当你想重复的时候,把它弹出来。它使您可以跟踪命令历史记录。但这超出了您的要求。
  • @Remonn 我能想到的,当你定义你的菜单命令时,最好不要定义normal 的东西。例如。您的示例可以由wincmd 完成。同样,该功能是一个工作回合。您必须检查不同的情况才能进行相应的处理。
  • @Remonn 我不知道你想要什么,如果你想做&lt;C-W&gt;T 你可以用wincmd 和你的函数:execute 'wincmd T' 这个Move the current window to a new tab page.
【解决方案2】:

你可以在你的 .vimrc 中做一个映射来进入命令模式,然后运行最后一个命令。比如:

noremap <F8> :<Up><Cr>

每当您在正常模式下按 F8 时,这将重复您从命令模式运行的最后一件事。您可以将 F8 更改为您想要的任何内容。

【讨论】:

  • @: 会做同样的事情,没有任何映射
  • @mb14,谢谢。我很遗憾它仍然不适用于调用函数的菜单命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多