我有一个在 vim 中保持打开的配置文件,但有时会在磁盘上更改,而这些更改不会反映在终端上。我可以在不关闭和重新打开文件的情况下刷新屏幕上的内容吗?如果是这样,如何?
Thu*_*shi 519
您可以在:edit不指定文件名的情况下使用该命令重新加载当前文件。如果您对文件进行了修改,您可以使用
:edit!强制重新加载当前文件(您将丢失您的修改)。
该命令:edit可以缩写为:e。强制编辑因此可以通过:e!
Ing*_*kat 207
除了手动刷新文件之外:edit,您还可以将~/.vimrc
:set autoread
Run Code Online (Sandbox Code Playgroud)
使 Vim 自动刷新任何未被 Vim 编辑过的文件。另见:checktime。
Tom*_*ale 97
跳到要添加Wrap-up的vimrc行的标题,以使您的生活更美好。
检查是否在 Vim 之外更改了任何缓冲区。这会检查并警告您是否最终会得到一个文件的两个版本。
要自动加载更改,请添加vimrc:
当检测到一个文件在 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)
要FocusGained(见上文)在纯 vim 中工作,请在终端模拟器(Xterm、tmux 等)中安装插件:
vim-tmux-focus-events
在 tmux 版本 > 1.9 上,您需要添加.tmux.conf:
set -g focus-events on
Run Code Online (Sandbox Code Playgroud)
这是我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.