vim: Automatize a substituição parêntese sensível ao contexto por surround.vim

1

Estou usando o vim com o plug-in surround.vim e deseja substituir toda a ocorrência de sin(...) com sin[...] em uma expressão matemática (muito longa) (contendo parênteses correspondentes).

Exemplo de entrada:

 sin(A*(B+C))+sin((X+Y)*sin((A+D)*C))

queria a saída:

 sin[A*(B+C)]+sin[(X+Y)*sin[(A+D)*C]]

Atualmente, estou pesquisando primeiro com /sin\zs( para pular para o próximo sin expressão com o cursor no ( e depois digite cs(] para fazer a substituição para o parêntese correspondente. Então, eu posso repetir os dois comandos com n (pesquisa a seguir) e . (repetir o último comando). Isso funciona, mas é complicado porque as expressões são muito grandes.

Existe uma maneira, como eu posso automatizar toda a sequência de comandos? ou de outra forma como eu posso a substituição dentro de vim de uma forma totalmente automatizada?

Provavelmente há outras maneiras completamente diferentes de fazer a conversão fora do vim, mas por razões educacionais eu estou especialmente interessado em uma solução vim para o problema.

    
por jofel 19.06.2015 / 19:19

1 resposta

3

Este é um caso típico em que uma macro recursiva pode ajudar. Basta colocar sua seqüência de teclas em uma macro recursiva e executá-la. Resumindo o artigo da wiki, para não irritar os deuses da SE:

  • q q q - limpe o q register
  • q q - inicia a gravação de uma macro q
  • /\msin\zs( Digite - encontre sin( e deixe o cursor em (
  • c s ( ] - substitui (...) por [...] (use ] em vez de [ para evitar adicionar espaços extras)
  • @ q - executa a macro q (que não faz nada por agora, pois o registro q está vazio)
  • q - finaliza a gravação da macro.

Em seguida, execute a macro que acabou de gravar: @ q . Isso é tudo, o @q no final faz a macro chamar-se. Ele pára no primeiro erro, ou seja, quando /sin( não encontra mais nada.

Em uma observação: se você não quiser aplicar essa alteração em todo o arquivo, mas apenas entre linhas, digamos, 10 e 20, e ainda usar recursão para evitar as confirmações manuais, use \%>...l e \%<...l para fazer sua correspondência de expressão regular apenas entre os limites desejados: /\m\%>9l\%<21lsin\zs( .

    
por 19.06.2015 / 19:46