Nanoでより一般的なショートカット(検索用のCtrl-F、置換用のCtrl-Hなど)を作成したかったので、ファイルを編集してnanorc
以下を追加しました。
bind ^F whereis all
bind ^H replace all
bind ^M mark all
...
驚くべきことに、バックスペースキーを押すと置換機能が有効になり、Enterを押すとマークアップが有効になります。
その後、仮想キーコードがBackspace 0x08、H 0x48、Enter 0x0D、M 0x4Dであることに気づきました。
Ctrlキーバインディングは実際に0x40でビットマスクされていますか?
答え1
Nanoで使用する仮想端末は、過去数十年間の物理シリアル端末をモデルにしたものです。通常、これらの端末は、アルファベットキー、または、、、、およびラベル付きのいずれかの@
キーを押すと同時に押すと、ASCII制御コードを生成します。送信される制御コードは、アルファベットコードから64を引いたASCIIコードです。したがって、を押すと、キャリッジリターンコードであるM(0x53)減算0x40 = 0x13のASCIIコードが生成されます。 Returnキーはキャリッジリターン文字も生成します。なぜならそれはキーの機能だからです。[
\
]
^
_
Ctrl
Ctrl-M
答え2
これは仮想キーコードではありません。
端末を使用しています。
端末は、単純な8ビット(場合によっては7ビット)の文字ストリームを使用して動作します。 TUIアプリケーションが知っている限りnano
、ユーザーとTUIの間にはシリアルポート、モデム2つ、PSTN、そして信頼できるDEC VT525があります。 みんな表示は、文字ストリーム、端末装置ファイル記述子、TERM
環境変数、およびterminfoデータベースのレコードです。
この文字ストリームには、アルファベットキーの制御キー修飾子などはありません。bind ^M
ソフトウェアを書くとき実際に拘束力があると理解される文字数 13。これは、ソフトウェアが使用する必要がある実際の端末I / Oモデルであるため、ソフトウェアが内部的に機能する必要がある方法です。これは^M
ソフトウェアコマンドパーサの製品であり、方法です表現する入力した構成コマンドの文字記号13。
FreeBSDなどの一部のオペレーティングシステムは、アプリケーションソフトウェアがパーサーで使用できる共通ライブラリ機能を提供し、アプリケーション全体にわたってこれらの表現の統一的な意味を生成します。
%printf '\x08\x0d' | %printf '\x08\x0d' | \^H\^M %
また、ここに仮想キーコードはありません。⎈ Control修飾キーによるすべての変換は、文字が(仮想または実際の)ワイヤに沿って送信される前に端末または端末エミュレータで発生します。
⎈ Control端末は、+(␈)に文字#8を生成し、+とにH文字⌫ Backspace#13(␍)を生成します。それはすべてターミナル/ターミナルエミュレータによって異なります。多くのエミュレータには、人々が変更できる一種のキーマップがあります。実際のDEC VTの場合、実際には文字#8転送と文字#127(DEL)転送を切り替える出力制御シーケンスDECBKMがあります。⎈ ControlMEnter⌫ Backspace
追加読書
- https://unix.stackexchange.com/a/382814/5132
- EnterキーがEOLを送信しないのはなぜですか?
- タブ文字を「^I」と表示
vis()
、、、strvis()
待つ。。 FreeBSDライブラリ関数マニュアル。 2017年4月22日。unvis
。 FreeBSD 共通コマンドマニュアル。 2010年11月7日。