刷新在 vi(m) 中打开的文件的更改内容

twa*_*163 412 vim

我有一个在 vim 中保持打开的配置文件,但有时会在磁盘上更改,而这些更改不会反映在终端上。我可以在不关闭和重新打开文件的情况下刷新屏幕上的内容吗?如果是这样,如何?

Thu*_*shi 519

您可以在:edit不指定文件名的情况下使用该命令重新加载当前文件。如果您对文件进行了修改,您可以使用 :edit!强制重新加载当前文件(您将丢失您的修改)。

该命令:edit可以缩写为:e。强制编辑因此可以通过:e!

  • 注意:这通常缩写为`:e!`。 (110认同)
  • @StephaneChazelas:是的,这是正确的 :) @twan163:你可以分别使用 `:e` 和 `:e!`,而不是 `:edit` 和 `:edit!`。 (33认同)
  • 丢失修改,是和否。至关重要的是,你仍然可以`u`ndo`:e!`。 (13认同)
  • 此外,如果您想重新加载所有缓冲区,请运行:`:bufdo e` (6认同)
  • 这 ”!” 是绊倒我,但现在很清楚。 (2认同)

Ing*_*kat 207

除了手动刷新文件之外:edit,您还可以将~/.vimrc

:set autoread
Run Code Online (Sandbox Code Playgroud)

使 Vim 自动刷新任何未被 Vim 编辑过的文件。另见:checktime

  • NB autoread [不完全有效](/sf/ask/174315921/) 自动。您必须使用`gvim`,或者运行外部命令。 (11认同)
  • @toszter 不,Vim 只会刷新 _unchanged_ 缓冲区。万一有变化,还是会有一个查询:保持,还是加载? (5认同)
  • 那些在 tmux 中使用 vim 的人可以通过使用 https://github.com/tmux-plugins/vim-tmux-focus-events 来获取焦点事件。否则 autoread 在终端将无济于事,除非你以某种方式调用 `:checktime` (3认同)
  • `autoread` 可以在光标停止移动 X 秒后自动触发,请参阅 [this answer](https://unix.stackexchange.com/a/383044/143394)。 (3认同)
  • 买家当心——如果你正在处理新代码并且 `git pull` 请注意你可能会无意中在屏幕上丢失未保存的更改。 (2认同)

Tom*_*ale 97

TL; 博士

跳到要添加Wrap-upvimrc行的标题,以使您的生活更美好。

手动

:checktime

检查是否在 Vim 之外更改了任何缓冲区。这会检查并警告您是否最终会得到一个文件的两个版本。

自动地

要自动加载更改,请添加vimrc

set autoread

当检测到一个文件在 Vim 之外被更改而它在 Vim 内部没有被更改时,自动再次读取它。当文件被删除时,这不会完成。

这个答案增加了一个警告:

除非您执行诸如运行外部命令(例如!ls!sh等)之类的操作,否则 Autoread 不会重新加载文件

继续阅读以获取解决方案。

光标停止移动时触发

添加到您的vimrc

au CursorHold,CursorHoldI * checktime
Run Code Online (Sandbox Code Playgroud)

默认情况下,CursorHold在光标保持静止 4 秒后触发,并且可以通过updatetime 进行配置。

触发缓冲区更改或终端焦点

vim 中更改缓冲区时将以下内容添加到您vimrc的触发中:autoread

au FocusGained,BufEnter * :checktime
Run Code Online (Sandbox Code Playgroud)

在普通vim中捕获终端窗口焦点

FocusGained(见上文)在纯 vim 中工作,请在终端模拟器(Xterm、tmux 等)中安装插件: vim-tmux-focus-events

在 tmux 版本 > 1.9 上,您需要添加.tmux.conf

set -g focus-events on
Run Code Online (Sandbox Code Playgroud)

包起来

autoread触发时的通知也是可能的

这是我vimrc实现上述所有内容的行:

" Triger `autoread` when files changes on disk
" https://unix.stackexchange.com/questions/149209/refresh-changed-content-of-file-opened-in-vim/383044#383044
" https://vi.stackexchange.com/questions/13692/prevent-focusgained-autocmd-running-in-command-line-editing-mode
    autocmd FocusGained,BufEnter,CursorHold,CursorHoldI *
            \ if mode() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | checktime | endif

" Notification after file change
" https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
autocmd FileChangedShellPost *
  \ echohl WarningMsg | echo "File changed on disk. Buffer reloaded." | echohl None
Run Code Online (Sandbox Code Playgroud)

感谢ErichBSchulz 用au CursorHold.

感谢这个解决cmdwin问题的答案

  • 优秀的帖子!感觉就像这应该是默认行为的事情之一 (6认同)