我正在寻找一个自动命令,让Vim在gg=G
和BufLeave
上执行FocusLost
,这样它就会缩进我没有使用的缓冲区。当我打开或保存文件时,我不喜欢这样做的想法,因为我觉得我会对较大的文件感到不耐烦。但是我觉得我不喜欢我尝试的自动命令:
:autocmd BufLeave,FocusLost * :normal gg=G
所以我想知道是否有人有任何建议可以避免以下问题:
我不一定需要整个自动命令代码本身,但更多的是自动命令的想法,它将完成缩进而不会导致更大的问题。希望答案不会太高于我的头脑,因为我仍在阅读Learn Vimscript the Hard Way。我一直想参与stackoverflow,这似乎是一个相当有趣且不太可能重复的问题。
答案 0 :(得分:0)
对于问题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不支持多线程。如果reindent需要30秒,则必须等待autocmd被触发。可能有一个通过python / perl实现多线程的解决方案。但是我没有测试过。 Vim 7.4改进了python接口,你可能想试试python中的多线程。