muda rapidamente as próximas linhas no vim?

2

Eu tenho o arquivo atual (sendo a localização atual [n])

The [p]hilosophical chicken saw the street
The red dog saw the street
The red dog crossed the street
The apple was red
The red dog crossed the street
The red dog was sleeping

Eu quero mudar as próximas 4 linhas que contêm red dog para frango filosófico

Esta é uma situação em que eu costumo correr e acabo usando o mouse.

Qual é a maneira mais rápida de fazer isso com o mínimo de pressionamentos de teclas?

Eu tentei até agora

  • Contamos as linhas pressionando Ctrl + g, contando as próximas linhas e fazendo %código%
    • Muito tempo, pensando e digitando
  • Macro - > :2,5s:red dog:philosophical chicken:g qu /red dog Enter c2W philosophical chicken Esc /red dog Enter q
    • Depois de concluído, quase tão rápido quanto usar substituto (: s)
  • 2@u - Arranca duas palavras (ignorando pontuação), desce 1 linha, cola antes do cursor e apaga duas palavras
    • Completa rapidamente uma linha, mas agora meu buffer contém red dog , então tenho que voltar e recapturar o buffer.
  • Realce frango filosófico com mouse no terminal, pressione 2yW j P 2dE , Ctrl+Shift+C + Ctrl + Deslocamento + V , j 2cW - Copiar texto, descer uma linha, alterar duas palavras e entrar no modo Inserir e colar, Esc escapa modo de inserção
    • Mouse no vim? : (
  • Esc c2W philosophical chicken Esc ?red dog Enter - Altere duas palavras, digite "frango filosófico" escape, inverta a pesquisa para "cão vermelho", faça a última ação (altere 2 palavras para frango filosófico), repetir
    • Tem que digitar duas palavras completas novamente

Até agora, usando o mouse, copiar e colar com alterações foi o caminho mais rápido para mim. Este não pode ser o caminho certo.

Como devo estar fazendo isso?

Idealmente, gostaria de arrancar 2 palavras, navegar para .N.N. e substituir 2 palavras pelo buffer.

    
por Miati 08.09.2016 / 04:45

5 respostas

2

Otimizando o que @MattObert disse:

  • y 3 i w
  • / red dog Digite
  • c 3 i w Ctrl-r 0 Esc
  • n . etc.

Em detalhes:

  • y 3 i w yanks philosophical chicken ; isto é marginalmente melhor que y 2 W porque o último inclui um espaço à direita; a parte i w também garante que o yank ainda funcione quando você começa com o cursor no meio da primeira palavra, em vez de no começo
  • / red dog Enter localiza o primeiro red dog
  • c 3 i w apaga red dog (novamente, sem o espaço final) e alterna para o modo de inserção
  • Ctrl-r 0 pastas do registro 0 (cf. :h i_CTRL-R e :h quote0 )
  • Esc muda para o modo normal
  • n . localiza o próximo red dog e reproduz a última operação (ou seja, substitui-a por philosophical chicken )
  • repita n . conforme necessário.

O primeiro truque é que os yanks são salvos automaticamente para registrar 0 . O segundo truque é que você pode colar registradores no modo de inserção com Ctrl-r .

Outras coisas que ajudariam você:

  • ativar números de linha: :setlocal relativenumber! number! (execute-o novamente para desativá-lo)
  • mesma coisa que uma macro: nnoremap <silent> <Leader>, :setlocal relativenumber! number!<CR>
  • use os desvios de linha em relação à linha do cursor: :.,+6 s/.../.../
  • substituir por confirmação: :%s/red dog/philosophical chicken/gc

Dê uma olhada nos Vimcasts de Drew Neil para outros truques semelhantes. Também considere postar perguntas relacionadas ao Vim no site do Vi .

    
por 08.09.2016 / 07:52
1

Há certamente mais de uma maneira de fazer isso. Mas acho que a maneira mais simples seria procurar o cachorro vermelho:

/red dog

altere então duas palavras:

c2w

Isto irá colocá-lo no modo de inserção, e você pode simplesmente digitar:

philosophical chicken

Em seguida, pressione a tecla Esc para voltar ao modo de comando e digite:

n.n.

até você ter substituído todas as instâncias de red dog por philosophical chicken . ( n pesquisará para a próxima instância de red dog e . repetirá o comando anterior.)

Menos raciocínio, não muita digitação e você nem precisa usar buffers. (Embora os buffers sejam legais!)

Talvez eu tenha entendido mal a questão, mas essa abordagem parece super simples e me pergunto por que todo mundo está pensando demais nisso.

EDITAR:

Depois de ler a questão mais de perto, vejo que uma variação disso é uma das opções acima, mas OP rejeitou porque "tem que digitar duas palavras inteiras novamente". Me desculpe por isso. Mas este ainda seria o meu método preferido.

    
por 08.09.2016 / 05:37
0

Eu normalmente usaria a primeira abordagem. Mas se você não gosta disso, Eu sugeriria uma pequena modificação da terceira abordagem.

  1. "a2yW , para extrair "frango filosófico" para o buffer A .
  2. Mover para "cachorro vermelho" pelo método de sua escolha; por exemplo, j ou /red dog .
  3. 2dW e "aP (ou "aP e 2dE ) para colar "frango filosófico" do buffer A e delete "red dog".
  4. Repita os passos 2 e 3 (já que o buffer A ainda contém "frango filosófico"). Se você pesquisou "red dog" antes, use n para repetir a pesquisa. Se você usou j antes, use 2Bj (ou 2B2j para mover da linha 3 para a linha 5, etc.)
por 08.09.2016 / 05:07
0

Eu descobri esta postagem

RESOLUTION: For my immediate need, I used 12yl to yank 12 characters and "_cw^r0 to replace a word. I was then able to use the . command to repeat the replacement throughout the file. – plong

Fazendo a sequência

y2W /red dog Enter "_c2W^r0 Esc n.n.

    
por 08.09.2016 / 05:22
0

Primeiro, eu arranco philosophical chicken , pois isso é mais curto que redigitar. Então, eu usaria um dos meus plugins:

Alterative A

Com o meu plug-in ChangeGlobally , gc{motion} substitui red dog pelo texto digitado (aqui : registrador colado), e re-aplica isso a todas / [contagem] seguintes ocorrências também.

"ay2ejgc2e<C-R>a<Esc>

Alterative B

Isso é mais adequado para edição, mas não para colar. Para poucas (ou não subseqüentes) ocorrências, eu preferiria meu plug-in ReplaceWithRegister , que permite que você substitua texto com um registro via gr{motion} . Para o seu exemplo, eu uso +w para passar para a próxima ocorrência; também é possível usar search / n .

y2ejgr2e+w.2+w.+w.
    
por 08.09.2016 / 12:40

Tags