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

标签 vim

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

这可能吗?

或者,是否可以在不更改当前 .行动?我想我可以尝试在命令模式下做所有事情,但我不确定这是否可能。

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

最佳答案

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

例子

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

这是如何做到的:

  • 打开一个新的 vim 窗口并执行以下命令:
    :fu JL()
        normal Ayyy
        endfu
    :map <F2> :call JL()<Enter>
    
  • 现在添加一些文字,比如 xxx , 输入 Axxx<Esc>
  • 现在按 [F2]键,你应该看到 xxxyyy
  • 最后,按 [.]键,你应该看到 xxxyyyxxx

  • 正是你想要的!

    为什么这有效

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

    这一切都发生在 eval.c getchar.c 在 VIM 源代码中。搜索 saveRedobuff看看发生了什么。

    关于vim - 备份-恢复 VIM 中的当前重复操作 (.),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/619423/

    相关文章:

    vim - CursorLine 和 NonText/SpecialKey 突出显示冲突

    vim - 为什么 Vim 在这个重新映射的键上延迟?我该如何解决?

    vim - vim 映射中的文本对象序列

    search - 如何在vim中显示打开折叠中匹配搜索的行?

    VIM 在处理许多文件时效率低下

    从剪贴板粘贴的 Vim 命令插入命令而不是执行它们

    vim - "Last modified"标题或状态行中的时间

    function - 为什么我的 .vimrc 中的函数被自动调用?

    vim - 当焦点从窗口丢失时,如何在 Vim 7 中自动保存?

    regex - VIM - 如何粘贴没有特殊字符的搜索寄存器?