web-dev-qa-db-fra.com

Mode de copie tmux - sélection d'un bloc de texte

J'utilise tmux avec les touches vi, et copier/coller fonctionne bien tant que vous sélectionnez une ligne de texte ou si vous n'avez qu'une seule fenêtre. Lorsque je veux sélectionner un bloc de texte (plusieurs lignes, mais pas toute la largeur), je rencontre des problèmes. Si plusieurs fenêtres vim sont ouvertes, le texte sélectionné sera sélectionné dans toutes les fenêtres. Ce dont j'ai besoin, c'est de sélectionner le texte uniquement dans une fenêtre. C’est-à-dire comme une sélection visuelle dans vim.

Est-ce possible?

38
Srećko Toroman

Assurez-vous de vérifier le bas de ce post pour les liaisons nécessaires qui doivent aller dans votre fichier .tmux.conf.

Je suppose que votre clé de préfixe est C-a:

  • C-a signifie: appuyez sur Ctrl + A
  • C-a [signifie: appuyez sur Ctrl + A puis appuyez [

Pour faire une sélection rectangle de texte de (1,1) à (2,2) dans tmux:

  • Aller en mode copie: C-a [
  • Déplacer le milieu d'une ligne
  • Appuyez sur C-v
  • Espace presse
  • Déplacer la sélection avec jkhl
  • Une fois que vous êtes satisfait de votre sélection, appuyez sur Entrée (ou sur y si vous avez la liaison dans votre fichier de configuration).
  • Vous pouvez coller le dernier tampon de copie en: C-a]

Notez que si vous appuyez sur space est nécessaire pour la sélection d'un rectangle.

Pour sélectionner les lignes comme vous le feriez normalement, passez en mode copie et appuyez sur v, sélectionnez avec les touches jkhl et appuyez sur y.

J'ai ces liaisons dans mon fichier .tmux.conf:

Avant le version 2.4 (20 avril 2017) :

setw -g mode-keys vi
bind-key -t vi-copy 'v' begin-selection     # Begin selection in copy mode.
bind-key -t vi-copy 'C-v' rectangle-toggle  # Begin selection in copy mode.
bind-key -t vi-copy 'y' copy-selection      # Yank selection in copy mode.

Après version 2.4 :

setw -g mode-keys vi
bind-key -T copy-mode-vi 'v' send -X begin-selection     # Begin selection in copy mode.
bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle  # Begin selection in copy mode.
bind-key -T copy-mode-vi 'y' send -X copy-selection      # Yank selection in copy mode.

Il est important de dissocier la liaison rectangle-bascule par défaut:

unbind-key -t vi-copy v  # Prior to version 2.4
unbind-key -T copy-mode-vi v

Sinon, la nouvelle liaison 'C-v' ne fonctionne pas.

Remarque: pour avoir un seul .tmux.conf qui fonctionne sur toutes les versions, voir cette question .

43
Amir H. Sadoughi

Avant de commencer la sélection, vous pouvez sélectionner un bloc visuel comme dans vi - type v. Dans la page de manuel, cela s'appelle "Basculement du rectangle".

15
Lars Kotthoff

Comme le souligne Lars, v fait ce que vous demandez en basculant entre le mode rectangle et le mode de sélection de la ligne complète. space et enter sont utilisés respectivement pour démarrer une nouvelle sélection et la copier. Entrez en mode copie en utilisant votre préfixe suivi de [ et collez votre sélection copiée dans n’importe quelle fenêtre tmux en utilisant ]

Cela m'a aussi perturbé puisque v fonctionne dans vim comme space le fait dans tmux, pour commencer la sélection.

Émettre :list-keys -t vi-copy dans tmux affichera le tableau complet des commandes en mode copie.

bind-key -t vi-copy    C-b page-up                                                      
bind-key -t vi-copy    C-c cancel
bind-key -t vi-copy    C-e scroll-down
bind-key -t vi-copy    C-f page-down
bind-key -t vi-copy    C-h cursor-left
bind-key -t vi-copy  Enter copy-selection
bind-key -t vi-copy    C-y scroll-up
bind-key -t vi-copy Escape clear-selection
bind-key -t vi-copy  Space begin-selection
bind-key -t vi-copy      $ end-of-line
bind-key -t vi-copy      , jump-reverse
bind-key -t vi-copy      / search-forward
bind-key -t vi-copy      0 start-of-line
bind-key -t vi-copy      1 start-number-prefix
bind-key -t vi-copy      2 start-number-prefix
bind-key -t vi-copy      3 start-number-prefix
bind-key -t vi-copy      4 start-number-prefix
bind-key -t vi-copy      5 start-number-prefix
bind-key -t vi-copy      6 start-number-prefix
bind-key -t vi-copy      7 start-number-prefix
bind-key -t vi-copy      8 start-number-prefix
bind-key -t vi-copy      9 start-number-prefix
bind-key -t vi-copy      : goto-line
bind-key -t vi-copy      ; jump-again
bind-key -t vi-copy      ? search-backward
bind-key -t vi-copy      B previous-space
bind-key -t vi-copy      D copy-end-of-line
bind-key -t vi-copy      E next-space-end
bind-key -t vi-copy      F jump-backward
bind-key -t vi-copy      G history-bottom
bind-key -t vi-copy      H top-line
bind-key -t vi-copy      J scroll-down
bind-key -t vi-copy      K scroll-up
bind-key -t vi-copy      L bottom-line
bind-key -t vi-copy      M middle-line
bind-key -t vi-copy      N search-reverse
bind-key -t vi-copy      T jump-to-backward
bind-key -t vi-copy      W next-space
bind-key -t vi-copy      ^ back-to-indentation
bind-key -t vi-copy      b previous-Word
bind-key -t vi-copy      e next-Word-end
bind-key -t vi-copy      f jump-forward
bind-key -t vi-copy      g history-top
bind-key -t vi-copy      h cursor-left
bind-key -t vi-copy      j cursor-down
bind-key -t vi-copy      k cursor-up
bind-key -t vi-copy      l cursor-right
bind-key -t vi-copy      n search-again
bind-key -t vi-copy      q cancel
bind-key -t vi-copy      t jump-to-forward
bind-key -t vi-copy      v rectangle-toggle
bind-key -t vi-copy      w next-Word
bind-key -t vi-copy BSpace cursor-left
bind-key -t vi-copy  NPage page-down
bind-key -t vi-copy  PPage page-up
bind-key -t vi-copy     Up cursor-up
bind-key -t vi-copy   Down cursor-down
bind-key -t vi-copy   Left cursor-left
bind-key -t vi-copy  Right cursor-right
bind-key -t vi-copy   C-Up scroll-up
bind-key -t vi-copy C-Down scroll-down
9
here

Comme aucune des autres réponses n'apporte une solution optimale au problème, je ne suis pas au-dessus de la nécromancie.

Il existe un moyen de faire en sorte que la sélection de blocs fonctionne de la même manière que dans Vim, sans avoir à appuyer sur la touche espace. Juste un simple Ctrl-V, enraciné dans votre mémoire musculaire.
Il faut éditer votre fichier .tmux.conf (mais vi-mode le fait déjà) et je ne suis pas sûr que cela fonctionne pour tmux <2.4.

Ajoutez ceci à votre fichier .tmux.conf pour répliquer la sélection Vim et les liaisons yank:

# set vi-mode
set-window-option -g mode-keys vi
# keybindings
bind-key -T copy-mode-vi v send-keys -X begin-selection
bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle \; send -X begin-selection
bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
# comment the preceding line and uncomment the following to yank to X clipboard
# bind-key -T copy-mode-vi y send-keys -X copy-pipe-and-cancel "xclip -in -selection clipboard"

Entrez en mode de sélection et naviguez jusqu’à l’endroit où vous souhaitez commencer la sélection. Maintenant, v commence la sélection régulière (caractère par caractère, ligne par ligne), <C-v> démarre la sélection de bloc et V (shift-v) démarre la sélection de ligne. Quel que soit le type de sélection, y remonte dans le tampon de collage tmux (ou dans le presse-papiers X; voir les commentaires de code ci-dessus).

Identique à Vim.

6
andrejr

EDIT: Après avoir vérifié le code source, j'ai complètement réécrit ma réponse.

Au départ, je pensais que cela n’était pas possible parce que je ne pouvais pas le faire fonctionner, mais les autres réponses sont correctes, à savoir que v est la clé correcte pour cela, mais il n’est pas évident de l’utiliser, en particulier si vous êtes habitué à vim.

En outre, cela ne fonctionnerait pas pour moi car j'avais v lié à begin-selection - je pense que j'ai dû copier cette idée à l'aveuglette ailleurs pour imiter la manière géniale de commencer une sélection judicieuse du personnage, sans savoir que cela poserait des problèmes plus loin dans le futur. route avec sélections de blocs.

$ tmux -V
tmux 1.9a
$ tmux list-keys -t vi-copy  | grep " v "
bind-key -t vi-copy      v begin-selection     # suppressed my block selection mode

Une fois que j'ai enlevé cette liaison (en commentant la ligne dans mon .tmux.conf et en redémarrant tmux), cela a commencé à fonctionner, mais c'est toujours assez déroutant car ce n'est pas du tout la même chose que vim.

Avec les liaisons par défaut, cela devrait fonctionner comme suit:

  1. Assurez-vous d’avoir tmux unning avec setw -g mode-keys vi dans votre .tmux.conf.
  2. tapez C-a [ pour démarrer le mode copie
  3. déplacez le curseur à l'endroit où vous souhaitez commencer la sélection
  4. tapez v
  5. tapez Space pour commencer la sélection
  6. déplacez le curseur et vous verrez une sélection rectangulaire
  7. vous pouvez appuyer à nouveau sur v pour faire basculer la sélection en mode de sélection de caractères ou inversement.

Vous n'avez pas besoin de taper la v avant d'appuyer sur Space. Vous pouvez commencer par sélectionner Space et ensuite appuyer sur v pour passer en mode de sélection rectangulaire.

C'est assez différent de vim en ce sens que dans tmux, vous devez taper deux caractères: Space et v pour passer en mode de sélection rectangulaire. Dans vim, il vous suffit de taper Ctrl-V.

De plus, dans vim v commence une sélection de caractère, pas de bloc.

Malheureusement, il ne semble pas y avoir de mode de sélection ligne par ligne dans tmux (Shift-v dans vim).
EDIT: Il semble que Tmux version 2.0 offre un mode de sélection ligne par ligne avec Shift-v (je ne l’ai pas encore essayé!).

2
Lqueryvg