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

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

这可能吗?

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

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

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

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

这是怎么做的:

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

:fu JL()
    normal Ayyy
    endfu
:map <F2> :call JL()<Enter>

>现在通过输入Axxx< Esc>来添加一些文字,比方说xxx.
>现在按[F2]键,你会看到xxxyyy
>最后,按[.]键,您应该看到xxxyyyxxx

正是你想要的!

为什么会这样

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

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

相关文章

解决方案:解决linux下vim乱码的情况:(修改vimrc的内容)全...
Linuxvi/vim所有的UnixLike系统都会内建vi文书编辑器,其他的...
      vim正则匹配:空行:/^$/  /^[\t]*$/注释...
$select-editorSelectaneditor.Tochangelater,run'sele...
上次手贱忘了保存,这次就简单做个备忘吧,把踩过的坑记一下...
Linux之文本编译器小结vim的优势所有的UNIX-LIKE习通都会内置...