Comment puis-je effacer le tampon de défilement dans Tmux?

185

Pour info, j'utilise Tmux via l'application Mac OS X Terminal.

Daya Sharma
la source
1
Cela a fonctionné pour moi: notes.jerzygangi.com
Mike

Réponses:

211

Cette même question me préoccupe depuis un certain temps. Voici le meilleur que j'ai trouvé. Mettez ceci dans votre fichier .tmux.conf:

bind -n C-k clear-history

Cela lie ctrl-k à la commande tmux clear-history. Le -n après la liaison permet de ne pas avoir à émettre le préfixe de commande tmux (ctrl-b par défaut). J'utilise bash, donc ctrl-l fait déjà l'équivalent de taper "clear" sur la ligne de commande. Avec ces deux touches, j'obtiens un joli combo ctrl-l, ctrl-k, qui déplace tout le tampon de défilement hors de l'écran (le "clear") puis supprime tout cet historique (la commande tmux "clear-history").

Ce n'est pas aussi agréable que les combos à 1 touche de Terminal, iTerm ou Konsole pour l'effacer, mais c'est un monde meilleur que de taper en clair tout le temps.

Juanpaco
la source
15
Agréable. J'ai fait bind k send-keys "clear"\; send-keys "Enter"pour la partie de compensation, mais l'utilisation de la fonction intégrée ctrl+lest plus simple, et clear-historyse débarrasser de l'historique de défilement est un bon ajout.
Henrik N
1
cette reliure vis mes volets vers le haut, supprimant tout le texte de tous les volets et supprime les bordures autour d'eux! Des idées sur ce qui se passe avec ça?
Ian Vaughan
Yikes. Quel programme shell utilisez-vous? At-il déjà défini par hasard un comportement pour ctrl + k?
juanpaco
iTerm2. Je viens de voir que ctrl + k fait déjà cela sans le jeu de liaisons tmux, il doit donc s'agir d'un mappage iTerm2.
Ian Vaughan
Bizarre. J'utilise aussi iTerm2. Je ne l'ai pas mis à jour depuis un certain temps, donc cela pourrait être une différence de version. Je n'utilise plus non plus Ck, car cela posait des problèmes avec mes liaisons vim. J'utilise Cn maintenant.
juanpaco
58

Comme @juanpaco l'a correctement indiqué, clear-historyest la commande pour effacer le tampon de défilement.
J'ajouterai que j'aime aussi effacer ce qui est à l'écran dans la même commande. L'émission d'une send-keys -Rréinitialisation (efface) l'écran, j'utilise donc ce qui suit dans mon.tmux.conf

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

Cela efface l'écran ET la mémoire tampon de défilement.

z5h
la source
1
Directement à partir de la documentation de tmux sur send-keys: "Le drapeau -R provoque la réinitialisation de l'état du terminal." Vous avez probablement juste besoin de mettre à jour.
z5h
20
L'inconvénient d'utiliser -R est que votre ligne d'entrée actuelle est masquée, différemment de lorsque vous effacez votre terminal avec Ctrl + l. Ce que j'ai fait estbind -n C-l send-keys C-l \; clear-history
volpato
6
Pour ceux d'entre vous qui ne le savent pas (comme je ne l'ai pas fait), pour arriver à l'état pour entrer la clear-historycommande, appuyez sur Ctrl+B, puis démarrez la commande avec deux points ( :).
palswim
1
@volpato J'aime votre approche, mais je trouve qu'elle laisse toujours un «écran» du tampon dans le défilement arrière. Je ne sais pas pourquoi. -R efface l'invite, mais je l'ai «résolue» en ajoutant un Cm supplémentaire à la fin (mais cela la place sur la deuxième ligne).
Gdogg
2
Vous pouvez condenser ceci en send-keys -R C-l \; clear-history.
ivan
35

Chaque réponse ici parle de l'ajout de nouvelles liaisons de touches.

Si vous voulez juste le faire occasionnellement, vous n'avez pas du tout besoin de cartographie ...

Le préfixe est par défaut <Ctrl-b>

Tapez simplement <prefix>:dans le volet approprié, puis tapezclear-history et appuyez sur Entrée.

Une des choses intéressantes à propos de tmux est que vous pouvez simplement exécuter l'une des commandes comme celle-ci ... ou les exécuter dans un shell / script comme elles tmux command... ou créer un raccourci clavier pour elles.

JonnyRaa
la source
8
Il est possible de taper les trois premiers caractères cle, puis la saisie semi-automatique avec <tab>à la première fois, puis à la deuxième fois utiliser <up arrow>pour accéder à l'entrée précédente. De cette façon, c'est assez rapide.
bct
1
Cela ne fonctionne pas pour moi car lorsque je commence à taper après avoir <Ctrl-b> the appuyé sur la touche c` est définie pour créer une nouvelle fenêtre.
fraxture le
@fraxture Je pense que vous vous méprenez - après avoir appuyé sur <Ctrl-b> puis appuyez :dessus , cela vous donne une invite interactive - c'est là que vous tapez 'c'
JonnyRaa
21

Si vous souhaitez combiner CTRL-Lplus clear-history, ajoutez ceci à votre ~/.tmux.conf:

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

Cela fonctionne même si vous êtes dans un shell MySQL par exemple.

plu
la source
1
Cela ne semble pas fonctionner pendant, disons tail -f some.log, n'est-ce pas? Y a-t-il un moyen de combiner ctrl-Zavec cela? Peut sembler bien faire les choses.
Aaron Gibralter
19

J'ai trouvé que l'utilisation send-keys -Rétait un peu lente - voici une autre façon d'effacer l'écran et l'historique avec une seule commande

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

Un appel tmux imbriqué est utilisé comme le plus évident

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

ne parvient pas à effacer le texte actuel de l'écran de l'historique - la commande clear-history semble s'exécuter dans un thread séparé pour envoyer les touches.

cage433
la source
5
il y a une mise en garde avec cette approche et c'est qu'elle ne fonctionne que sur les shells locaux, car elle envoie le tmux clear-history sous forme de chaîne à écrire dans le volet actif. Je l'ai adapté à: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

Bien plus simple que la plupart, je viens de créer un script shell appelé cls et l'exécuter chaque fois que je veux effacer mon écran et la mémoire tampon de défilement.

Tout ce que c'est:

cls

clear;
tmux clear-history;
Brad Parks
la source
3
Mais que faire si vous n'avez pas accès à la ligne de commande. Par exemple, lorsqu'un serveur est en cours d'exécution et que vous regardez les journaux.
zudduz
d'où regarderiez-vous les journaux? Sur un serveur Web? Si oui, alors je ne comprends pas pourquoi tmux est impliqué?
Brad Parks
1
C'est bien de pouvoir regarder les journaux du serveur et votre éditeur vim simultanément.
zudduz
Utilisez-vous des splits tmux? Sinon, divisez simplement votre fenêtre en 2, et affichez vos journaux dans l'un, et utilisez vim dans l'autre en exécutant simplement `tmux split" dans votre session tmux ... Mais peut-être que je ne comprends pas ce que vous faites?
Brad Parks
10

J'ai trouvé que cela fonctionne mieux dans TMUX 2.6, en effaçant l'écran, en faisant défiler vers l'arrière, mais en gardant l'invite affichée après.

Utilise Ctrl-L

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

Ctrl-L est utilisé dans les applications de console pour redessiner l'écran. J'ai trouvé que lorsque lié àsend-keys -R les touches fléchées ne fonctionneraient plus correctement dans certaines applications (par exemple, vim, mc).

Pour conserver la fonctionnalité de rafraîchissement dans les applications de console, j'ai utilisé:

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

Cela nécessite que l'option tmux soit activée alternate-screen(ce qui est par défaut).

Phil
la source
3

J'ai utilisé certaines des sources ci-dessus ainsi que d'autres sources pour trouver:

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 

L'espace de début dans "clear && tmux clear-history" empêche la commande d'être écrite dans le fichier d'historique (à condition que vous ayez configuré votre shell pour traiter les espaces de début de cette façon; google "hist ignore space" + le nom de votre shell pour plus Info). J'aime que cette commande n'apparaisse pas dans mon historique car elle est plus en ligne avec ctrl-k dans le terminal.

Les premières touches d'envoi Cu et les touches d'envoi Ck effaceront tout ce qui est actuellement tapé à l'invite pour s'assurer que "clear && tmux clear-history" est réussi (par exemple, si vous avez tapé "ABCDEFG" à l'invite et avez votre curseur entre le D et le E, cela garantit que "ABCD clear && tmux clear-historyEFG" n'est pas envoyé au shell, ce qui échouerait).

Les touches d'envoi "Up" et les dernières touches d'envoi Cu effacent les derniers éléments de l'historique interne de votre shell. Même avec l'espace de fin mentionné ci-dessus, l'historique interne du shell inclura la ligne "clear ...". L'envoi et Ctrl-u s'en débarrasse.

Enfin, dans iTerm, j'ai défini ctrl-k pour mapper sur ctrl-a k (mon préfixe tmux est défini sur ctrl-a), donc je peux taper ctrl-k, ce que mes mains veulent faire après tant d'années de travail alors. Je fais cela, en allant dans iTerm> Préférences> Profils> Clés et en ajoutant un raccourci pour envoyer le code hexadécimal "0x01 0x6B". Il y a un excellent article ici qui donne plus d'informations sur l'utilisation des codes hexadécimaux avec tmux et iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Cela me donne à peu près ctrl-k avec tmux. La seule chose qui me dérange encore un peu, c'est que le vrai ctrl-k sans tmux n'a pas de problèmes si vous avez actuellement quelque chose tapé à l'invite et conservera ce que vous avez tapé tout en effaçant l'écran. Comme mentionné, cette approche doit effacer ce qui est tapé pour que la commande "effacer ..." n'échoue pas. Mais c'est sacrément proche!

Brett
la source
2

pourquoi pas? bind -n C-l send-keys C-l

klebervirgilio
la source
J'aimerais aussi savoir s'il y a une raison de ne pas le recommander.
Gaston Sanchez
2
Tout d'abord, ce n'est pas nécessaire: -n C-ldit en gros «attraper ça», puis vous passez immédiatement la même chose à travers. (c'est-à-dire qu'il s'agit d'un non-op.)… Deuxièmement, votre intention est désactivée, car ⌃Lefface l'écran , pas le défilement arrière: si vous appuyez sur ⌃B [puis faites défiler vers le haut, vous verrez que tout le défilement est toujours enregistré; le but de cette question est de clarifier ce scrollback (de tmux), pas le terminal visible.
ELLIOTTCABLE
2

Après beaucoup de recherches et de temps passé. J'ai trouvé le meilleur moyen pour moi sur zsh et terminal.app

J'utilise prefix-cpour effacer l'écran et prefix-Cpour effacer l'historique et le tampon de défilement et ne laisser aucune ligne au-dessus parce que je trouve cela ennuyeux.

Sans 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

Avec 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
la source
2

Pour une solution rapide pour effacer les volets tmux individuels, vous pouvez configurer un alias ...

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

Donc, j'ai utilisé plu approche de d'en haut depuis un moment, mais j'en ai eu marre de ses limitations (en gros, le ⌃Lpassage n'a aucun sens à moins d'être redirigé vers un programme qui le comprend).

J'ai donc amélioré les différentes approches dans différentes réponses à ce fil; bien que complexe, cette approche fonctionne avec les coques et autres commandes :

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

Essayez avec tail -f /private/var/log/system.log ou quelque chose!


Mises en garde:

Il y a une remarque importante ici: il s'agit de redimensionner de manière invisible le volet en cours d'effacement, si ce n'est pas un shell. Cela peut déclencher un comportement de redimensionnement dans certaines applications de ligne de commande à l'écoute de SIGWINCHes; mais mon raisonnement est que ce n'est pas un gros problème, parce que ce sont des programmes que vous n'essaierez probablement pas de `` nettoyer '' toute façon .

En outre, la situation en citant coquille est déjà un gâchis, et peut facilement devenir plus d'un lors de l' intégration#{pane_current_command} , alors soyez prudent, vous devrez peut-être modifier cela en fonction de vos default-commandparamètres.

La même chose s'applique à mes tests de la fin de cette correspondance de commande "sh"; si vous avez default-commandquelque chose comme /bin/bash --loginou quelque chose de compliqué impliquant exec, la commande réelle peut ne pas se terminer par "sh"; utilisez ⌃B :pour exécuter display-message '#{pane_current_command}'si vous voulez voir ce qui est testé.

ELLIOTTCABLE
la source