Readline: ANSI エスケープシーケンスをキーにバインドする

Readline: ANSI エスケープシーケンスをキーにバインドする

bash / readlineを使用してキーをバインドしてコンソール画面の下部を消去したいです。

画面下部を消去するANSIシーケンスは、\e[Jそのため、次の行を鉱山に追加しようとしましたが、うまくいかず、.inputrc3文字だけを無視しました。

Control-N: "\e[J"

文字列にいくつかのテスト文字を追加すると、次のようになります。

Control-N: "BEFORE \e[J AFTER"

を押してから文字列を挿入し、BEFOREそこで停止します。

現在、この回避策が見つかりましたが、明らかに不要なechoコマンドを含む行が表示されます。

Control-N: "echo -ne \"\\e[J\"\n"

バインディングを介してANSIシーケンスを送信できますかreadline

答え1

2つの部分:

  • Bashを使用すると、キーをreadlineにバインドできます画面を消去機能(元の目標のようです)。
  • Bashのreadlineの目的は、コマンドを実行するためにテキストを準備(編集など)することです。強く打つ。エスケープシーケンスは次に送信されます。端末。なしリストされた機能readlineの場合echoまたはが置き換えられますprintf

readlineのキーバインディングには、単一の関数名またはリテラル文字列が必要です。あなたの例では、readlineは可能であると思われる関数名を読み、残りの行は無視します。

したがって、いいえ、bash / readlineはエスケープシーケンスをキーバインディングに直接エコーする便利な機能を提供しません。前述のようにを使用する必要がありますecho

答え2

目的の結果が得られた場合は、コマンドecho内でコマンドの使用を少し改善すると、次のようになります。.inputrc

私は以下の機能を私の機能に入れ、.bashrc具体的には機能の短い名前を選択しました。

cbs()
{
    echo -ne '\e[J\e[F\e[2K'
    history -d $(history 1)
}

ANSIシーケンスを使用して画面下部を消去し()、カーソルを元\\e[Jの行に戻し()、\\e[F最後にコマンドが挿入された行を消去します(\\e[2K)。

コマンドはまた、汚染されないようにbashレコードから直接削除されました。

コマンドの短い名前は重要です。行が小さすぎるコンソールウィンドウに含まれていると、トリックが正しく機能しないためです。

それからそれCtrl-Nに従ってバインドします.inputrc

Control-N: "cbs\n"

関連情報