vim仅在程序终止且出现故障时打印结果

vim仅在程序终止且出现故障时打印结果,vim,makefile,Vim,Makefile,当我在命令行中使用make时,以下代码工作正常,但如果我使用vim:make命令,所有文本仅在程序终止且结果不正常时打印 正确的输出: > test test 但是在vim:make中,我得到了 > test 代码如下: 答复c #include <stdio.h> static char input[2048]; int main(int argc, char** argv) { fputs("> ", stdout);

当我在命令行中使用
make
时,以下代码工作正常,但如果我使用vim
:make
命令,所有文本仅在程序终止且结果不正常时打印

正确的输出:

> test
 test
但是在vim
:make
中,我得到了

> test
代码如下:

答复c

#include <stdio.h>

static char input[2048];

int main(int argc, char** argv) {
        fputs("> ", stdout);
        fgets(input, 2048, stdin);
        printf("%s", input);
        return 0;
}

Vim捕获
make
输出,以便解析它并在quickfix窗口中显示任何编译错误。如果您在运行
:make
期间观察这些进程,您会注意到一个命令行,如

/bin/bash -c make  2>&1| tee /tmp/v0YCPH1/16
:make
的主要用例是运行非交互式构建,而不是进行用户交互。如果某种测试是您的目标,您可以添加一个专用的
测试
目标,例如:

test: repl
        echo "test" | ./repl
或者,如果您添加

fflush(stdout);

调用
fputs()
后,您将获得预期的输出,因为这会显式地清除输入之前的输出缓冲区。

Vim捕获
make
输出,以便解析它并在quickfix窗口中显示任何编译错误。如果您在运行
:make
期间观察这些进程,您会注意到一个命令行,如

/bin/bash -c make  2>&1| tee /tmp/v0YCPH1/16
:make
的主要用例是运行非交互式构建,而不是进行用户交互。如果某种测试是您的目标,您可以添加一个专用的
测试
目标,例如:

test: repl
        echo "test" | ./repl
或者,如果您添加

fflush(stdout);

调用
fputs()
后,您将获得预期的输出,因为这会显式地清除输入之前的输出缓冲区。

如果您正在运行交互式构建并拥有足够新的Vim。您可能想要签出
:terminal
,这将允许您打开一个类似于终端的缓冲区,在那里您可以交互地测试构建。如果您正在运行交互式构建并拥有足够新的Vim,请参阅
:h terminal
。您可能想要签出
:terminal
,这将允许您打开一个类似于终端的缓冲区,在那里您可以交互地测试构建。参见
:h终端