为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

互换的青春 2021-09-29 16:37:39
我有一个文件列表,我必须运行 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 程序中执行时它不起作用。有人可以帮我解决这个问题吗?我进行了大量搜索,但无法继续进行。
查看完整描述

2 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-09-29
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

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


我将 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 将作为参数传递来代替 $1

file2 将作为参数传递来代替 $2

outputfile 将作为参数传递来代替 $3


查看完整回答
反对 回复 2021-09-29
  • 2 回答
  • 0 关注
  • 208 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信