3

異なるキーの組み合わせによってトリガーされる、複数のタブ補完ルーチンを持つことは可能ですか?

たとえば、タブ補完myprog -help オプションの出力を解析するカスタム タブ補完関数があります。デフォルトのタブ補完動作をTabそのままにして、カスタム補完をShift+のようなものにバインドする方法はありますTabか?

4

1 に答える 1

2

キーバインディング自体はreadlineの一部であり、あなたの中で変更したり、あなたの中でコマンドを~/.inputrc使用したりできます(など)が、それらはユーザー定義関数に直接バインドせず、それらの関数を呼び出す可能性のあるマクロとして間接的にのみバインドします.bind.bashrc

"\C-xhf": dump-functions        # for ~/.inputrc
bind '"\C-xhf":dump-functions'  # in .bashrc (etc.)

bind -lバインドできる組み込み関数が表示されます。この方法でマクロを追加できます。これにより、必要な bash 関数を実行できますが、完了コンテキストではなく、結果がコマンド ラインに戻されません。例:

"\C-xc":  "echo hi\n"       # note it's a just macro, not a direct binding.

completeコマンドラインの左側にあるビルトインコマンドの補完をオーバーライドできることは、すでにご存知だと思います。通常、代替セットを呼び出す方法を考え出す代わりに、独自の補完ルーチンをそのように作成して使用することをお勧めします。例:

_complete_ssh ()
{
    local ssharg="${COMP_WORDS[COMP_CWORD]}"
    local filter=cat
    case "$ssharg" in *@*) filter="sed s/^/${ssharg%@*}@/" ;; esac
    local host=${ssharg##*@}
    COMPREPLY=( $(compgen -W "`
        sed 's/[, ].*//'  ~/.ssh*/known_hosts{,2} | sort | uniq
    `" $host | $filter ))
    return 0
}
complete -F _complete_ssh ssh          # for any command starting with "ssh "...

バインドを試してuniversal-argument、マクロを介して実行される関数に影響するかどうかを確認しました (「C-xu」で UA の前に付け、次に「C-xf」で関数を実行します)。 UA を検出します。bind前のコマンドの UA を逆流させるオプション、または $-something を使用すると、ユーザー定義のコンプリータ サブ関数が の内部から UA を検出completeできるようになり、動作が異なる可能性があると思われますが、readline のソース コードにそのアイデアの兆候は見られません。どのキーバインドが関数またはマクロを呼び出したかを確認する明確な方法はありません (私はそれを期待していませんでした)。2 つのキーバインドを同じビルトインにマッピングしcomplete、バックトラックしてどのキーバインドがそれをトリガーしたかを確認します。

とにかく Shift-TAB をバインドするのは難しく、古い学校の端末から入力することは不可能であることに注意してください。bash は X ライブラリを使用せず、Shift を修飾子として直接見ることができません。代わりに、修飾子の適切な概念を持たない一部の文字セットで入力用の端末または端末エミュレーターに依存します。

于 2013-07-19T07:42:42.733 に答える