web-dev-qa-db-ja.com

`\ C-`と` \ e`の代わりにALT(メタ)または他のコントロールキーを接頭辞として使用してReadlineキーバインディングを設定する方法は?

接頭辞として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は、OptionCommand、またはfnのいずれかを接頭辞として使用して実行することはできません。Readlineはこれを無視します。

この問題はmacOSに固有のものですか?どのように解決できますか?

さらに、キーバインディング、つまりより長いキーバインディングのプレフィックスが実行される前に発生するはずの「タイムアウト」をどのように制御できますか?

@added(@laktak):bind '"^[f": kill-Word'は機能しませんが、代わりにターミナルでƒになります: enter image description here

3
Shuzheng

私はあなたが何か間違ったことをしているとは思わない、単に代わりに「オプション」キーを「メタ」として使用するようにTerminal.appに指示する必要がある。ターミナルの設定(+,)、Profiles、デフォルトのプロファイルのKeyboardタブ、 「オプションをメタキーとして使用する」にチェックを入れます。

Screenshot of Terminal.app "Profiles" → "Keyboard" settings

それ以外の場合は、(ほとんどのキーマップで)デフォルトのmacOS動作を取得し、Option +キーで特殊文字を生成します。 Option+f スクリーンショットから フック付きの小文字 "f" を生成します(完全なリファレンス here )。

iTerm 2 では、左側のOptionキーがデフォルトですでに賢明なことを行っていると思いますが、念のため、これを変更する方法は次のとおりです。

iTerm 2 Option key behavior

OptionからEscapeへの再マッピングに関する限り、それがまだやりたかった場合は、ウィンドウの下部にある[修飾キー...]ボタンをクリックして、システム環境設定のキーボード設定から実行できます。

macOS System Settings Keyboard prefpane

次に、(利用可能な選択肢から)好きなように再マッピングします。

Remapping modifier keys in the macOS Keyboard prefpane

新しい環境設定の最初の5分間でこの設定ペインをたたき上げました。MacキーボードのControlキーが扱いにくい場所にあるため、Caps LockをControlに再マッピングできるようにしています。

2
TheDudeAbides

ユーティリティは次のようになります。

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にも自動的にバインドされます。

1
user370539

私があなたの質問を正しく理解した場合:

bind '"^[f": kill-Word'

Option+Fを呼び出すkill-Wordを定義します

0
laktak