web-dev-qa-db-ja.com

readline / bash:Escキーと矢印キーをマップする方法は?

別のコマンドライン駆動型ソフトウェアから、次の動作に慣れています。上矢印/下矢印でコマンド履歴を確認し、現在の行でこれまでに入力した文字と一致する行を照合し、Escでこれまでに入力したすべての行を削除します。現在の行に。私は(readlineを介して)bashに同じことをさせようとしています。これが私が.bashrcに入れたものです:

bind 'Escape: kill-whole-line'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

Escape = "\ e"のマッピングがエスケープシーケンス "\ e [A"および "\ e [B"のマッピングと干渉するため、動作は意図したとおりではありません。

私の質問:これを機能させる方法はありますか? 1つの可能性はタイミングベースです。つまり、\ eの後に別のキーがすぐに続く場合、それはシーケンスの一部として扱われますが、短い遅延の間に他に何も来ない場合、それ自体がキーとして扱われます。しかし、bashとreadlineのドキュメントを読んで、私はそのようなことを思い付くことができませんでした。

副次的な質問:歴史的なマシンの複雑な動作を実際にエミュレートしようとはしないが、そこで実行されているプログラムに押されたキーに関する明確な情報を提供する最新の端末「エミュレーター」はありますか?これにより、CTRL-AとCTRL-SHIFT-Aの区別なども可能になります... xtermのように動作するKDEのKonsoleとLinuxコンソールでこれらをテストしました。

6
A. Donda

xtermを使用している場合は、eightBitControlブールリソースを設定することで、シーケンス\e[の代わりにCSI(0x9B)を送信することができます。たとえば、次のようにxtermを起動します。

xterm -xrm '*eightBitControl:true'

XTermアプリケーション固有のリソースファイルを編集することで、このリソースを永続的に設定できます(Ubuntuはこれを/etc/X11/app-defaultsに配置しているようですが、/usr/share/X11/app-defaultsの方が標準的だと思います)。

ただし、注意してください。これにより、すべてのキーバインドを修正するまで、基本的にターミナルが破損します。

より一般的な質問については、最初に表示されるよりも難しいと思います。 Linuxコンソールは、8ビットの文字コードを生成するように設計されています(UTF-8で動作します)。実際のコンソールから(つまり、Xを使用せずに)、「生の」スキャンコードを取得できますが、すべてのキーマッピングロジックを自分で実行する必要があります(実際には、Xが実行します)。 Xキーマッピング機能を使用して、alt + ctrl +文字の組み合わせに対して特定のコードを生成できる場合がありますが、それらを8ビットのコーディングシーケンスに圧縮する場所がわかりません。私はあなたの痛みを感じますが:)

4
rici