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

Vim 改进自动命令以缩进并返回到bufleve和FocusLost上的行,vim,auto-indent,autocmd,Vim,Auto Indent,Autocmd,我正在寻找一个自动命令,使Vim在buflive和FocusLost上执行gg=G,以便它缩进我没有使用的缓冲区。我不喜欢在打开或保存文件时这样做,因为我想我会对较大的文件感到不耐烦。但我想我不喜欢自动命令,我甚至尝试了更多: :autocmd BufLeave,FocusLost * :normal gg=G 因此,我想知道是否有人有任何建议来避免以下问题: 最大的问题是,我失去了我的线路 而且,我似乎不得不等待缩进完成,才能开始编辑另一个缓冲区。(我想,几乎任何解决方案都至少会让Vim在

我正在寻找一个自动命令,使Vim在
buflive
FocusLost
上执行
gg=G
,以便它缩进我没有使用的缓冲区。我不喜欢在打开或保存文件时这样做,因为我想我会对较大的文件感到不耐烦。但我想我不喜欢自动命令,我甚至尝试了更多:

:autocmd BufLeave,FocusLost * :normal gg=G
因此,我想知道是否有人有任何建议来避免以下问题:

  • 最大的问题是,我失去了我的线路
  • 而且,我似乎不得不等待缩进完成,才能开始编辑另一个缓冲区。(我想,几乎任何解决方案都至少会让Vim在其他缓冲区中运行得更慢。)

我不一定需要整个自动命令代码本身,但更需要一个自动命令的想法,它可以在不引起更大问题的情况下完成缩进。希望答案不会太高,因为我还在通读。我一直想参与stackoverflow的研究,这似乎是一个相当有趣且不太可能重复的问题。

对于问题1,有一个解决方案:您可以在重新缩进之前保存光标位置(
gg=G
),然后恢复位置。vim有内置的
getpos()和setpos()
,在这种情况下可以帮助您。例如,您可以创建一个函数:

   function! Hook()
      let p = getpos(".")
      normal! gg=G
      call setpos(".",p)
   endfunction
:autocmd BufLeave,FocusLost * :call Hook()
在autocmd中,调用以下函数:

   function! Hook()
      let p = getpos(".")
      normal! gg=G
      call setpos(".",p)
   endfunction
:autocmd BufLeave,FocusLost * :call Hook()
这将使您的vim重新缩进,并在您离开和返回缓冲区时保持原稿


然而,对于问题2,似乎vimscript没有很好的解决方案。因为vimscript不支持多线程。如果重新登入需要30秒,则必须等待autocmd被触发。可以通过python/perl实现多线程。但是我还没有测试。Vim 7.4改进了python接口,您可能希望尝试一下python中的多线程

因此,对我来说,最好的自动命令可能是使用“&mod”和“$”(假设它们在O(1)运行)来过滤掉通过保存触发的大文件和未修改的文件。一旦我学习了所有必要的Vim脚本,这样的方法应该会起作用。我不明白为什么需要使用
&mod和line(“$”)
。无论如何,如果您只想在某些模式或其他条件下执行reindent,您可以在
Hook
函数中检查它们。是的,它们都是vim脚本@布兰登