No vim, às vezes tenho ocasião de substituir as primeiras ocorrências de uma partida em uma linha, mas nem todas as que g
gostariam. por exemplo:
a a a a a
para
b b b a a
Eu sei que poderia usar :s/a/b/[enter]:[up][enter]:[up][enter]
, mas isso é tedioso o suficiente em três repetições, tenho linhas com potencialmente mais de 10 substituições.
Eu tentei:
:s/a/b/3g
: vim reclamou de caracteres à direita.:s/a/b/3
: altera a primeira ocorrência nesta e nas duas linhas a seguir.3:s/a/b
: igual ao anterior.:s/a/b/g3
: altera todas as ocorrências nesta e nas próximas duas linhas.:3s/a/b
: altera a primeira ocorrência na linha 3.:/a/,3/a/s/a/b
: altera a primeira ocorrência em cada linha entre a próximaa
e a terceira linha que contéma
o arquivo (solicitando a reversão, se necessário).:/a/,/\([^a]*a\)\{3\}/s/a/b/
: altera a primeira ocorrência em cada linha entre essa e a seguinte com 3a
s (e isso não seria facilmente extensível a uma pesquisa com vários caracteres).
E vários outros padrões de endereçamento, nenhum dos quais funcionou. Devo dizer que aprendi :s
bastante sobre o comando tentando encontrar uma resposta para esse problema, mas ainda não o resolvi.
Alguém sabe como fazer isto?
(pontos de bônus por faixa específica, por exemplo, segunda a quarta ocorrências)
n
e.
, embora não tenha pensado em usá-los aqui. Certamente uma melhoria, obrigado.s/a/=something/
deve fazer o truque (:help sub-replace-=
). Não sou fluente o suficiente no Vim para escreversomething
logo de cara .:[up][enter]
pode ser substituído por&
, o que ainda não é o ideal, mas pelo menos é menos doloroso.Respostas:
Com base na
:s/pattern/replacement/gc
idéia de Samus_ (que parece ser a maneira mais simples de garantir a operação correta quando o padrão está contido na cadeia de substituição), substitua as ocorrências de segunda a quarta em uma única linha:feedkeys()
é uma função que coloca a sequência de entrada na fila de entrada do teclado. O ponto é fazer a contagem antecipadamente, para que você não precise se preocupar em perder a conta ou ser interrompido.Para um caso mais geral, substituir as ocorrências Mth a Nth em uma única linha por N maior ou igual a um M muito grande :
Substitua M e N pelos valores desejados (você pode até deixar
vim
fazer a aritmética mental trivial se não quiser fazer isso sozinho). Observe que.
é o operador de concatenação de strings do VimL. Obviamente, isso só salva as teclas pressionadas para M grandes . Se você usar essa funcionalidade com frequência, poderá economizar tempo para colocar o que foi dito acima em um comando ou função personalizada de algum tipo, pois é bastante digitado.fonte
Para a primeira pergunta, eu faria:
O segundo é mais complicado, não sei como fazê-lo automaticamente, mas você pode fazer com que o vim solicite a você em cada partida desta forma:
Em seguida, você responde "não" às primeiras n correspondências e "sim" às outras.
fonte
c
, essa pode ser a melhor solução proposta ainda. Eu ainda teria que contar, mas acho que é a primeira opção que funcionaria com substituições que contêm a string de pesquisa.fonte
Eu acho que isso pode funcionar, substitua primeiro e repita 2 vezes:
fonte