いくつかのキーシーケンスバインディングをインストールしようとして問題が発生しました。私のシェルはbashで、端末はgnome-terminalで、システムはグラフィカルモードのUbuntu 14.04です。 編集:私のキーボードは数字パッドとctrl、fn、super、altを持つフランス語のazertyです。
編集する:ㅏBashガイド、章を読む
追加したいcontol++altspaceしかし、この正確な順序は機能しませんが、他の同様の順序はうまく機能します。私の目標はshell-expand-line readlineを実行することですが、比較のためにupcase-wordを試しました。
--私のターゲットの設置効果を分析してみよう。
これが私が追加したものです~/.inputrc
(ctrl++)。metaspace
"\e\C- ": shell-expand-line
新しい結果は次のとおりですbind -p
。
"\e\C-@": shell-expand-line
もちろん、徹底した比較のため、設置前と設置後に一つずつ数台のターミナルを稼働しました。
--control+metaの代わりにcontrol+altが動作していることを確認するためのいくつかの実験です。
システムは "\033"バイトを使用してとしてMetaエミュレートする必要がありAlt、bashはMetaとしてエミュレートする必要があります。Escapeどちらも試してみましたが、大丈夫だという結論が出てAltいます。Esc。確認するために、ctrl + meta + letterシーケンスをテストしました。
ところで、Ctrl+の個々のサンプルは簡単です。分離されたチルダ "〜"(シェル拡張行)を展開するか、Alt+ +または++を使用して任意の小文字の単語(大文字の単語)の大文字と小文字を変更します。 ++はすでにshell-expand-lineにバインドされているので、役に立たない++とバインディングを混在させました。ctrlmetaectrlmetavCtrlmetaectrlmetav
—もっと複雑な観察…
「^@」が「NUL」文字を記述することを読んでいます。なぜこんなに逃げる?
xevをテストしてctrl++altを押しましたspace。報告された文字は「NUL」文字です。
Alt + Spaceは通常GNOME端末のウィンドウメニューを開きますが、AltはもちろんCtrlキーなしでメニューを有効にします。
紛争はシステムから来ているようですが、私はこれが初めてです。私はほとんどのbashマニュアル(特にreadlineの章)とxevのフォーラム提案を読んでいました。
- 質問
何を言うか、修正する部分がありますか?シーケンスを書き換えるのはなぜですか?ctrlbashとgnome-terminalで++を動作させるにはどうすればよいですか?altspace
編集:エスケープ時にビットマスクが適用されるため、「@」が「NUL」に変換されることがわかりましたが、Alt+が「NUL」を提供するspace理由は見えません。
答え1
ターミナルエミュレータ(あなたの場合はGnomeターミナル)は、Ctrl++(およびメタ修飾子と共にキーシンボルとして受け取られます)などのAltキーの組み合わせをバイトシーケンスに変換します。スペースなどのテキスト文字はそのまま送信されます。文字に対応しないキーは、制御文字(バイト13 =キャリッジリターン=、バイト9 =タブ=)で送信され、存在しない場合は制御文字に送信されます。バイト 27 = エスケープで始まるエスケープシーケンスとして送信されます。 +文字はエスケープ文字として送信され、その後にその文字が続きます(すべての意図と目的のために、今日の一般的な構成では、「Alt」と「Meta」は同義語と見なされます。この記事ではそのトピックについて説明しません。 )。また、見ることができますSpaceSpace
Ctrl
a
ReturnTabAltキーボード入力とテキスト出力はどのように機能しますか?
Ctrl+文字がある場合は、制御文字に送信されます(たとえば、+または++ Ctrl→AバイトCtrl1 = ^A)。制御空間文字はありませんが、歴史的な理由から、+キーの組み合わせは通常バイト0 = ^@として送信されます。ShiftACtrlSpace
CtrlVbashコマンドラインで+を押してから目的のキーまたはキーの組み合わせを押すと、端末から送信されたキーシーケンスを表示できます。Ctrl+ はVbash にコマンドとして解釈せずに次の文字を挿入するように指示します。
Ctrl++を2バイトシーケンス27、0 Alt= escape、^ @にSpace転送するのは論理的です。残念ながら、Gnome Terminalはこれを行わずに27、32 = escape、spaceを送信します。 Gnome Terminalから送信されたキーシーケンスを設定できません(VTEライブラリをパッチする必要があります)。したがって、端末でCtrl++を使用するには、Altいくつかの可能性があります。Space
- 他の端末エミュレータを使用してください。 Ubuntuには約40個あります。
- ソースコードの編集VTEライブラリ別のエスケープシーケンスを送信するようにしてください。これを改善として提案することもできます。
LD_PRELOAD
Gnome端末からlibvteに呼び出しをパッチする場合です。私はそれが実用的であることを確認しておらず、とにかく面倒です。興味があれば、他の端末エミュレータを使用してください。- Gnomeターミナルウィンドウがアクティブになると、+Ctrlが+にAlt変わるようにウィンドウマネージャまたは外部プログラムを設定します。ほとんどの環境では、他のアプリケーションを中断することなくこれを行うのは簡単ではありません。SpaceEsc CtrlSpace
簡単に言えば、このバインディングを使用するには、xterm(キーの組み合わせのエスケープシーケンスを完全に設定できる場合)などの他の端末エミュレータを使用する必要があります。
答え2
あなたのGNOME端末(実際にはデフォルトのvte-0.34)が間違ったctrl++Altシーケンスをエクスポートしていますspace。間違い(https://bugzilla.gnome.org/show_bug.cgi?id=710349)vte-0.36で修正されました。
ハッカーを恐れずに問題が発生しても安全に回復できる場合は、Ubuntu 14.04にvte-0.36をインストールしてみてください。この修正と改善に加えて、他の多くの機能を得ることができます。 Gnome3ステージングでPPAまたはパッケージを検索または直接コンパイルできます。このバージョンのvteにアップグレードすると、他のソフトウェアコンポーネントに触れる必要はありません。 gnome-terminalを完全に再起動する必要があります(すべてのウィンドウが閉じます)。