我正在寻找一个自动命令,让Vim在BufLeave
和FocusLost
上执行gg=G
,这样它就可以缩进我没有使用的缓冲区。我不喜欢在打开或保存文件时这样做,因为我觉得我会对较大的文件感到不耐烦。但我觉得我不喜欢自动命令,我尝试了更多:
:autocmd BufLeave,FocusLost * :normal gg=G
所以我想知道是否有人有任何建议来避免以下问题:
- 最大的问题是我失去了我的线路
- 此外,我似乎不得不等待缩进完成才能开始编辑另一个缓冲区。(我想,几乎任何解决方案都可能使Vim在其他缓冲区中的速度变慢。)
我不一定需要整个自动命令代码本身,而是一个自动命令的想法,它可以在不引起更大问题的情况下完成缩进。希望答案不会太离谱,因为我仍在阅读《艰难之路学习Vimscript》。我一直想参与stackoverflow,这似乎是一个相当有趣且不太可能重复的问题。
对于问题1,有一个解决方案:您可以在重新缩进(gg=G
)之前保存光标位置,然后恢复位置。vim内置了getpos() and setpos()
,在这种情况下可以为您提供帮助。例如,您可以创建一个函数:
function! Hook()
let p = getpos(".")
normal! gg=G
call setpos(".",p)
endfunction
在你的autocmd中,你调用函数:
:autocmd BufLeave,FocusLost * :call Hook()
这应该会使你的vim重新缩进,并在你离开和返回缓冲区时保持原始。
然而,对于问题2,vimscript似乎没有好的解决方案。因为vimscript不支持多线程。如果重新生成需要30秒,则必须等待autocmd被触发。可以有一个通过python/perl实现多线程的解决方案。但是我还没有测试。Vim 7.4已经改进了python接口,您可能想尝试一下python中的多线程。