文字列補完を標準出力に出力する方法は?


15

一部のgitコマンドには多くのオプションがあり、必要なものを検索すると便利な場合があります。TAB幅を制御するオプションを探していましたgit-guiが、には約200の補完がありgit configます。明らかな回避策は、すべての補完をエディターにコピーして検索することですが、私はむしろ

[something] | grep tab

manまたはのinfoページはcompgenありhelp compgenません。独自のオプションについても説明していません。また、オートコンプリートもありませんcompgen(皮肉なのはどうですか?)。

PS:compgen -A動作しません。

PPS:これは質問ではありませんgit-gui- タブ幅の質問に対する解決策は他の場所にありました。

PPPS:これはコマンドの自動補完ではなくコマンドパラメータのみです。


これは、「タブ完了」の出力をパイプする方法に非常に似ていますか?、しかし、受け入れられた答えは、引数ではなくコマンドを完了するためのものでした
Michael Mrozek

回答:


10

次の関数を使用できます。これらの関数は、sudoオートコンプリートが完了リストを生成するのと同じ方法を使用します。

comp() {
    local COMP_LINE="$*"
    local COMP_WORDS=("$@")
    local COMP_CWORD=${#COMP_WORDS[@]}
    ((COMP_CWORD--))
    local COMP_POINT=${#COMP_LINE}
    local COMP_WORDBREAKS='"'"'><=;|&(:"
    # Don't really thing any real autocompletion script will rely on
    # the following 2 vars, but on principle they could ~~~  LOL.
    local COMP_TYPE=9
    local COMP_KEY=9
    _command_offset 0
    echo ${COMPREPLY[@]}
}
comp git config ''

where _command_offsetはbash-completion(パッケージ)で定義されています。

注:関数は、対話型シェルで実行する必要があります(つまり、ファイル内にある場合は、ファイルを実行するだけでなくソースにする必要があります)。または、必要な完了規則/関数は定義されません。

PS。compgen -A組み込みのアクションでのみ機能します。試したほうがよい(しかし機能しません)のはcompgen -F(または実際にはcompgen -o bashdefault -o default -o nospace -F _git)です。これが機能しない理由(およびcompgen / completeを含むbash組み込みコマンドのドキュメント)は、bash(1)で見つけることができます。


@ l0b0はすべての場合にうまくいけばうまくいきます。
yuyichao

すばらしい、うまくいきます!私はいくつかのマイナーな調整を行いましたが、今ではそれは.bash_aliasesにあります。解決策だけが残っているように剪定することもできますが、賞金が得られることは間違いありません。ディスカッションコメントはもう関係ないので削除します。
l0b0

1
対話型シェルでこれを使用すると、既に配置されているタブ補完が破壊されることがあります。各変数を関数に対してローカルにすることで、その問題を解決できます。(例えばlocal COMP_LINE="$*"
ALフラナガン

@ALFlanagan良い点。更新しました。
yuyichao
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.