6

JLine (または JLine2) を使用して、 に呼び出しを発行readlineConsoleReader、標準のプロンプトに加えて、選択した文字列をバッファーに事前に入力することはできますか?

私はやろうとしました、例えば:

reader.getCursorBuffer().write("Default");
reader.readLine("Prompt> ");

これは確かにバッファに書き込んでいるように見えますが、この行はプロンプトを表示するだけです。Enter キーを押すと、期待どおりにreadLine戻ります。"Default"画面をクリアすると、バッファが再描画され、正しく表示されます。

私の理解では、 へreader.redrawLine()の呼び出しの直後に何らかの方法で呼び出す必要がありますreadLine。ただし、この最後のスレッドはブロックしているため、難しくなっています (不可能ではありませんが、そのために 2 番目のスレッドを使用するのは間違いなく間違っていると感じています)。

4

4 に答える 4

1

今日、まさにこのユースケースに出くわしました。

これはちょっとしたハックですが、テキストを JLine バッファーにプリロードし、次のようにしてユーザーに編集させることができました。

String preloadReadLine(ConsoleReader reader, String prompt, String preload)
    throws IOException
{
    reader.resetPromptLine(prompt, preload, 0);
    reader.print("\r");
    return reader.readLine(prompt);
}

ええ、の印刷\rはハックですが、うまくいくようです。

JLine-2.13 を使用しています。

于 2015-03-26T22:43:29.327 に答える
1

私はスレッドを使用してそれを行うことができました (はい、それは間違っているように感じますが、他の方法は見つかりませんでした)。

同様の目的でスレッドを使用するJLine 自体にあるコードから着想を得ました。

スカラの場合:

      val thr = new Thread() {
        override def run() = {
          reader.putString("Default")
          reader.flush()
          // Another way is:
          // reader.getCursorBuffer.write("Default") // writes into the buffer without displaying
          // out.print("D*f*ult") // here you can choose to display something different
          // reader.flush()
        }
      }
      thr.setPriority(Thread.MAX_PRIORITY)
      thr.setDaemon(true)
      thr.start()
于 2015-11-24T13:38:11.173 に答える
0

または、すでにプロンプ​​トが設定されている場合は、どちらresetPromptLineかが必要だと思います。putStream

質問をハイジャックするためではありませんが、プロンプトを置き換える行を単純に印刷する方法がわかりません(表面上または視覚的にプロンプ​​トを下に押して、その上にメッセージを表示します)。

于 2013-05-17T18:37:06.777 に答える
0

JLine3 の更新:

これは、次の既存のオーバーロードの 1 つを使用して実現できますreadLine

readLine(String prompt, Character mask, String buffer)

たとえば、はreader.readLine("> ", null, "abc")編集中のバッファの一部です。> abcabc

于 2020-08-07T10:35:17.367 に答える