改进自动命令以缩进并返回到BufLeave和FocusLost上的行

时间:2013-08-18 19:09:45

标签: vim auto-indent autocmd

我正在寻找一个自动命令,让Vim在gg=GBufLeave上执行FocusLost,这样它就会缩进我没有使用的缓冲区。当我打开或保存文件时,我不喜欢这样做的想法,因为我觉得我会对较大的文件感到不耐烦。但是我觉得我不喜欢我尝试的自动命令:

:autocmd BufLeave,FocusLost * :normal gg=G

所以我想知道是否有人有任何建议可以避免以下问题:

  • 最大的问题是我失去了我的目标。
  • 此外,似乎我不得不等待缩进才能开始编辑另一个缓冲区。 (我想任何解决方案都可能至少使Vim在其他缓冲区中变慢。)

我不一定需要整个自动命令代码本身,但更多的是自动命令的想法,它将完成缩进而不会导致更大的问题。希望答案不会太高于我的头脑,因为我仍在阅读Learn Vimscript the Hard Way。我一直想参与stackoverflow,这似乎是一个相当有趣且不太可能重复的问题。

1 个答案:

答案 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中的多线程。