Я пытаюсь написать небольшое приложение командной строки Java, которое создаст новый файл, а затем откройте его с помощью редактора по умолчанию для систем, хранящегося в $ EDITOR, а затем выйдите после закрытия редактора.
Пока, без везения, я пробовал следующее:
Desktop dt = Desktop.getDesktop();
dt.edit(file);
Этот метод привел к UnsupportedOperationException
, который имеет смысл, поскольку я запускаю свою программу с терминала, а не как приложение Java с рабочего стола.
Прямо сейчас у меня есть это:
Runtime rt = Runtime.getRuntime();
Process proc = rt.exec(commandString); // "vim newfile"
proc.waitFor();
Это работает, но не так, как мне нужно. Когда я бегу
ps a | grep vim
Я вижу, что он действительно работает в фоновом режиме, с именем файла, которое я ему дал:
1000 pts/1 S+ 0:00 vim 2014-07-16.23-02
Любые идеи о том, как сделать этот запуск на переднем плане?
vim, как и многие интерактивные программы, ожидает, что его stdin
станет реальным терминалом, на который он может отправлять вызовы ioctl
. Но при выполнении через Runtime.exec()
stdin
будет перенаправлен на родительский процесс (см. Javadoc on Process
для получения дополнительной информации).
В Java 7 вы должны иметь возможность использовать ProcessBuilder.inheritIO()
для передачи по файлам. (Отказ от ответственности: я не пробовал, YMMV.)
fork()
в нативном коде. Конечно, тогда вам приходится сталкиваться с болью, связанной с зависимостью JNI от платформы.