Wie bringe ich Vim dazu, sich wie "tail -f" zu verhalten?

36

Ich würde gerne wissen, ob es eine Möglichkeit gibt, Vim dazu zu bringen, sich so zu verhalten tail -f.
Selbst das beste Vim-Plugin, das ich bisher gefunden habe, macht nicht das, was ich erwarte.

Ich möchte das Datei-Update unbedingt in Echtzeit sehen . Selbst wenn ich nicht auf der Tastatur bin, möchte ich, dass Vim den Puffer ständig neu lädt und zur letzten Zeile springt.

Wie macht man das?
(Ich möchte nicht die gesamte Datei neu laden, da einige Protokolldateien sehr groß sind. Das Beste ist, nur die letzten Zeilen zu laden, wie es der tail -fFall ist.)

Fuchs
quelle
2
Warum muss es innerhalb sein vim? Was ist los mit tail -f?
Sven
1
Weil ich die Kraft von vim haben will, wenn ich Logfiles lese. Als ob Sie in der Lage wären, nach Mustern zu suchen, und besonders die Hervorhebung der Syntax zu genießen. Ich habe für einige Protokolldateien (Bind, Apache usw.) eine eigene Syntaxhervorhebung vorgenommen.
Sie könnten in interessiert sein Autoread und FileChangedShell >: help Autoread>: help FileChangedShell
gsi-frank
2
Nur für die Suche könnten Sie tun, less +Fanstatt tail -f. Gibt Ihnen jedoch nicht die Syntaxhervorhebung.
Dennis Kaarsemaker

Antworten:

28

Sie können sich nicht so vimverhalten tail -f. Sie können lesssich wie eine Kombination aus vimund verhalten tail -f.

Für immer weiterleiten (folgen)

lesshat einen Forward-Forever-Modus, den Sie durch Drücken Foder Übergeben +Fals Argument eingeben können .

$ less +F

Verhält lesssich tail -fin diesem Modus so, dass der Lesevorgang nicht unterbrochen wird, wenn das Ende einer Datei erreicht ist. Es wird ständig mit neuen Daten aus der Datei aktualisiert. Um diesen Modus zu verlassen, drücken Sie Ctrlc.

Satzstellung markieren

lessunterstützt die automatische Filterung der gelesenen Daten. Es gibt ein Programm namens Source-Highlight , mit dem Sie grundlegende Quellcode-Hervorhebungen durchführen können. Es kommt mit einem Skript, das gut funktioniert less. Um es zu verwenden, stellen Sie einfach die LESSOPENUmgebungsvariable entsprechend ein.

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

Sie müssen auch festlegen less, dass rohe Terminal-Escape-Sequenzen (diese weisen Ihr Terminal an, wie Text eingefärbt werden soll) übergeben werden sollen, indem Sie das -RFlag übergeben. Sie können durch Setzen der Umgebungsvariablen lessvorgeben, dass immer das -RFlag übergeben wird LESS.

 export LESS=' -R '

Wann lessist nicht genug

Obwohl lesses vi-ähnliche Tastenkombinationen hat, ist es nicht dasselbe wie Vim. Manchmal fühlt es sich fremd an und es fehlen wichtige Funktionen wie die Integration von Tags und die Möglichkeit, Text zu bearbeiten.

Sie können lessVim (vorausgesetzt EDITOR=vim) für die aktuell angezeigte Datei aufrufen, indem Sie drücken v. lessSogar der Cursor wird in Vim an der richtigen Stelle platziert. Wenn Sie Vim verlassen, befinden Sie sich wieder in less. Wenn Sie in Vim Änderungen an der Datei vorgenommen haben, werden diese in widergespiegelt less.


quelle
5
vim --servername TAIL_VIM /tmp/somefile

Jetzt können Sie in einer anderen Shell (wie bash) Folgendes tun:

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

Wenn das <C -> <CN> vim zwingt, in den normalen Modus zu wechseln, "edit!" Weist vim an, die aktuelle Datei neu zu laden (der CR simuliert das Drücken der Eingabetaste), und G springt zum Ende der Datei. Durch Entfernen von (G) wird es einfacher, die Datei zu trennen, während die Eingabe eingeht.

Crutux
quelle
Ich sehe den Parameter "--servername" im Mann, jedoch erhielt ich folgende Fehlermeldung: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
Wenn Sie vim --version benutzen, sehen Sie + clientserver (nicht -clientserver, mit einem Bindestrich)? Wenn nicht, kompilieren viele Leute vim aus dem Quellcode mit ./configure --with-features = huge
crutux
Ja, es gibt + clientserver. Ich habe die Ubuntu-Version.
Fox
1

Ich fand die Antwort dank des Kommentars von Evan Teitelman . Meine Lösung ist inspiriert von /usr/share/vim/vimcurrent/macros/less.vim .

Ich habe meine eigene Funktion gemacht, aber sie könnte stark verbessert werden.

function! Tailf()
    e
    normal G
    redraw

    sleep 1
    call Tailf()
endfunction

Und drücken Sie einfach STRG + C , um Tailf zu beenden.

So öffnen Sie eine Protokolldatei im Tailf-Modus: view -M "+call Tailf()" /path/to/logfile.log

Was mir nicht gefällt, ist der sleepAnruf, bei dem während der automatischen Aktualisierung keine vim-Aktionen ausgeführt werden können. Am besten ist es, wenn der Puffer autonom ist und aktualisiert wird, auch wenn ich mich in einem anderen geteilten Fenster befinde. Auf jeden Fall ist es ein guter Anfang. :)

Fuchs
quelle
2
Es sieht so aus, als würde es auch die gesamte Datei neu lesen, was nicht das ist, was Sie wollten, oder?
Bernhard
Dadurch wird die gesamte Datei neu geladen. Es wäre wahrscheinlich nicht allzu schwierig, ein Plugin zu erstellen :read, das auf inotifywait basiert und darauf wartet, dass eine Datei geändert und, falls sie angehängt wurde, in die Zeilen am Ende der Datei eingelesen wird .
Ja, es stimmt, es lädt die gesamte Datei neu, daher muss dies erheblich verbessert werden. Wenn ich sage, dass ich das möchte, spreche ich mehr über das Ergebnis (was Sie auf dem Bildschirm sehen: ein Vim, der Ihre Datei alleine aktualisiert und in der letzten Zeile bleibt). Leider habe ich nicht genug vim Wissen, um ein nettes Plugin zu machen ...
Fox
@EvanTeitelman OK, ich sehe, wie man inotifywait jetzt benutzt. Ich kann wissen, wann immer sich die Datei ändert. Aber woher wissen, ob es angehängt (nicht vollständig modifiziert) wurde und wie viele neue Zeilen angehängt wurden?
Fox
Lesen Sie bei jeder Änderung der Datei die Anzahl der Zeilen in der Datei. Wenn die Anzahl der Zeilen zunimmt, lesen Sie die Änderungen ein.
1

Eine nicht rekursive Methode für das gleiche:

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
quelle
1

Ich mag es kurz und ohne viel Hacken. Sie können diesen Oneliner bei Bedarf von ex (innerhalb von vim) ausführen (oder jeden Befehl in vimrc einfügen, wenn Protokolldateien geöffnet werden.)

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

(Wenn Sie (fast) ans Ende der Datei springen möchten, verwenden Sie bei Feedkeys einfach "G" anstelle von "lh".)

Erläuterung:

  • autoread: liest die Datei, wenn sie von außen geändert wird (aber es funktioniert nicht von alleine, es gibt keinen internen Timer oder ähnliches. Es wird die Datei nur gelesen, wenn vim eine Aktion ausführt, wie ein Befehl in ex :!
  • CursorHold * checktime: Wenn der Cursor für die in angegebene Zeit updatetime(standardmäßig 4000 Millisekunden) nicht vom Benutzer bewegt checktimewird, wird nach Änderungen von außerhalb der Datei gesucht
  • call feedkeys("lh"): Der Cursor wird einmal nach rechts und zurück nach links bewegt. und dann passiert nichts (... was bedeutet, dass CursorHoldausgelöst wird, was bedeutet , dass wir eine Schleife haben )

Um das Scrollen zu unterbrechen call feedkeys("G"), führen Sie Folgendes aus :set noautoread: Jetzt wird vim mitteilen, dass die Datei geändert wurde, und Sie werden gefragt, ob Sie die Änderungen lesen möchten oder nicht.

Ich mag die Idee, Logfiles in vim (anstelle von tail -f) anzusehen, zB wenn Sie in einer ssh-Sitzung ohne screen / tmux arbeiten. Außerdem können Sie bei Bedarf direkt aus der Protokolldatei kopieren oder die Ausgabe direkt speichern oder ... was auch immer Sie mit vim tun können :)

* aus dieser Antwort (unter Bezugnahme auf eine Antwort von PhanHaiQuang und einen Kommentar von flukus )

eli
quelle
0

Edit: Ich entschuldige mich, völlig umgangen, dass du das schon ausprobiert hast.

Sie können versuchen, das Tail Bundle- Plugin zu verwenden. Ich denke, es sollte das tun, wonach Sie suchen.

Öffnen Sie zum Installieren tail-3.0.vba mit vim und führen Sie Folgendes aus:

:so %

Starten Sie neu und Sie sollten in der Lage sein, eine Datei von vim aus wie folgt zu bearbeiten:

:Tail /path/to/file
Sean Schoonover
quelle
0

NUR für VIM 8.0+ wurden Timer eingeführt, sodass Sie einen Timer verwenden können, um die Tail-Funktion zu simulieren. Dies funktioniert meiner Erfahrung nach ziemlich effektiv.

Ich habe die Taste F6 zum Einschalten des Endes und die Taste F7 zum Ausschalten des Endes zugeordnet. Sie können diese in den folgenden Befehlen anpassen. Weitere Informationen finden Sie in meinem Abschnitt unten unter WORDS OF CAUTION.

Führen Sie Folgendes aus

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>

Sie können die obigen Befehle auch zu einem Teil von vimrc machen, damit Sie sie immer haben.

Einige Worte zur Vorsicht:

  • Ich gehe davon aus, dass Sie keine anderen Timer haben, also stoppt timer_stopall () tatsächlich alle Timer. Sie könnten dies ein bisschen weiter modifizieren, um die ID während timer_start zu erhalten und sie dann zu halten, usw. Aber das schien mir ein bisschen Arbeit zu sein, und ich würde annehmen, dass die meisten Leute keine Timer verwenden würden.
  • im tail-modus würde ich dringend empfehlen, keine befehle auszuführen, da dies normalerweise zu einem absturz der vim-instanzen führt. BITTE SCHALTEN sie den tail-modus ab (f7), bevor sie in den bearbeitungsmodus zurückkehren. dies ist STRICTLY ONLY Zum Anzeigen von Protokollen.
Jolly1234
quelle
-1

Führen Sie in Vim Folgendes aus:

!tail -f 

Dadurch wird Vim angehalten, während das abgebrochene untergeordnete Element tail -fim aktuellen Puffer ausgeführt wird. Durch Drücken von Ctrl-Ckehren Sie zum Puffer in Vim zurück.

user65446
quelle
1
Das ist nicht vim, aber einfach taildie Arbeit zu erledigen . Vim ist portabel. Das ist nicht.
Oligofren