简体   繁体   English

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

[英]How to execute vimdiff command from inside a java program

I have a list of files for which I have to run the vimdiff command and save the output as a html file.I am doing this with Java.我有一个文件列表,我必须运行 vimdiff 命令并将输出保存为 html 文件。我正在使用 Java 执行此操作。 Below is the command I am trying to execute下面是我试图执行的命令

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!'"

When I run the below code, the code is getting executed.当我运行下面的代码时,代码正在执行。 But I am not able to see the file getting generated.但是我看不到生成的文件。

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

The command is running fine when executed from a terminal.从终端执行时,该命令运行良好。 But its not working when executed inside a java program.但是在 java 程序中执行时它不起作用。 Can someone help me with this issue?有人可以帮我解决这个问题吗? I did a lot of search but not able to proceed with this.我做了很多搜索,但无法继续进行。

You're using :TOhtml and write the result as different.html .您正在使用:TOhtml并将结果写为different.html If you're not sure where to locate the file, check the current working directory of the Java process, do a file search of your hard disk, or specify an absolute path in the Vim command to be sure.如果您不确定该文件的位置,请检查 Java 进程的当前工作目录,对硬盘进行文件搜索,或在 Vim 命令中指定绝对路径以确保确定。

You won't see anything from Vim's operation itself.你不会从 Vim 的操作中看到任何东西。 Using process.使用process. getInputStream() , you could obtain what Vim wrote to the terminal during its operation, but that would just amount to a garble of characters, as Vim is using special ANSI escape sequences to control the terminal, position the cursor, etc. getInputStream() ,您可以获取 Vim 在其操作期间写入终端的内容,但这只会造成乱码,因为 Vim 使用特殊的 ANSI 转义序列来控制终端、定位光标等。

To use Vim non-interactively, it is recommended to pass the following options:要以非交互方式使用 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.

Without a possibility to interact with Vim (from inside your Java program), a troubleshooting tip is enabling verbose logging: You can capture a full log of a Vim session with -V20vimlog .由于无法与 Vim 交互(从 Java 程序内部),故障排除提示是启用详细日志记录:您可以使用-V20vimlog捕获 Vim 会话的完整日志。 After quitting Vim, examine the vimlog log file for errors.退出 Vim 后,检查vimlog日志文件是否有错误。

After Two days I found the below Solution:两天后,我找到了以下解决方案:

I added the vimdiff command to a shell script and executed it using the following method and it worked like a gem.我将 vimdiff 命令添加到 shell 脚本并使用以下方法执行它,它就像一个 gem。

Java method 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!'

Note:笔记:

  • file1 will be passed as a argument in the place of $1 file1 将作为参数传递来代替 $1
  • file2 will be passed as a argument in the place of $2 file2 将作为参数传递来代替 $2
  • outputfile will be passed as a argument in the place of $3 outputfile 将作为参数传递来代替 $3

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM