Às vezes, quero editar um determinado bloco visual de texto em várias linhas.
Por exemplo, eu pegaria um texto assim:
name
comment
phone
email
E fazer parecer assim
vendor_name
vendor_comment
vendor_phone
vendor_email
Atualmente, o jeito que eu faria agora é ...
- Selecione todas as 4 linhas de um bloco pressionando Ve depois jquatro vezes.
- Recuar com >.
- Volte uma letra com h.
- Vá para bloquear o modo visual com Ctrlv.
- Selecione quatro linhas abaixo pressionando jquatro vezes. Nesse ponto, você selecionou blocos visuais 4x1 de espaço em branco (quatro linhas e uma coluna).
- Pressione C. Observe isso praticamente recuado à esquerda por uma coluna.
- Digite a
" vendor_"
sem a citação. Observe o espaço extra que tivemos que colocar de volta. - Pressione Esc. Essa é uma das poucas vezes em que uso Escpara sair do modo de inserção.Ctrlceditaria apenas a primeira linha.
- Repita a etapa 1.
- Recuar para o outro lado com <.
Não preciso recuar se houver pelo menos uma coluna de espaço em branco antes das palavras. Eu não precisaria do espaço em branco se não tivesse que limpar o bloco visual comc .
Mas se eu tiver que limpar, existe uma maneira de fazer o que fiz acima sem criar o espaço em branco necessário com recuo?
Além disso, por que a edição de várias linhas ao mesmo tempo funciona apenas saindo do modo de inserção com Escmais de Ctrlc?
Aqui está um exemplo mais complicado:
name = models.CharField( max_length = 135 )
comment = models.TextField( blank = True )
phone = models.CharField( max_length = 135, blank = True )
email = models.EmailField( blank = True )
para
name = models.whatever.CharField( max_length = 135 )
comment = models.whatever.TextField( blank = True )
phone = models.whatever.CharField( max_length = 135, blank = True )
email = models.whatever.EmailField( blank = True )
Neste exemplo, eu executaria o bloco visual vertical sobre o .
e, em seguida, o reinserria durante o modo de inserção, ou seja, tipo .whatever.
. Espero que agora você possa ver a desvantagem deste método. Estou limitado a selecionar apenas uma coluna de texto que seja igual na posição vertical .
:s/models\./\0whatever./
\0
por&
.Respostas:
n
dentroname
.I
(capital i).vendor_
. Nota: Ele somente atualizará a tela na primeira linha - até que Escseja pressionado (6.), quando todas as linhas serão atualizadas.Uma maiúscula
I
deve ser usada em vez de minúsculai
, porque a minúsculai
é interpretada como o início de um objeto de texto , o que é bastante útil por si só, por exemplo, para selecionar dentro de um bloco de tag (it
):fonte
j
ou^L
. Você deve ver que o Vim não estava ocupado, afinal; estava apenas esperando. Segundo, tente alterar'timeout'
para um valor mais baixo, como80
(em vez do padrão1000
) e observe que o tempo limite é atingido mais rapidamente.timeoutlen
não étimeout
.A
vez deI
, que será inserido depois do bloco selecionado e não antes. Se suas linhas tiverem comprimentos diferentes, isso não funcionará; Eu gosto de usar uma substituição correspondente ao final de cada linha para isso, por exemplo, selecionando algumas linhas e usando:s/$/inserted/
.Outra abordagem é usar o comando .(
dot
) em combinação com I.vendor_
)Acho que essa técnica geralmente é mais rápida do que o modo de bloqueio visual para pequenos números de adições e tem o benefício adicional de que, se você não precisar inserir o texto em todas as linhas de um intervalo, poderá ignorá-las facilmente pressionando j s' .
Observe que, para um grande número de adições contíguas, a abordagem ou macro de blocos provavelmente será superior.
fonte
Pressione:
Digite o novo texto.
fonte
Esc
para os noobs do VIM como eu - levei um tempo para descobrir que as alterações são propagadas "mais tarde"!v
? Eu posso fazer issoCtrl+V --> A
, mas fazerv
para selecionar o texto não funciona -A
apenas acrescenta a essa linha. Eles não são ambos seleção? Além disso, muito estranho -A
apenas acrescenta ao final da linha SE eu estender o bloco visual até o final da linha; caso contrário, ele será anexado onde quer que o bloco visual termine para cada linha. É como se não reconhecesse a diferença entrea
eA
.c
vez deC
, mas funcionou perfeitamente bem. ObrigadoEu usaria uma macro para registrar minhas ações e depois a repetiria.
Agora você tem uma boa macro.
Digite 3@qpara executar sua macro três vezes para fazer o restante das linhas.
fonte
Ou eu estou esquecendo de alguma coisa?
fonte
vender_
prefixo é indesejado.1,4s/^/vendor_/
V
e digitar:
. Ele vai prefixar a expressão ed com:'<,'>
que fazem a ed aplicam-se apenas à seleção com:'<,'>s/^/vendor_/
Atualizado janeiro de 2016
Embora a resposta aceita seja uma ótima solução, na verdade, trata-se de um pouco menos de teclas digitadas e dimensiona melhor - com base em princípio na resposta aceita.
n
dentroname
.I
.vendor_
.Observe que isso tem menos pressionamentos de tecla do que a resposta aceita fornecida (compare a Etapa 3). Contamos apenas o número de j ações a serem executadas.
Se você tiver os números de linha ativados (como ilustrado acima) e souber o número da linha para a qual deseja mover, a etapa 3 poderá ser alterada para # Gonde # é o número da linha desejada.
No nosso exemplo acima, isso seria 4G. No entanto, ao lidar com apenas alguns números de linha, uma contagem explícita funciona bem.
fonte
Eu queria comentar muitas linhas em algum arquivo de configuração em um servidor que só tinha vi (sem nano), então o método visual também era complicado, e aqui está como eu fiz isso.
vi file
:set number!
ou:set number
:35,77s/^/#/
Nota: os números são inclusivos, as linhas de 35 a 77, ambas incluídas, serão modificadas.
Para remover o comentário / desfazer isso, basta usar
:35,77s/^#//
Se você deseja adicionar uma palavra de texto como um comentário após cada linha de código, também pode usar:
:35,77s/$/#test/
(para idiomas como Python):35,77s/;$/;\/\/test/
(para idiomas como Java)créditos / referências:
/unix/84929/uncommenting-multiple-lines-of-code-specified-by-line-numbers-using-vi-or-vim
/unix/120615/how-to-comment-multiple-lines-at-once
fonte
Você também pode ter um caso de uso em que deseja excluir um bloco de texto e substituí-lo.
Como isso
Para
Você pode apenas bloquear visualmente selecionar "Mundo" nas duas linhas.
Tipo c para alterar - agora você estará no modo de inserção.
Insira o material que você quer e aperte escape.
Ambos são refletidos verticalmente. Funciona exatamente como 'I', exceto que substitui o bloco pelo novo texto em vez de inseri-lo.
fonte
Suponha que você tenha este arquivo:
Você deseja adicionar "vendor_" na frente de "nome", "comentário", "telefone" e "email", independentemente de onde eles apareçam no arquivo .
A
c
bandeira solicitará sua confirmação. Você pode soltar isso se não desejar o prompt.fonte
Uma alternativa que pode ser mais flexível:
Exemplo: Para inserir o texto XYZ no início da linha
O que está acontecendo aqui?
%
== Executar em todas as linhasnorm
== Execute as seguintes teclas no modo normalI
== Inserir no início da linhaXYZ
== O texto que você deseja inserirEntão você bate Enter, e ele executa.
Específico ao seu pedido:
Você também pode escolher um intervalo específico:
Ou execute em um intervalo visual selecionado:
fonte
ctrl-v ctrl-[
para inserir um "Esc escapado", que o leva de volta ao "modo normal" para o objetivo do seu comando normal. Acabei de testar isso com'<,'>norm Iaa^[ysiw"
, onde^[
está o Esc escapado.fonte
fonte