Vim을 "tail -f"처럼 동작하게하려면 어떻게해야합니까?


36

Vim을 다음과 같이 동작시키는 방법이 있는지 알고 싶습니다 tail -f. 지금까지 찾은
최고의 Vim 플러그인 조차도 내가 기대하는 것을하지 않습니다.

실제로 파일 업데이트를 실시간 으로보고 싶습니다 . 키보드를 사용하지 않아도 Vim이 버퍼를 지속적으로 다시로드하고 마지막 줄로 건너 뛰기를 원합니다.

이것을하는 방법?
(일부 로그 파일이 매우 크기 때문에 전체 파일을 다시로드하고 싶지 않습니다. 가장 좋은 방법은 마지막 줄만로드하는 것 tail -f입니다.)


2
왜 안에 있어야 vim합니까? 무슨 일이야 tail -f?
Sven

1
로그 파일을 읽을 때 vim의 힘을 원하기 때문입니다. 패턴을 검색하고 특히 구문 강조를 즐길 수있는 것과 같습니다. 일부 로그 파일 (바인드, 아파치 등)에 대해 고유 한 구문 강조 표시를 만들었습니다.

당신은 autoreadFileChangedShell에 관심이있을 수 있습니다 > : help autoread> : help FileChangedShell
gsi-frank

2
검색 만하는 less +F대신에 할 수 tail -f있습니다. 그래도 구문 강조를 제공하지는 않습니다.
Dennis Kaarsemaker

답변:


28

당신은 vim처럼 행동 할 수 없습니다 tail -f. 당신은 할 수 less의 조합처럼 행동을 vim하고 tail -f있지만.

영원히 앞으로 (추종) 모드

less를 누르 F거나 +F인수로 전달 하여 입력 할 수있는 순방향 영구 모드가 있습니다 .

$ less +F

이 모드에서는 파일 끝에 도달해도 읽기를 중지하지 않는 less것처럼 작동 tail -f합니다. 파일의 새 데이터로 지속적으로 새로 고칩니다. 이 모드를 종료하려면을 누르십시오 Ctrlc.

구문 강조

less읽은 데이터의 자동 필터링을 지원합니다. 기본 소스 코드 강조 표시를 수행 할 수있는 source-highlight 프로그램 이 있습니다. 와 잘 작동하는 스크립트가 제공됩니다 less. 사용하려면 LESSOPEN환경 변수를 적절하게 설정하십시오 .

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"

또한 플래그 less를 전달하여 원시 터미널 이스케이프 시퀀스를 전달하도록 지시해야합니다 (이것은 터미널에 텍스트 색상을 지정하는 방법을 알려줍니다) -R. 환경 변수 를 설정하여 less항상 -R플래그를 전달한다고 가정 할 수 있습니다 LESS.

 export LESS=' -R '

less충분하지 않을 때

lessvi와 같은 키 바인딩이 있지만 Vim과 동일하지 않습니다. 때로는 외국어를 느끼고 ctags 통합 및 텍스트 편집 기능과 같은 중요한 기능이 부족합니다.

를 눌러 현재보고있는 파일에서 lessVim (가정 EDITOR=vim)을 호출 할 수 있습니다 v. lessVim 내의 올바른 위치에 커서를 놓을 수도 있습니다. Vim을 종료하면에서 다시 돌아옵니다 less. Vim에있는 동안 파일을 변경하면에 반영됩니다 less.


5
vim --servername TAIL_VIM /tmp/somefile

이제 다른 쉘 (bash와 같은)에서 다음을 수행 할 수 있습니다.

while true
do
    inotifywait --event modify /tmp/somefile \
    && vim --servername TAIL_VIM --remote-send '<C-\><C-N>:edit!<CR>G';
done

<C-> <CN>이 vim을 일반 모드로 강제 전환하는 경우 "edit!" vim에게 현재 파일을 다시로드하도록 지시하고 (CR은 Enter 키 누르기 시뮬레이션) G는 파일의 맨 아래로 이동합니다. (G)를 제거하면 입력이 들어오는 동안 파일을 더 쉽게 확인할 수 있습니다.


남자에 "--servername"이라는 매개 변수가 표시되지만 다음과 같은 오류 메시지가 나타납니다.VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Feb 10 2013 02:28:47) Option inconnue: "--servername=toto" Plus d'info avec: "vim -h"
Fox

vim --version을 수행하면 + clientserver (하이픈이있는 -clientserver 아님)가 표시됩니까? 그렇지 않으면, 많은 사람들이 컴파일 정력 소스에서 ./configure를 --with-기능 = 거대한 사용
crutux을

예, + clientserver가 있습니다. 우분투 버전이 있습니다.
폭스

1

Evan Teitelman 의 의견 덕분에 답을 찾았습니다 . 내 솔루션은 /usr/share/vim/vimcurrent/macros/less.vim 에서 영감을 얻었습니다 .

나는 내 자신의 기능을 만들었지 만 많이 향상 될 수 있습니다.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

그리고 CTRL + C 를 눌러 Tailf를 종료하십시오.

Tailf 모드에서 로그 파일을 열려면 view -M "+call Tailf()" /path/to/logfile.log

내가 싫어하는 것은 sleep자동 새로 고침 중에 vim에서 아무것도 할 수없는 전화입니다. 버퍼가 자율적이고 다른 분할 창에 있더라도 업데이트되는 것이 가장 좋습니다. 어쨌든, 그것은 좋은 시작입니다. :)


2
전체 파일을 다시 읽는 것처럼 보입니다. 원하는 것이 아닙니다.
Bernhard

전체 파일을 다시로드합니다. inotifywait을 기반으로 플러그인을 만드는 것은 그리 어렵지 않으며 :read파일이 수정 될 때까지 기다렸다가 추가 된 경우 파일 맨 아래 줄에 읽습니다.

예, 사실입니다. 전체 파일을 다시로드하므로 크게 개선해야합니다. 내가 이것을 원한다고 말하면 결과에 대해 더 많이 이야기하고 있습니다 (화면에 표시되는 내용 : 파일 만 업데이트하고 마지막 줄에 머물러있는 vim). 불행히도 멋진 플러그인을 만들기에 충분한 vim 지식이 없습니다 ...
Fox

@EvanTeitelman OK, 이제 inotifywait를 사용하는 방법을 봅니다. 파일이 바뀔 때마다 알 수 있습니다. 그러나 추가되었는지 (완전히 수정되지 않았는지) 확인하는 방법과 추가 된 새로운 행 수를 확인하는 방법은 무엇입니까?
폭스

파일이 변경 될 때마다 파일의 줄 수를 읽으십시오. 줄 수가 증가하면 변경 내용을 읽습니다.

1

비재 귀적 방법 :

cmap tailf<CR> call Tailf()<CR>
         function! Tailf()
    "Press C-c to stop tailing
        while 1
            e                                  
            normal G
            redraw
            sleep 1
        endwhile
    endfunction

1

나는 짧고 많은 해킹없이 좋아합니다. 필요할 때 ex (whithin vim)에서이 oneliner를 실행할 수 있습니다 (또는 로그 파일을 열 때 vimrc에 각 명령을 넣습니다).

:set autoread | au CursorHold * checktime | call feedkeys("lh")

(파일의 끝으로 (거의) 이동하려면 피드 키와 함께 "lh"대신 "G"를 사용하십시오)

설명:

  • autoread: 외부에서 변경 될 때 파일을 읽습니다 (그러나 자체적으로 작동하지 않으며 내부 타이머 또는 이와 유사한 것이 없습니다. vim이 ex의 명령과 같은 동작을 수행 할 때만 파일을 읽습니다. :!
  • CursorHold * checktime: 사용자가 지정한 시간 동안 커서를 움직이지 않으면 updatetime(기본적으로 4000 밀리 초) checktime파일 외부에서 변경 사항을 확인합니다.
  • call feedkeys("lh"): 커서가 한 번 좌우로 움직입니다. 그런 다음 아무 일도 일어나지 않습니다 (... 즉, CursorHold트리거됨을 의미하므로 루프가 있음 )

를 사용할 때 스크롤을 멈추려면 call feedkeys("G")execute :set noautoread-now vim은 파일이 변경되었음을 알리고 변경 사항을 읽고 싶은지 묻습니다.

나는 screen / tmux없이 ssh 세션에서 작업 할 때 꼬리 파일 대신 vim에서 로그 파일을 보는 아이디어를 좋아합니다. 또한 필요한 경우 로그 파일에서 직접 복사하거나 출력을 직접 저장하거나 vim으로 할 수있는 모든 작업을 저장할 수 있습니다 :)

*이 답변에서 ( PhanHaiQuang 의 답변 과 flukus 의 의견 참조 )


0

편집 : 나는 당신이 이미 이것을 시도한 것을 완전히 우회했습니다.

Tail Bundle 플러그인을 사용해 볼 수 있습니다 . 찾고있는 것을해야한다고 생각합니다.

설치하려면 vim으로 tail-3.0.vba를 열고 다음을 실행하십시오.

:so %

다시 시작하면 다음과 같이 vim 내에서 파일을 테일링 할 수 있어야합니다.

:Tail /path/to/file

0

VIM 8.0 이상에만 타이머가 도입되었으므로 타이머를 사용하여 테일 기능을 시뮬레이션 할 수 있습니다. 이는 내 경험에서 매우 효과적입니다.

꼬리를 켜려면 F6 키를 매핑하고 꼬리를 끄려면 F7 키를 매핑했습니다. 아래 명령에서 명령을 사용자 정의 할 수 있으며주의 단어에 대해서는 아래 섹션을 참조하십시오.

다음을 실행하십시오

exe ":function! Tail(timer) \n :exe 'normal :e!\<ENTER>G' \n endfunction"
map <F6> :exe timer_start(2000, 'Tail', {'repeat':-1})<CR> 
map <F7> :exe timer_stopall()<CR>

위의 명령을 vimrc의 일부로 만들면 항상 가질 수 있습니다.

주의 사항 :

  • 다른 타이머가 없다고 가정하므로 timer_stopall ()은 실제로 모든 타이머를 효과적으로 중지합니다. timer_start 중에 ID를 가져 와서 ID를 얻기 위해 조금 더 수정할 수는 있지만 약간의 작업으로 보였으며 대부분의 사람들이 타이머를 사용하지 않을 것이라고 가정합니다.
  • 꼬리 모드에있는 동안 명령을 실행하려고 시도하지 않는 것이 좋습니다. 일반적으로 vim 인스턴스와 충돌하므로 편집 모드로 돌아 가기로 결정하기 전에 TAIL (F7)을 해제하십시오. 로고보기.

-1

Vim에서 다음을 실행하십시오.

!tail -f 

분기 된 자식 tail -f이 현재 버퍼에서 실행 되는 동안 Vim이 일시 중단됩니다 . 때리면 Ctrl-CVim의 버퍼로 돌아갑니다.


1
그것은 vim이 아니라 평범한 tail일을하고 있습니다. Vim은 휴대용입니다. 이것은 아니다.
oligofren
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.