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?
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:
Pour faire une sélection rectangle de texte de (1,1) à (2,2) dans tmux:
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 .
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".
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
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.
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:
setw -g mode-keys vi
dans votre .tmux.conf
.C-a [
pour démarrer le mode copiev
Space
pour commencer la sélectionv
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é!).