我想保存当前的单次重复操作(这是按 . 时发生的情况),然后运行宏,然后恢复 . Action (因为宏通常会改变它)。
这可能吗?
或者,是否可以在不更改当前 .行动?我想我可以尝试在命令模式下做所有事情,但我不确定这是否可能。
背景:我正在编写一个文件浏览器函数(如 TextMate 中的 command-T,参见 http://github.com/mdemare/fuzzy_file_finder ),我想对用户环境进行尽可能少的更改,因此更改必须发生在函数中。目前,当您使用此功能切换文件时,您的 . action 被覆盖,这是非常不受欢迎的。
最佳答案
在 VIM 中,您可以创建一个宏来执行您通常在 normal
中所做的任何编辑。模式而不干扰重做 [.]
通过将这些编辑内容包装在用户定义中来实现功能 :function
然后用 :map
执行该函数键。
例子
看它的最好方法是用一个例子。假设您要添加文本 yyy
每次按 F2 键到当前行的末尾,但您不希望这干扰重做命令 [.]
.
这是如何做到的:
: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/