随打随存:VIM中的自动保存

20

正如问题标题所述,我希望在VIM的插入模式下输入内容时自动保存文件。

这种操作是否可行?如何实现?


1
你有检查过这个吗?http://vim.wikia.com/wiki/Auto-save_current_buffer_periodically - ctn
1
这也许会有帮助:http://vim.wikia.com/wiki/Auto_save_files_when_focus_is_lost - Lars Kotthoff
1
对于使用来自Wikia的autocmd CursorHold,CursorHoldI * update的人,请注意,这会与像Telescope这样打开自定义对话框的插件存在问题,因为脚本将尝试保存对话框。请改用*.*而不是*以排除非文件缓冲区。 - SOFe
https://vi.stackexchange.com/a/79/6671 建议使用 autocmd CursorHold,CursorHoldI * update - undefined
7个回答

42

每当文本更改时,我建议保存缓冲区:

autocmd TextChanged,TextChangedI <buffer> silent write

我在这里找到了它。它对我有效。

注意 (感谢@Kevin): 不幸的是,如果您打开vim而没有打开文件,它将导致错误,因为vim将尝试保存您键入的文本但无处可存。


2
这是字面上的解决方案。不需要使用插件使事情变得复杂。 - Iresh Dissanayaka
3
如果你在没有打开文件的情况下打开vim,那么这将导致错误。 - Kevin
2
@simhumileco,解决这个问题的方法可能是指定缓冲区类型。例如:autocmd TextChanged,TextChangedI *.md silent write - craft
4
正如 @eric 所指出的,你可以检查缓冲区是否只读,但是这种方法似乎仅适用于验证它是否由文件支持: au TextChanged,TextChangedI <buffer> if &readonly == 0 && filereadable(bufname('%')) | silent write | endif - J Cracknell
1
根据https://stackoverflow.com/a/34814520/2641825所说,使用`:update`比`:write`更合适,因为它只在存在未持久化的更新时才实际保存。 - undefined
显示剩余2条评论

12

1
这根本不起作用。在我启用自动保存后,对文件进行了一些更改后,文件没有更新。 - Omar Abid
同意@omar的观点。当我输入:AutoSaveToggle时,会出现一个错误提示说它不存在,而当我输入:run AutoSaveToggle时,什么也不会发生。 - Brettins
经过进一步调查,我认为这是一个通信问题。这个答案的第一行关于使用:AutoSaverToggle需要vim自动保存插件才能工作。这不是我对Jayram信息的理解,特别是因为第二行暗示它是一个本地VIM命令,并且在补充中你也可以使用插件。然而,这个命令需要插件的支持。 - Brettins
@Brettins 是的,:AutoSaveToggleAutoSave 插件的一部分。它不是 Vim 的原生命令! - Aleksei Chernenkov
终于找到了如何安装这个插件的方法:需要在 .vimrc 中配置插件,然后运行 :PluginInstall 而不指定任何插件名称。 - Deqing

5
这将处理只读缓冲区(例如netrw)和未检测到的文件类型。使用TextChangedI而不是InsertLeave似乎会导致在插入模式下键入每个字符时进行一次写入,这可能是您想要的,也可能不是。
augroup autosave
    autocmd!
    autocmd BufRead * if &filetype == "" | setlocal ft=text | endif
    autocmd FileType * autocmd TextChanged,InsertLeave <buffer> if &readonly == 0 | silent write | endif
augroup END

2
你能解释一下你代码中的每一行吗? - VimNing
1
第2行:清除此组中的所有自动命令 第3行:如果文件类型未设置,则将其设置为“文本” 第4行:当离开插入模式时,如果文本已更改且文件可写,则保存文件 - Eric

2
在Vim中没有原生的自动保存支持。但是您可以使用vim-auto-save插件来实现自动保存。
默认情况下,该插件仅在普通模式下自动保存,但是它的README中有一个部分描述了如何配置插件以在插入模式下保存。提示:您应该将插件配置为在CursorHoldI和/或TextChangedI Vim事件上自动保存。
请参考插件文档以了解如何安装和使用它。

1

不知道是否有人提到过这个。

按文件类型自动保存

(在这种情况下,是针对Markdown *.md文件)

autocmd BufNewFile,BufRead *.md :autocmd TextChanged,TextChangedI <buffer> silent write

这将会在 Markdown (*.md) 文件被修改的时候立即写入文件内容。

0

使用带有逻辑的函数来处理只读缓冲区和空缓冲区,与自动命令配合使用效果非常好:

" auto save file when it is modified
augroup auto_save
  autocmd!
  " call save function
  autocmd BufModifiedSet * call AutoSave()
augroup end

" save function that is called when buffer is modified
function AutoSave()
  if (bufname() != "" && &buftype == "" && &filetype != "" && &readonly == 0)
    silent write
  " prevent empty, readonly, etc... buffers from being saved
  else
  endif
endfunction

自动组auto_save包含一个自动命令,调用AutoSave()。每当当前缓冲区被修改时执行(参见:help BufModifiedSet)。AutoSave()函数仅在缓冲区可写、非空且具有文件类型时才写入缓冲区。

0

907th/vim-auto-save自动保存文件,但如果您的.vimrc依赖于写入事件,则可能会出现问题。

最近,我注意到https://github.com/chrisbra/vim-autosave,它将文件保存到备份目录中,如果您的.vimrc依赖于写入事件,这听起来非常有前途。


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