プログラムで特定のコマンドのBASH完了にアクセスします
-
29-09-2019 - |
質問
小さなコマンドランチャーアプリケーションを作成しようとしています。自分の完了システムで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
- 経由
complete -p
我々は気づくcomplete -o bashdefault -o default -o nospace -F _git git
. 。後で「_git」を覚えています。 - 「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
出力:「ログ」
他のヒント
チェックインします /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
オプション出力。