Executa o comando na saída do VIM e exibe a saída

2

Eu uso vim para editar meus scripts PHP, e gostaria que vim executasse automaticamente php -l em qualquer arquivo *.php que eu saísse para fazer uma verificação de sintaxe. Eu configurei este autocmd no meu arquivo ~/.vimrc :

autocmd VimLeave *.php :!php -l %

O que estou esperando ver é a mensagem:

No syntax errors detected in (file).

... ou qualquer erro de análise foi encontrado durante a verificação de sintaxe. Mas nada é exibido.

Quando eu substituo o comando acima por algo que prova que o autocmd está realmente em execução (como echo % >> /tmp/vimtest ), vejo que o arquivo é criado e anexado com as informações corretas. Quando eu substituí-lo por algo que deve apenas produzir algo (como echo hello world ), não recebo nada. Portanto, só posso supor que meu comando php -l esteja em execução, mas vim não mostra a saída.

Eu não conheço virtualmente nada sobre vimscript e nunca trabalhei com autocmds, então espero que haja um sinalizador que eu possa definir aqui que fará com que a saída seja exibida no console ao sair.

    
por Nick Coons 23.12.2015 / 04:06

1 resposta

2

Eu descobri porque isso não funciona como eu esperava. A saída é ecoada para o console, mas quando vim termina de sair, ele remove tudo o que foi exibido, por isso não é visível. Isso pode ser demonstrado com isto:

autocmd VimLeave *.php :!echo Hello; sleep 5

Eu posso ver por cinco segundos, então ele limpa e me leva de volta ao prompt. Eu pensei que poderia fazer algo assim:

autocmd VimLeave *.php :!php -l %; sleep 5

E isso funciona, mas cria um sono de cinco segundos toda vez que eu saio da edição de um arquivo PHP. Eu posso Ctrl-C fora dele, mas isso é um mau hábito para entrar, e adiciona outro passo para o 95% dos casos em que eu sair de um arquivo e não há erros. Pensei em alterar sleep 5 para sleep 1 , para que eu não precisasse esperar tanto nesses casos, mas só me resta um segundo para ver os erros reais, o que pode não ser bom.

Então escrevi algo um pouco mais complexo:

autocmd VimLeave *.php :!php -l % &> /dev/null; if [ $? -ne 0 ]; then ERRORS=$(( php -l % ) 2>&1 ); clear; printf "\n************************************ ERRORS ************************************\n$ERRORS\n********************************************************************************\n"; sleep 10; fi;

Isso faz o seguinte:

Se não houver erros, ele sairá normalmente e não exibirá nenhuma saída especial. Se houver um erro, ele me fornecerá uma exibição de erro bem formatada como esta:

************************************ ERRORS ************************************
PHP Parse error:  syntax error, unexpected 'include' (T_INCLUDE) in file.php on line 4

Parse error: syntax error, unexpected 'include' (T_INCLUDE) in ami.php on line 4
Errors parsing file.php
********************************************************************************

Ele limpa a tela antes de exibir esse erro e aguarda 10 segundos. Isso me dá tempo mais que suficiente para ver e compreender o erro. Eu posso sempre Ctrl-C fora da exibição se eu terminar antes dos 10 segundos. Se eu Ctrl-C out ou os 10 segundos estiverem ativos, ele volta para o console principal que vi antes de abrir vim , como normalmente veria ao sair de vim sem nenhuma dessas modificações.

Isso provavelmente pode ser feito em uma função autocmd para que fique um pouco mais limpa dentro do meu arquivo .vimrc , se eu achar que valeu a pena aprender como fazer isso.

    
por 27.12.2015 / 02:23

Tags