改进自动命令,以便在BufLeave和FocusLost上缩进并返回行



我正在寻找一个自动命令,让Vim在BufLeaveFocusLost上执行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中的多线程。

相关内容

  • 没有找到相关文章

最新更新