Como obter uma visualização do comando de substituição?

9

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 cbandeira 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?

Vitor Eiji
fonte
2
esse é um item da lista de permissões no rastreador de erros de vim (desculpe, não o encontre atualmente) #
Christian Brabandt
2
Pelo que vale a pena, geralmente uso a substituição na primeira linha para substituir sem a %, 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 ...
statox
2
@ChristianBrabandt Encontre-o . Ainda está com prioridade não classificada ...
Vitor Eiji
2
@VitorEiji que não era o que eu estava pensando. Mas isso realmente não importa, pois atualmente não é possível. Neovim fornece a opção 'inccommand', que pode funcionar (ou não, atualmente não)
Christian Brabandt
O mal visualiza a substituição; Eu não sei como isso acontece, no entanto.
Geremia

Respostas:

2

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 npara a próxima área.

Para o seu caso especificamente:

  1. Pesquisar áreas: /\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))
  2. Comece a gravar uma macro qq.
  3. Aplique :s/\<okFunction(\(\w\+\), \(\w\+\), \(\w\+\))/betterFunction(\1, \3)/g
  4. Parar a gravação de macro q
  5. Desfaça ( u) ou vá para o próximo resultado da pesquisa ( n).
  6. Aplique macro @q.
  7. Repita as etapas 5 e 6 conforme necessário.

Obviamente não exatamente o que você estava procurando, mas geralmente é o que eu faço.

Tumbler41
fonte
isso é legal! Eu nunca percebi que quando você faz uma pesquisa com /ela também se comporta como uma seleção visual - legal.
the_velour_fog
@the_velour_fog " /... 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 o nleva para a próxima ocorrência.
Tumbler41
11
Se você não especificar um padrão, :s/pattern/replacementele usará a última string de pesquisa; portanto, na etapa 3, você poderá aplicar :s//betterFunction(\1, \3)/gpara salvar algumas digitações.
Haegin
@ Tumbler41 ah, obrigado por esclarecer. Sim, eu também faço essa técnica básica de pesquisa e , em seguida, aplico macro , normalmente preencho primeiro o arglist e utilizo :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/.../..../gce começar a voar através da operação
the_velour_fog