Vim自动命令:当行发生变化时?

4

我想在每次修改行时运行一个函数,但好像没有专门的自动命令可用于此。我可以在CursorMoved上运行该功能,但这会减慢编辑速度。我还可以为所有主要编辑操作映射该函数,但由于我试图使每行独立于其他行,所以可能会变得非常混乱。如果没有解决方案,我可能每隔几秒钟进行一次diff以查看发生了什么更改,并在更改的行上运行该函数,但这又是一个混乱的解决方案。

有什么想法吗?


1
你看过 InsertLeave 事件吗?它应该比 CursorMoved 更少的影响性能。 - Prince Goulash
1
你到底想要实现什么?最好提供一个具体的使用案例来询问(并且回答起来更容易),而不是仅仅询问技术细节而没有背景信息。 - Ingo Karkat
是的,我已经阅读了:h autocmd-events。InsertLeave仅适用于该操作,而不适用于正常模式下进行的任何更改、替换等。为了解释我正在尝试做什么 - 基本上我正在尝试通过一个系统来组织我的笔记,使每个单独的行末尾都有一个参考号码,这样我就可以在不同的地方多次使用相同的行,在不同的标题/折叠下,并且每次编辑行/折叠时,它会“同步”其他行。这是一种廉价的数据库,没有复杂性,具有编辑纯文本的速度。 - kknight
你自己说了!你想在一个(强大的)文本编辑器中实现数据库。这是个坏主意。说真的,我会重新考虑我的方法。 - Ingo Karkat
请参考以下与程序相关的问题:Relevant questions。您可以使用 &modified,但似乎没有适当的自动命令事件。 @IngoKarkat 可能是正确的。 - Nikita Kouevda
为什么?我已经拥有了所有我想要的功能,只是每次编辑完一行后,我都必须手动运行函数。 - kknight
2个回答

4

0
你可以使用BufWritePre事件来实现这样的功能。在主文件中定义你的行和标记,然后在从文件中引用它们,例如:

master-Foo.vim:

let b:Dom_slaves = ['/foo/bar/slave.cpp', '...', ...]
let b:Dom_map = { 
              \   10 : "do your laundry",
              \   20 : "prepare your lunch" 
              \ }

slave.cpp

/* Dom_master = master-Foo.vim */
...
cout << "I will gladly /* Dom-id:10 */ and /* Dom-id:20 */.\n";

Dominate.vim

let MSMap = {}
autocmd BufWritePre * call s:Dominate()

function! s:Dominate()
    " if current buffer's Dom_slaves and Dom_map defined
        " read & update all slaves with Dom_map mappings
    " else see if 'Dom_master = somefile' appears in the buffer
        " update mapped values from cache or read master file, cache and update
    " endif
endfunction

顺便说一下,这对你的vim来说是一件可怕的事情。 :P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接