Como posso repetir uma edição em várias linhas no vim?

votos
94

Estou ciente de que no vim eu muitas vezes pode repetir um comando simplesmente adicionando um número na frente dele. Por exemplo, pode-se eliminar 5 linhas por:

5dd

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

:10,20s:hello:goodbye:gc

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

Publicado 10/12/2008 em 13:39
fonte usuário
Em outras línguas...                            


9 respostas

votos
86

:10,20s/^/,/

Ou usar uma macro, ficha com:

q a i , ESC j h q

usar com:

@ a

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

Respondeu 10/12/2008 em 13:45
fonte usuário

votos
11

Eu acho que o mais fácil é para gravar uma macro, e em seguida, repita a macro como muitas vezes quiser. Por exemplo, para adicionar uma vírgula no início de cada linha, você digita:

q a I , ESC j q

repetir que 5 vezes, você entra

5 @ a
Respondeu 10/12/2008 em 13:45
fonte usuário

votos
1

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

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

Ou seja, você pode criar um jogo do grupo numerado com \ (e \), e usar \ 1 no texto de substituição para dizer "substituir com o conteúdo do jogo".

Respondeu 10/12/2008 em 14:03
fonte usuário

votos
99

Ctrl- ventra no modo em blocos visual. Você pode então mover ( hjkl-wise, como normal), e se você deseja inserir algo em várias linhas, use Shift- i.

Assim, o texto:

abc123abc
def456def
ghi789ghi

se você bater Ctrl- vcom o cursor sobre o 1, bateu jduas vezes para ir para baixo duas colunas, em seguida Shift- i,ESC, o texto ficaria assim:

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

(a inserção multi-linha tem um pouco de lag, e não irá processar até Depois de bater ESC).

Respondeu 10/12/2008 em 14:37
fonte usuário

votos
47

Isso é o que o comando: norma (al) é a seguinte:

: 10,20 normais I,
Respondeu 18/12/2008 em 20:32
fonte usuário

votos
2

Eu uso modo visual bloco . Isso permite que você execute inserções / edições em várias linhas (aka 'edita verticais').

Respondeu 07/01/2009 em 00:33
fonte usuário

votos
17

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

1) gravar uma macro para uma linha, chamá-lo de 'a'; neste caso uma tipos

qa I, ESC jq

2) Selecione o bloco de linhas que você deseja aplicar a macro para

3) utilizar a função 'norma' para executar macro 'um' sobre este bloco de linhas, ou seja,

:'<,'>norm@a
Respondeu 28/11/2009 em 12:21
fonte usuário

votos
36

Se você já estiver usando o '. para repetir o seu último comando muito, então eu encontrei este para ser a solução mais conveniente até agora. Ele permite que você repita o 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>
Respondeu 09/11/2011 em 12:53
fonte usuário

votos
0

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

  1. Selecione o texto que deseja aplicar ao operador usar modo visual
  2. Em seguida, execute o comando :norm .
Respondeu 14/02/2019 em 16:47
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more