如何从Java程序内部执行vimdiff命令

时间:2018-09-20 10:38:17

标签: java vim vimdiff

我有一个文件列表,我必须运行vimdiff命令并将输出保存为html文件。下面是我要执行的命令

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程序中执行时它不起作用。有人可以帮我解决这个问题吗?我做了很多搜索,但无法继续进行。

2 个答案:

答案 0 :(得分:1)

您正在使用: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会话的完整日志。退出Vim后,检查vimlog日志文件中是否有错误。

答案 1 :(得分:0)

两天后,我找到了以下解决方案:

我将vimdiff命令添加到Shell脚本中,并使用以下方法执行该命令,它的工作方式就像是gem。

Java方法

try {
            File[] uiDiffDir = getFiles();

            for (File file : uiDiffDir) {

                String[] cmd = {"sh", shellScriptPath, file1, file2,
                        outputfile};
                Process p = Runtime.getRuntime().exec(cmd);
                p.waitFor();
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        p.getInputStream()));
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

shell.sh

vimdiff -c 'set foldlevel=9999' $1 $2 -c TOhtml -c 'w! '"$3"'' -c 'qa!'

注意:

  • file1将作为参数传递到$ 1处
  • file2将在$ 2处作为参数传递
  • 输出文件将作为参数传递到$ 3处