Come posso cancellare il buffer di scrollback in Tmux?


Risposte:


211

Questa stessa domanda mi sta tormentando da un po 'di tempo. Ecco il meglio che ho pensato. Inserisci questo nel tuo file .tmux.conf:

bind -n C-k clear-history

Ciò lega ctrl-k al comando tmux clear-history. Il bind -n dopo lo rende così non è necessario emettere il prefisso del comando tmux (ctrl-b per impostazione predefinita). Uso bash, quindi ctrl-l fa già l'equivalente di digitare "cancella" dalla riga di comando. Con questi due tasti ottengo una bella combinazione ctrl-l, ctrl-k, che sposta tutto il buffer di scorrimento dallo schermo (il "cancella") e quindi elimina tutta quella cronologia (il comando tmux "cancella cronologia").

Non è così carino come le combinazioni a 1 tasto di Terminal, iTerm o Konsole per cancellarlo, ma è un mondo migliore che scrivere sempre in Clear-History.


15
Bello. L'ho fatto bind k send-keys "clear"\; send-keys "Enter"per la parte di pulizia, ma l'uso del built-in ctrl+lè più semplice e clear-historysbarazzarsi della cronologia di scrollback è una buona aggiunta.
Henrik N,

1
questa rilegatura avvita i miei riquadri, rimuovendo tutto il testo da tutti i riquadri e rimuove i bordi intorno a loro! Qualche idea su cosa succede?
Ian Vaughan,

Yikes. Quale programma di shell usi? Per caso ha già definito un comportamento per ctrl + k?
juanpaco,

iTerm2. Ho appena visto che ctrl + k lo fa già senza il set di associazione tmux, quindi deve essere una mappatura iTerm2.
Ian Vaughan,

Strano. Uso anche iTerm2. Non l'ho aggiornato da qualche tempo, quindi potrebbe essere una differenza di versione. Inoltre non uso più Ck, perché ciò ha causato problemi con i miei collegamenti vim. Adesso uso Cn.
juanpaco,

58

Come affermato correttamente da @juanpaco, clear-historyè il comando per cancellare il buffer di scrollback.
Aggiungo che mi piace anche cancellare ciò che è sullo schermo con lo stesso comando. L'emissione di un send-keys -Rreset (cancella) lo schermo, quindi uso quanto segue nel mio.tmux.conf

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

Questo cancella lo schermo E il buffer di scorrimento.


1
Direttamente dalla documentazione di tmux su send-keys: "Il flag -R provoca il ripristino dello stato del terminale." Probabilmente devi solo aggiornare.
z5h,

20
Lo svantaggio dell'uso di -R è che la riga di input corrente diventa nascosta, diversamente da quando si cancella il terminale con Ctrl + l. Quello che ho fatto è statobind -n C-l send-keys C-l \; clear-history
volpato il

6
Per quelli di voi che non sanno (come non l'ho fatto io), per arrivare allo stato per inserire il clear-historycomando, premere Ctrl+B, quindi avviare il comando con due punti ( :).
Palswim,

1
@volpato Mi piace il tuo approccio, ma trovo che lasci ancora uno 'schermo' del buffer nella scroll back. Non ho idea del perché. -R cancella il prompt, ma l'ho "risolto" aggiungendo un Cm extra alla fine (ma poi lo mette sulla seconda riga).
Gdogg,

2
Puoi condensarlo a send-keys -R C-l \; clear-history.
Ivan

35

Ogni risposta qui parla dell'aggiunta di nuovi collegamenti chiave.

Se vuoi solo farlo di tanto in tanto non hai bisogno di una mappatura ...

Il prefisso predefinito è <Ctrl-b>

Basta digitare <prefix>:nel riquadro pertinente e quindi digitare clear-historye premere Invio.

Una delle cose interessanti di tmux è che puoi semplicemente eseguire uno qualsiasi dei comandi come quello ... o eseguirli in una shell / copiarli come tmux command... o creare una scorciatoia da tastiera per loro.


8
È possibile digitare i primi tre caratteri cle, quindi completare automaticamente con <tab>la prima volta, quindi utilizzare la seconda volta <up arrow>per accedere alla voce precedente. In questo modo è abbastanza veloce.
bct

1
Questo non funziona per me perché quando inizio a digitare dopo aver <Ctrl-b> the premuto il tasto c` è impostato per creare una nuova finestra.
fraternità

@fraxture Penso che tu fraintenda - dopo aver premuto <Ctrl-b> e poi premendolo :ti dà un prompt interattivo - è lì che dovresti digitare 'c'
JonnyRaa

21

Se desideri combinare CTRL-Lpiù cronologia chiara, aggiungi questo al tuo ~/.tmux.conf:

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

Funziona anche se, ad esempio, ti trovi in ​​una shell MySQL.


1
Questo non sembra funzionare durante, diciamo tail -f some.log, giusto? C'è un modo per combinare ctrl-Zcon questo? Sembra che riesca a farlo bene.
Aaron Gibralter,

19

Ho scoperto send-keys -Rche essere un po 'lento: ecco un altro modo per cancellare schermo e cronologia con un solo comando

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

Una chiamata tmux nidificata viene utilizzata come la più ovvia

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

non riesce a cancellare il testo corrente dello schermo dalla cronologia - il comando clear-history sembra essere eseguito in un thread separato per inviare le chiavi.


5
c'è un avvertimento con questo approccio ed è che funziona solo su shell locali, perché invia tmux clear-history come stringa da scrivere nel riquadro attivo. L'ho adattato a: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

Molto più semplice della maggior parte, ho appena creato uno script shell chiamato clsed eseguirlo ogni volta che voglio cancellare il mio schermo e il buffer di scorrimento.

Tutto ciò che è è questo:

cls

clear;
tmux clear-history;

3
Ma cosa succede se non si ha accesso alla riga di comando. Come quando un server è in esecuzione e stai guardando i registri.
Zudduz,

da dove guarderesti i registri? Oltre un server web? Se è così, allora non capisco perché tmux è coinvolto?
Brad Parks,

1
È bello poter guardare contemporaneamente i log del server e l'editor Vim.
Zudduz,

Usi tmux split? In caso contrario, basta dividere la finestra in 2, visualizzare i log in uno e utilizzare vim nell'altro semplicemente eseguendo "tmux split" all'interno della sessione di tmux ... Ma forse non sto ottenendo quello che stai facendo?
Brad Parks,

10

Trovato che funziona meglio in TMUX 2.6, cancellando lo schermo, scrollback, ma mantenendo il prompt visualizzato dopo.

Usa Ctrl-L

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

6

Ctrl-L viene utilizzato nelle applicazioni console per ridisegnare lo schermo. Ho scoperto che se associato ad send-keys -Resso, i tasti freccia non funzionerebbero più correttamente in alcune applicazioni (ad esempio vim, mc).

Per conservare la funzionalità di ridisegno nelle applicazioni console, ho usato:

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

Ciò richiede che l'opzione tmux alternate-screensia attiva (che è per impostazione predefinita).


3

Ho usato alcune delle precedenti e altre fonti per trovare:

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 

Lo spazio iniziale in "clear && tmux clear-history" impedisce che il comando venga scritto nel file di cronologia (a condizione che tu abbia la tua configurazione della shell per trattare gli spazi iniziali in questo modo; google "hist ignore space" + il nome della tua shell per ulteriori informazioni Informazioni). Mi piace che questo comando non venga visualizzato nella mia cronologia poiché è più in linea con ctrl-k nel Terminale.

Le prime chiavi di invio Cu e le chiavi di invio Ck cancelleranno tutto ciò che è attualmente digitato al prompt per garantire che "cancella &&mm clear-history" abbia esito positivo (ad esempio, se hai digitato "ABCDEFG" al prompt e hai il tuo cursore tra la D e la E, questo assicura che "ABCD clear && tmux clear-historyEFG" non venga inviato alla shell, il che fallirebbe).

I tasti di invio "Su" e gli ultimi tasti di invio Cu cancellano gli ultimi elementi dalla cronologia interna delle shell. Anche con lo spazio finale menzionato sopra, la storia interna della shell includerà la riga "clear ...". Inviando e Ctrl-u si sbarazza di questo.

Infine, in iTerm ho impostato ctrl-k per mappare su ctrl-a k (ho il mio prefisso tmux impostato su ctrl-a), quindi posso digitare ctrl-k che è ciò che le mie mani vogliono fare da tanti anni così. Faccio questo, andando su iTerm> Preferenze> Profili> Tasti e aggiungendo un collegamento per inviare il codice esadecimale "0x01 0x6B". C'è un ottimo articolo qui che fornisce maggiori informazioni sull'uso dei codici esadecimali con tmux e iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Questo mi dà praticamente ctrl-k con tmux. L'unica cosa che mi tormenta ancora è che il vero ctrl-k senza tmux non ha problemi se al momento hai qualcosa digitato al prompt e manterrà ciò che hai digitato mentre cancelli lo schermo. Come accennato, questo approccio deve cancellare ciò che viene digitato in modo che il comando "cancella ..." non fallisca. Ma è abbastanza vicino!


2

perchè no? bind -n C-l send-keys C-l


Vorrei sapere anche a me se c'è un motivo per non consigliarlo.
Gaston Sanchez,

2
Prima di tutto, non è necessario: in -n C-lpratica dice "prendi questo", e poi passi immediatamente la stessa cosa. (cioè questo è un no-op.)… Secondo, il tuo intento è spento, perché ⌃Lcancella lo schermo , non lo scorrimento indietro: se premi ⌃B [e poi scorri verso l'alto, vedrai che tutto lo scorrimento è ancora registrato; l'obiettivo di questa domanda è quello di cancellare quel scrollback (di tmux), non il terminale visibile.
ELLIOTTCABLE

2

Dopo molte ricerche e tempo trascorso. Ho trovato il modo migliore per me su zsh e terminal.app

Sto usando prefix-cper cancellare lo schermo e prefix-Cper cancellare la cronologia e il buffer di scorrimento e senza lasciare righe sopra perché lo trovo fastidioso.

Senza 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

Con 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

2

Per una soluzione rapida per cancellare i singoli riquadri tmux è possibile impostare un alias ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'

1

Quindi, ho usato l'approccio di plu dall'alto per un po ', ma mi sono stufato delle sue limitazioni (in sostanza, il ⌃Lpassaggio è insignificante a meno che non sia collegato a un programma che lo capisca).

Quindi ho migliorato i vari approcci in diverse risposte a questo thread; sebbene complesso, questo approccio funziona con entrambe le shell e altri comandi :

# ⌃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"

Provalo con tail -f /private/var/log/system.logo qualcosa del genere!


Avvertenze:

C'è una nota importante qui: questo è il ridimensionamento invisibile del riquadro da cancellare, se non è una shell. Ciò può innescare il comportamento di ridimensionamento in alcune applicazioni della riga di comando che ascoltano SIGWINCHes; ma il mio ragionamento è che questo non è un grosso problema, perché quelli sono programmi che molto probabilmente non proverai a "cancellare" comunque .

Inoltre, la situazione di quotazione della shell è già un disastro e può facilmente diventare più complicata durante l'incorporamento #{pane_current_command}, quindi fai attenzione, potresti doverlo modificare in base alle tue default-commandimpostazioni.

Lo stesso vale per il mio test della fine di quel comando corrispondente "sh"; se hai default-commandqualcosa di simile /bin/bash --logino qualcosa di complicato che coinvolge exec, il comando effettivo potrebbe non finire con "sh"; utilizzare ⌃B :per eseguire display-message '#{pane_current_command}'se si desidera vedere ciò che viene testato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.