.inputrcを介して端末アプリケーションの他のコマンドにCiキーとTABキーをバインドします。

.inputrcを介して端末アプリケーションの他のコマンドにCiキーとTABキーをバインドします。

私が試したことによれば、.inputrcで同じことを意味するようです。一方にバインドすると、他方にバインドされますTABC-i私はそれが元々同じものであり、この動作が昔から継承されていることを知っていますが、今ターミナルエミュレータを除くすべてのXアプリケーションはaC-iTABpressを区別します。

TABそれでは、そのキーを押したときにターミナルコマンド(「done」など)を実行し、押したときに別のコマンドを実行する方法はありますかC-i

(同じ問題は、およびC-m元のバインディング以外の手段を介して送信し、これらの貴重なキーバインディングに私のコマンドを適用したいすべての制御シーケンスに適用されます。)ENTERC-zC-d

ところで、キーストロークからシェル解析までのプロセスを説明していただければ、理解するのに役立ちます。今、私はキーボードイベントがXmodmapによって変換され、Xmodmapが.inputrcによって変換され、その結果がシェルまたは同様のものによって解釈されることを理解しています。

私は現在Guakeを使用し、時にはターミナルエミュレータとしてgnome-terminalを使用します。

コメントに提案されたリンクをたどると、ターミナルエミュレータはTABXサーバーのキーシムを変換してC-ibashシェルに送信するチェーンの要素であるようです。これはTABENTERピアのようなものを理解できないからです。したがって、readline自体を設定することは、ターミナルエミュレータの後ろ、bashシェルの前に配置されるので、何の効果もありません。したがって、質問は次のように正確になる可能性があります。TABなどC-iを他の文字シーケンスのペアに変換するように端末エミュレータを設定するにはどうすればよいですか?後で.inputrcの元のコマンドにマップされ、最終的に他の目的に使用できる新しいカスタムエスケープシーケンスを作成して送信することもできます。または、出てエスケープシーケンスを作成して送ってください。ENTERC-mTABENTERC-iC-mTABENTERC-iC-m

答え1

ターミナルエミュレータは、「Tabキーを押す」などのイベントを、ターミナルで実行されているアプリケーション(あなたの場合はbash)が読み取ることができる一連の文字に変換します。バラよりキーボード入力とテキスト出力はどのように機能しますか?このトピックの詳細な紹介です。

Ctrl歴史的な理由から、一部のキーは他の文字を押すのと同じ文字(Tab= Ctrl+ IReturn= Ctrl+ MEsc= Ctrl+)を送信します[。その理由は歴史物理学のためだ。端末これは、端末で実行されているアプリケーションがそれを期待するように行われるため、端末はこれを行います。

GuakeとGnome端末の両方を使用VTEライブラリ、これはキーとコードから文字シーケンスへのマッピング設定を許可しません。あなたも同じ問題があります。bash - Ctrl + Alt + Spaceを使用したキーシーケンスバインディングエラー

Xterm完全に設定可能なキーバインディングがあります。Tabキーを押しながらタブ文字(デフォルト)を送信したり、文字列を送信したり、必要に応じて送信したりhelloできます。 Xterm 構成に合格しました。XResources。たとえば、pressとreleaseにエスケープシーケンスを送信するには、Tab次のように入力します。\e[t\e]t~/.Xresources

XTerm.vt100.translations: #override \
  <Key>Tab: string("\033[t") \n\
  <KeyRelease>Tab: string("\033]t") \n\

または、Tab[転送]タブを終了して別のアイテムを作成して送信するCtrlこともできます。I

XTerm.vt100.translations: #override \
  Ctrl~Meta~Shift<Key>I: string("\033[a5i") \n\
  Ctrl~Meta Shift<Key>I: string("\033[a6i") \n\

\e[a5iその後、設定可能なキーバインディングを使用して、bashや他のターミナルアプリケーションで必要に応じてバインドできます。

規則に応じて、マルチ文字エスケープシーケンスはエスケープ文字(通常はプログラミング言語と設定ファイルで、またはで表される\e\033\x1b始まります。一部のアプリケーションでは、異なる文字で始まるエスケープシーケンスに問題がある可能性があります。タイムアウトを許可しない限り、エスケープシーケンスであり、独自のキーである文字を持ってはいけません(これが本質的にviなどのアプリケーションのEsc一部の機能にバインドされている理由です)。独自のキーシーケンスを定義する場合は、ファンクションキーとカーソルキーから送信されるキーシーケンスと競合しないように注意してください。ある程度事実上の標準化

答え2

Gillesの優れた回答に追加するために、urxvtターミナルエミュレータでキーマップを設定することもできます。たとえば、比較する.Xresourcesファイルに次の行を追加しましたCtrl+BackspaceCtrl+Hこの問題)2つのキーコードを異なる方法で使用できるように:

# Map Ctrl+Backspace to little-used escape sequence
urxvt.keysym.C-BackSpace: \033[33~

~/.zshkbdその後、zshが2つのキーコードを区別するように、myに以下を追加しました。

bindkey "^H" kill-line

# Ctrl + Backspace
bindkey "\033[33~" backward-delete-word

Ctrl+I私はこれがzshや他のアプリケーションでも同じように機能するはずですTAB(この場合は明らかにCtrl+I別の文字に再マップされますが)。

関連情報