首页 > 解决方案 > 如何从 java 程序中执行 vimdiff 命令

问题描述

我有一个文件列表,我必须为其运行 vimdiff 命令并将输出保存为 html 文件。我正在使用 Java 执行此操作。下面是我试图执行的命令

String cmd = "vimdiff -c 'set foldlevel=9999' src/test/resources/testdata/output/html_output_before_changes/file1.html src/test/resources/testdata/output/html_output_after_changes/file2.html -c TOhtml -c 'w! different.html' -c 'qa!'"

当我运行以下代码时,代码正在执行。但我看不到文件正在生成。

Runtime rt = Runtime.getRuntime();
Process process = rt.exec(cmd);

从终端执行该命令时运行良好。但是在java程序中执行时它不起作用。有人可以帮我解决这个问题吗?我做了很多搜索,但无法继续进行。

标签: javavimvimdiff

解决方案


您正在使用:TOhtml并将结果写为different.html. 如果您不确定该文件的位置,请检查 Java 进程的当前工作目录,对您的硬盘进行文件搜索,或者在 Vim 命令中指定一个绝对路径来确定。

你不会从 Vim 的操作本身看到任何东西。使用process.getInputStream(),您可以获得Vim 在运行期间写入终端的内容,但这只是乱码,因为 Vim 使用特殊的 ANSI 转义序列来控制终端、定位光标等。

要以非交互方式使用 Vim,建议传递以下选项:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-n                No swapfile.
-i NONE           Ignore the |viminfo| file (to avoid disturbing the
                  user's settings).
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                  with messages or output to avoid blocking.

由于无法与 Vim 交互(从您的 Java 程序内部),故障排除技巧是启用详细日志记录:您可以使用-V20vimlog. 退出 Vim 后,检查vimlog日志文件是否有错误。


推荐阅读