質問

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

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

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

役に立ちましたか?

解決

私はそれがどのように機能するか本当にわかりませんが 素晴らしいウィンドウマネージャー Bash Completeの結果にアクセスするために、次の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. 「git l」の長さは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

出力:「ログ」

他のヒント

デビアン政権を見てください バッシュ完成の紹介 - それはかなり理解しやすいです - ところで、それもあります パート2.

チェックインします /etc/bash_completion.d/ ディレクトリ。これは、異なるコマンド完了スクリプトのままです。

ここでは、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

この種のコードを使用すると、「foo c」 + tabを入力するとcommandnが完了し、「foo command1p」 +タブを入力するとparamnが完了します。

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

my2c

しばらく前にこのスクリプトをハッキングしました。 マンページのバッシュ完成 私は他の人が解析で同様のことをしたことを知っています --help オプション出力。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top