Javaプログラム内からVIを起動し、処理を続行する前にVIを終了するまで待つことができます。ここで私は、現在持っているコードスニペットです:commons-execの下でJava内からVIを起動するにはどうしたらいいですか?
...
String previewFileName="test.txt"; // the file to edit
CommandLine cmdLine = new CommandLine("/usr/bin/vi");
cmdLine.addArgument(previewFileName);
cmdLine.addArgument(">/dev/tty");
cmdLine.addArgument("</dev/tty");
Executor executor = new DefaultExecutor();
try
{
DefaultExecuteResultHandler resultHandler = new ResetProcessResultHandler(cmdLine);
executor.execute(cmdLine, resultHandler);
} catch (IOException e)
{
throw new Error("Cannot execute command: /usr/bin/vi " + previewFileName, e);
}
log.info("waiting...");
cmdLine.wait();
log.info("...done");
...
private class ResetProcessResultHandler extends DefaultExecuteResultHandler
{
private final CommandLine mCommandLine;
public ResetProcessResultHandler(CommandLine pCommandLine)
{
mCommandLine = pCommandLine;
}
public void onProcessComplete(int exitValue)
{
log.info("Command complete rc(" + exitValue + ")");
if (exitValue != 0)
{
throw new RuntimeException("VI command error [rc=" + exitValue + "] ");
}
mCommandLine.notify();
}
public void onProcessFailed(ExecuteException e)
{
if (e.getExitValue() != 0)
{
log.error("launch VI error " + e.toString());
throw new RuntimeException("VI command failed [" + e.getCause() + "] ");
}
else
{
log.info("VI complete rc(" + e.getExitValue() + ")");
}
mCommandLine.notify();
}
}
私が受け取る出力:
Vim: output is not to a terminal
Vim: input is not from a terminal
しかし、その後、私はVIが始まったかのように描かれ、画面を参照してください。 VIはI型の文字を読み込みません。
だから.../dev/ttyからのリダイレクトはそのトリックを行っていません。
誰かがこの前にこれをしているに違いありません - 助けてください!
おかげで、
マーク
これは動作しません。なぜなら、viはフォアグラウンドに持ち込まれず、ユーザーのttyに接続されているからです(これは明らかに質問が本当に求めているものです)。 –