bash / readlineを使用してキーをバインドしてコンソール画面の下部を消去したいです。
画面下部を消去するANSIシーケンスは、\e[J
そのため、次の行を鉱山に追加しようとしましたが、うまくいかず、.inputrc
3文字だけを無視しました。
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"