0

我正在寻找一个自动命令来让 Vim 做一个gg=Gon BufLeaveFocusLost这样它就会缩进我没有使用的缓冲区。我不喜欢在打开或保存文件时这样做,因为我认为我会对较大的文件感到不耐烦。但我认为我不喜欢我尝试过的自动命令:

:autocmd BufLeave,FocusLost * :normal gg=G

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

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

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

4

1 回答 1

0

对于问题1,有解决方案:您可以在重新缩进(gg=G)之前保存光标位置,然后恢复位置。vim 有 build-in 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 中的多线程。

于 2013-08-18T20:22:09.797 回答