Como repito uma edição em várias linhas no Vim?


122

Estou ciente de que no Vim geralmente posso repetir um comando simplesmente adicionando um número na frente dele. Por exemplo, pode-se excluir 5 linhas por:

5dd

Também é frequentemente possível especificar um intervalo de linhas para aplicar um comando, por exemplo

:10,20s:hello:goodbye:gc

Como posso executar uma 'edição vertical'? Eu gostaria de, por exemplo, inserir um símbolo específico, digamos uma vírgula, no início (ignorando o espaço em branco, ou seja, o que você obteria se digitasse uma vírgula após Shift-I no modo de comando) de cada linha de um determinado alcance. Como isso pode ser alcançado (sem recorrer a período de queda-período-queda-período-queda)?

Respostas:


107

:10,20s/^/,/

Ou use uma macro, grave com:

q a i , ESC j h q

usar com:

@ a

Explicação: q acomeça a gravar uma macro para registrar ae qtermina a gravação. Há registros apara zdisponível para isso.


Obrigado. E se eu quisesse o equivalente a um turno-i? Ou seja, pular o espaço em branco inicial?
Saffsd

2
Explicação: ^\(\s*\)captura o espaço em branco inicial e o salva em um registro, com o qual você pode ler \1.
Svante

136

Ctrl- ventra no modo visual em sentido horário. Em seguida, você pode se mover ( hjkl-se, normalmente) e, se desejar inserir algo em várias linhas, use Shift- i.

Então, para o texto:

abc123abc
def456def
ghi789ghi

se você pressionar Ctrl- vcom o cursor sobre o 1, pressionar jduas vezes para descer duas colunas e, em seguida Shift- i,ESC, seu texto ficará assim:

abc,123abc
def,456def
ghi,789ghi

(a inserção de várias linhas tem um pequeno atraso e não será renderizada até DEPOIS que você pressionar ESC).


3
Agradável. Ctrl-V significa letras maiúsculas, a propósito, você pode dizer Ctrl-Shift-v
Svante

8
na verdade, é CTRL-v ou CTRL-V. O Vim não diferencia maiúsculas de minúsculas para códigos CTRL (consulte: help CTRL- {char}).
Rampion

2
depois de pesquisar um pouco sobre por que esse método não estava funcionando, é porque ele usa uma letra maiúscula I (shift-i) em vez de i (também era apenas ctrl-v, pois ctrl-shift-v me levou para o final)
Willyfrog

4
Estou curioso. Por que eles simplesmente não usam isem a tecla Shift?
off99555

1
i sem deslocamento é inserido na posição atual. shift + i é inserido no início da linha
Kevin P


44

Se você já está usando o '.' para repetir o seu último comando muito, então eu encontrei este para ser a solução mais conveniente até agora. Permite repetir seu último comando em cada linha de um bloco visual usando

" allow the . to execute once for each line of a visual selection
vnoremap . :normal .<CR>

1
Isso é útil, mas também limitado, pois a .linha de operações é sábia no modo visual. Eu acho que o modo visual, neste caso, às vezes pode ser conveniente para selecionar um intervalo de linhas. Porém, comandos e macros são mais flexíveis e poderosos nesse caso.
Bohr

23

Eu acredito que a maneira mais fácil de fazer isso é

1) grave uma macro para uma linha, chame-a de 'a'; neste caso, tipos

qa I, ESC jq

2) selecione o bloco de linhas ao qual deseja aplicar a macro

3) use a função 'norma' para executar a macro 'a' nesse bloco de linhas, ou seja,

:'<,'>norm@a

17

Eu acho que o mais fácil é gravar uma macro e repita a macro quantas vezes quiser. Por exemplo, para adicionar uma vírgula no início de cada linha, digite:

q a I , ESC j q

para repetir isso 5 vezes, você entra

5 @ a


2

Com sua edição já salva no .operador, faça o seguinte:

  1. Selecione o texto ao qual você deseja aplicar o operador usando o modo visual
  2. Em seguida, execute o comando :norm .

1

Além das macros, como já foi respondido, para o caso específico de inserir uma vírgula em um intervalo de linhas (digamos da linha 10 a 20), você pode fazer algo como:

:10,20s/\(.*\)/,\1

Ou seja, você pode criar uma correspondência de grupo numerada com \ (e \) e usar \ 1 na cadeia de substituição para dizer "substituir pelo conteúdo da correspondência".

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.