接頭辞としてControl(\C-
)またはEscape(\e
)を使用したReadlineキーバインディングの設定例のみを見つけることができます。
私の場合、macOSでは、\C-
スペースはデフォルトのキーバインディングによって完全に埋められており、\e
スペースはタッチバー付きのMacbookでは実用的ではありません。
"\M-f": kill-Word
に~/.inputrc
を入力すると、次の結果になります。
bind -P | grep -F "\M-"
kill-Word can be found on "\e[3;5~" "\ed".
ただし、kill-Word
は、Option
、Command
、またはfn
のいずれかを接頭辞として使用して実行することはできません。Readlineはこれを無視します。
この問題はmacOSに固有のものですか?どのように解決できますか?
さらに、キーバインディング、つまりより長いキーバインディングのプレフィックスが実行される前に発生するはずの「タイムアウト」をどのように制御できますか?
@added(@laktak):bind '"^[f": kill-Word'
は機能しませんが、代わりにターミナルでƒ
になります:
私はあなたが何か間違ったことをしているとは思わない、単に代わりに「オプション」キーを「メタ」として使用するようにTerminal.appに指示する必要がある。ターミナルの設定(⌘+,)、Profiles、デフォルトのプロファイルのKeyboardタブ、 「オプションをメタキーとして使用する」にチェックを入れます。
それ以外の場合は、(ほとんどのキーマップで)デフォルトのmacOS動作を取得し、Option +キーで特殊文字を生成します。 Option+f スクリーンショットから フック付きの小文字 "f" を生成します(完全なリファレンス here )。
iTerm 2 では、左側のOptionキーがデフォルトですでに賢明なことを行っていると思いますが、念のため、これを変更する方法は次のとおりです。
OptionからEscapeへの再マッピングに関する限り、それがまだやりたかった場合は、ウィンドウの下部にある[修飾キー...]ボタンをクリックして、システム環境設定のキーボード設定から実行できます。
次に、(利用可能な選択肢から)好きなように再マッピングします。
新しい環境設定の最初の5分間でこの設定ペインをたたき上げました。MacキーボードのControlキーが扱いにくい場所にあるため、Caps LockをControlに再マッピングできるようにしています。
ユーティリティは次のようになります。
showkey (1) - examine the codes sent by the keyboard
しかし、これはmac-osでは欠けているようです...ここにそれは「キーコード」です...?
または、ctrl-V(qouted insert)を入力してから、特別なキーを入力します。 bashでは、これはxtermに^[OP
を、F1キーのコンソールに^[[[A
を出力します。
Readline変数:
keyseq-timeout (500)
半完成シーケンスに使用するタイムアウトです。
その下には、キーがシンボルに変換される一種のキーマップファイルが必要です。これはLinuxの/usr/share/kbd/keymaps/mac/
からです:
keycode 51 = Delete Remove
alt keycode 51 = Meta_Delete
shift alt keycode 51 = Meta_Delete
control keycode 51 = Remove
keycode 53 = Escape
alt keycode 53 = Meta_Escape
shift alt keycode 53 = Meta_Escape
keycode 54 = Control
keycode 55 = Alt # Command/Apple key
keycode 56 = Shift
keycode 57 = Caps_Lock
keycode 58 = AltGr # Alt/Option key
柔軟性がわかります! Meta-Deleteシンボルはkill-Wordになる可能性があります...
バインド '"^ [f":kill-Word
この^[
は\e
、またはctrl-Vである必要があり、次にEscape:サーカムフレックスプラスブラケットではなく1バイト。
^ Cはシェル(bash)またはvimでctrl-vを入力してからEscを押すと^[
を取得しますが、^ CはShift-6ではなくShift-cを意味します。後ろに戻ると、1文字です。 readlineのこれらのメタフラグオプションと一緒に使用すると、複雑になる可能性があります...チェーン全体を示します。
キーマップ "default.map"(スキャンコードと修飾子をキーシンボルに変換します)
keycode 105 = Left F150 F151
string F150 = "\033[150"
string F151 = "\033[151"
keycode 106 = Right F154 F155
string F154 = "\033[154"
string F155 = "\033[155"
デフォルトの「左」の後のF150およびF151は、シフト矢印およびコントロール左矢印を意味します。 2番目のステップでは、文字列(この場合はエスケープシーケンス)を定義できます。ここで、\e
は機能しませんでしたが、8進数の033はascii 27がcontrol- [はEscapeです...このキーマップはLinux固有ですが、Xウィンドウにも同様のロジックがあります。
そして.inputrc:
"\e[150": backward-Word
"\e[151": Shell-backward-Word
"\e[154": forward-Word
"\e[155": Shell-forward-Word
これはLinuxコンソールで非常にうまくいきます。 X Windowsでのxterm(Xorg):まったく:Xorgはキー自体をスキャンします。
backward-Word can be invoked via "\e[150", "\e[1;2D", "\e[1;3D", "\eb".
セミコロンが付いた真ん中の2つは、VTxxxスタイルの変更された左矢印です。これは事前設定されており、backward-Word
にも自動的にバインドされます。
私があなたの質問を正しく理解した場合:
bind '"^[f": kill-Word'
Option+F
を呼び出すkill-Word
を定義します