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


互换的青春
浏览 209回答 2
2回答

阿波罗的战车

您正在使用: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日志文件是否有错误。

叮当猫咪

两天后,我找到了以下解决方案:我将 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();        }外壳文件vimdiff -c 'set foldlevel=9999' $1 $2 -c TOhtml -c 'w! '"$3"'' -c 'qa!'笔记:file1 将作为参数传递来代替 $1file2 将作为参数传递来代替 $2outputfile 将作为参数传递来代替 $3
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java