在 VIM 退出时执行命令并查看输出

在 VIM 退出时执行命令并查看输出

我用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如果我认为花时间学习如何做到这一点是值得的,那么这可能可以变成一个自动命令函数,以便我的文件内部更干净一些。

相关内容