Jak sprawić, by Vim zachowywał się jak „tail-f”?

36

Chciałbym wiedzieć, czy istnieje sposób, aby Vim się zachowywał tail -f.
Nawet najlepsza wtyczka Vima , jaką znalazłem do tej pory, nie spełnia moich oczekiwań.

Naprawdę chcę zobaczyć aktualizację pliku w czasie rzeczywistym . Nawet z dala od klawiatury chcę, aby Vim ciągle przeładowywał bufor i przeskakiwał do ostatniej linii.

Jak to zrobić?
(Nie chcę ponownie ładować całego pliku, ponieważ niektóre pliki dziennika są bardzo duże. Najlepiej jest ładować tylko ostatnie wiersze, podobnie jak tail -f).

Lis
źródło
2
Dlaczego musi być w środku vim? Co jest nie tak z tail -f?
Sven
1
Ponieważ chcę mocy vima podczas czytania plików dziennika. Jak w przypadku wyszukiwania wzorca, a szczególnie cieszenia się podświetlaniem składni. Dla niektórych plików dziennika (bind, apache itp.) Utworzyłem własne wyróżnianie składni.
Mógłby być zainteresowany AutoRead i FileChangedShell >: help AutoRead>: help FileChangedShell
gsi-frank
2
Tylko do wyszukiwania, możesz zrobić less +Fzamiast tail -f. Nie zapewnia jednak podświetlania składni.
Dennis Kaarsemaker,

Odpowiedzi:

28

Nie możesz vimsię tak zachowywać tail -f. Możesz sprawić, że lesszachowujesz się jak połączenie vimi tail -fchociaż.

Naprzód na zawsze (śledzenie)

lessma tryb na zawsze do przodu, do którego można wejść naciskając Flub przekazując +Fgo jako argument.

$ less +F

W tym trybie lesszachowuje się tak tail -f, że nie przestaje czytać, gdy osiągnie koniec pliku. Stale odświeża się z nowymi danymi z pliku. Aby wyjść z tego trybu, naciśnij Ctrlc.

Podświetlanie składni

lessobsługuje automatyczne filtrowanie danych, które odczytuje. Istnieje program o nazwie source-highlight, który może wykonywać podstawowe podświetlanie kodu źródłowego. Jest wyposażony w skrypt, który działa dobrze less. Aby go użyć, wystarczy odpowiednio ustawić LESSOPENzmienną środowiskową.

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

Musisz także powiedzieć, lessaby przekazać nieprzetworzone sekwencje specjalne terminala (te mówią terminalowi, jak pokolorować tekst), przekazując mu -Rflagę. Możesz powiedzieć, lessże udajesz, że zawsze przekazuje -Rflagę, ustawiając LESSzmienną środowiskową.

 export LESS=' -R '

Kiedy lessto za mało

Chociaż lessma przypisania klawiszy podobne do vi, to po prostu nie jest to samo, co Vim. Czasami wydaje się obcy i brakuje mu ważnych funkcji, takich jak integracja tagów i możliwość edycji tekstu.

Możesz wykonać lesswywołanie Vima (zakładając EDITOR=vim) na aktualnie przeglądanym pliku, naciskając v. lessumieści nawet kursor we właściwej lokalizacji w Vimie. Po wyjściu z Vima znajdziesz się ponownie less. Jeśli dokonałeś jakichkolwiek zmian w pliku, gdy byłeś w Vimie, zostaną one odzwierciedlone w less.


źródło
5
vim --servername TAIL_VIM /tmp/somefile

Teraz w innej powłoce (np. Bash) możesz:

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

Kiedy <C -> <CN> zmusza vima do przejścia do trybu normalnego, „edytuj!” mówi vimowi, aby ponownie załadował bieżący plik (CR symuluje naciśnięcie enter), a G przechodzi do dolnej części pliku. Usunięcie (G) ułatwia rozszyfrowanie pliku podczas wprowadzania danych.

crutux
źródło
Widzę param „--servername” w tym człowieku, jednak dostałem następujący komunikat o błędzie: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
jeśli wykonasz vim --version czy widzisz + clientserver (nie -clientserver, z łącznikiem)? Jeśli nie, wiele osób kompiluje vima ze źródła używając ./configure --with-features = huge
crutux
Tak, istnieje + clientserver. Mam wersję Ubuntu.
Fox
1

Odpowiedź znalazłem dzięki komentarzowi Evana Teitelmana . Moje rozwiązanie jest zainspirowane /usr/share/vim/vimcurrent/macros/less.vim .

Zrobiłem własną funkcję, ale można ją znacznie poprawić.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

I po prostu naciśnij CTRL + C, aby wyjść z Tailf.

Aby otworzyć plik dziennika w trybie Tailf: view -M "+call Tailf()" /path/to/logfile.log

To, co mi się nie podoba, to sleeppołączenie, które nie pozwala nic robić w vimie podczas automatycznego odświeżania. Najlepiej byłoby, gdyby bufor był autonomiczny i aktualizował się, nawet jeśli jestem w innym podzielonym oknie. W każdym razie, to dobry początek. :)

Lis
źródło
2
Wygląda na to, że ponownie odczytuje cały plik, co nie jest tym, czego chciałeś, prawda?
Bernhard
To spowoduje ponowne załadowanie całego pliku. Prawdopodobnie nie byłoby zbyt trudne stworzenie wtyczki opartej na inotifywait, :readktóra czeka, aż plik zostanie zmodyfikowany, a jeśli zostanie dołączony, odczyta wiersze na dole pliku.
Tak, to prawda, przeładowuje cały plik, więc trzeba to znacznie poprawić. Kiedy mówię, że tego chcę, bardziej mówię o wyniku (to, co widzisz na ekranie: vim, który aktualizuje sam plik i pozostaje w ostatniej linii). Niestety nie mam wystarczającej wiedzy na temat vimów, aby stworzyć fajną wtyczkę ...
Fox
@EvanTeitelman OK, widzę teraz, jak korzystać z inotifywait. Mogę wiedzieć, kiedy plik się zmienia. Ale jak się dowiedzieć, czy zostało dodane (nie całkowicie zmodyfikowane) i jak wiedzieć, ile nowych linii zostało dodanych?
Fox
Odczytaj liczbę wierszy w pliku przy każdej zmianie pliku. Jeśli liczba linii wzrośnie, przeczytaj zmiany.
1

Nierekurencyjna metoda dla tego samego:

cmap tailf<CR> call Tailf()<CR>
         function! Tailf()
    "Press C-c to stop tailing
        while 1
            e                                  
            normal G
            redraw
            sleep 1
        endwhile
    endfunction
Ritesh Agarwal
źródło
1

Lubię to krótko i bez hakowania. Możesz uruchomić ten oneliner z ex (whithin vim) w razie potrzeby (lub wstawić każde polecenie do vimrc, gdy pliki dziennika są otwarte).

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

(jeśli chcesz przeskoczyć (prawie) na koniec pliku, po prostu użyj „G” zamiast „lh” z klawiszami feed)

Wyjaśnienie:

  • autoread: czyta plik po zmianie z zewnątrz (ale nie działa samodzielnie, nie ma wewnętrznego timera ani czegoś takiego. Odczyta plik tylko wtedy, gdy vim wykona akcję, jak polecenie ex :!
  • CursorHold * checktime: gdy kursor nie zostanie przesunięty przez użytkownika na czas określony w updatetime(domyślnie 4000 milisekund), checktimewykonywany jest sprawdzanie zmian spoza pliku
  • call feedkeys("lh"): kursor przesuwa się raz, w prawo i do tyłu w lewo. i wtedy nic się nie dzieje (... co oznacza, że CursorHoldzostanie uruchomione, co oznacza, że ​​mamy pętlę )

Aby zatrzymać przewijanie podczas używania call feedkeys("G"), wykonaj :set noautoread- teraz vim powie, że plik został zmieniony i zapytaj, czy chcesz odczytać zmiany, czy nie)

Podoba mi się pomysł oglądania plików dziennika w vimie (zamiast tail -f), np. Kiedy pracujesz w sesji ssh bez screen / tmux. Dodatkowo możesz skopiować bezpośrednio z pliku dziennika, jeśli to konieczne, lub zapisać dane wyjściowe bezpośrednio lub ... cokolwiek możesz zrobić z vimem :)

* z tej odpowiedzi (nawiązującej do odpowiedzi PhanHaiQuang i komentarza flukus )

eli
źródło
0

Edycja: przepraszam, całkowicie ominąłem, że już to próbowaliście.

Możesz spróbować użyć wtyczki Tail Bundle , myślę, że powinna zrobić to, czego szukasz.

Aby zainstalować, otwórz tail-3.0.vba w vimie i wykonaj:

:so %

Uruchom ponownie i powinieneś być w stanie ogonić plik z poziomu vima tak:

:Tail /path/to/file
Sean Schoonover
źródło
0

TYLKO dla VIM 8.0+ wprowadzili timery, więc możesz użyć timera do symulacji funkcji ogona, działa to całkiem skutecznie z mojego doświadczenia.

Odwzorowałem klawisz F6, aby włączyć ogon, i F7, aby wyłączyć ogon, możesz dostosować te w poniższych poleceniach, zobacz także moją sekcję poniżej ZASADY PRZESTROGI.

Uruchom następujące

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>

Możesz również ustawić powyższe polecenia jako część vimrc, aby zawsze je mieć.

Kilka ostrzeżeń:

  • Zakładam, że nie masz żadnych innych timerów, więc timer_stopall () faktycznie faktycznie zatrzyma wszystkie timery. Możesz to nieco zmodyfikować, aby uzyskać identyfikator podczas timer_start, a następnie go zatrzymać itp., Ale to wydawało mi się trochę pracy i zakładam, że większość ludzi nie używałaby timerów.
  • gdy jest w trybie ogona, zdecydowanie sugeruję, abyś nie próbował uruchamiać żadnych poleceń, zwykle powoduje awarie instancji vima, więc PROSZĘ WYŁĄCZYĆ OGON (F7), zanim zdecydujesz się wrócić do trybu edycji, jest to WYŁĄCZNIE WYSOKIE DO PRZEGLĄDANIA DZIENNIKÓW.
Jolly1234
źródło
-1

Z poziomu Vima wykonaj:

!tail -f 

To zawiesi Vima, gdy rozwidlone dziecko wykonuje tail -fna bieżącym buforze. Uderzenie Ctrl-Cpowoduje powrót do bufora w Vimie.

użytkownik65446
źródło
1
To nie jest vim, ale zwykła tailpraca. Vim jest przenośny. To nie jest.
oligofren