清理 Windows 上 Vim 的 javac 输出,可能通过 Unix (Cygwin) 工具

Clean javac output on Windows for Vim, maybe via Unix (Cygwin) tools

我是 Java 的新手,并在 Windows 10 上安装了以下 JDK:

C:\Program Files\AdoptOpenJDK\jdk-11.0.8.10-openj9

我可以从 Cygwin 的 Bash 命令行调用编译器 javac (在 x 终端中),但它 会产生许多错误 stdoutstderr. 我都不需要将它们发送到文件 我可以用 Vim.

仔细阅读

这是我的调用命令

# mk.bash
# -------
javac \
-classpath "/c/Program Files/.../cplex.jar" \
TestSetup.java

classpath 参数在这里无关紧要,因为我 只想专注于在 Vim-perusable 中捕获 javac 的输出 方式。

发出 ./mk.bash >| mk.out 生成一个空的 mk.out,就像 ./mk.bash 2>&1 >| mk.out。几十年来我一直使用后一种模式 将 stderr 重定向到 stdout 并覆盖目标文件。

可以使用script命令将javac输出发送到mk.out:

script mk.out
./mk.bash
exit

然后我可以使用 Vim 浏览错误消息。然而 内容被许多二进制字符混淆(图像 & link 到下面的文件)。通常情况下,我可以 使用 dos2unix 清理杂乱的文件,但在这个输出中,它由于退出 到二进制字符。

作为清理非文本内容的另一种方法,Vim fileformat=dos 选项,可以使用 :e ++ff=dos % 输入。 e% 表示编辑当前文件,而 ++ff=dos 表示 将文件解释为 dos 格式(fffileformat)。全部 这样做是为了清理由于不同行造成的视觉伪影 Unix 和 DOS 中的结尾。所有错误信息仍然穿插 看起来像转义字符 ^[.

有没有办法让javac只生成纯文本 输出还是清理输出?

这是 Vim 中非纯文本文件的图像:

我怀疑这一切是否相关,但我正在关注此网页以 编译一个调用第 3 方的简单 Java 应用程序 TestSetup.java 工具:https://kunlei.github.io/cplex/cplex-java-setup.

前面的底线

下面的 Bash 命令发送 stdoutstderr 来自 javac 到屏幕和文件 mk.out:

javac -classpath /Some/NonExistent/Jar/File.jar TestSetup.java \
2>&1 | tee mk.out

如何找到的

我发现问题主要是 Bash 管道的使用, 重定向和 script 命令。后者负责 ANSI 代码。我以前无法确定这一点,因为我可以 在没有 script 的情况下,无法在文件中捕获 javac 错误消息。所以 我首先解决了那个问题,然后将 script 的使用与 script 缺席。这是我找到的。

以下 bash 命令创建一个没有 ANSI 的 DOS 格式文件 代码:

javac -classpath '/Some/NonExistent/File.jar' TestSetup.java \
>| mk.out 2>&1

之前,我有:(1) 2>&1 >| mk.out 而不是 (2) >| mk.out 2>&1。对于选项 (1),我认为 stderr 被定向到 stdout,所以我只需要将 stdout 指向 mk.out

但事实并非如此。在选项 (1) 中,规范 2>&1stderr 指向 stdout 当前指向的内容,即 屏幕。随后的>| mk.out则指向stdout(而 std.out) 到 mk.out。不幸的是,这意味着 stderr 是 仍然会出现在屏幕上。 Presto,mk.out 留空(坏)。

在选项(2)中,stdout首先指向mk.out。随后的 2>&1 然后将 stderr 指向 stdout 指向的内容,即 mk.out。因此,javac 错误消息被发送到 mk.out。 它 包含 ANSI 代码,这很好。

虽然选项 (2) 可行,但并不理想;错误消息不是 显示在屏幕上。这是我回到 script 并找到的地方 它引入了 ANSI 代码:

script \
-c "javac -classpath '/Some/NonExistent/File.jar' TestSetup.java" \
mk.out

由于上面解决了重定向的问题stderr,我看了下 对于 bash 个避免 script 的选项。下面发送stderr给 屏幕和 mk.out:

javac -classpath /Some/NonExistent/Jar/File.jar TestSetup.java \
2>&1 | tee mk.out

根据上面选项(1)的解释,好像是 不应该工作,但是 Bash 在用于 管道。具体来说,stderr 被重定向到 stdout 是什么 定向到,但仅在所有重定向之后。在管道中, 以上表示 javacstdout 指向 teestdin, 只有这样 javacstderr 才会指向目标 javacstdout,即teestdin.

供参考:初步解决方案(javacXstdout选项)

我发现我的 javac 有一个命令行选项 -Xstdout OutputFileName.txt 专门用于此目的。

不幸的是, 并非我在网上找到的所有 javac 文档都显示此选项的可用性。在那种情况下,我找到的最直接的解决方案是 :term cat The/Output/File.Path in Vim.

许多 vim 备选方案也显示在该页面上,以及 here

为了将来参考,如果需要,我发现 3 个完整的页面 相关的是:

提到了 ansi2txt,但您需要 Ubuntu。