Java アプリケーションは、Java/Scala から新しい対話型アプリケーション (コマンド ライン エディタなど) をどのように生成できますか?
を使用するRuntime.getRuntime().exec("vim test")
と、Process インスタンスのみが取得vim
され、バックグラウンドで実行されます。ではなく、ユーザーに表示されます。
を使用して入力ライターと出力ライターをラップする必要がありますSystem.console()
すべての入力を生成されたプロセスに、すべての出力をユーザーに手動でリダイレクトする必要があります。
注:この方法は、vim が必要とする端末/コンソールが絶対に必要な場合にのみ使用してください。他のすべての用途については、Runtime.exec() を使用してください。
私はちょうどこの同じ問題を抱えていました。私が取り組んだのは、Java Native Interface を使用して、システム コールを実行する小さな c 関数を呼び出すことです。
SystemProcess.java:
class SystemProcess {
public native int systemCall(String cmd);
public boolean execute() { return systemCall("vim test") == 0; }
static { System.loadLibrary("SystemProcess"); }
}
SystemProcess.c
#include [javah-generated-header.h]
[javah-generated-function-prototype] (JNIEnv *env, jobject obj, jstring jcmd) {
jboolean iscopy;
const char *cmd = (*env)->GetStringUTFChars(env, jcmd, &iscopy);
jint ec = system(cmd);
(*env)->ReleaseStringUTFChars(env, jcmd, cmd);
return ec;
}
すべてのヘッダー生成と共有ライブラリへの C コンパイルを実際に行う方法は、あなたに任せます。システムを fork/exec または posix_spawn に置き換えると気分が良くなる場合は、自由に置き換えてください。しかし、ほとんどの場合、これは unix/linux でそのまま動作するはずです。
Linuxを使用していると仮定すると、実際には新しいターミナルウィンドウでコマンドを実行する必要があります
Runtime.getRuntime().exec(new String[]{"xterm", "-e", "vim test"});
うーん。これを試して:
scala.sys.Process("vim test").run(true)
おっと、それは Scala トランク上だけです -- おそらく Scala 2.9 です。