我想保存当前的单重复操作(当你按下时会发生这种情况.),然后运行一个宏,然后恢复.动作(因为宏通常会改变它).
这可能吗?
或者,是否可以在不改变电流的情况下写入宏.行动?我想我可以尝试在命令模式下做所有事情,但我不确定这是否可行.
背景:我正在编写一个文件浏览器函数(如TextMate中的command-T,请参阅http://github.com/mdemare/fuzzy_file_finder),我想尽可能少地对用户的环境进行更改,因此更改必须在功能中发生.目前,当您使用此功能切换文件时,您的.行动被覆盖,这是非常不受欢迎的.
在VIM中,您可以创建一个宏,该宏将执行您通常在normal
模式下执行的任何编辑,而不会[.]
通过将这些编辑包装在用户定义中:function
然后使用:map
ped键执行该功能来干扰重做功能.
看到它的最好方法是举个例子.假设您希望yyy
每次按F2键时将文本添加到当前行的末尾,但您不希望这会干扰重做命令[.]
.
这是怎么做的:
打开一个新的vim窗口并执行以下命令:
:fu JL() normal Ayyy endfu :map:call JL()
现在xxx
通过输入添加一些文本,比方说Axxx
现在按下[F2]
键,你应该看到xxxyyy
最后,[.]
按键,你应该看到xxxyyyxxx
正是你想要的!
为什么会这样这是因为VIM执行重做命令的方式的性质.当您键入命令时,VIM会跟踪命令的字符.当您按下该[.]
键时,它会将这些字符填充回键盘缓冲区以重新执行它们.不幸的是,一个简单的q
宏以相同的方式工作 - 它将字符填充到缓冲区中,并通过这样做覆盖重做缓冲区.该:normal
命令也是这样做的,但是当放在用户定义的函数中时,我们会解决这个限制,因为执行用户定义函数的代码在用户定义的函数期间保存并恢复重做缓冲区.
这一切都发生在eval.c
和getchar.c
在VIM源代码.搜索saveRedobuff
以查看正在发生的事情.