내 질문은 실시간으로 텍스트 파일을 모니터링하는 방법 과 비슷
하지만 vim에서하고 싶습니다. 열린 파일 사용 tail -f sample.xml
파일을 읽을 수 있다는 것을 알고 있으며 새 콘텐츠가 파일에 기록되면 새 콘텐츠도 내 화면에 기록됩니다. 파일이 업데이트 될 때 vim이 새 데이터를 자동으로 채우도록 할 수 있습니까?
답변
당신은 할 수 있습니다 :set autoread
파일이 변경 될 때 vim이 파일을 읽도록 . 그러나 (플랫폼에 따라) 초점을 맞춰야합니다.
도움말에서 :
파일이 Vim 외부에서 변경된 것으로 감지되고 Vim 내부에서 변경되지 않은 경우 자동으로 다시 읽습니다. 파일이 삭제되면 이것은 수행되지 않습니다.
답변
자동으로 알지 못하지만 다음을 입력 할 수 있습니다.
:e!
파일을 다시로드하려면
답변
다음을 입력하십시오 .vimrc
.
"정상 모드에서 4 초 동안 활동이 없으면 한 번 확인 자동 읽기 설정 au CursorHold * 체크 타임
답변
@flukus가 이전 답변 에 대한 의견에서 말했듯 이 call feedkeys["lh"]
(커서를 오른쪽으로 이동하고 왼쪽으로 다시 이동하므로 로그 파일을 볼 때 일반적으로 해를 끼치 지 않습니다)
따라서 나머지 답변 을 결합 하면 필요할 때 ex (whithin vim)에서 실행할 수있는 oneliner가 있습니다.
:set autoread | au CursorHold * checktime | call feedkeys("lh")
((거의) 파일의 끝으로 이동하려면 피드 키와 함께 “lh”대신 “G”를 사용하십시오.)
설명 :
– autoread은 : 더 내부 타이머 또는 그런 일이없는, 외부에서 변경된 파일을 읽고 (하지만 자신의 작업을 나던 그것은 단지 정력이 예에서 명령과 같은 작업을 수행하는 파일을 읽습니다. :!
– CursorHold * checktime : ‘updatetime'(기본값은 4000 밀리 초)에 지정된 시간 동안 사용자가 커서를 이동하지 않은 경우 파일 외부에서 변경 사항을 확인하는 checktime이 실행됩니다.
– feedkeys ( “lh”) 호출 : 커서가 한 번, 오른쪽 및 왼쪽 뒤로 이동 한 다음 아무 일도 일어나지 않습니다 (… 즉, CursorHold가 트리거됨을 의미하며 루프 가 있음을 의미 합니다 ).
또한 :set syntax=logtalk
로그에 색상을 지정할 수 있습니다.
를 사용할 때 스크롤을 중지하려면 다음을 call feedkeys("G")
실행하십시오 :set noautoread
. 이제 vim이 파일이 변경되었음을 알리고 변경 내용을 읽을 것인지 묻습니다)
(부작용이 있습니까?)
편집 : 한 가지 부작용이 있습니다. 피드 키에 “G”를 사용하면 현재 열려있는 모든 버퍼가 아래로 스크롤됩니다. 따라서 오른쪽 버퍼가 로그 파일을 자동으로 아래로 스크롤하는 동안 분할 창의 왼쪽 버퍼에서 작업 할 수 없습니다.
답변
이것을 .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)
답변
Tail Bundle 은 원하는 작업을 수행해야합니다. 직접 사용하지 않았습니다.
답변
Unix + neovim 인 경우
:term tail -f <filename>
분명히 이것이 모든 사람에게 효과가있는 것은 아니지만 내가하는 방법입니다.