2010-12-15 9 views
2

bashなどで知られているjavaプログラムに「履歴」機能を追加したいので、矢印キーを押すと以前の送信コマンドが表示されます。Java:cliコマンドの "履歴"、ouputを "編集可能"にする方法は?

過去のコマンドをデフォルト出力に書き込むことは問題ありません。これは、矢印upが3回、編集可能な出力でない場合に3行になります。私は、コマンドの再送のために、ちょうどEnterキーを押す必要があるので、入力フィールドにプログラムの出力を書きたい。

これは可能ですか?

種類よろしく

+0

この種のことを行うライブラリがあり、自動補完とbashのようなオプションのリスト表示を処理します。 Apache Felixは1つを使用しています(どちらが使用されているかは変更されていると思います) –

答えて

1

独自のソリューションを展開する場合、これはあなたが開始されます。

バッファリングされた入力を直接入力に変更する必要があります。 System.inと直接接続することでこれを行うことができます。これを処理するためのスレッドを作成し、ループでSystem.in.read()への呼び出しをブロックし、一度に1バイトずつ読む必要があります。

バイトが読み込まれるたびに、読み込まれている現在のコマンドでバッファを更新したままにしておきます。入力されたすべての文字をバッファに追加します。文字が\bの場合は、バッファ内の最後の文字を削除します。 \rまたは\nが検出されたら、バッファでコマンドを実行してクリアします。

上矢印または下矢印が表示された場合は、\bSystem.outにバッファの長さと同じ数だけ送信します。これにより、現在入力されているコマンドのローカルコピーが消去されます。その後、新しいコマンドをSystem.outに出力し、バッファに入力して、そこにあったものを置き換えます。これにより、ユーザーは削除したり、追加したり、Enterキーを押して送信することができます。これはbashの機能を模倣しています。

\t(タブ)文字を検出し、タブ補完機能を実装することもできます。

+0

3番目のブロックは私が探していたものです – arghs

+0

早速コメントを送ってください... クライアントに\ bを送ります重要)は、カーソルを1つのcharに戻しますが、charは削除しません。 "222"の上に "111"を上書きすると "222"が上書きされますが、 "22211"の上に "22211"が上書きされます。 – arghs

+0

それから、空白を出力してからそれをクリアしてから、さらに\ bを空にします。 –

2

コマンド履歴、タブ補完、行編集を提供するJLineをご覧ください。

+0

+1 for JLine。私は正常に私のプロジェクトでJLineを統合しました。私はいつも私の自国のソリューションにそれを使用することを好むでしょう... –

+0

+1は、この必要性のために確かに固体ライブラリのように見えます。 –

+0

提案してくれてありがとうが、私はそれを自分でやりたい。私が失敗すれば、もっとよく見えるだろう;) – arghs

関連する問題