24

Bashシェルは、すべての可能性が次の行にリストされている「従来の」オートコンプリートとは異なるタイプのオートコンプリートをサポートしていることがわかりました。

「従来の」オートコンプリートでは、入力chしてからキーを押すと、次のTabようになります。

$ ch
chacl  chgrp  chmod  chown  chvt

しかし、次の行を自分に追加すると/etc/inputrc(Tabキーが組み込みmenu-complete関数に再マップされます):

Tab: menu-complete

次に、シェルの動作が変更されます。補完される単語は、可能な補完のリストからの単一の一致に「インライン」で置き換えられ、Tabキーをもう一度押すと、単語は次の一致に置き換えられます。

これは便利だと思いましたが、それでも従来のオートコンプリートを維持し、キーの組み合わせにバインドしたいと思いましたCtrl + Tab。そこで、ライブラリのドキュメントが示唆/etc/inputrcしているように、ファイルに次の行を追加しました。readline

Ctrl-Tab: complete

ただし、この行を追加すると、両方が作成されTabCtrl-Tab従来のcomplete関数が呼び出されるように見えます。

誰かが私が間違っていることを知っていますか?

前もって感謝します!

4

5 に答える 5

35

そもそも、私はこの分野の専門家ではありませんが、あなたの質問には答えられると思います。まず、Bashを使用している間、Bashは端末/コンソールから受信したキーボードコマンドを解釈するシェルです。inputrcファイル内の特定のキーの組み合わせにどのように反応するかをBashに通知している間、端末は、inputrcファイルが方程式に入る前に、どの文字がシェルに「送信」されるかを正確に判断します。

残念ながら、私のシステムでは(もちろん、OSXですが、Linuxと比較した場合、これは奇妙な動作ではないと思います)、両方とも同じキーボード入力をシェルに送信しますTabCtrl-Tab実際、Tabとコマンドの両方をシェルにCtrl-Tab送信します。実際、ターミナルを使用しているときに入力すると、Tabを押したかのように完了します。Ctrl-ICtrl-I

ソフトウェア(ほとんどのLinuxシステムにデフォルトでインストールされています)であるshowkeyは、特定のキーボード入力を押したときにシェルが受け取るキーを示します。

とにかく、あなたへの私の提案はShift-Tab、それ自身のキーコードをシェルに送信するように見えるを使用することです。Shift-Tab私のコンピューターでは、(showkeyを使用して)'<ESC> [Z'として表示されます。これは、全体的にかなり標準的だと思います。そのため、次のバインディングを持つinputrcファイルを使用すると、目的を達成するshift-tab代わりに使用できるようになります。ctrl-tab

Tab: menu-complete
"\e[Z": complete

2番目のバインディングの\eはエスケープ文字を表し、[Zは単にshowkeyを使用して表示される文字です。catを使用し、ターミナル内からcatを実行し、を押すだけでOSXに同様の効果を得ることができますShift-Tab。ここで、^ [はエスケープ文字を表し、他の文字は以前と同じです。

これでは質問が正確に解決されないことはわかっていますが、ターミナル内の別のキーバインドCtrl-Tabに再マッピングせずにキーの組み合わせとして使用できるとは思わないCtrl-Tabため(GUIを使用している場合はより簡単になる可能性があります)ターミナル)、これはあなたがかなりの努力なしで得ることができるのと同じくらい近いでしょう!

于 2012-08-20T21:29:27.950 に答える
8

ShiftTabバインドしたmenu-complete-backwardので、正しい完了をスキップした場合は1ステップ戻り、にマップCtrlqしたcompleteので、いくつかの可能な完了がある場合は、Ctrlqそれらを循環せずにリストするためにヒットします。

# Make Tab cycle between possible completions
# Cycle forward: Tab
# Cycle backward: Shift-Tab

TAB: menu-complete
"\e[Z": menu-complete-backward

# Make C-q display the list of possible completions

Control-q: complete

# Display the list of matches when no further completion is possible

set show-all-if-unmodified on

編集: Ctrlqデフォルトでバインドさquoted-insertれています。つまり、シェルに次のキーを文字通り受け取るように指示します。quoted-insertもにバインドされているため、再バインドしてCtrlvもその機能が失われることはありませんCtrlq。とにかく、私はそれがAltESCデフォルトで可能な完了を表示するためにも機能することを発見しました(私が知る限り、それはと同等TABです); Gnomeによって押収される可能性があることに注意してください。次にESC、[設定]→[デバイス]→[キーボード]→[ナビゲーション]で[ウィンドウを直接切り替える]を2回押すか再バインドします。

于 2017-11-26T10:09:01.517 に答える
5

以下はあなたが探しているものを達成するはずです(私が正しく理解していれば!)

あなたの中で.inputrc

# display all possible matches for an ambiguous pattern at first tab
set show-all-if-ambiguous on

# next tab(s) will cycle through matches
TAB: menu-complete
# shift tab cycles backward
"\e[Z": menu-complete-backward
于 2018-08-07T17:27:11.953 に答える
0

Ctrl-Tabが実際の文字かどうかはわかりません。たとえば、私の端末はその組み合わせを無視します。Ctrl-Tabを使用する唯一の方法は、ターミナルエミュレータを使用して、それ以外の場合は使用されていないエスケープシーケンスにマップし、そのシーケンスをにバインドすることだと思いますcomplete

于 2012-08-20T20:44:25.537 に答える
0

どこから始めれば、これができるかできないかは、キーボードとドライバーに依存し、すべての答えを見つけることはできません。キーを押して放すたびに、シーケンスされたキーペア(キーダウンとリリース)(スキャンコード)が生成されます。これらのコードは、カーネルによってキーコードに変換されます。たとえば、ラップトップキーボードでは0x3a 0xbaがキーコード15(下と上)に変換されます。リターンレターca/などのアクションに変換キーコードは、ほとんどのキーボードで異なります。

前の例を続けると、シフトタブ(およびaltとcontrolおよび任意の組み合わせ)はキーコード15を生成しますが、16進数では0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2a 0x2aを生成します。これは、shiftaltとcontrolが特殊なキー(修飾子)であるためです。 )これらはキーコードに対して乗算され、ダンプキーテーブルに入力されます。カーネルは割り当ての数に制限されます。これはキーマップの選択によって決定され、リソースを端末の色と共有します(charがしきい値を超えて定義されている場合端末のカラースコープを制限します)。そして、xserverを使用していて、まったく新しいシステムを使用している場合、これはすべてウィンドウの外に出ます。これらのほとんどは、インストールされているユーザーとプログラムによって変更、変更、操作できます。これすべてに対する私のポイントは、タブキーのマッピングと、キーボードドライバーをkbdドライバーに変えることについてのキャッチオールはないことを強調することです(今、あなたのためにうまくいく解決策を見つけたら:))しかしチャンスポータブルではなく、キーボードを変更すると機能しない可能性があり、xserverとtuiの間で変換されない可能性がありますか。私がお勧めするのは、外出先でkbdを変更する手順を学ぶことです。

同じ行でキーを押すと、10進数の8進数の16進数表記が表示されます

--full-table -1 >> keytable 

keycode-> keysymペアリングの完全なリストがレイアウトのより良い画像を提供する形式で文書化され、そこからloadkeyを使用してキー値を変更するか、.inputrcまたはメインrcファイル。カスタムkey.mapファイルを作成することもできます。さらなるエスケープシーケンス変換は「$TERM」変数によって決定され、各仮想端末エミュレーターは異なる場合があります

infocmp "$TERM"

ターミナルエスケープシーケンスのリストが表示されます

資力:

https://man7.org/linux/man-pages/man4/console_codes.4.html

https://www.gnu.org/software/screen/manual/html_node/Input-Translation.html

http://kbd-project.org/docs/scancodes/scancodes.html

https://www.vt100.net/

要約すると。キーボードドライバーkemapの選択仮想ターミナルエミュレーターとカーネルは、難しいキーの再マッピングのバックボーンを形成します(tab / s-tab / a-tab)

于 2020-12-29T04:14:31.420 に答える