web-dev-qa-db-fra.com

Comment faire défiler les volets à l'intérieur d'une fenêtre dans tmux comme dans l'écran?

Je pensais Déplacer le volet tmux vers la fenêtre était la même question mais cela ne semble pas l'être.

Venant d'utiliser GNU écran régulièrement, je cherche tmux pour faire les mêmes choses. L'une des choses que je fais régulièrement est d'ouvrir deux fenêtres différentes, une avec du code ouvert dans vim, et quelques fenêtres de terminaux ouvertes pour tester le code, et parfois une ou deux fenêtres pour diverses autres choses. Je divise l'écran verticalement et souvent la fenêtre vim dans le volet supérieur, puis l'une des autres fenêtres dans le fléau inférieur.

Les principales commandes que j'utilise ensuite sont Ctrla,Tab pour tourner entre les volets et Ctrla,n pour faire pivoter entre les fenêtres d'un volet. Par exemple, avec vim dans le volet supérieur, je bascule vers le volet inférieur, puis je tourne à travers les autres terminaux, faisant tout ce dont j'ai besoin. L'écran reste divisé tout le temps.

Le problème est que je ne trouve pas de capacité comparable à celle de l'écran Ctrla,n dans tmux. Changer de fenêtre ne semble pas fonctionner à l'intérieur d'un volet, mais saute complètement. Si l'écran est divisé, les deux seules options semblent être de passer à une fenêtre qui n'est pas divisée, puis de la diviser ou de faire une sous-division d'un volet. Ce que je cherchais non plus.

Suggestions (en plus de simplement coller à l'écran)?

45
FooBar

tmux et screen ont des modèles différents donc il n'y a pas d'équivalent exact.

En termes écran, un fractionnement vous permet d'afficher plusieurs fenêtres en même temps. next (C-a n) fait pivoter les fenêtres dans la partie active du fractionnement; cela vous permet de faire pivoter les fenêtres "masquées" dans la région active du fractionnement.

En termes tmux, un fractionnement divise une fenêtre en un ou plusieurs volets. Chaque partie d'une fenêtre fractionnée est un volet individuel, les volets ne sont jamais masqués (si une fenêtre est sélectionnée (visible), tous ses volets le sont également) et un volet ne peut être utilisé que dans un seul fractionnement d'une fenêtre (un volet peut pas être dans plusieurs fenêtres, et il ne peut pas être dans plusieurs divisions de la même fenêtre). Il existe des commandes pour déplacer les volets dans (ou entre) les fenêtres, mais pas de la même manière que next dans écran.


Vous pouvez utiliser une liaison comme celle-ci pour organiser un effet similaire:

bind-key C-n swap-pane -s :+.top \; rotate-window -Ut :+

Vous voudrez probablement mettre ceci dans votre ~/.tmux.conf fichier, mais vous pouvez simplement le taper/coller après Prefix: pour le lier dans votre instance de serveur actuelle.

Pour utiliser la liaison, choisissez votre "fenêtre principale", divisez-la, créez une fenêtre "conteneur de volet" immédiatement après la "fenêtre principale", puis utilisez la liaison pour faire pivoter n'importe quel volet de la "fenêtre principale" parmi le groupe dans le " fenêtre "Conteneur de volet".

Voici comment créer la configuration:

  • Choisissez une fenêtre à utiliser comme "fenêtre principale". Commencez (par exemple) Vim dedans.

  • Divisez votre "fenêtre principale" en deux volets.

    Par exemple. Prefix" (:split-window)

    Vous pouvez utiliser ce volet comme fenêtre de test (ou visionneuse de journaux, ou autre).

  • Créez une nouvelle fenêtre (le "conteneur de volet") immédiatement après votre fenêtre principale.

    Par exemple. Prefixc (:new-window)

    Il est important qu'aucune autre fenêtre ne se place entre les index de la "fenêtre principale" et la fenêtre du "conteneur de volet" (+ dans les spécificateurs de fenêtre utilisés dans les commandes liées signifie "la fenêtre numérotée immédiatement supérieure").

  • Divisez cette fenêtre en plusieurs volets. Pour faire pivoter trois volets, divisez cette fenêtre en deux volets (le troisième volet est celui de la "fenêtre principale").

    Peut-être avez-vous besoin d'un Shell pour git, et d'un Shell pour exécuter une interface de base de données. Mettez chacun dans un volet séparé dans cette fenêtre "conteneur de volet".

  • Revenez à votre "fenêtre principale". Sélectionnez le volet que vous souhaitez "faire pivoter".

    Vous pouvez utiliser PrefixUp/Down/Left/Right pour se déplacer parmi les volets.

  • Appelez la liaison pour échanger le volet actuel avec le premier volet dans la fenêtre "conteneur de volet" et ("en arrière-plan") faites pivoter les volets à l'intérieur de la fenêtre "conteneur de volet" (afin que la prochaine fois que vous exécutez la liaison, la première commande échange avec le volet "suivant" de la séquence).

    PrefixControl-n (la liaison utilise C-n, mais vous pouvez changer cela en ce que vous voulez).

  • Pour faire défiler les volets en arrière, vous pouvez utiliser les éléments suivants:

bind-key C-p swap-pane -s: +. bottom \; rotation-fenêtre -Dt: +
31
Chris Johnsen

Je crois que ce que vous cherchez c'est Ctrlb+ (). Ceux-ci vous permettront de vous déplacer entre les volets.

46
sparticvs

utilisation bind -r, vous pouvez donc appuyer une fois sur prefix, puis sur d'autres touches dans une séquence pour localiser votre volet. Le délai peut être ajusté de repeat-time. Vérifier man tmux

bind -r Tab select-pane -t :.+

Si vous préférez hjkl,

bind -r h select-pane -L
bind -r j select-pane -D
bind -r k select-pane -U
bind -r l select-pane -R
8
zhazha

Voici une petite conf qui vous permet de passer à des volets ou fenêtres plus anciens en utilisant les raccourcis ALT ou MAJ + flèche. Pas besoin d'utiliser le préfixe clé est confortable.

## NAVIGATION: ############################

# Switch panes 
# Usage: "ALT+arrow keys" (without prefix key)
# from https://Gist.github.com/spicycode
bind -n M-Left select-pane -L
bind -n M-Right select-pane -R
bind -n M-Up select-pane -U
bind -n M-Down select-pane -D

# Switch windows 
# usage: "SHIFT+arrow" (without prefix key)
bind -n S-Left  previous-window
bind -n S-Right next-window

Si vous êtes plus paresseux que moi, vous pourriez également être intéressé par le code suivant qui permet la navigation dans les volets avec la souris. (utilisation: préfixe de touche + m pour allumer, M pour l'éteindre)

## MOUSE CONTROL: #########################
set -g mode-mouse off
set -g mouse-resize-pane off
set -g mouse-select-pane off
set -g mouse-select-window off

# Toggle mouse on 
bind m \
    set -g mode-mouse on \;\
    set -g mouse-resize-pane on \;\
    set -g mouse-select-pane on \;\
    set -g mouse-select-window on \;\
    display 'Mouse: ON'

# Toggle mouse off
bind M \
    set -g mode-mouse off \;\
    set -g mouse-resize-pane off \;\
    set -g mouse-select-pane off \;\
    set -g mouse-select-window off \;\
    display 'Mouse: OFF'

cette configuration devrait fonctionner fonctionne à coup sûr pour tmux 1.6 à 1.9.

2
xaa

Cette réponse vous donne deux volets, où les deux volets contiennent le même ensemble de fenêtres, mais chaque volet peut basculer entre les fenêtres indépendamment.

L'approche tmux consiste à utiliser trois sessions:

  • une session externe pour les volets ,
  • une session interne pour les fenêtres (vous pouvez y attacher à partir d'un volet),
  • une vue secondaire sur la session interne (pour l'autre volet).

Oui, c'est philosophie UNIX devenu fou. Commençons:

# Create a session to hold the multiple windows
$ tmux new-session -s inner

    <Ctrl-b> c   to create a few windows, run some things

    <Ctrl-b> d   to detach, but leave it running

# Create a session to hold multiple panes (the view)
$ tmux new-session -s outer

    <Ctrl-b> "   to split

# Open the inner session in the current (bottom) pane
$ unset TMUX ; tmux attach -t inner

Vous pouvez maintenant basculer vers le volet supérieur et ouvrir Vim comme d'habitude. Pour parcourir les fenêtres de la session interne (le volet inférieur), vous devrez utiliser Ctrl-bCtrl-bn et p.

En plus: c'est un peu compliqué mais vous pouvez toujours changer le préfixe de la session externe, par ex. à Ctrl-a, comme ça:

<Ctrl-b> :set-option prefix C-a

Alors ce serait juste Ctrl-bn et p pour faire défiler les fenêtres intérieures, et Ctrl-ao pour faire défiler les volets extérieurs.

OK maintenant, au lieu d'ouvrir Vim dans le volet supérieur, connectons-nous à nouveau à votre session interne. Quittez vim et utilisez cette fois un new-session commande (notamment avec -t ne pas -s):

$ tmux new-session -t inner

Voila! Vous pouvez désormais parcourir les fenêtres des volets supérieur et inférieur.

La raison pour laquelle nous devons utiliser new-session -t la deuxième fois est que si nous devions simplement faire attach -t encore une fois, les volets supérieur et inférieur seront synchronisés, affichant toujours la même fenêtre, ce qui n'est pas ce que vous voulez. Pour permettre à ce volet de se déplacer à travers les fenêtres indépendamment de l'autre volet, nous créons une nouvelle session de "visualisation" mais connectons son arrière-plan directement à la session existante qui contient les fenêtres. Ceci est également connu comme " sessions groupées ". (Soit dit en passant, ce lien suggère également d'utiliser [un]link-window pour déplacer les fenêtres entre les sessions.)

Bien sûr, pour la symétrie, vous auriez pu exécuter tmux new-session -t inner dans le volet inférieur également, au lieu de attach. Dans ce cas, vous exécuteriez 4 instances de tmux (plus un processus tmux de plus pour le serveur)!

2
joeytwiddle

Mettez le code suivant dans votre .tmux.conf:

# cycle prev/next pane
bind -n S-right select-pane -t :.+
bind -n S-left select-pane -t :.-

Recharger la configuration, puis vous pouvez appuyer sur (directement sans clé de préfixe) Shift+ pour faire défiler les volets dans le sens horaire, et Shift+ pour faire un cycle en sens inverse.

Testé dans Tmux 2.8.


Dans le cas où vous ne souhaitez pas modifier la configuration, prefix+o est la liaison de touches par défaut pour le cycle horaire. J'ai parfois trouvé cette liaison de clé, puis je reçois la commande de tmux list-keys et l'utiliser pour mes propres raccourcis clavier:

bind-key    -T prefix       o                 select-pane -t :.+
1
Reorx