Как выполнить команду vimdiff из Java-программы - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть список файлов, для которых мне нужно выполнить команду 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 ]

0 голосов
/ 24 сентября 2018

Через два дня я нашел следующее решение:

Я добавил команду vimdiff в скрипт оболочки и выполнил ее, используя следующий метод, и она работала как гем.

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
  • outputfile будет передан в качестве аргумента вместо 3
0 голосов
/ 20 сентября 2018

Вы используете :TOhtml и запишите результат как different.html.Если вы не уверены, где найти файл, проверьте текущий рабочий каталог процесса Java, выполните поиск файла на жестком диске или укажите абсолютный путь в команде Vim, чтобы быть уверенным.

Вы ничего не увидите в самой операции Vim.Используя process.getInputStream(), вы могли бы получить то, что Vim написал на терминал во время его работы, но это было бы просто искажением символов, поскольку Vim использует специальный ANSIescape-последовательности для управления терминалом, позиционирования курсора и т. д.

Чтобы использовать 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-программы), совет по устранению неполадок, включающий подробное ведение журнала: вы можете записать полный журнал сеанса Vim с помощью -V20vimlog.После выхода из Vim проверьте файл журнала vimlog на наличие ошибок.

...