bashなどで知られているjavaプログラムに「履歴」機能を追加したいので、矢印キーを押すと以前の送信コマンドが表示されます。Java:cliコマンドの "履歴"、ouputを "編集可能"にする方法は?
過去のコマンドをデフォルト出力に書き込むことは問題ありません。これは、矢印upが3回、編集可能な出力でない場合に3行になります。私は、コマンドの再送のために、ちょうどEnterキーを押す必要があるので、入力フィールドにプログラムの出力を書きたい。
これは可能ですか?
種類よろしく
bashなどで知られているjavaプログラムに「履歴」機能を追加したいので、矢印キーを押すと以前の送信コマンドが表示されます。Java:cliコマンドの "履歴"、ouputを "編集可能"にする方法は?
過去のコマンドをデフォルト出力に書き込むことは問題ありません。これは、矢印upが3回、編集可能な出力でない場合に3行になります。私は、コマンドの再送のために、ちょうどEnterキーを押す必要があるので、入力フィールドにプログラムの出力を書きたい。
これは可能ですか?
種類よろしく
独自のソリューションを展開する場合、これはあなたが開始されます。
バッファリングされた入力を直接入力に変更する必要があります。 System.in
と直接接続することでこれを行うことができます。これを処理するためのスレッドを作成し、ループでSystem.in.read()
への呼び出しをブロックし、一度に1バイトずつ読む必要があります。
バイトが読み込まれるたびに、読み込まれている現在のコマンドでバッファを更新したままにしておきます。入力されたすべての文字をバッファに追加します。文字が\b
の場合は、バッファ内の最後の文字を削除します。 \r
または\n
が検出されたら、バッファでコマンドを実行してクリアします。
上矢印または下矢印が表示された場合は、\b
をSystem.out
にバッファの長さと同じ数だけ送信します。これにより、現在入力されているコマンドのローカルコピーが消去されます。その後、新しいコマンドをSystem.out
に出力し、バッファに入力して、そこにあったものを置き換えます。これにより、ユーザーは削除したり、追加したり、Enterキーを押して送信することができます。これはbashの機能を模倣しています。
\t
(タブ)文字を検出し、タブ補完機能を実装することもできます。
この種のことを行うライブラリがあり、自動補完とbashのようなオプションのリスト表示を処理します。 Apache Felixは1つを使用しています(どちらが使用されているかは変更されていると思います) –