modo de copia tmux - seleccione bloque de texto

39

Estoy usando tmux con las teclas vi, y copiar / pegar funciona bien siempre que esté seleccionando una línea de texto, o si solo tiene una ventana. Cuando quiero seleccionar un bloque de texto (varias líneas, pero no todo el ancho), me encuentro con problemas. Si tengo varias ventanas vim abiertas, seleccionaría texto de todas ellas, y lo que necesito es seleccionar texto solo de una ventana. Es decir, como una selección visual en vim.

¿Es posible hacerlo?

Srećko Toroman
fuente
¿Cómo se activan las combinaciones de teclas Vi en tmux?
romainl
agregue "set-window-option -g mode-keys vi" a su ~ / .tmux.conf
Srećko Toroman el
1
Parece que las respuestas no están llegando a su pregunta sobre el uso del modo de bloque visual: "líneas múltiples, pero no de ancho completo" también es lo que estoy buscando. ¿Encontraste tu propia solución?
dmonopolio
No, todavía no hay solución.
Srećko Toroman
En realidad, hay una solución.
Srećko Toroman

Respuestas:

46

Asegúrese de revisar la parte inferior de esta publicación para ver los enlaces necesarios que deben ir a su archivo .tmux.conf.

Supongo que su clave de prefijo es Ca:

  • Ca significa: presione Ctrl+A
  • Ca [significa: presione Ctrl+ Aluego presione[

Para hacer una selección rectangular de texto de (1,1) a (2,2) en tmux:

  • Vaya al modo de copia: Ca [
  • Mueve el medio de una línea
  • Presione Cv
  • Presione espacio
  • Mueve la selección con jkhl
  • Una vez que esté satisfecho con su selección, presione Entrar (oy si tiene el enlace en su archivo de configuración).
  • Puede pegar el último búfer de copia: Ca]

Tenga en cuenta que presionar spacees necesario para la selección del rectángulo.

Para seleccionar líneas como lo haría normalmente, vaya al modo de copia y presione v, seleccione con las teclas jkhl y presione y.

Tengo estos enlaces en mi .tmux.conf:

Antes de la versión 2.4 (20 de abril de 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.

Después de la versión 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.

Es importante desvincular el enlace predeterminado de rectángulo-alternar:

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

De lo contrario, el nuevo enlace 'Cv' no funciona.

Nota: para tener un single .tmux.confque funcione en todas las versiones, vea esta pregunta .

Amir H. Sadoughi
fuente
1
Muchas gracias. El énfasis está en su tmux.conf: puede editar la respuesta para incluir bind-key -t vi-copy 'Cv' rectángulo-alternar al principio.
Srećko Toroman
La pregunta original pregunta cómo hacer que la selección rectangular funcione con "teclas de modo vi". No es necesario volver a vincular las teclas para responder esta pregunta. Ver las otras respuestas; es solo "v" y "espacio" desde el modo de selección.
Lqueryvg
esto funciona aparte del hecho de que jkhl no funciona, tengo que usar las teclas de flecha para moverme, ¿hay alguna forma de cambiar esto?
Max
¿Cuál es la diferencia entre sendy send-keys. Veo en superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key se utiliza. ¿También son importantes las comillas?
user2442366
15

Puede seleccionar un bloque visual al igual que en vi-type vantes de comenzar la selección. En la página de manual, esto se llama "alternar rectángulo".

Lars Kotthoff
fuente
2
Eso es exactamente lo que estoy usando. Pero eso tiene un problema que describí anteriormente. El rectángulo es siempre de ancho completo. Necesito un rectángulo tipo VIM (x1, y1) - (x2, y2) :)
Srećko Toroman
1
@ Srećko Toroman, ¿qué quieres decir exactamente con todo el ancho?
gitaarik
9

Como señala Lars, en vrealidad hace lo que está pidiendo al alternar entre el modo rectángulo y el modo de selección de línea completa. spacey enterse usan respectivamente para comenzar una nueva selección y copiarla. Ingrese al modo de copia usando su prefijo seguido de [y pegue su selección copiada en cualquier ventana de tmux usando]

Esto me confundió también desde v funciona en vim comospace hace en tmux, para comenzar la selección.

La emisión :list-keys -t vi-copyen tmux mostrará la tabla completa de comandos en modo copia.

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
aquí
fuente
No lo entiendo de nuevo. Dada una ventana Vim con una división vertical, ¿cómo selecciona un rectángulo en la primera división solamente? Aquí, el rectángulo multilínea siempre envolverá todo el panel Tmux. No es como una selección de bloque Vim. Estoy usando tmux 1.5, ¿tal vez es diferente en su versión?
Srećko Toroman
Sí, aquí, v está mapeado para comenzar la selección. El cambio de rectángulo no está definido. Entonces, supongo que ambos tienen razón, ¿solo necesito actualizar mi cliente?
Srećko Toroman
Si tiene una ventana dividida de vim abierta en un solo panel tmux, ¿no puede usar la capacidad de pegar y tirar de vim? Si, por otro lado, tiene dos paneles tmux, cada uno con su propia ventana vim, tmux select / copy debería poder ajustarse en los bordes del panel. Estoy usando tmux 1.7
aquí el
6

Dado que ninguna de las otras respuestas dan una solución óptima al problema, no estoy por encima de la nigromancia.

Hay una manera de hacer que la selección de bloques funcione de la misma manera que lo hace en Vim, sin tener que presionar la barra espaciadora. Solo un simple Ctrl-V, arraigado en tu memoria muscular.
Requiere editar su .tmux.conf (pero usar el modo vi ya lo hace) y no estoy seguro de que funcione para tmux <2.4.

Agregue esto a su .tmux.conf para replicar la selección de Vim y los enlaces de extracción:

# 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"

Ingrese al modo de selección y navegue hasta donde desea comenzar la selección. Ahora vcomienza la selección regular (carácter por carácter, en línea), <C-v>comienza la selección de bloque y V(shift-v) comienza la selección de línea. Independientemente del tipo de selección, se yajusta al búfer de pasta tmux (o al portapapeles X; consulte los comentarios de código anteriores).

Igual que Vim.

andrejr
fuente
Trabajó para mí, tenga un voto positivo hacia su necomancy 👏👏👏
mahemoff
2

EDITAR: Después de verificar el código fuente, he reescrito mi respuesta por completo.

Originalmente pensé que esto no era posible porque no podía hacer que esto funcionara, pero las otras respuestas son correctas sobre vser la clave correcta para esto, pero no es obvio cómo usar esto, especialmente si estás acostumbrado a vim.

Además, no funcionaría para mí porque tenía que vhacerlo begin-selection; creo que debo haber copiado ciegamente esta idea de otro lugar para imitar la forma vim de comenzar una selección inteligente de personajes, sin saber que causaría problemas más adelante con el camino. Bloquear selecciones.

$ 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

Una vez que eliminé este enlace (al comentar la línea en mi .tmux.confy reiniciar tmux), comenzó a funcionar, pero sigue siendo bastante confuso porque no es lo mismo que vim.

Con enlaces predeterminados, debería funcionar de la siguiente manera:

  1. Asegúrese de tener tmux unning con setw -g mode-keys vien su .tmux.conf.
  2. escriba C-a [para iniciar el modo de copia
  3. mueva el cursor a donde desea comenzar la selección
  4. tipo v
  5. escriba Spacepara comenzar la selección
  6. mueve el cursor y verás una selección rectangular
  7. puede presionar vnuevamente para alternar la selección nuevamente en la selección de caracteres o viceversa.

No tiene que escribir el vantes de presionar Space. Puede comenzar la selección de caracteres con Spaceprimero y vluego presionar para alternar al modo de selección rectangular.

Es bastante diferente de vim en que en tmux tienes que escribir dos caracteres: Spacey ventrar en modo de selección rectangular. En vim solo tienes que escribir Ctrl-V.

También en vim vcomienza una selección de caracteres sabios, no de bloque.

Lamentablemente, no parece haber un modo de selección en línea en tmux ( Shift-ven vim).
EDITAR: Parece que la versión 2.0 de Tmux proporciona un modo de selección en línea Shift-v(¡aún no lo he probado!)

Lqueryvg
fuente
Presione "v" y puede seleccionar líneas. No hay necesidad de espacio.
Amir H. Sadoughi
1
@ AmirH.Sadoughi, eso es porque (según su respuesta) ha cambiado los valores predeterminados y ha vinculado "v" para comenzar la selección en lugar de "espacio". Si comienza con un .tmux.conf vacío, debería encontrar que el comportamiento que describo es correcto; tienes que presionar "espacio" para comenzar la selección.
Lqueryvg
1
Gracias por corregirme. Para abordar su última oración (sobre la selección en línea), estaba tratando de decir que con mi configuración, puedo hacer una selección de bloque con cv-space, y puedo hacer una selección de línea con v. Entonces, presionando "prefijo v "me permite seleccionar líneas.
Amir H. Sadoughi
Me resulta muy difícil de creer porque la selección en línea solo se agregó a Tmux recientemente ( Shift-ven la versión 2.0 de marzo de 2015), ciertamente después de mi respuesta y mucho después de su respuesta original. Quizás usted y yo estamos hablando de dos cosas diferentes cuando hablamos de la selección en línea. Por favor compare con los modos de selección 3 en VIM (con v, Shift-vy Ctrl-v).
Lqueryvg
Tienes razón, lo acabo de probar. Mi vselección es de carácter sabio. Estoy en la versión 1.9a y no tengo la selección vim-like line-wise. Entonces, con la versión 2.0, los tres modos exactos que tiene vim también son posibles en tmux, ¿verdad?
Amir H. Sadoughi