--arg
引数を認識して設定できるbashコンプリートスクリプトを作成したいと思います--some-arg=file
。
読んだ後このチュートリアルのいくつかの例で、/usr/share/bash_completion/completions/
次のスクリプトを作成しました(Chromiumを使用していくつかのフラグを入力する時間を節約するため)。
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=file
if [[ ${cur} == "--"*"=" ]] ; then
# Removed failures (is my logic OK?)
return 0
fi
# Handle other options
if [[ ${cur} == -* ]] ; then
COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
return 0
fi
}
complete -F _chromium chromium
に保存し、~/bash_completions/chromium
を使用してシンボリックリンクを作成しましたsudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
。
それから. /usr/share/bash_completions/completions/chromium
。
今、2つの問題があります。
chromium --u<TAB>
chromium --user-data-dir=<SPACE>
(このスペースは不要です)に展開します。- パス(ディレクトリとファイル)が完全ではなくなりました。
これらの問題をどのように解決できますか?
答え1
2つの問題の解決策を見つけました!
スペースを追加したくない場合は、この
nospace
オプションを使用してください。これは2つの方法で行うことができます。- 次のアドレスに転送してください
complete
。
complete -o nospace -F _chromium chromium
compopt
組み込みの使用:(
compopt -o nospace
このオプションを有効にする)
compopt +o nospace
(このオプションを無効にする)
私はgnu.orgのBashドキュメントでこれを見つけました。8.7 組み込み機能のプログラム可能な完成。
- 次のアドレスに転送してください
- 文書を完成させてください。
- Petervが提案した
-f
と一緒にロゴを使用してくださいcompgen
。私はそのアドバイスに従ってそれをCOMPREPLY=( $(compgen -f "$cur") )
。
スタックオーバーフローで見つけました。この回答完成リストを手動で作成することをお勧めします(使用しないcompgen
)。この方法は非常に効果的です。 - この
filenames
オプションを有効にすると、Readline compspecは次のことができるようにファイル名を生成するように指示します。- ファイル名別処理の実行(ディレクトリ名へのスラッシュの追加、特殊文字の引用、末尾のスペースの抑制など)
- さまざまな色でファイル形式を表示(
colored-stats
有効)
- Petervが提案した
の助けを借りてBashの文字列操作(スペースを拡張し~
て処理するために)質問に記載されているすべての基準を満たすbashコンプリートスクリプトを作成しました。
_chromium()
{
local cur prev opts
COMPREPLY=()
cur="${COMP_WORDS[COMP_CWORD]}"
prev="${COMP_WORDS[COMP_CWORD-1]}"
# Some interesting options
opts="
--disable-web-security
--easy-off-store-extension-install
--incognito
--load-extension=
--pack-extension=
--pack-extension-key=
--user-data-dir=
"
# Handle --xxxxxx=
if [[ ${prev} == "--"* && ${cur} == "=" ]] ; then
compopt -o filenames
COMPREPLY=(*)
return 0
fi
# Handle --xxxxx=path
if [[ ${prev} == '=' ]] ; then
# Unescape space
cur=${cur//\\ / }
# Expand tilder to $HOME
[[ ${cur} == "~/"* ]] && cur=${cur/\~/$HOME}
# Show completion if path exist (and escape spaces)
compopt -o filenames
local files=("${cur}"*)
[[ -e ${files[0]} ]] && COMPREPLY=( "${files[@]// /\ }" )
return 0
fi
# Handle other options
COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
if [[ ${#COMPREPLY[@]} == 1 && ${COMPREPLY[0]} != "--"*"=" ]] ; then
# If there's only one option, without =, then allow a space
compopt +o nospace
fi
return 0
}
complete -o nospace -F _chromium chromium
答え2
-f
ファイル名を完成させるには、に渡してくださいcompgen
。
オプションの後のスペースを削除できないか心配です。完成がうまくいく方法だからです。一意の一致を見つけると完全に完了します。