我的问题类似于此如何实时监视文本文件,
但我想在vim中执行此操作。我知道我可以读取打开的文件使用tail -f sample.xml
文件,并且在将新内容写入文件时,它还会将新内容写入屏幕。文件更新后,vim可以自动填充新数据吗?
我的问题类似于此如何实时监视文本文件,
但我想在vim中执行此操作。我知道我可以读取打开的文件使用tail -f sample.xml
文件,并且在将新内容写入文件时,它还会将新内容写入屏幕。文件更新后,vim可以自动填充新数据吗?
Answers:
您可以:set autoread
使vim在文件更改时读取文件。但是,(取决于您的平台),您必须给予重点关注。
从帮助中:
当检测到文件在Vim外部已被更改并且在Vim内部尚未被更改时,请自动重新读取。删除文件后,不会完成此操作。
将以下内容放入您的.vimrc
:
“在正常模式下闲置4s后检查一次 设置自动读取 au CursorHold *检查时间
就像@flukus在对上一个答案的注释中所说的那样call feedkeys["lh"]
(您可以将光标向右移动,然后向左移动,通常在查看日志文件时不会造成伤害)
因此,如果您将其余的答案结合在一起,则可以使用oneliner,可以在需要时从ex(whitin vim)运行:
:set autoread | au CursorHold * checktime | call feedkeys("lh")
(如果您想(几乎)跳到文件末尾,只需在Feed键中使用“ G”而不是“ lh”)
说明:
- 自动读:读取来自外部的变化时,该文件(但它自身不工作,不存在内部定时器或类似的东西,它只会读取时VIM中前做一个动作,像这样的命令文件。:!
- CursorHold * checktime:当用户未在'updatetime'中指定的时间(默认为4000毫秒)中移动光标时,将执行checktime,它检查文件外部的更改
- 调用feedkeys(“ lh”):光标向右和向左移动一次,然后什么也没有发生(...这意味着CursorHold被触发,这意味着我们有一个循环)
此外,您可以:set syntax=logtalk
为日志着色
要在使用时停止滚动call feedkeys("G")
,执行:set noautoread
-现在vim会告诉该文件已更改,并询问是否要读取更改)
(这有副作用吗?)
编辑:我看到一个副作用:如果一个人使用Feed键使用“ G”,它将向下滚动每个当前打开的缓冲区?因此,无法在splittet窗口的左缓冲区中工作,而让右缓冲区自动向下滚动日志文件
将此粘贴到您的.vimrc中,它应该像老板一样工作。(摘自:http : //vim.wikia.com/wiki/Have_Vim_check_automatically_if_the_file_has_changed_externally)
" Function to Watch for changes if buffer changed on disk
function! WatchForChanges(bufname, ...)
" Figure out which options are in effect
if a:bufname == '*'
let id = 'WatchForChanges'.'AnyBuffer'
" If you try to do checktime *, you'll get E93: More than one match for * is given
let bufspec = ''
else
if bufnr(a:bufname) == -1
echoerr "Buffer " . a:bufname . " doesn't exist"
return
end
let id = 'WatchForChanges'.bufnr(a:bufname)
let bufspec = a:bufname
end
if len(a:000) == 0
let options = {}
else
if type(a:1) == type({})
let options = a:1
else
echoerr "Argument must be a Dict"
end
end
let autoread = has_key(options, 'autoread') ? options['autoread'] : 0
let toggle = has_key(options, 'toggle') ? options['toggle'] : 0
let disable = has_key(options, 'disable') ? options['disable'] : 0
let more_events = has_key(options, 'more_events') ? options['more_events'] : 1
let while_in_this_buffer_only = has_key(options, 'while_in_this_buffer_only') ? options['while_in_this_buffer_only'] : 0
if while_in_this_buffer_only
let event_bufspec = a:bufname
else
let event_bufspec = '*'
end
let reg_saved = @"
"let autoread_saved = &autoread
let msg = "\n"
" Check to see if the autocommand already exists
redir @"
silent! exec 'au '.id
redir END
let l:defined = (@" !~ 'E216: No such group or event:')
" If not yet defined...
if !l:defined
if l:autoread
let msg = msg . 'Autoread enabled - '
if a:bufname == '*'
set autoread
else
setlocal autoread
end
end
silent! exec 'augroup '.id
if a:bufname != '*'
"exec "au BufDelete ".a:bufname . " :silent! au! ".id . " | silent! augroup! ".id
"exec "au BufDelete ".a:bufname . " :echomsg 'Removing autocommands for ".id."' | au! ".id . " | augroup! ".id
exec "au BufDelete ".a:bufname . " execute 'au! ".id."' | execute 'augroup! ".id."'"
end
exec "au BufEnter ".event_bufspec . " :checktime ".bufspec
exec "au CursorHold ".event_bufspec . " :checktime ".bufspec
exec "au CursorHoldI ".event_bufspec . " :checktime ".bufspec
" The following events might slow things down so we provide a way to disable them...
" vim docs warn:
" Careful: Don't do anything that the user does
" not expect or that is slow.
if more_events
exec "au CursorMoved ".event_bufspec . " :checktime ".bufspec
exec "au CursorMovedI ".event_bufspec . " :checktime ".bufspec
end
augroup END
let msg = msg . 'Now watching ' . bufspec . ' for external updates...'
end
" If they want to disable it, or it is defined and they want to toggle it,
if l:disable || (l:toggle && l:defined)
if l:autoread
let msg = msg . 'Autoread disabled - '
if a:bufname == '*'
set noautoread
else
setlocal noautoread
end
end
" Using an autogroup allows us to remove it easily with the following
" command. If we do not use an autogroup, we cannot remove this
" single :checktime command
" augroup! checkforupdates
silent! exec 'au! '.id
silent! exec 'augroup! '.id
let msg = msg . 'No longer watching ' . bufspec . ' for external updates.'
elseif l:defined
let msg = msg . 'Already watching ' . bufspec . ' for external updates'
end
echo msg
let @"=reg_saved
endfunction
let autoreadargs={'autoread':1}
execute WatchForChanges("*",autoreadargs)
CursorHold
运行一次。因此,如果您去喝咖啡或在另一个窗口中做某事,它将不会更新。
尾束应该做你想要的。注意,我自己没有使用过。