¿Cómo puedo borrar el búfer de desplazamiento en Tmux?

Respuestas:

211

Esta misma pregunta me ha estado atormentando durante bastante tiempo. Aquí está lo mejor que se me ocurrió. Ponga esto en su archivo .tmux.conf:

bind -n C-k clear-history

Esto une ctrl-k al comando tmux clear-history. La opción -n after bind lo hace para que no tenga que emitir el prefijo del comando tmux (ctrl-b por defecto). Yo uso bash, por lo que ctrl-l ya hace el equivalente de escribir "clear" en la línea de comando. Con estas dos teclas obtengo un buen combo ctrl-l, ctrl-k, que mueve todo el búfer de desplazamiento de la pantalla (el "borrar") y luego elimina todo ese historial (el comando tmux "borrar-historial").

No es tan bueno como los combos de 1 tecla de Terminal, iTerm o Konsole para limpiarlo, pero es un mundo mejor que escribir en un historial claro todo el tiempo.

juanpaco
fuente
15
Agradable. Lo he estado haciendo bind k send-keys "clear"\; send-keys "Enter"para la parte de limpieza, pero usar el incorporado ctrl+les más simple, y clear-historydeshacerse del historial de desplazamiento es una buena adición.
Henrik N
1
¡Este enlace arruina mis paneles, elimina todo el texto de todos los paneles y elimina los bordes a su alrededor! ¿Alguna idea de qué pasa con eso?
Ian Vaughan
Yikes ¿Qué programa de shell usas? ¿Por casualidad ya tiene algún comportamiento definido para ctrl + k?
juanpaco
iTerm2. Acabo de ver que ctrl + k ya hace esto sin el conjunto de enlaces tmux, por lo que debe ser una asignación iTerm2.
Ian Vaughan
Extraño. Yo también uso iTerm2. No lo he actualizado durante algún tiempo, por lo que podría ser una diferencia de versión. Tampoco uso Ck porque eso causó problemas con mis enlaces vim. Yo uso Cn ahora.
juanpaco
58

Como @juanpaco declaró correctamente, clear-historyes el comando para borrar el búfer de desplazamiento hacia atrás.
Agregaré que también me gusta borrar lo que está en la pantalla con el mismo comando. Emitir un send-keys -Rrestablecimiento (borra) la pantalla, así que utilizo lo siguiente en mi.tmux.conf

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

Esto borra la pantalla Y el búfer de desplazamiento hacia atrás.

z5h
fuente
1
Directamente de la documentación de tmux en send-keys: "El indicador -R hace que el estado del terminal se restablezca". Probablemente solo necesite actualizar.
z5h
20
El inconveniente de usar -R es que su línea de entrada actual queda oculta, de manera diferente a cuando borra su terminal con Ctrl + l. Lo que hice esbind -n C-l send-keys C-l \; clear-history
volpato
66
Para aquellos de ustedes que no saben (como yo no sabía), para llegar al estado para ingresar el clear-historycomando, presione Ctrl+By luego comience el comando con dos puntos ( :).
palswim
1
@volpato Me gusta su enfoque, pero creo que todavía deja una 'pantalla' del búfer en el desplazamiento hacia atrás. No tengo idea de por qué. -R pone en blanco el mensaje, pero lo 'resolví' agregando un Cm adicional al final (pero luego eso lo coloca en la segunda línea).
Gdogg
2
Puedes condensar esto a send-keys -R C-l \; clear-history.
ivan
35

Cada respuesta aquí habla sobre agregar nuevas asociaciones de teclas.

Si solo quieres hacerlo ocasionalmente, no necesitas un mapeo en absoluto ...

Prefijo predeterminado a <Ctrl-b>

Simplemente escriba <prefix>:el panel correspondiente y luego escriba clear-historyy presione Intro.

Una de las cosas interesantes de tmux es que puede ejecutar cualquiera de los comandos de esa manera ... o ejecutarlos en un shell / script como tmux command... o hacer un atajo de teclado para ellos.

JonnyRaa
fuente
8
Es posible escribir los primeros tres caracteres cle, y luego autocompletar con <tab>la primera vez, luego usar la segunda vez <up arrow>para acceder a la entrada anterior. De esta manera es bastante rápido.
bct
1
Esto no funciona para mí porque cuando empiezo a escribir después de <Ctrl-b> the presionar la tecla c` está configurado para crear una nueva ventana.
fraxture el
@fraxture Creo que malinterpretas: después de presionar <Ctrl-b> y luego presionarlo:
aparece
21

Si desea combinar CTRL-Lplus clear-history, agregue esto a su ~/.tmux.conf:

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

Esto incluso funciona si estás en un shell de MySQL, por ejemplo.

plu
fuente
1
Esto no parece funcionar durante, digamos, tail -f some.log¿verdad? ¿Hay alguna forma de combinar ctrl-Zesto? Puede parecer acertar.
Aaron Gibralter
19

Descubrí que usar send-keys -Res un poco lento: aquí hay otra forma de borrar la pantalla y el historial con un solo comando

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

Una llamada tmux anidada se usa como la más obvia

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

no puede borrar el texto actual de la pantalla del historial: el comando clear-history parece ejecutarse en un hilo separado para enviar claves.

jaula433
fuente
55
Hay una advertencia con este enfoque y es que solo funciona en shells locales, ya que envía el tmux clear-history como cadena para que se escriba en el panel activo. Lo he adaptado 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

Mucho más simple que la mayoría, acabo de crear un script de shell llamado clsy lo ejecuto cada vez que quiero borrar mi pantalla y el búfer de desplazamiento.

Todo lo que es esto es:

cls

clear;
tmux clear-history;
Brad Parks
fuente
3
Pero, ¿y si no tienes acceso a la línea de comando? Por ejemplo, cuando se está ejecutando un servidor y estás viendo los registros.
zudduz
¿desde dónde estarías mirando los registros? ¿Sobre un servidor web? Si es así, entonces no entiendo por qué tmux está involucrado.
Brad Parks el
1
Es bueno poder ver los registros del servidor y su editor vim simultáneamente.
zudduz
¿Usas tmux splits? Si no, simplemente divida su ventana en 2, y vea sus registros en uno, y use vim en el otro simplemente ejecutando `tmux split" dentro de su sesión de tmux ... ¿Pero tal vez no entiendo lo que está haciendo?
Brad Parks,
10

Encontré que esto funciona mejor en TMUX 2.6, borrando la pantalla, desplazándose hacia atrás, pero manteniendo el mensaje que se muestra después.

Utiliza Ctrl-L

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

Ctrl-L se usa en aplicaciones de consola para volver a dibujar la pantalla. Descubrí que cuando se vincula a send-keys -Rél, las teclas de flecha ya no funcionan correctamente en algunas aplicaciones (por ejemplo, vim, mc).

Para conservar la funcionalidad de redibujar en aplicaciones de consola, utilicé:

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

Esto requiere que la opción tmux alternate-screenesté activada (que está por defecto).

Phil
fuente
3

He utilizado algunas de las fuentes anteriores más otras para crear:

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 

El espacio inicial en "clear && tmux clear-history" evita que el comando se escriba en el archivo de historial (siempre que tenga su configuración de shell para tratar los espacios iniciales de esta manera; google "hist ignore space" + el nombre de su shell para obtener más información) info) Me gusta que este comando no aparezca en mi historial, ya que está más en línea con ctrl-k en la Terminal.

Las primeras teclas de envío Cu y teclas de envío Ck borrarán todo lo que se escriba actualmente en la solicitud para asegurarse de que "clear && tmux clear-history" sea exitoso (por ejemplo, si ha escrito "ABCDEFG" en la solicitud y tiene con el cursor entre la D y la E, esto garantiza que "ABCD clear && tmux clear-historyEFG" no se envíe al shell, lo que podría fallar).

Las teclas de envío "Arriba" y las últimas teclas de envío Cu borran los últimos elementos del historial interno de sus shells. Incluso con el espacio final mencionado anteriormente, el historial interno del shell incluirá la línea "claro ...". Enviando y Ctrl-u se deshace de esto.

Por último, en iTerm configuré ctrl-k para asignar a ctrl-a k (tengo mi prefijo tmux configurado en ctrl-a), por lo que puedo escribir ctrl-k, que es lo que mis manos quieren hacer después de tantos años de hacer entonces. Hago esto yendo a iTerm> Preferencias> Perfiles> Claves y agregando un acceso directo para enviar el código hexadecimal "0x01 0x6B". Aquí hay un gran artículo que brinda más información sobre el uso de códigos hexadecimales con tmux e iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Eso casi me da ctrl-k con tmux. Lo único que todavía me molesta es que el verdadero ctrl-k sin tmux no tiene problemas si actualmente tiene algo escrito en el indicador y conservará lo que ha escrito mientras limpia la pantalla. Como se mencionó, este enfoque necesita borrar lo que está escrito para que el comando "borrar ..." no falle. ¡Pero está muy cerca!

Brett
fuente
2

¿Por qué no? bind -n C-l send-keys C-l

Klebervirgilio
fuente
También me gustaría saber si hay una razón para no recomendar esto.
Gaston Sanchez
2
En primer lugar, eso no es necesario: -n C-lbásicamente dice 'atrapa esto', y luego estás pasando eso mismo inmediatamente. (es decir, esto es un no-op.) ... Segundo, su intención está apagada, porque ⌃Lborra la pantalla , no el desplazamiento hacia atrás: si presiona ⌃B [y luego hacia arriba, verá que todo el desplazamiento hacia atrás todavía se registra; el objetivo de esta pregunta es limpiar que scrollback (de tmux), el terminal no visible.
ELLIOTTCABLE
2

Después de mucha investigación y pasar tiempo. He encontrado la mejor manera para mí en zsh y terminal.app

Estoy usando prefix-cpara borrar la pantalla y prefix-Cpara borrar el historial y el búfer de desplazamiento y no dejar líneas arriba porque me resulta molesto.

Sin 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
Rahul Katariya
fuente
2

Para una solución rápida para borrar paneles tmux individuales, puede configurar un alias ...

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

Entonces, he estado usando el enfoque de plu desde arriba por un tiempo, pero me harté de las limitaciones del mismo (básicamente, la ⌃Ltransmisión no tiene sentido a menos que se canalice a un programa que lo entienda).

Así que he mejorado los diversos enfoques en diferentes respuestas a este hilo; Aunque complejo, este enfoque funciona tanto con shells como con otros comandos :

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

Pruébalo con tail -f /private/var/log/system.logo algo así!


Advertencias:

Hay una nota importante aquí: esto es invisiblemente redimensionar el panel que se está borrando, si no es un shell. Esto puede desencadenar un comportamiento de cambio de tamaño en algunas aplicaciones de línea de comandos que escuchan SIGWINCHes; pero mi razonamiento es que este no es un gran problema, porque esos son programas que es muy probable que no intentes "borrar" de todos modos .

Además, la situación de las citas de shell ya es un desastre, y puede convertirse fácilmente en más de uno cuando se incrusta #{pane_current_command}, así que tenga cuidado, es posible que tenga que modificar esto en función de su default-commandconfiguración.

Lo mismo se aplica a mi prueba del final de esa coincidencia de comandos "sh"; Si tiene default-commandalgo parecido /bin/bash --logino algo complicado exec, el comando real puede no terminar con "sh"; use ⌃B :para ejecutar display-message '#{pane_current_command}'si desea ver contra qué se está probando.

ELLIOTTCABLE
fuente