当焦点从窗口移开时,如何在Vim 7中自动保存?

7
我在我的.vimrc文件中尝试了以下内容:
:au FocusLost * silent! wa
autocmd BufLeave,FocusLost silent! wall

同时还尝试了:

如何在 Vim 失去焦点时自动保存文件?

但是无法使其生效,当我按下 Ctrl+Z 或切换到终端的另一个选项卡 (mac) 时,它仍然不会自动保存。


添加了一个我找到的插件,看起来比手动配置/黑客更干净,并且能够完成工作。 - bakkal
可能是重复的问题:当Vim失去焦点时如何自动保存文件? - Ciro Santilli OurBigBook.com
:au BufHidden * :wa - Yann VR
2个回答

15

BufLeave 会在你跳转到另一个 buffer 时触发。使用命令行版本的 Vim 并不会触发此事件,例如按下 <C-z> 或切换到另一个 Terminal.app 标签页等,并不会触发此事件,因为 CLI Vim 完全不关心终端仿真器的 GUI 或环境,而且你并没有离开当前 buffer。

FocusLost 同样也是如此(或多或少是这样,文档中表示其仅适用于 GUI,但未说明适用于哪些终端)。

因此,在 MacVim 中可能会起作用,但在 CLI Vim 中肯定不行。

实际上,由于 Vim 不知道你的终端仿真器的标签页或是否被放到后台,我怀疑你无法在 CLI Vim 中实现你的目标。

我碰巧在我的~/.vimrc 文件中设置了 autocmd FocusLost * :wa,但我已将其放在 if has("gui_running") 条件语句中,并且还设置了 inoremap <Esc> <Esc>:w<CR> 来省去按 ESC 的步骤。希望有所帮助。


4
“inoremap <Esc> <Esc>:w<CR>”非常棒。感谢@romainl。 - adarsh
4
@adarsh,“autocmd InsertLeave * if expand('%')! ='' | update | endif”更好无限。 - romainl
1
@romainl,太棒了!它确实省略了像“x”或“dd”之类的东西。你会用什么来代替这些类型的命令呢?实际上,那可能就是它了。好吧,不要紧,还有缩进。猜想你必须在每个命令上都节省空间,但这似乎有点过度杀伤力了,不是吗? - Costa Michailidis

1
在OS X和Vim CLI中,我使用这个插件http://www.vim.org/scripts/script.php?script_id=4521
自动保存 - 在每次缓冲区修改后无需使用:w(或任何绑定)即可自动将更改保存到磁盘。AutoSave默认情况下处于禁用状态,运行:AutoSaveToggle以启用/禁用AutoSave。如果您希望始终启用插件,则可以使用g:auto_save选项(在.vimrc中放置'let g:auto_save = 1')。

这个插件似乎是更新版本:https://github.com/907th/vim-auto-save - apostl3pol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接