我用vim
它来编辑 PHP 脚本,我想vim
自动执行我退出时进行语法检查的php -l
任何文件。我已在文件中设置此自动命令:*.php
~/.vimrc
autocmd VimLeave *.php :!php -l %
我期望看到以下消息:
No syntax errors detected in (file).
...或者语法检查过程中遇到的任何解析错误。但什么都没有显示。
当我用一些可以证明 autocmd 确实在运行的命令(如echo % >> /tmp/vimtest
)替换上述命令时,我可以看到文件被创建并附加了正确的信息。当我用一些应该只输出一些内容的命令(如echo hello world
)替换它时,我什么也得不到。所以我只能假设我的php -l
命令正在运行,但vim
没有显示输出。
我实际上对 vimscript 一无所知,也从未使用过自动命令,所以我希望在这里设置一个标志,使输出在退出时显示到控制台。
答案1
我弄清楚了为什么它没有像我希望的那样工作。输出被回显到控制台,但是当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
。
.vimrc
如果我认为花时间学习如何做到这一点是值得的,那么这可能可以变成一个自动命令函数,以便我的文件内部更干净一些。