备份 - 恢复VIM中的当前重复操作(。)

时间:2009-03-06 16:23:23

标签: vim

我想保存当前的单重复操作(这是按下时发生的情况。),然后运行一个宏,然后恢复。动作(因为宏通常会改变它)。

这可能吗?

或者,是否可以在不改变电流的情况下编写宏。行动?我想我可以尝试在命令模式下执行所有操作,但我不确定这是否可行。

背景:我正在编写文件浏览器函数(如TextMate中的command-T,请参阅http://github.com/mdemare/fuzzy_file_finder),我想尽可能少地对用户的环境进行更改,因此必须进行更改在功能中。目前,当您使用此功能切换文件时,您的。行动被覆盖,这是非常不受欢迎的。

3 个答案:

答案 0 :(得分:10)

在VIM中,您可以创建一个宏,该宏将执行您通常在normal模式下执行的任何编辑,而不会通过将这些编辑包装在用户定义的[.]中来干扰重做:function功能。然后用:map ped键执行该函数。

实施例

看到它的最好方法是举个例子。假设您希望每次按F2键时将文本yyy添加到当前行的末尾,但您不希望这会干扰重做命令[.]

以下是如何操作:

  1. 打开一个新的vim窗口并执行以下命令:

    :fu JL()
        normal Ayyy
        endfu
    :map <F2> :call JL()<Enter>
    
  2. 现在点击xxx

  3. 添加一些文字,比如Axxx<Esc>
  4. 现在按下[F2]键,您会看到xxxyyy

  5. 最后,按[.]键,您会看到xxxyyyxxx

  6. 正是你想要的!

    为什么会这样?

    这是因为VIM执行重做命令的方式的性质。当您键入命令时,VIM会跟踪命令的字符。当您按下[.]键时,它会将这些字符填充回键盘缓冲区以重新执行它们。不幸的是,一个简单的q宏以相同的方式工作 - 它将字符填充到缓冲区中,并通过这样做覆盖重做缓冲区。 :normal命令也可以执行此操作,但是当放置在用户定义的函数中时,我们可以解决此限制,因为执行用户定义函数的代码在用户定义的函数期间保存并恢复重做缓冲区。

    这一切都发生在VIM源代码中的eval.cgetchar.c中。搜索saveRedobuff以查看正在发生的事情。

答案 1 :(得分:4)

您可以将动作录制到寄存器中以便稍后使用。按 q ,然后按注册 az AZ 0-9 是有效的注册标识符),应用所需的命令/操作,然后按 q 停止录制。按 @ 然后是注册

有关详细说明,请参阅complex repeatVim documentation部分。

注意:不幸的是,序列 qa.qu 不会完全符合您的要求,因为命令将重复当前的最后一个操作而不是最后一个操作记录命令时的动作。

答案 2 :(得分:4)

我能想到帮助你的唯一方法:重新映射'。'保存行动历史,如果需要,您可以随时回忆。有关这些方面的建议,请参阅repeat.vim插件。