25

小さなコマンドランチャーアプリケーションを作成しようとしていますが、自分の補完システムでbashのタブ補完を使用したいと思います。を使用して、一般的なコマンドの補完のリストを取得できましたcompgen -abck
ただし、特定のコマンドの補完も取得したいと思います。たとえば、入力git pにはgitのコマンドの補完が表示されます。

これを行うために使用できる方法はありますcompgenか?そうでない場合、プログラムで完了のリストを取得する他の方法はありますか?

[編集:明確にするために、私はbashに補完を提供しようとはしていません-私のアプリはGUIコマンドランチャーです。自分のアプリでbashの既存の補完を使用したいだけです。]

4

4 に答える 4

15

それがどのように機能するかは本当にわかりませんが、素晴らしいウィンドウマネージャーは、bashの完了結果にアクセスするために次のLuaコードを使用します。

https://github.com/awesomeWM/awesome/blob/master/lib/awful/completion.lua#L119

  1. 経由complete -pして見つけますcomplete -o bashdefault -o default -o nospace -F _git git。後で使用するために「_git」を覚えています。
  2. 「gitl」の長さは5なので、COMP_COUNT=6に設定します。「git」の最初の引数を完了しているので、COMP_CWORD=1です。

一緒に次のスクリプトを使用します。

__print_completions() {
    printf '%s\n' "${COMPREPLY[@]}"
}

# load bash-completion functions
source /etc/bash_completion

# load git's completion function
_completion_loader git

COMP_WORDS=(git l)
COMP_LINE='git l'
COMP_POINT=6
COMP_CWORD=1
_git
__print_completions

出力:「ログ」

于 2010-09-03T22:52:46.950 に答える
2

ディレクトリをチェックインし/etc/bash_completion.d/ます。これは、さまざまなコマンド補完スクリプトが残る場所です。

于 2010-08-22T16:19:57.883 に答える
1

かなり古い質問ですが、その間に、これを処理してZSHで補完を再利用するスクリプトを実装しました。

于 2020-12-16T00:53:04.760 に答える
-1

ここにbashでの単純ですが実用的な例があります:

function foo_completion()
{
    local currentWord=${COMP_WORDS[COMP_CWORD]}
    local completionList=""

    case "${COMP_CWORD}" in
        "1")
            completionList="command1 command2 command3";
            ;;
        "2")
            completionList="param1 param2 param3";
            ;;
    esac

    COMPREPLY=( $( compgen -W "${completionList}" -- ${currentWord} ) )
}

complete -F foo_completion foo

この種のコードでは、「fooc」+tabと入力するとcommandNが完了し、「foocommand1p」+tabと入力するとparamNが完了します。

コマンドヘルプから完了リストを計算できます。

my2c

于 2010-08-30T08:08:07.123 に答える