2

Я использую vim для редактирования моих PHP-скриптов, и я хотел бы, чтобы vim автоматически выполнял php -l для любого файла *.php который я выхожу, для проверки синтаксиса. Я установил этот autocmd в моем файле ~/.vimrc :

autocmd VimLeave *.php :!php -l %

То, что я ожидаю увидеть, это либо сообщение:

No syntax errors detected in (file).

... или любая другая ошибка синтаксического анализа, обнаруженная во время проверки синтаксиса. Но ничего не отображается.

Когда я заменяю приведенную выше команду чем-то, что доказывает, что autocmd действительно работает (например, echo % >> /tmp/vimtest), я вижу, что файл создается и добавляется с правильной информацией. Когда я заменяю его чем-то, что должно просто выводить что-то (например, echo hello world), я ничего не получаю. Поэтому я могу только предположить, что моя команда php -l запущена, но vim не показывает мне вывод.

Я практически ничего не знаю о vimscript и никогда не работал с autocmds, поэтому я надеюсь, что здесь можно установить флаг, который будет отображать вывод на консоль при выходе.

1 ответ1

2

Я понял, почему это не работает, как я надеялся. Вывод выводится на консоль, но когда vim завершает работу, он удаляет все, что он выводит, поэтому он не виден. Это можно продемонстрировать с помощью этого:

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

Я могу видеть это в течение пяти секунд, затем он очищается и возвращает меня к приглашению. Я думал, что могу просто сделать что-то вроде этого:

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

И это работает, но затем он создает пятисекундный сон каждый раз, когда я завершаю редактирование файла PHP. Я могу использовать Ctrl-C , но это плохая привычка, и я добавляю еще один шаг в 95% случаев, когда я выхожу из файла и ошибок нет. Я думал о том, чтобы сменить sleep 5 на sleep 1 чтобы мне не пришлось так долго ждать в этих случаях, но потом у меня осталась всего одна секунда, чтобы просмотреть любые реальные ошибки, которые могут быть не очень хорошими.

Итак, я написал что-то более сложное:

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;

Это делает следующее:

Если ошибок нет, он просто выходит как обычно и не отображает никаких специальных выходных данных. Если есть ошибка, это дает мне красиво отформатированное отображение ошибки как это:

************************************ 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
********************************************************************************

Он очищает экран перед отображением этой ошибки и ждет в течение 10 секунд. Это дает мне более чем достаточно времени для просмотра и понимания ошибки. Я всегда могу выйти из режима Ctrl-C , если я закончу до истечения 10 секунд. Если я Ctrl-C или 10 секунд истекают, он возвращается к основной консоли, которую я видел перед открытием vim , как я обычно видел при выходе из vim без каких-либо этих изменений.

Это, вероятно, можно превратить в функцию autocmd, чтобы она была немного чище в моем файле .vimrc , если бы я думал, что стоит потратить время на то, чтобы научиться это делать.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .