变更线上的vim autocmd?

时间:2013-01-22 13:46:24

标签: vim

我试图在每次更改一行时运行一个函数,但似乎没有特定的自动命令。我可以在CursorMoved上运行该函数,但它会减慢编辑速度。我也可以为所有主要的编辑动作映射函数,但它可能会变得非常混乱,因为我试图保持每一行独立于其他行。如果没有解决方案,我可能每隔几秒就做一次差异,看看有什么变化,并在更改的线上运行该功能,但这又是一个混乱的解决方案。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

如果您可以获得Vim 7.4,请查看TextChanged (and TextChangedI, for insert mode) events。 (请注意,这将监视整个缓冲区的变化。)

答案 1 :(得分:-1)

你可以用BufWritePre事件做这样的事情。有一个主文件定义你的行和标记,然后在从文件中,引用它们的主文件,如:

主-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