Como alcançar a seleção de diferentes tamanhos de textos em diferentes linhas?


10

suponha que tenho os seguintes textos:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

Quero fazer a seleção como abaixo:

aaa-dd-e:"aaa",
bb-x:"bb",
c-9:"c"

Tentei usar cv para criar um bloco visual, mas depois de criar a seleção na primeira coluna e pressionar "f:" (pretendia expandir a seleção para marcas de dois pontos em todas as linhas como acima), o que recebo é:

aaa-dd-e: "aaa",:
bb-x"bb",
c-9:"c"

a seleção para no primeiro ponto e cria um retângulo.


6
O que você deseja alcançar com essa seleção? Pode haver outra maneira
Arjen Dijkstra

Se estiver separado por caractere, você pode tentar realinhar o bloco primeiro e selecioná-lo. Consulte: Alinhar texto apenas no primeiro separador no VIM
kenorb

Respostas:


6

A seleção geralmente é um meio para um fim, mais ainda no Vim, onde a seleção geralmente não é necessária em primeiro lugar.

Supondo que você ainda deseja colocar aspas em torno dos nomes de propriedades em seu arquivo não JSON para transformá-lo em JSON adequado:

  1. selecione as linhas a serem modificadas, em caracteres ou em linhas, não importa,
  2. :'<,'>norm I"^[f:i"( '<,'>é inserido automaticamente para você e ^[é obtido com <C-v><Esc>).

Se você possui o belo plugin surround, a etapa 2 se torna:

:'<,'>norm ^vt:S"

Com uma substituição, a etapa 2 pode se tornar:

:'<,'>s/^\s*\([^:]*\):/"\1"

vocês estão certos, agora acho a seleção visual provavelmente desnecessária. com a ajuda ou :g/regex/norm, posso simplesmente conseguir o que quero fazer.
Aaron Shen

Existe alguma maneira de colocar todo o bloco selecionado na área de transferência do sistema e colar em outro arquivo?
Aaron Shen

Claro. Supondo que seu Vim seja compilado com o suporte da área de transferência, você pode fazer "+you "*y, dependendo da área de transferência que deseja segmentar. Há muitas perguntas relacionadas por aqui.
romainl 1/09/17

14

O Vim suporta apenas seleções retangulares em sentido de bloco, com exceção da borda direita irregular quando você pressiona $.

Existem plugins (como vários cursores do vim ) que podem emular várias seleções, mas você também deve ser capaz de atingir seu objetivo real (que infelizmente não mencionou) com comandos puros do Vim, por exemplo :globale :substitute(se você pode formular uma rotina regular). expressão que corresponde à seleção em cada linha) ou repetindo macros (se houver um movimento específico que cubra a seleção em cada linha).


e se eu quiser cortar essas linhas e colar em outro buffer?
Aaron Shen

1

Apenas para jogar outro chapéu no ringue, se você realmente quiser usar a seleção visual, use o plug-in Tabular para alinhar os dois pontos e faça sua seleção visual.

Se você pegar seu texto original:

aaa-dd-e: "aaa",
bb-x: "bb",
c-9: "c"

:Tab /:\zs alinhará tudo após o cólon, como abaixo

aaa-dd-e:  "aaa",
bb-x:      "bb",
c-9:       "c"

E então você pode fazer sua seleção de bloco visual.

Como outros já disseram, a seleção visual provavelmente não é necessária nessa situação. O uso normou substituição provavelmente pode realizar o que você deseja sem mexer nas seleções visuais.


1

Encontrei uma solução para esse problema que é surpreendentemente simples! Inicie o modo de bloco visual na parte inferior da seleção do texto que você deseja copiar e selecione para cima! Ele expandirá o bloco à medida que você sobe, enquanto que se você destacar para baixo, isso parecerá diminuir a seleção.


Mas assim sempre será um bloco retangular, certo? Enquanto eu lia, não é isso que o OP quer (eles mencionam que tentaram o modo de bloqueio visual).
Martin Tournoij

Não. Sempre será um bloco retangular se todas as linhas tiverem o mesmo comprimento. Descobri que começar na parte inferior e realçar para cima e pressionar $ para ir para o final da linha resultará em todas as linhas destacadas destacadas no final da linha.
Arthur Bowers
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.