Wie kann ich den Scrollback-Puffer in Tmux löschen?

185

Zu Ihrer Information, ich verwende Tmux über die Mac OS X Terminal App.

Daya Sharma
quelle
1
Das hat bei mir funktioniert
Mike

Antworten:

211

Dieselbe Frage plagt mich schon seit einiger Zeit. Hier ist das Beste, was ich mir ausgedacht habe. Fügen Sie dies in Ihre .tmux.conf-Datei ein:

bind -n C-k clear-history

Dies bindet Strg-K an den Befehl tmux clear-history. Mit der Option -n nach dem Binden müssen Sie nicht das Befehlspräfix tmux eingeben (standardmäßig Strg-b). Ich benutze bash, also macht Strg-L bereits das Äquivalent zur Eingabe von "clear" in der Befehlszeile. Mit diesen beiden Tasten erhalte ich eine nette Kombination aus Strg-L, Strg-K, die den gesamten Bildlaufpuffer vom Bildschirm entfernt ("Löschen") und dann den gesamten Verlauf löscht (Befehl tmux "Löschen des Verlaufs").

Es ist nicht ganz so schön wie die 1-Tasten-Combos von Terminal, iTerm oder Konsole, um es zu löschen, aber es ist eine Welt, die besser ist, als ständig Clear-History einzugeben.

Juanpaco
quelle
15
Nett. Ich habe bind k send-keys "clear"\; send-keys "Enter"für den Clearing-Teil gearbeitet, aber die Verwendung des integrierten Teils ctrl+list einfacher, und clear-historyes ist eine gute Ergänzung, den Scrollback-Verlauf loszuwerden.
Henrik N
1
Diese Bindung verschraubt meine Fenster, entfernt den gesamten Text von allen Fenstern und entfernt die Ränder um sie herum! Irgendwelche Ideen, was damit los ist?
Ian Vaughan
Huch. Welches Shell-Programm verwenden Sie? Ist zufällig bereits ein Verhalten für Strg + k definiert?
Juanpaco
iTerm2. Ich habe gerade gesehen, dass Strg + k dies bereits ohne den tmux-Bindungssatz tut, daher muss es sich um ein iTerm2-Mapping handeln.
Ian Vaughan
Seltsam. Ich benutze auch iTerm2. Ich habe es seit einiger Zeit nicht mehr aktualisiert, daher kann es sich um einen Versionsunterschied handeln. Ich benutze Ck auch nicht mehr, weil das Probleme mit meinen Vim-Bindungen verursacht hat. Ich benutze jetzt Cn.
Juanpaco
58

Wie @juanpaco richtig angegeben, clear-historyist dies der Befehl zum Löschen des Scrollback-Puffers.
Ich möchte hinzufügen, dass ich im selben Befehl auch löschen möchte, was auf dem Bildschirm angezeigt wird. Durch das Ausgeben eines wird send-keys -Rder Bildschirm zurückgesetzt (gelöscht), daher verwende ich Folgendes in meinem.tmux.conf

bind-key b send-keys -R \; clear-history

Dies löscht den Bildschirm UND den Scrollback-Puffer.

z5h
quelle
1
Direkt aus der tmux-Dokumentation zu send-keys: "Das -R-Flag bewirkt, dass der Terminalstatus zurückgesetzt wird." Sie müssen wahrscheinlich nur aktualisieren.
z5h
20
Der Nachteil der Verwendung von -R besteht darin, dass Ihre aktuelle Eingabezeile ausgeblendet wurde, anders als beim Löschen Ihres Terminals mit Strg + l. Was ich getan habe istbind -n C-l send-keys C-l \; clear-history
Volpato
6
Für diejenigen unter Ihnen, die es nicht wissen (wie ich es nicht getan habe), um zum Status zu gelangen, um den clear-historyBefehl einzugeben , drücken Sie Ctrl+Bund starten Sie den Befehl mit einem Doppelpunkt ( :).
Palswim
1
@volpato Ich mag Ihren Ansatz, aber ich finde, dass immer noch ein 'Bildschirm' des Puffers im Bildlauf zurückbleibt. Keine Ahnung warum. -R löscht die Eingabeaufforderung aus, aber ich habe sie durch Hinzufügen eines zusätzlichen Cm am Ende "gelöst" (aber dann wird sie in die zweite Zeile eingefügt).
Gdogg
2
Sie können dies verdichten send-keys -R C-l \; clear-history.
Ivan
34

In jeder Antwort hier geht es um das Hinzufügen neuer Tastenkombinationen.

Wenn Sie es nur gelegentlich tun möchten, benötigen Sie überhaupt kein Mapping ...

Das Präfix ist standardmäßig <Ctrl-b>

Geben Sie einfach <prefix>:den entsprechenden Bereich ein clear-historyund geben Sie die Eingabetaste ein.

Eines der coolen Dinge an tmux ist, dass Sie einfach einen dieser Befehle ausführen können ... oder sie in einer Shell / einem Skript ausführen können, wie sie tmux command... oder eine Tastenkombination für sie erstellen .

JonnyRaa
quelle
7
Es ist möglich, die ersten drei Zeichen cleeinzugeben und <tab>beim ersten Mal automatisch zu vervollständigen und beim zweiten Mal <up arrow>auf den vorherigen Eintrag zuzugreifen. Auf diese Weise ist es ziemlich schnell.
bct
1
Dies funktioniert bei mir nicht, da beim Starten der Eingabe nach dem <Ctrl-b> the Drücken der Taste c` ein neues Fenster erstellt wird.
Fraxture
@fraxture Ich glaube, Sie verstehen das falsch - nachdem Sie <Strg-b> gedrückt und dann gedrückt haben, erhalten Sie :eine interaktive Eingabeaufforderung - hier geben Sie 'c' ein
JonnyRaa
21

Wenn Sie CTRL-Lplus Clear-History kombinieren möchten , fügen Sie dies zu Ihrem hinzu ~/.tmux.conf:

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

Dies funktioniert sogar, wenn Sie sich beispielsweise in einer MySQL-Shell befinden.

plu
quelle
1
Das scheint nicht zu funktionieren tail -f some.log, oder? Gibt es eine Möglichkeit, dies zu kombinieren ctrl-Z? Kann scheinen, es richtig zu machen.
Aaron Gibralter
19

Ich fand send-keys -Res etwas langsam - hier ist eine andere Möglichkeit, Bildschirm und Verlauf mit einem einzigen Befehl zu löschen

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

Ein verschachtelter tmux-Aufruf wird als offensichtlicher verwendet

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

nicht auf den Bildschirm des aktuellen Text aus der Geschichte löschen - der klaren vergangene Befehl wird in einem separaten Thread zu senden-Tasten ausgeführt werden .

cage433
quelle
5
Es gibt eine Einschränkung bei diesem Ansatz und es ist, dass es nur auf lokalen Shells funktioniert, da es den tmux-Clear-Verlauf als Zeichenfolge sendet, die in den aktiven Bereich geschrieben werden soll. Ich habe es angepasst an:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.
12

Viel einfacher als die meisten anderen habe ich gerade ein Shell-Skript namens erstellt clsund es ausgeführt, wann immer ich meinen Bildschirm und meinen Scrollback-Puffer löschen möchte.

Alles was es ist ist das:

cls

clear;
tmux clear-history;
Brad Parks
quelle
3
Was aber, wenn Sie keinen Zugriff auf die Befehlszeile haben? Zum Beispiel, wenn ein Server ausgeführt wird und Sie die Protokolle überwachen.
Zudduz
Woher würden Sie die Protokolle sehen? Über einen Webserver? Wenn ja, dann verstehe ich nicht, warum tmux beteiligt ist?
Brad Parks
1
Es ist schön, Serverprotokolle und Ihren VIM-Editor gleichzeitig anzeigen zu können.
Zudduz
Verwenden Sie tmux splits? Wenn nicht, teilen Sie einfach Ihr Fenster in zwei und zeigen Sie Ihre Protokolle in einem an und verwenden Sie vim in dem anderen, indem Sie einfach "tmux split" in Ihrer tmux-Sitzung ausführen ... Aber vielleicht verstehe ich nicht, was Sie tun?
Brad Parks
10

Es wurde festgestellt, dass dies in TMUX 2.6 am besten funktioniert, indem der Bildschirm gelöscht und ein Bildlauf durchgeführt wird, die Eingabeaufforderung jedoch weiterhin angezeigt wird.

Verwendet Strg-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
ideasman42
quelle
6

Strg-L wird in Konsolenanwendungen verwendet, um den Bildschirm neu zu zeichnen. Ich fand das, wenn ich daran gebunden warsend-keys -R die Pfeiltasten in einigen Anwendungen (z. B. vim, mc) nicht mehr richtig funktionieren .

Um die Neuzeichnungsfunktion in Konsolenanwendungen beizubehalten, habe ich Folgendes verwendet:

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

Dies setzt voraus, dass die Option tmux aktiviert alternate-screenist (standardmäßig).

Phil
quelle
3

Ich habe einige der oben genannten und andere Quellen verwendet, um Folgendes zu finden:

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

Das führende Leerzeichen in "clear && tmux clear-history" verhindert, dass der Befehl in die Verlaufsdatei geschrieben wird (vorausgesetzt, Sie haben Ihr Shell-Setup, um führende Leerzeichen auf diese Weise zu behandeln; google "hist ignore space" + den Namen Ihrer Shell, um weitere Informationen zu erhalten die Info). Ich möchte, dass dieser Befehl nicht in meinem Verlauf angezeigt wird, da dies eher mit Strg-K im Terminal übereinstimmt.

Die ersten Sendetasten Cu und Sendetasten Ck löschen alles, was derzeit an der Eingabeaufforderung eingegeben wird, um sicherzustellen, dass der "Lösch- und Tmux-Löschverlauf" erfolgreich ist (z. B. wenn Sie an der Eingabeaufforderung "ABCDEFG" eingegeben haben und haben Wenn Sie den Cursor zwischen D und E bewegen, wird sichergestellt, dass "ABCD clear && tmux clear-historyEFG" nicht an die Shell gesendet wird, was fehlschlagen würde.

Mit den Send-Schlüsseln "Up" und den letzten Send-Schlüsseln Cu werden die letzten Elemente aus dem internen Verlauf Ihrer Shells gelöscht. Selbst mit dem oben erwähnten nachgestellten Leerzeichen enthält der interne Verlauf der Shell die Zeile "clear ...". Senden und Strg-u wird dies los.

Zuletzt habe ich in iTerm Strg-k so eingestellt, dass es Strg-a k zugeordnet wird (ich habe mein tmux-Präfix auf Strg-a gesetzt), damit ich Strg-k eingeben kann, was meine Hände nach so vielen Jahren tun möchten so. Ich gehe dazu zu iTerm> Einstellungen> Profile> Schlüssel und füge eine Verknüpfung hinzu, um den Hex-Code "0x01 0x6B" zu senden. Hier gibt es einen großartigen Artikel, der weitere Informationen zur Verwendung von Hex-Codes mit tmux und iTerm enthält: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Das gibt mir so ziemlich Strg-K mit tmux. Das einzige, was mich immer noch nervt, ist, dass das echte Strg-K ohne tmux keine Probleme hat, wenn Sie derzeit etwas an der Eingabeaufforderung eingegeben haben und das, was Sie eingegeben haben, beim Löschen des Bildschirms beibehalten. Wie bereits erwähnt, muss bei diesem Ansatz gelöscht werden, was eingegeben wurde, damit der Befehl "clear ..." nicht fehlschlägt. Aber es ist verdammt nah!

Brett
quelle
2

warum nicht? bind -n C-l send-keys C-l

klebervirgilio
quelle
Ich würde auch gerne wissen, ob es einen Grund gibt, dies nicht zu empfehlen.
Gaston Sanchez
2
Zuallererst ist das nicht notwendig: Im -n C-lGrunde sagt man "Fang das", und dann gibst du sofort dasselbe durch. (dh dies ist ein No-Op.)… Zweitens ist Ihre Absicht deaktiviert, da der Bildschirm⌃L gelöscht wird und nicht ⌃B [der Bildlauf zurück: Wenn Sie drücken und dann nach oben scrollen, sehen Sie, dass der gesamte Bildlauf noch aufgezeichnet ist. Das Ziel dieser Frage ist es, das Scrollback von (tmux) zu löschen , nicht das sichtbare Terminal.
ELLIOTTCABLE
2

Nach viel Recherche und Zeit. Ich habe auf zsh und terminal.app den besten Weg für mich gefunden

Ich benutze prefix-c, um den Bildschirm und prefix-Cden Verlauf und den Bildlaufpuffer zu löschen und keine Zeilen darüber zu lassen, weil ich es ärgerlich finde.

Ohne Vim

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

Mit Vim

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys
Rahul Katariya
quelle
2

Für eine schnelle Lösung zum Löschen einzelner tmux-Fenster können Sie einen Alias ​​einrichten ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
Paul Hale
quelle
1

Ich habe also eine Weile den Ansatz von plu von oben verwendet , aber ich habe die Einschränkungen satt (im Grunde ist der ⌃LDurchlauf bedeutungslos, es sei denn, er wird an ein Programm weitergeleitet, das ihn versteht.)

Daher habe ich die verschiedenen Ansätze in verschiedenen Antworten auf diesen Thread verbessert. Obwohl dieser Ansatz komplex ist, funktioniert er sowohl mit Shells als auch mit anderen Befehlen :

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

Probieren Sie es mit tail -f /private/var/log/system.logoder so!


Vorsichtsmaßnahmen:

Hier gibt es einen wichtigen Hinweis: Dadurch wird die Größe des zu löschenden Bereichs unsichtbar geändert , wenn es sich nicht um eine Shell handelt. Dies kann in einigen Befehlszeilenanwendungen, die auf SIGWINCHes warten, ein Größenänderungsverhalten auslösen . Meine Argumentation ist jedoch, dass dies kein großes Problem ist, da es sich um Programme handelt, die Sie höchstwahrscheinlich sowieso nicht versuchen werden, zu "löschen" .

Darüber hinaus ist die Situation, in der Shell zitiert wird, bereits ein Chaos und kann beim Einbetten leicht zu einer größeren Situation #{pane_current_command}werden. Seien Sie also vorsichtig, möglicherweise müssen Sie dies basierend auf Ihrer default-commandEinstellung ändern .

Gleiches gilt für meine Prüfung des Endes dieses Befehlsabgleichs "sh". Wenn Sie default-commandetwas Ähnliches /bin/bash --loginoder Kompliziertes haben exec, endet der eigentliche Befehl möglicherweise nicht mit "sh"; Verwenden Sie diese Option, ⌃B :um auszuführen, display-message '#{pane_current_command}'wenn Sie sehen möchten, gegen was getestet wird.

ELLIOTTCABLE
quelle