tmux en pratique: tampon de défilement

La différence entre les tampons de défilement terminal et tmux, et comment modifier le mode de copie, le défilement et la sélection à la souris du comportement de tmux.

Ceci est la 3ème partie de ma série d'articles tmux in practice.

Habituellement, les émulateurs de terminal implémentent un tampon de défilement, de sorte que vous pouvez explorer la sortie passée, lorsqu'elle se déplace hors de la vue. tmux, comme d'autres applications de terminal plein écran comme vim, s'exécute dans ce que l'on appelle le tampon d'écran alternatif d'un terminal parent. Le tampon alternatif a des dimensions exactes de largeur et de hauteur comme taille de fenêtre physique.

L'utilisation d'un tampon alternatif a plusieurs effets:

  • Toute sortie qui dépasse la partie visible du tampon alternatif est perdue. Dès que les lignes sont hors de vue, elles sont perdues. Pour éviter la perte d'historique, tmux implémente son propre tampon de défilement «interne». La conséquence de ceci est que vous ne pouvez pas travailler avec le scrollback interne de tmux comme vous le faites habituellement dans votre terminal.
  • Toute sortie produite à l'intérieur de tmux (la même chose est vraie pour vim, nano, man, less, etc.) ne déborde pas dans l'historique de défilement du terminal externe. Lorsque vous fermez votre application plein écran, vous revenez au même état lorsque vous avez lancé l'application et ne voyez plus la sortie de l'intérieur de l'application.

En pratique, si vous avez l'habitude de faire défiler en arrière en utilisant ⌘↑dans votre iTerm et si vous allez faire la même chose à l'intérieur d'une session tmux en cours d'exécution, vous contrôlerez et défilerez le tampon de défilement externe de l'iTerm, plutôt que le tampon de défilement interne du tmux.

La solution est d'utiliser des contrôles spécifiques à tmux pour accéder à son propre tampon de défilement: Ctrl-bpuis [pour entrer en mode copie, utiliser les Down/Upflèches ou PageDownet les PageUptouches, qou Enterpour quitter le mode copie.

Certaines personnes qui trouvent cela ennuyeux - configurer le tampon de défilement tmux pour qu'il soit autorisé à s'afficher dans le tampon de défilement du terminal parent - afin qu'ils puissent simplement utiliser des contrôles de défilement familiers. Voir ce post. Cependant, cette solution se limite à avoir une session tmux avec 1 fenêtre et 1 volet uniquement. Et lorsque vous détachez / fermez une session tmux, le terminal parent est pollué par la sortie de la fenêtre tmux.

Personnellement, j'utilise tmux scrollback sans hacks ci-dessus, mais peaufinez sa configuration pour qu'elle soit plus conviviale et familière.

Tout d'abord, je n'aime pas prefix,[entrer en mode copie. Je me suis habitué à ⌘↑commencer le défilement dans iTerm, et j'ai ajouté les raccourcis clavier suivants:

# trigger copy mode bybind -n M-Up copy-mode

Une fois que vous êtes en mode copie, vous pouvez continuer d'appuyer M-Uppour faire défiler d'une ligne vers le haut. Les commandes habituelles PageDownet PageUpsont disponibles pour faire défiler l'écran entier, et en extra M-PageDownet M-PageUppour faire défiler la moitié de l'écran (vraiment pratique).

# Scroll up/down by 1 line, half screen, whole screenbind -T copy-mode-vi M-Up send-keys -X scroll-upbind -T copy-mode-vi M-Down send-keys -X scroll-downbind -T copy-mode-vi M-PageUp send-keys -X halfpage-upbind -T copy-mode-vi M-PageDown send-keys -X halfpage-downbind -T copy-mode-vi PageDown send-keys -X page-downbind -T copy-mode-vi PageUp send-keys -X page-up

De plus, même lorsque je suis en session tmux, je peux continuer à utiliser ⌘↑et ⌘↓à contrôler le tampon de défilement interne de tmux, plutôt que celui d'iTerm. C'est possible en utilisant un profil iTerm personnalisé avec certaines raccourcis clavier remplacés pour déclencher des actions tmux. Donc ⌘↑pressé dans iTerm envoie juste une M-Upfrappe à la session tmux.

Lisez ma partie précédente de la série «tmux en pratique» pour plus de détails: tmux en pratique: intégration iTerm2 et tmux.

Un autre paramètre par défaut de tmux que je préférerais changer est le défilement de la molette de la souris. Il défile de 5 lignes, ce qui ressemble à un grand saut. Réduisons-le pour faire défiler de 2 lignes:

# When scrolling with mouse wheel, reduce number of scrolled rows per tick to "2" (default is 5)
bind -T copy-mode-vi WheelUpPane select-pane \; send-keys -X -N 2 scroll-upbind -T copy-mode-vi WheelDownPane select-pane \; send-keys -X -N 2 scroll-down

Eh bien, parlons maintenant de la copie de texte une fois que vous êtes en mode copie. Je m'habitue à copier du texte à l'aide de la souris. Activer la prise en charge de la souris:

set -g mouse on

Par défaut, lorsque vous sélectionnez du texte avec la souris dans tmux, il est copié dans la mémoire tampon, et vous êtes immédiatement sorti du mode copie. Votre position de défilement actuelle est réinitialisée à la fin de la sortie et vous êtes mis en mode d'invite de commande. Voyons cela en action:

Comme vous le remarquez, chaque fois que je sélectionne du texte avec la souris, cela me fait sortir du mode copie. C'est vraiment agaçant. Habituellement, lorsque je suis coincé avec une tâche, j'ai tendance à sélectionner du texte ici ou là juste pour méditer (cela m'aide à me concentrer?). Ou vous voudrez peut-être simplement sélectionner un texte à mettre en évidence pour votre collègue assis à côté de vous.

Alors, modifions cela. Nous ne voulons pas être expulsés du mode copie. Nous ne voulons pas que la sélection soit effacée lors de l'événement de fin de glissement de la souris. Le texte de la sélection peut ensuite être copié par un clic gauche de la souris.

# Do not copy selection and cancel copy mode on drag end event# Prefer iTerm style selection: select, then mouse click to copy to bufferunbind -T copy-mode-vi MouseDragEnd1Panebind -T copy-mode-vi MouseDown1Pane select-pane \;\ send-keys -X copy-pipe "pbcopy" \;\ send-keys -X clear-selection

Voyons le résultat:

Pour accéder aux éléments du tampon de copie et coller l'élément le plus récent, utilisez C-pet p:

bind p paste-bufferbind C-p choose-buffer

C'est tout pour aujourd'hui. Restez à l'écoute. Dans la prochaine partie de la série «tmux in practice», nous parlerons de l'intégration du presse-papiers et de la façon de partager du texte copié dans tmux avec le presse-papiers du système (à la fois localement et lorsque vous travaillez à distance, sous OSX et Linux).

BTW, vous pouvez voir tous ces ajustements de configuration en action, il suffit de vérifier mon repo tmux-config.

Tour

Si vous souhaitez contourner complètement le mode de copie tmux et sélectionner du texte via iTerm, maintenez simplement pt> key while dragging you mouse.

Resources and links

shell — What exactly is scrollback and scrollback buffer? — Unix & Linux Stack Exchange — //unix.stackexchange.com/questions/145050/what-exactly-is-scrollback-and-scrollback-buffer

tmux scrollback with iTerm2 • dan.carley.co — //dan.carley.co/blog/2013/01/11/tmux-scrollback-with-iterm2/

tmux copy mouse selected text to clipboard automatically on mouse release — Stack Overflow — //stackoverflow.com/questions/36815879/tmux-copy-mouse-selected-text-to-clipboard-automatically-on-mouse-release

keyboard shortcuts — tmux — scroll up/down with shift + page up/down into a pane — Super User — //superuser.com/questions/702189/tmux-scroll-up-down-with-shift-page-up-down-into-a-pane

[question/request] copy-mode without automatically selecting a pane? · Issue #1021 · tmux/tmux — //github.com/tmux/tmux/issues/1021

ssh — Leaving tmux scrollback in terminal (iTerm2) — Stack Overflow — //stackoverflow.com/questions/12865559/leaving-tmux-scrollback-in-terminal-iterm2

command line — Use terminal scrollbar with tmux — Super User — //superuser.com/questions/310251/use-terminal-scrollbar-with-tmux

Original text