modo de cópia tmux - selecione o bloco de texto

39

Estou usando o tmux com as teclas vi, e copiar / colar funciona bem desde que você selecione uma linha de texto ou se tiver apenas uma janela. Quando desejo selecionar um bloco de texto (várias linhas, mas não a largura total), encontro problemas. Se eu tiver várias janelas vim abertas, ele selecionará o texto de todas elas, e o que eu preciso é selecionar o texto apenas de uma janela. Ou seja, assim como uma seleção visual no vim.

Isso é possível?

Srećko Toroman
fonte
Como você ativa as combinações de teclas do Vi no tmux?
Romainl
adicionar "mode-chaves set-window-opção -g vi" para seu ~ / .tmux.conf
Srećko Toroman
11
Parece que as respostas não estão chegando à sua pergunta sobre o uso do modo de bloqueio visual - "várias linhas, mas não a largura total" também é o que estou procurando. Você encontrou sua própria solução?
dmonopoly
Não, ainda não há solução.
Srećko Toroman
Na verdade, existe uma solução.
Srećko Toroman

Respostas:

46

Certifique-se de verificar na parte inferior desta postagem as ligações necessárias que precisam entrar no seu arquivo .tmux.conf.

Estou assumindo que sua chave de prefixo é Ca:

  • Ca significa: pressione Ctrl+A
  • Ca [significa: pressione Ctrl+ e, em Aseguida, pressione[

Para fazer uma seleção retangular de texto de (1,1) a (2,2) no tmux:

  • Vá para o modo de cópia: Ca [
  • Mover o meio de uma linha
  • Pressione Cv
  • Espaço de Imprensa
  • Mova a seleção com jkhl
  • Quando estiver satisfeito com sua seleção, pressione Enter (ou y se você tiver a encadernação em seu arquivo conf).
  • Você pode colar o buffer de cópia mais recente: Ca]

Observe que pressionar spaceé necessário para a seleção do retângulo.

Para selecionar linhas como você faria normalmente, vá para o modo de cópia e pressione v, selecione com as teclas jkhl e pressione y.

Eu tenho essas ligações no meu .tmux.conf:

Antes da versão 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.

Após a versão 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.

É importante desvincular a ligação padrão de retângulo-alternância:

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

Caso contrário, a nova ligação 'Cv' não funcionará.

Nota: para ter um single .tmux.confque funcione entre versões, consulte esta pergunta .

Amir H. Sadoughi
fonte
11
Muito obrigado. A ênfase está no seu tmux.conf - você pode editar a resposta para incluir a opção bind-key -t vi-copy 'Cv' retângulo-alternar no início.
Srećko Toroman
A pergunta original pergunta como obter a seleção retangular trabalhando com "mode-keys vi". Não há necessidade de vincular novamente as chaves para responder a essa pergunta. Veja as outras respostas; é apenas "v" e "espaço" no modo de seleção.
Lqueryvg
isso funciona além do fato de que o jkhl não funciona, eu tenho que usar as setas do teclado para se mover, existe alguma maneira de mudar isso?
Max
Qual é a diferença entre sende send-keys. Vejo em superuser.com/questions/196060/selecting-text-in-tmux-copy-mode send-key usado. As aspas também são importantes?
User2442366 18/10
15

Você pode selecionar um bloco visual como no tipo vi vantes de iniciar a seleção. Na página de manual, isso é chamado de "alternância de retângulo".

Lars Kotthoff
fonte
2
É exatamente isso que estou usando. Mas isso tem um problema que eu descrevi acima. O retângulo é sempre largura total. Eu preciso de um VIM-like retângulo (x1, y1) - (x2, y2) :)
Srećko Toroman
11
@ Srećko Toroman, o que você quer dizer exatamente com largura total?
Gitaarik
9

Como Lars aponta, vrealmente faz o que você está solicitando alternando entre o modo retângulo e o modo de seleção de linha completa. spacee entersão usados ​​respectivamente para iniciar uma nova seleção e copiá-la. Entre no modo de cópia usando seu prefixo seguido por [e cole sua seleção copiada em qualquer janela do tmux usando]

Isso também me confundiu, pois vfunciona no vim, como spaceno tmux, para iniciar a seleção.

A emissão :list-keys -t vi-copyno tmux mostrará a tabela completa de comandos no modo de cópia.

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
Aqui
fonte
Eu não entendo de novo. Dada uma janela do Vim com uma divisão vertical, como você seleciona um retângulo somente na primeira divisão? Aqui, o retângulo com várias linhas sempre envolverá o painel Tmux completo. Não é como uma seleção de blocos do Vim. Estou usando o tmux 1.5, talvez seja diferente na sua versão?
Srećko Toroman
Sim, aqui, v é mapeado para a seleção inicial. A alternância do retângulo é indefinida. Então, acho que vocês dois estão certos, só preciso atualizar meu cliente?
Srećko Toroman
Se você tiver uma janela dividida do vim aberta em um único painel tmux, não poderá usar a capacidade de arrancar e colar do vim? Se, por outro lado, você tiver dois painéis do tmux, cada um com sua própria janela do vim, o tmux select / copy deve ser capaz de quebrar as bordas do painel. Estou usando o tmux 1.7
aqui
6

Como nenhuma das outras respostas fornece uma solução ideal para o problema, não estou acima da necromancia.

Existe uma maneira de fazer a seleção de blocos funcionar da mesma maneira que no Vim, sem precisar pressionar espaço. Apenas um Ctrl-V simples, arraigado na memória muscular.
Requer a edição do seu .tmux.conf (mas o modo vi já o faz) e não tenho certeza de que funcione para o tmux <2.4.

Adicione isso ao seu .tmux.conf para replicar a seleção do Vim e arrancar as ligações:

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

Entre no modo de seleção e navegue para onde deseja iniciar a seleção. Agora vinicia a seleção regular (caractere por caractere, em linha), <C-v>inicia a seleção de blocos e V(shift-v) inicia a seleção de linha. Independentemente do tipo de seleção, ypuxa para tmux colar buffer (ou área de transferência do X; veja os comentários do código acima).

O mesmo que o Vim.

andrejr
fonte
Trabalhou para mim, ter um upvote para o seu necomancy 👏👏👏
mahemoff
2

EDIT: Depois de verificar o código fonte, reescrevi minha resposta completamente.

Originalmente, pensei que isso não era possível porque não consegui fazer isso funcionar, mas as outras respostas estão corretas em vser a chave correta para isso, mas não é óbvio como usá-lo, especialmente se você está acostumado a vim.

Além disso, isso não funcionaria para mim porque eu tinha vdecidido begin-selection- acho que devo ter copiado cegamente essa idéia de outro lugar para imitar a maneira vim de iniciar uma seleção sábia de personagens, sem saber que isso causaria problemas mais adiante no caminho. seleções de bloco.

$ 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

Depois que tirei essa ligação (comentando a linha no meu .tmux.confe reiniciando o tmux), ela começou a funcionar, mas ainda é bastante confusa porque não é a mesma coisa que o vim.

Com ligações padrão, deve funcionar da seguinte maneira:

  1. Certifique-se de ter o tmux unning setw -g mode-keys vino seu .tmux.conf.
  2. digite C-a [para iniciar o modo de cópia
  3. mova o cursor para onde deseja iniciar a seleção
  4. tipo v
  5. digite Spacepara iniciar a seleção
  6. mova o cursor e você verá uma seleção retangular
  7. você pode pressionar vnovamente para alternar a seleção novamente para a seleção de caracteres ou vice-versa.

Você não precisa digitar o vantes de pressionar Space. Você pode iniciar a seleção por caracteres Spaceprimeiro e pressionar vdepois para alternar para o modo de seleção retangular.

É bem diferente do vim, no tmux você precisa digitar dois caracteres: Spacee ventrar no modo de seleção retangular. No vim, você só precisa digitar Ctrl-V.

Também no vim vinicia uma seleção em caracteres, não em bloco.

Infelizmente, não parece haver um modo de seleção em linha no tmux ( Shift-vno vim).
EDIT: Parece que o Tmux versão 2.0 fornece um modo de seleção por linha Shift-v(ainda não o testei ainda!)

Lqueryvg
fonte
Pressione "v" e você pode selecionar linhas. Não há necessidade de espaço.
Amir H. Sadoughi
11
@ AmirH.Sadoughi, é porque (conforme sua resposta) você alterou os padrões e vinculou "v" para iniciar a seleção em vez de "espaço". Se você começar com um .tmux.conf vazio, deverá encontrar o comportamento que descrevo está correto; você tem que pressionar "espaço" para iniciar a seleção.
Lqueryvg
11
Obrigado por me corrigir. Para endereçar sua última frase (sobre seleção em linha), eu estava tentando dizer que, com minha configuração, posso fazer uma seleção de blocos com cv-space, e posso fazer uma seleção de linhas com v. Então, pressionando "prefixo v "me permite selecionar linhas.
Amir H. Sadoughi
Acho isso muito difícil de acreditar porque a seleção por linha só foi adicionada ao Tmux recentemente ( Shift-vna versão 2.0 de março de 2015), certamente após a minha resposta e muito depois da resposta original. Talvez você e eu falemos sobre duas coisas diferentes quando falamos sobre seleção por linha. Por favor, compare com os 3 modos de seleção no VIM (com v, Shift-ve Ctrl-v).
Lqueryvg
Você está certo, eu apenas testei. Minha vseleção é de caráter. Estou na versão 1.9a e não tenho a seleção em linha do tipo vim. Então, com a versão 2.0, os três modos exatos que o vim possui também são possíveis no tmux, certo?
Amir H. Sadoughi