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-b
puis [
pour entrer en mode copie, utiliser les Down/Up
flèches ou PageDown
et les PageUp
touches, q
ou Enter
pour 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-Up
pour faire défiler d'une ligne vers le haut. Les commandes habituelles PageDown
et PageUp
sont disponibles pour faire défiler l'écran entier, et en extra M-PageDown
et M-PageUp
pour 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-Up
frappe à 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-p
et 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
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