Faire défiler la sortie du shell avec la souris dans tmux

256

Le défilement de la souris ne fonctionne pas dans tmux comme cela fonctionne lorsque je lance un shell sans tmux (dans Gnome Terminal). Il semble que tmux envoie les événements de défilement de la souris comme si j’appuyais sur les touches haut / bas. Mais je veux qu’il défile dans l’ historique des sorties du shell . Existe-t-il un moyen de faire fonctionner tmux comme ceci?

Note: Je sais faire défiler avec le clavier (grâce à une autre question ici).

J'ai essayé le défilement à la souris dans deux versions de tmux:

utilisateur31494
la source
1
Je pense que la réponse de bukzor résout votre problème pour tmux 1.5 et plus récent.
Kynan

Réponses:

252

Pour faire défiler l'historique de la sortie, utilisez ^b+ [ Vous pouvez ensuite utiliser M + V pour monter de page et ^ V pour descendre de page. Je ne sais pas si vous pouvez utiliser le réel PgUpet PgDownbien. Mon terminal n'envoie pas ces clés au tmux. Au lieu de cela, il fait défiler lui-même et non l'histoire de tmux.

Pour quitter le mode copie, appuyez sur ESC.

Pour utiliser votre souris dans ce mode (appelé mode copie), appuyez sur ^b+ : et entrez les informations suivantes:

setw -g mouse on

Remarque: Dans tmux <2.1, l’option était nommée mode-mouse, et nonmouse

Maintenant, lorsque vous passez en mode copie, vous pouvez utiliser votre souris pour le faire défiler. Vous pouvez mettre cette commande dans votre ~ / .tmux.conf si vous voulez, afin qu'elle se charge à chaque fois que vous exécutez tmux.

Mise à jour: à partir de tmux 1.5, cette option permet de passer automatiquement en mode Copie à l'aide de la molette de défilement et de revenir en arrière dans la mémoire tampon de défilement tmux. Il n'est plus nécessaire de frapper d'abord Ctrl-B+ [. Le fait de revenir à l'invite termine également le mode de copie automatiquement.

Pavlo
la source
1
Notez que vous devrez peut-être recharger le fichier de configuration si vous avez déjà un serveur tmux en cours d'exécution. blog.sanctum.geek.nz/reloading-tmux-config fichier-source tmux ~ / .tmux.conf
Allan Nienhuis
7
Ne travaille pas pour moi sur OS X.
Ain
2
@Ain - Il existe maintenant 11 versions principales d'OS X. De quelle version parle-t-on exactement?
Ramhound
10
Pour tmux> = 2.1, voir la réponse de @ DannyRe (actuellement très en retrait).
joelostblom
3
set -g mouse ona travaillé pour moi sur macOS tmux 2.1
Miguel Mota
123

Il y a quelques changements pour Tmux 2.1

  • Le mode souris a été réécrit. Il n'y a plus d'options pour:

    • volet de redimensionnement de la souris
    • volet de sélection de la souris
    • fenêtre de sélection de la souris
    • mode-souris

    Au lieu de cela, il n'y a qu'une seule option: "souris" qui active complètement le support de la souris.

Ce serait

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
DannyRe
la source
6
Merci, maintenant la sélection des volets, etc. fonctionne, mais le défilement ne fonctionne pas. Pour que le défilement fonctionne à nouveau, utilisez ceci: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi
1
génial - cela fonctionne même sur cygwin - tmux sur WINDOWS 7
GWD
@Mahdi Cela ne semble pas fonctionner sur osx. Des allusions?
mardi
2
bindne semble plus nécessaire sur tmux 2.3
Theron Luhn
2
+1 pour set -g mouse on. Le commentaire précédent est correct. La liaison n'est plus nécessaire.
Dakusan
63

La version actuelle de tmux (1.5) vous permet simplement d'activer l'option mode-souris et vous permet de faire défiler l'écran avec la molette de la souris.

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

Dans mon .tmux.conf:

set-window-option -g mode-mouse on
bukzor
la source
C'est le comportement que vous voulez vraiment! Le défilement de la souris permet le mode de copie, pas seulement le défilement du tampon alternatif du shell. C'était finalement l'incitation à passer de screen à tmux pour moi. Existe-t-il une option pour obtenir le même comportement également avec Shift + PgUp?
Kynan
1
@kynan: Je persiste personnellement C-A PgUppour faire cela. Vous pouvez lier directement la clé de page vers le haut avec tmux bind-key -n PPage copy-mode -u. Le même thème devrait fonctionner pour shift + pageup si vous le déconnectez de votre terminal local.
bukzor
1
Cela entraîne un comportement étrange dans lequel, lorsque je retourne à la ligne de commande, un caractère supplémentaire est inséré dans l'interface de ligne de commande, ce qui entraîne généralement une erreur de ma première commande. C'est assez énervant.
Chris R
Notez que, même si cela fonctionne bien pour déclencher le défilement avec la souris, cela provoque un comportement étrange lors de la sélection du texte à coller avec le clic du milieu. J'ai fini par préférer Cb pg-up / down (par défaut) car le compromis n'était pas acceptable.
h7r
@ChrisR Je reçois assez cela aussi et ce n'est pas tout à fait cohérent. Est-ce un type [M [M # [M [M # [M [M # [M # [M # de M?
Elijah Lynn
53

Essayez ceci dans votre .tmux.conf

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

Tiré de http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY

John L. Jegutanis
la source
+1 pour le escape-timeréglage
Dakusan
Pour ceux qui s'y demandent, le fichier .tmux.conf est placé dans votre répertoire personnel.
user2647513 le
15

Quelqu'un (d'une source que j'ai perdue) a suggéré d'ajouter ce qui suit à ~.tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Je ne sais pas du tout comment cela fonctionne, mais cela me permet maintenant de faire défiler la molette de la souris à l'intérieur d'une session tmux sans avoir à passer en mode copie de tmux; Je viens de faire défiler la roue et BAM! Ça marche. Notez que j'utilise terminal.app, mais je me souviens que l'OP a donné la réponse à utiliser spécifiquement avec gnome-terminal.

Jed Daniels
la source
1
Jed, merci! Votre conseil fonctionne aussi dans gnome-terminal. Je vais essayer d'utiliser cette configuration pendant un certain temps. Mais il a un inconvénient: le défilement à la souris ne fonctionne pas comme prévu dans less. Si je charge à l' lessintérieur tmux, le défilement de la souris ne fait pas défiler le fichier ouvert less. Il fait défiler tout le terminal. Étrangement, vimse comporte comme prévu à l'intérieur tmuxde votre configuration.
user31494 le
2
Notez qu'à partir de tmux 1.5, cette setw -g mode-mouse onoption est remplacée par l' option qui permet le défilement en mode copie à l'aide de la molette de la souris.
Kynan
3
L’explication est que cette option désactive le verrouillage du défilement sur l’écran secondaire du terminal, ce qui est souhaitable dans la plupart des cas, car les applications demandant le tampon d’écran secondaire (vi, less, tmux, etc.) fournissent leurs propres fonctions de défilement. Remplacer ce verrou dans tmux permet de faire défiler la mémoire tampon d’écran de remplacement du terminal, ce qui ne donne pas le résultat souhaité, sauf quelques cas. Voir cette réponse pour une citation d' man xtermexpliquer autre écran.
Kynan
Hélas, cela ne fonctionne pas dans iTerm
Suan
Cela a eu des résultats positifs avec iTerm 2
Keith Smiley -
5

tmux 2.1 introduit de nouvelles liaisons de souris.

J'ai écrit ces liens tout à l'heure aujourd'hui. Il lie de manière transparente la molette de la souris aux flèches lorsque vous ne vous trouvez pas dans Vim, car Vim est capable d’interpréter les codes bruts de la molette de la souris (pour choisir la fenêtre Vim à faire défiler pour vous en fonction de la souris sur laquelle est placée votre souris).

Cela signifie que nous pouvons enfin utiliser la souris uniquement pour afficher plusieurs pages de manuel et tout ce qui accepte les touches fléchées. Vous pouvez étendre et chaîner la iflogique nécessaire pour implémenter plus de logique pour vos applications.

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

Avec cette nouvelle fonctionnalité de reliure à molette, il est possible d’écrire la molette de la souris sur tout comportement sensible au contexte que vous aimez.

Steven Lu
la source
Je suis maintenant en train de jouer avec l'idée de faire quelque chose d'intéressant avec la molette de la souris. Ce que je ferai probablement, c’est de ne pas mapper la molette sur la bordure, mais de la mapper pour faire défiler les fenêtres tmux lorsque vous avez terminé sur la ligne de statut.
Steven Lu
Quel est le lien vers votre Github? Je voudrais rester au courant de vos efforts! Une autre fonctionnalité que je recherche est de faire double-cliquer pour copier le mot dans le presse-papiers X, comme c'est le cas en dehors de Tmux.
Joeytwiddle
@joeytwiddle Je recommande vivement github.com/NHDaly/tmux-better-mouse-mode , voir mon autre réponse
Steven Lu
3

Gnome-terminal fait de super astuces en traduisant les événements de défilement de la souris en touches fléchées Haut et Bas dans des conditions de défilement restreint "habituel". Par exemple, lorsque vous affichez un texte en utilisant less(cela se produit en particulier lorsque vous lisez un homme), vous pouvez faire défiler le contenu à l' aide j, ket les touches fléchées. Mais aussi , avec gnome-terminal, vous pouvez faire cela avec le défilement de la souris, grâce au truc mentionné.

Donc, je suppose tmuxque la "capture" du terminal est similaire less- et que le même mécanisme est gnome-terminalutilisé: le défilement de la souris se traduit par une pression sur les touches fléchées haut / bas.

Vous pouvez désactiver cette fonctionnalité dans les paramètres de profil et obtenir le défilement régulier en toutes circonstances. Il suffit de décocher la dernière case à cocher dans l'onglet « défilement »: la case à cocher.

Ulidtko
la source
Merci pour l'explication, Uldtko! Mais cela n'aide pas avec le problème de défilement de la souris. Oui, si cette option est désactivée, l’ gnome-terminalenvoi du triple ^[[Aet ^[[Bdu défilement de la souris s’arrête . C'est plus agréable dans tmux(pas moche ^[[A^[[A^[[Adans certains programmes, pas moche défilement historique de commande), mais lesscesse maintenant de défiler sur le défilement de la souris.
user31494
1
Ukrainien? (devinant par les ipersonnages)
dotancohen
1

https://github.com/NHDaly/tmux-better-mouse-mode

Implémentation configurable et riche en fonctionnalités du contrôle de la souris pour les nouveaux tmux. hautement recommandé.

Vous voulez probablement utiliser

set -g @emulate-scroll-for-no-mouse-alternate-buffer "on"

avec elle aussi.

Steven Lu
la source
J'ai installé ceci mais je ne suis plus capable de surligner et de copier du texte avec la souris. Êtes-vous capable de faire ça?
jonathanking le
Oui, il est probable que la configuration de tmux associée à la souris soit en conflit avec celle-ci.
Steven Lu
0

Vous pouvez combiner les idées de reliure des autres réponses pour obtenir un comportement de défilement assez satisfaisant: travailler dans vim change automatiquement le mode de copie dans le terminal et le quitter lorsque vous atteignez le bas vous permet toujours d’utiliser votre molette de souris dans man, less et journalctl.

Mon code:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

vous pouvez ajouter d'autres commandes nécessitant des touches de direction pour le défilement dans la partie grep -e 'man'

J'ai ajouté les touches d'envoi plusieurs fois, donc une coche sur la molette de la souris fera défiler 4 lignes à la fois.

stealz
la source
0

Si vous êtes déjà dans une session tmux, vous pouvez exécuter la commande

set mouse on

Rappel: pour exécuter des commandes, utilisez votre préfixe alors :.

Robert
la source