端末から入力行を徐々に読み、ユーザーにINS、DEL、右、左、終了、バックスペース機能を許可したいと思います。
文字列が変更されるたびにそれを処理して、テキストファイルに対して増分正規表現検索を実行したいと思います。
これらの編集キーと他のキーは複数の入力文字を生成するため、
入力を解釈するのは非常に困難です。たとえば、C-Leftは6文字を生成します。
文字ごとに編集可能な入力を簡単に取得する方法はありますか?
残りの処理はbashで行われるので、bashでこれを行う方法を知りたいです。他の提案も歓迎します。
それで始めましたが、潜在的な制御コードが多すぎて少し余裕がありませんでした。
#!/bin/bash
IFS=$'\n'
while true ;do
read -n 1 c
((${#c}==0)) && break # Exit the loop. Input length is 0
# ie. The user has pressed Enter
echo "xx=$(echo -n "$c"|xxd -p)="
# 1b 5b 32 7e "INS"
# 1b 5b 33 7e "DEL"
# 1b 5b 43 "RIGHT"
# 1b 5b 44 "LEFT"
# 1b 5b 46 "END"
# 1b 5b 48 "HOME"
# 7f "BACKSPACE"
done
ベストアンサー1
一度に1文字ずつ読み込む場合は、read -n
キーシーケンスパーサを実装する必要があります。以下を使用して、ほとんどの端末で動作する遅くて汚れたソリューションを構築できます。エスケープ文字で始まり、任意の数の文字で続くファンクションキーエスケープシーケンスを考慮して、この文字セットにない0-9;[]O
最後の文字が続きます。
入力を読み取るより良い方法は、適切な入力ライブラリを使用することです。 Bashはこれを独自の目的に使用します(読書船)。組み込みを使用してbind
独自のキーバインディングを宣言すると、bind -x
キーを押したときにシェルコマンドを実行するように特別に設計された制限付きインターフェイスを取得できます。制限されたインターフェイスのために、必要なものを実装することは可能かもしれませんが、難しいです。
Zshには独自の入力ライブラリがあります。ズラー。インターフェイスはbashよりはるかに豊富です。 zleを使用すると、任意のキーマップを定義でき、シェルコードからzleの内部機能にアクセスできます。zle
カスタムコマンド(ウィジェットと呼ばれる)にシェル機能を割り当て、bindkey
独自のキーマップを作成および入力し、最後にvared
選択したキーマップを使用して入力行を読み取るために使用されます。