Estou no processo de embelezar algum código-fonte usando o vim. {1}
Criei algumas macros do vim que executam as etapas individuais: remoção do espaço em branco à direita, remoção de linhas vazias depois {
, remoção de linhas vazias antes {
, esse tipo de coisa.
Agora, quero criar uma macro que execute todas as macros individuais em sequência. No entanto, quando a primeira macro recursiva termina (porque não consegue mais encontrar correspondências -> erro de correspondência), minha macro "wrapper" também termina.
Existe uma maneira de fazer uma macro vim continuar depois que um submacro gerou um erro?
{1} Eu sei sobre reformatters automáticas. Eu posso até usá-los no meu problema atual. Eu apenas mencionei a reformatação de fonte pelo bem do exemplo. Não poste nenhuma resposta sobre esse embelezador de origem ou sobre isso. A questão não é sobre reformatação de código em si , mas sobre macros do vim.
Exemplo:
- Macro 1 - aparar espaços em branco à direita -
qw/\s\+$d$@wq
- Macro 2 - excluir linhas vazias antes} -
qe/\n\n *}dd@eq
- Macro do invólucro - retabitação, Macro 1, Macro 2 -
qr:retab@w@eq
Quando executo o invólucro - @r
- ele irá retabular e, em seguida, execute a Macro 1 até que não seja encontrado mais espaço em branco à direita, e finalize ( sem executar a Macro 2).
Esclarecimento:
O que estou procurando é como chamar um submacro para que, quando esse submacro termine, a macro de chamada continue?
Se o comando com falha for uma substituição que não está encontrando seu padrão, por exemplo,
quando
foo
não existe no buffer, você pode adicionar oe
sinalizador para ignorar esse erro, por exemplo,Vejo
Você pode dizer ao Vim para ignorar os erros de alguns comandos: ex, precedendo-os com
:silent!
. VejoEditar após a adição de exemplo à pergunta
Macro 1 e Macro 2 são recursivas e nenhum mecanismo explícito para terminar a recursão. Meu palpite é que um dos testes internos do Vim para recursão ilimitada está sendo acionado, o que gera um erro. Se a Macro 1 estiver gerando esse erro, esse erro encerrará a execução da Macro Wrapper logo após
@w
.Minha sugestão seria limitar o número de vezes que suas macros estão sendo executadas reescrevendo-as como: ex comandos e limitando o intervalo de linhas nas quais elas são executadas. Por exemplo:
onde
^M
significa digitar sua tecla Enter ou Return. Não testei esses itens juntos na macro Wrapper, mas acho que você poderá corrigir os erros que cometi.fonte
/foo
). Embora de:silent!
fato o truque do submacro recursivo não tenha abortado a macro do wrapper, agora o submacro não termina de jeito nenhum ... e suspeito que fazê-lo de alguma forma terminar novamente também encerraria a macro do wrapper. Parece que estou preso. : - \O que funcionou para mim foi uma combinação das respostas de Peter Rincker e @garyjohn. Separadamente, eu continuava recebendo problemas estranhos.
Eu acho que a
silent!
no<leader>rt
, e os personagens da tubulação entre oendtry
eow
foram as chaves - simplesmente ter a quebra de linha após aendtry
falha. Elestry
funcionaram quando eu os inseri, mas quando executados como uma macro, o erro sobre o texto da pesquisa não foi encontrado continuaria sendo gerado.fonte
Rotineiramente, crio macros dinamicamente quando preciso realizar uma tarefa repetitiva entre muitos arquivos. No meu caso, tenho o NERDtree ( http://www.vim.org/scripts/script.php?script_id=1658 ) instalado no VIM, que cria uma
vsplit
janela e, à esquerda, tenho uma lista de todos os arquivos em o diretório atual. Em um exemplo, preciso encontrar a primeira instância da stringMY_TEST
no arquivo e excluir, se houver, um prefixo rotulado comoCUSTOM_PREFIX-
dessa linha, salvar o arquivo e passar para a próxima.Aqui está como eu tenho essa macro trabalhar em cerca de 2000 arquivos no diretório atual. Eu poderia escrever um script bash para fazer isso, mas é mais rápido no VIM, no meu caso. As
+
teclas denotam ser pressionadas simq,a
CTRL+ W,←
↓
ENTER
q
1000, @,a
Espero que isto ajude!
fonte