清理 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 终端中),但它 会产生许多错误
stdout
或 stderr
. 我都不需要将它们发送到文件
我可以用 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
格式(ff
是 fileformat
)。全部
这样做是为了清理由于不同行造成的视觉伪影
Unix 和 DOS 中的结尾。所有错误信息仍然穿插
看起来像转义字符 ^[
.
有没有办法让javac
只生成纯文本
输出还是清理输出?
这是 Vim 中非纯文本文件的图像:
我怀疑这一切是否相关,但我正在关注此网页以
编译一个调用第 3 方的简单 Java 应用程序 TestSetup.java
工具:https://kunlei.github.io/cplex/cplex-java-setup.
前面的底线
下面的 Bash 命令发送 stdout
和 stderr
来自
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>&1
将 stderr
指向 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
是什么
定向到,但仅在所有重定向之后。在管道中,
以上表示 javac
的 stdout
指向 tee
的 stdin
,
只有这样 javac
的 stderr
才会指向目标
javac
的stdout
,即tee
的stdin
.
供参考:初步解决方案(javac
的Xstdout选项)
我发现我的 javac
有一个命令行选项 -Xstdout OutputFileName.txt
专门用于此目的。
不幸的是, 并非我在网上找到的所有 javac
文档都显示此选项的可用性。在那种情况下,我找到的最直接的解决方案是 :term cat The/Output/File.Path
in Vim.
许多 vim 备选方案也显示在该页面上,以及 here
为了将来参考,如果需要,我发现 3 个完整的页面
相关的是:
- https://superuser.com/questions/380772/removing-ansi-color-codes-from-text-stream
- https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output
- https://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped
提到了 ansi2txt
,但您需要 Ubuntu。
我是 Java 的新手,并在 Windows 10 上安装了以下 JDK:
C:\Program Files\AdoptOpenJDK\jdk-11.0.8.10-openj9
我可以从 Cygwin 的 Bash 命令行调用编译器 javac
(在 x 终端中),但它 会产生许多错误
stdout
或 stderr
. 我都不需要将它们发送到文件
我可以用 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
格式(ff
是 fileformat
)。全部
这样做是为了清理由于不同行造成的视觉伪影
Unix 和 DOS 中的结尾。所有错误信息仍然穿插
看起来像转义字符 ^[
.
有没有办法让javac
只生成纯文本
输出还是清理输出?
这是 Vim 中非纯文本文件的图像:
我怀疑这一切是否相关,但我正在关注此网页以
编译一个调用第 3 方的简单 Java 应用程序 TestSetup.java
工具:https://kunlei.github.io/cplex/cplex-java-setup.
前面的底线
下面的 Bash 命令发送 stdout
和 stderr
来自
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>&1
将 stderr
指向 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
是什么
定向到,但仅在所有重定向之后。在管道中,
以上表示 javac
的 stdout
指向 tee
的 stdin
,
只有这样 javac
的 stderr
才会指向目标
javac
的stdout
,即tee
的stdin
.
供参考:初步解决方案(javac
的Xstdout选项)
我发现我的 javac
有一个命令行选项 -Xstdout OutputFileName.txt
专门用于此目的。
不幸的是, 并非我在网上找到的所有 javac
文档都显示此选项的可用性。在那种情况下,我找到的最直接的解决方案是 :term cat The/Output/File.Path
in Vim.
许多 vim 备选方案也显示在该页面上,以及 here
为了将来参考,如果需要,我发现 3 个完整的页面 相关的是:
- https://superuser.com/questions/380772/removing-ansi-color-codes-from-text-stream
- https://unix.stackexchange.com/questions/14684/removing-control-chars-including-console-codes-colours-from-script-output
- https://unix.stackexchange.com/questions/4527/program-that-passes-stdin-to-stdout-with-color-codes-stripped
提到了 ansi2txt
,但您需要 Ubuntu。