Freqüentemente, sinto necessidade de executar uma substituição que terá correspondências dispersas em um arquivo grande e com expressões não triviais de pesquisa e substituição.
Por exemplo, digamos que eu tenha algumas chamadas de função como okFunction(arg1, arg2 arg3)
. Os argumentos diferem a cada chamada de função, é claro. Agora diga que eu descobri uma função melhor que não precisa arg2
. Eu posso ajustar facilmente o arquivo inteiro com
:%s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/gc
Embora conceitualmente simples, não tenho certeza de que tenho a sintaxe correta nesse padrão bastante longo. A c
bandeira realmente ajuda aqui, mas o problema é que, ao pedir confirmação, o vim não mostra com o que a correspondência será substituída. Quero dizer, ele mostrará a expressão de substituição, mas não o resultado avaliado. Se confirmar a substituição com y
, o vim saltará imediatamente para a próxima partida e não poderei ver se cometi algum erro.
Eu encontrei o plug - in vim-over que resolve parcialmente o problema, mas apenas se todas as matemáticas estiverem visíveis na tela quando você estiver digitando o comando. Quando você pressiona enter, o comportamento é exatamente o mesmo que descrevi acima e não recebo uma visualização.
Portanto, existe uma maneira de o vim avaliar a expressão de substituição ao pedir confirmação nos comandos substitutos?
fonte
%
, verifique se o resultado é o que eu estava esperando e, em seguida, use a substituição com%
(são apenas algumas teclas:):<up><c-b>%
. Claramente, uma opção de visualização seria muito mais eficiente que isso. Embora nenhum patch está disponível talvez um poderia envolver a substituição em uma função vimscript com este tipo de opção, mas que soa como um monte de trabalho ...Respostas:
Uma solução alternativa são as macros. Destaque todas as áreas problemáticas e faça a substituição em uma linha de cada vez. Então decida se você quer ou não. Uma vez feito
n
para a próxima área.Para o seu caso especificamente:
/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
qq
.:s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
q
u
) ou vá para o próximo resultado da pesquisa (n
).@q
.Obviamente não exatamente o que você estava procurando, mas geralmente é o que eu faço.
fonte
/
ela também se comporta como uma seleção visual - legal./
... se comporta como uma seleção visual." Na verdade não. A razão pela qual isso funciona é porque:s//
atua na linha atual e o uso on
leva para a próxima ocorrência.:s/pattern/replacement
ele usará a última string de pesquisa; portanto, na etapa 3, você poderá aplicar:s//betterFunction(\1, \3)/g
para salvar algumas digitações.:vimgrep /pattern/ ##
e aplico macro ; dessa forma, se o meu padrão está realmente correspondendo consistentemente e o macro é muito tedioso, posso rapidamente reverter para:argdo %s/.../..../gc
e começar a voar através da operação