web-dev-qa-db-fra.com

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

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

157
Daya Sharma

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

bind -n C-k clear-history

Ceci lie ctrl-k à la commande tmux clear-history. Avec -n after bind, vous n'avez donc pas à émettre le préfixe de la 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 de l'écran (le "clear") puis supprime tout cet historique (la commande tmux "clear-history").

Ce n'est pas tout à fait aussi agréable que les combos à une touche de Terminal, iTerm ou Konsole pour le nettoyer, mais c'est un monde meilleur que de taper tout le temps dans l'historique sans tache.

187
juanpaco

Comme @juanpaco a correctement déclaré, clear-history est la commande pour effacer le tampon de défilement.
J'ajouterai que j'aime bien effacer ce qui est à l'écran dans la même commande. Émettre un send-keys -R _ réinitialise (efface) l’écran, j’utilise ce qui suit dans mon .tmux.conf

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

Ceci efface l'écran ET le tampon de défilement.

52
z5h

Chaque réponse ici parle de l'ajout de nouvelles raccourcis clavier.

Si vous voulez simplement le faire de temps en temps, vous n'avez pas du tout besoin de cartographie ...

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

Il suffit de taper <prefix>: dans le volet approprié, puis tapez clear-history et appuyez sur enter.

Un des avantages de tmux est que vous pouvez exécuter n'importe quelle commande de ce type ... ou les exécuter dans un shell/script comme tmux command ... ou créez un raccourci clavier pour eux.

22
JonnyRaa

Si vous voulez combiner CTRL-L plus 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.

20
plu

J'ai trouvé en utilisant send-keys -R être un peu lent - voici un autre moyen d'effacer l'écran et l'historique en une seule commande

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

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

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

échoue pour effacer le texte actuel de l'écran de l'historique - la commande clear-history semble s'exécuter dans un fil séparé pour envoyer des clés.

17
cage433

Bien plus simple que la plupart des autres, je viens de créer un script Shell appelé cls et de le lancer chaque fois que je veux effacer mon tampon d’écran et de défilement.

Tout ça c'est ça:

cls

clear;
tmux clear-history;
10
Brad Parks

Cela fonctionne mieux dans TMUX 2.6: effacement de l’écran, défilement, mais maintien de l’invite après.

Utilise Ctrl-L

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

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

Pour conserver la fonctionnalité de mise à jour dans les applications de la 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 l'option tmux alternate-screen être sur (ce qui est par défaut).

5
Phil

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

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 l'écriture de la commande dans le fichier d'historique (à condition que votre configuration de shell puisse traiter les espaces de début de cette façon; google "hist ignore space" + le nom de votre shell pour plus d'informations. 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 Ck effacent tout ce qui est actuellement saisi à l'invite afin de s'assurer que l'historique "clear && tmux clear-history" réussit (par exemple, si vous avez saisi "ABCDEFG" à l'invite et que vous 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 C-u effacent les derniers éléments de l'historique interne de votre shell. Même avec l’espace de fuite mentionné ci-dessus, l’historique interne de Shell inclura la ligne "clair ...". Envoi et Ctrl-u se débarrasse de cela.

Enfin, dans iTerm, je mets ctrl-k pour mapper sur ctrl-a k (mon préfixe tmux est défini sur ctrl-a), je peux donc taper ctrl-k, ce que mes mains veulent faire après tant d'années de travail alors. Je le fais en allant dans iTerm> Préférences> Profils> Touches 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 blesse encore un peu, c'est que le vrai ctrl-k sans tmux ne pose pas de problème si vous avez 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 "clear ..." n'échoue pas. Mais c'est sacrément proche!

2
Brett

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

J'utilise prefix-c pour effacer l'écran et prefix-C pour effacer l’historique et le tampon de défilement en ne laissant aucune ligne au-dessus car 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
2
Rahul Katariya

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

1
klebervirgilio

Donc, j’utilise l’approche de pld’en haut depuis un moment, mais j’en ai marre de ses limitations (en gros, le ⌃L transmis n’a de sens que s’il est dirigé 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 deux shells 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-le avec tail -f /private/var/log/system.log ou quelque chose!


Mises en garde:

Il y a une note importante ici: ceci est invisible redimensionnement le volet est effacé, si ce n'est pas un Shell. Cela peut déclencher un comportement de redimensionnement dans certaines applications de ligne de commande écoutant SIGWINCHes; mais je pense que ce n’est pas un gros problème, car il s’agit de programmes pour lesquels vous ne tenterez probablement pas d’être "clairs" de toute façon.

En outre, la situation des citations de shell est déjà un désordre et peut facilement devenir plus lors de l’intégration #{pane_current_command}, soyez donc prudent, vous devrez peut-être modifier cela en fonction de votre default-command réglage.

La même chose s'applique à mon test de la fin de cette commande correspondant à "sh"; si tu as un default-command de quelque chose comme /bin/bash --login ou quelque chose de compliqué impliquant exec, la commande actuelle ne peut pas se terminer par "sh"; utilisation ⌃B : éxécuter display-message '#{pane_current_command}' si vous voulez voir ce qui est testé.

1
ELLIOTTCABLE