[vim] Vim은 파일의 실시간 변경 사항을 모니터링 할 수 있습니다.

내 질문은 실시간으로 텍스트 파일을 모니터링하는 방법 과 비슷
하지만 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>

분명히 이것이 모든 사람에게 효과가있는 것은 아니지만 내가하는 방법입니다.