A substituição global do Vim não substitui todos os jogos em uma linha

12

às vezes, minhas subistusões globais não substituem todas as correspondências em uma linha. Isso é confirmado pelo fato de que eu posso vê-lo quando faço substituições com confirmação. Uma correspondência é encontrada em uma linha com várias correspondências possíveis, mas depois é transferida para outra linha.

Eu uso os parâmetros gou gcoperando em todo o arquivo com %.

Neste arquivo:

hello hello
hello
hello hello hello
hello

Se %s/hello/goodbye/geu receber

goodbye hello
goodbye
goodbye hello hello
goodbye

Tudo o que tenho na minha .vimrcpesquisa / substituição é

set hlsearch
set ignorecase
set incsearch
Nicolas Scotto Di Perto
fonte
3
Por favor, dê-nos um exemplo do mundo real e mostre-nos o seu vimrc.
Romainl
2
Qual é o resultado :echo &gde o que acontece se você adicionar um segundo gsinalizador como este: %s/hello/goodbye/ggou se você remover gtotalmente o sinalizador? Se a saída de :echo &gdfor 1, tente adicionar set nogdefaultno final do seu vimrc.
user9433424
11
Bem! Eu não sei por que, mas por padrão foi definido como 0, então eu adicionei set nogdefaultcomo você disse e funciona agora, a propósito. Obrigado!
Nicolas Scotto Di Perto

Respostas:

12

Talvez você, ou um plugin, tenha ativado a opção 'gdefault'. Esta opção adiciona o sinalizador gautomaticamente sempre que você executa uma substituição.

Portanto, quando você adiciona manualmente o sinalizador genquanto 'gdefault'está ativado, é como se você tivesse 2 gsinalizadores que têm o mesmo efeito que nenhum. Portanto, o Vim substitui apenas a primeira ocorrência do padrão em todas as linhas.

Por padrão, esta opção está desactivada, mas para se certificar de que é, você pode adicionar no final da sua vimrc: set nogdefault.

Como alternativa, se você suspeitar que um plug-in pode ter ativado a opção, você pode localizá-lo com: verb set gd?

Ou você pode se acostumar com a opção, o que significa que, quando você deseja substituir todas as ocorrências de um padrão, não adiciona o gsinalizador (porque gdefaultjá o fez) e quando deseja substituir apenas a 1ª ocorrência do padrão em uma linha, você adiciona o gsinalizador (porque 2 gsinalizadores são iguais a nenhum).

user9433424
fonte