我有一个配置文件,在 vim 中保持打开状态,但有时会在磁盘上更改,而这些更改不会反映在终端上。我可以在不关闭并重新打开文件的情况下刷新屏幕上的内容吗?如果是这样,怎么办?
答案1
您可以使用该:edit
命令(无需指定文件名)来重新加载当前文件。如果您对文件进行了修改,则可以使用
:edit!
强制重新加载当前文件(您将丢失修改)。
该命令:edit
可以缩写为:e
。因此,强制编辑可以通过以下方式完成:e!
答案2
除了使用 手动刷新文件外:edit
,您还可以将~/.vimrc
:set autoread
使 Vim 自动刷新任何未经 Vim 编辑的文件。另见:checktime
。
答案3
长话短说
跳到Wrap-up
标题,查看要vimrc
添加的行以使您的生活更美好。
手动
检查 Vim 外部是否更改了任何缓冲区。如果您最终会得到一个文件的两个版本,它会检查并警告您。
自动地
要自动加载更改,请添加vimrc
:
当检测到文件在 Vim 外部被更改而 Vim 内部未更改时,自动再次读取该文件。当文件被删除时,这不会完成。
这个答案添加一个警告:
自动读取不会重新加载文件,除非您执行诸如运行外部命令之类的操作(例如
!ls
等!sh
)
继续阅读以获取解决方案。
当光标停止移动时触发
添加到您的vimrc
:
au CursorHold,CursorHoldI * checktime
默认情况下,光标保持光标保持静止 4 秒后触发,可通过以下方式配置更新时间。
缓冲区更改或终端焦点触发
将以下内容添加到更改缓冲区时vimrc
触发autoread
里面维姆:
au FocusGained,BufEnter * :checktime
在普通 vim 中捕获终端窗口焦点
要FocusGained
(见上文)在普通 vim 中工作,请在终端仿真器(Xterm、tmux 等)内安装插件:
vim-tmux-焦点事件
在 tmux 版本 > 1.9 上,您需要添加.tmux.conf
:
set -g focus-events on
包起来
以下是我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
谢谢ErichBSchulz 为我指明了正确的方向au CursorHold
。
谢谢这个答案用于解决cmdwin问题。
答案4
这是 neovim 的 lua 版本:
-- 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
vim.api.nvim_create_autocmd({'FocusGained', 'BufEnter', 'CursorHold', 'CursorHoldI'}, {
pattern = '*',
command = "if mode() !~ '\v(c|r.?|!|t)' && getcmdwintype() == '' | checktime | endif",
})
-- Notification after file change
-- https://vi.stackexchange.com/questions/13091/autocmd-event-for-autoread
vim.api.nvim_create_autocmd({'FileChangedShellPost'}, {
pattern = '*',
command = "echohl WarningMsg | echo 'File changed on disk. Buffer reloaded.' | echohl None",
})