长话短说

长话短说

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

答案1

您可以使用该:edit命令(无需指定文件名)来重新加载当前文件。如果您对文件进行了修改,则可以使用 :edit!强制重新加载当前文件(您将丢失修改)。

该命令:edit可以缩写为:e。因此,强制编辑可以通过以下方式完成:e!

答案2

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

:set autoread

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

答案3

长话短说

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

手动

跑步:checktime

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

自动地

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

set autoread

当检测到文件在 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

包起来

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

谢谢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",
})

相关内容