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

39

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?

Srećko Toroman
la source
Comment activez-vous les raccourcis clavier Vi dans tmux?
Romainl
Ajoutez "set-window-option -g mode-keys vi" à votre ~ / .tmux.conf
Srećko Toroman le
1
Il semble que les réponses ne viennent pas à votre question d'utilisation du mode bloc visuel - "plusieurs lignes, mais pas toute la largeur", c'est aussi ce que je recherche. Avez-vous trouvé votre propre solution?
Monopoly
Non, toujours pas de solution.
Srećko Toroman
En fait, il y a une solution.
Srećko Toroman

Réponses:

46

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 Ca:

  • Ca signifie: appuyez sur Ctrl+A
  • Ca [signifie: appuyez sur Ctrl+ Apuis appuyez sur[

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

  • Aller en mode copie: Ca [
  • Déplacer le milieu d'une ligne
  • Presse cv
  • Appuyer sur espace
  • 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: Ca]

Notez que vous devez appuyer sur spacepour sélectionner 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 la 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 la 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 'Cv' ne fonctionne pas.

Remarque: pour en avoir un .tmux.confqui fonctionne sur plusieurs versions, consultez cette question .

Amir H. Sadoughi
la source
1
Merci beaucoup. L'accent est mis sur votre tmux.conf - vous pouvez éditer la réponse pour inclure bind-key -t vi-copy 'Cv' rectangle-toggle au début.
Srećko Toroman
La question initiale demande comment obtenir une sélection rectangulaire en utilisant "mode-keys vi". Il n'est pas nécessaire de relier les clés pour répondre à cette question. Voir les autres réponses. c'est juste "v" et "espace" du mode sélection.
Lqueryvg
cela fonctionne autrement que le fait que jkhl ne fonctionne pas, je dois utiliser les touches fléchées pour me déplacer, y a-t-il un moyen de changer cela?
Max
Quelle est la difference entre sendand send-keys. Je vois dans superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key est utilisé. Les guillemets sont-ils également importants?
user2442366
15

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

Lars Kotthoff
la source
2
C'est exactement ce que j'utilise. Mais cela a un problème que j'ai décrit ci-dessus. Le rectangle a toujours toute sa largeur. J'ai besoin d'un rectangle de type VIM (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman que voulez-vous dire exactement par pleine largeur?
gitaarik
9

Comme le souligne Lars, vfait ce que vous demandez en basculant entre le mode rectangle et le mode de sélection de ligne complète. spaceet entersont utilisés respectivement pour commencer 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 également dérouté car v, dans vim, fonctionne comme spacedans tmux, pour commencer la sélection.

Émission :list-keys -t vi-copyen tmux affichera la table complète 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
ici
la source
Je ne comprends pas encore. Avec une fenêtre Vim avec une scission verticale, comment sélectionner un rectangle dans la première scission seulement? Ici, le rectangle multiligne encapsulera toujours le volet Tmux complet. Ce n'est pas comme une sélection de bloc Vim. J'utilise tmux 1.5, c'est peut-être différent dans votre version?
Srećko Toroman
Oui, ici, v est mappé pour commencer la sélection. Le rectangle-bascule est indéfini. Donc je suppose que vous avez raison tous les deux, je dois juste mettre à jour mon client?
Srećko Toroman
Si vous avez une fenêtre fractionnée vim ouverte dans un seul volet tmux, ne pouvez-vous pas utiliser la capacité de vim et coller de vim? Si, par contre, vous avez deux panneaux tmux, chacun avec sa propre fenêtre vim, tmux select / copy devrait pouvoir s’envelopper aux bords du volet. J'utilise tmux 1.7
ici le
6

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"

Passez en mode sélection et naviguez jusqu’à l’endroit où vous souhaitez commencer la sélection. vCommence maintenant la sélection normale (caractère par caractère, ligne par ligne), <C-v>commence la sélection de bloc et V(shift-v) commence la sélection de ligne. Indépendamment du type de sélection, ytire sur tmux coller le tampon (ou le presse-papier X; voir les commentaires de code ci-dessus).

Identique à Vim.

Andrejr
la source
Travaillé pour moi, avoir un vote positif pour votre nécomancie
mahemoff
2

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 exactes v, mais il n’est pas évident de savoir comment utiliser cela, surtout si vous êtes habitué à vim.

En outre, il ne travaillerait pour moi parce que je l' avais vlié à begin-selection- je pense que je dois avoir aveuglément copié cette idée d'ailleurs à imiter la façon de vim pour commencer un caractère choix judicieux, ne sachant pas que cela causerait des problèmes plus loin sur la route bloquer les sélections.

$ 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.confet 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 setw -g mode-keys vidans votre .tmux.conf.
  2. tapez C-a [pour démarrer le mode copie
  3. déplacez le curseur à l'endroit où vous voulez commencer la sélection
  4. type v
  5. tapez Spacepour commencer la sélection
  6. déplacez le curseur et vous verrez une sélection rectangulaire
  7. vous pouvez appuyer à vnouveau pour basculer la sélection en mode de sélection de caractères ou inversement.

Vous n'êtes pas obligé de taper le vavant d'appuyer Space. Vous pouvez commencer par sélectionner les caractères, Spacepuis appuyer sur vpour passer au mode de sélection rectangulaire.

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

Également dans vim, vcommence 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-vdans vim).
EDIT: Il semble que Tmux version 2.0 offre un mode de sélection ligne par ligne Shift-v(je ne l’ai pas encore essayé!)

Lqueryvg
la source
Appuyez sur "v" et vous pouvez sélectionner des lignes. Pas besoin d'espace.
Amir H. Sadoughi
1
@ AmirH.Sadoughi, c'est parce que (conformément à votre réponse) vous avez modifié les valeurs par défaut et lié "v" pour commencer la sélection au lieu de "espace". Si vous commencez avec un fichier .tmux.conf vide, le comportement que je décris est correct. vous devez appuyer sur "espace" pour commencer la sélection.
Lqueryvg
1
Merci de me corriger. Pour aborder votre dernière phrase (à propos de la sélection ligne par ligne), j'essayais de dire qu'avec ma config, je peux faire une sélection de bloc avec cv-space, et je peux faire une sélection de ligne avec v. So, en appuyant sur "prefix v "me permet de sélectionner des lignes.
Amir H. Sadoughi
Je trouve cela très difficile à croire, car la sélection par ligne n'a été ajoutée à Tmux que récemment ( Shift-vdans la version 2.0 de mars 2015), certainement après ma réponse et longtemps après votre réponse initiale. Peut-être que vous et moi parlons de deux choses différentes lorsque nous parlons de sélection par ligne. Veuillez comparer avec les 3 modes de sélection dans VIM (avec v, Shift-vet Ctrl-v).
Lqueryvg
Vous avez raison, je viens de le tester. Ma vsélection est basée sur le caractère. Je suis sur la version 1.9a et n'ai pas la sélection par ligne vim-like. Ainsi, avec la version 2.0, les trois modes exacts de vim sont également possibles dans tmux, non?
Amir H. Sadoughi