Je veux créer un script d'achèvement bash qui reconnaît les arguments du formulaire --arg
et --some-arg=file
.
Après avoir lu ce tutoriel et quelques exemples /usr/share/bash_completion/completions/
, j'ai écrit le script suivant (pour gagner du temps à taper des drapeaux avec 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
Je l'ai enregistré dans ~/bash_completions/chromium
et créé un lien symbolique à l'aide de sudo ln -s ~/bash_completions/chromium /usr/share/bash_completion/completions/chromium
.
Ensuite, je l'ai chargé en utilisant . /usr/share/bash_completions/completions/chromium
.
Maintenant, je rencontre deux problèmes:
chromium --u<TAB>
se développe enchromium --user-data-dir=<SPACE>
(je ne veux pas de l'espace).- Les chemins (répertoires et fichiers) ne sont plus complétés.
Comment puis-je résoudre ces problèmes?
bash
autocomplete
chrome
Rob W
la source
la source
Réponses:
J'ai trouvé la solution aux deux problèmes!
Pour ne pas ajouter d'espace, utilisez l'
nospace
option. Ceci peut être fait de deux façons:complete
:complete -o nospace -F _chromium chromium
compopt
intégrée:compopt -o nospace
(pour activer l'option)compopt +o nospace
(pour désactiver l'option)Je l'ai trouvé dans la documentation de Bash sur gnu.org, 8.7 Builtin Completion Completion Builtins .
-f
drapeau aveccompgen
. J'ai suivi ce conseil et l'ai mis en œuvre commeCOMPREPLY=( $(compgen -f "$cur") )
. Cela a bien fonctionné, jusqu'à ce que j'essaie de terminer un chemin contenant des espaces.Sur Stack Overflow, j'ai trouvé cette réponse qui recommande la création manuelle de la liste d'achèvement (sans utiliser
compgen
). Cette approche a bien fonctionné.filenames
option pour indiquer à Readline que la spécification comp génère des noms de fichiers, afin qu'elle puisse:colored-stats
activé)Avec l'aide de la manipulation des chaînes de Bash (pour développer
~
et gérer les espaces), j'ai construit un script de complétion bash qui répond à tous les critères énoncés dans la question.la source
-f
commutateur pour l'achèvement du chemin d'accès au fichier, mais il ne complète pas le caractère/
s'il s'agit d'un répertoire ... c'est une petite chose cependant.Pour compléter les noms de fichiers, essayez de passer
-f
àcompgen
.Je crains que vous ne puissiez pas vous débarrasser des espaces après les options, car c'est ainsi que l'achèvement fonctionne - une fois qu'il trouve une correspondance unique, il la complète complètement.
la source
-f
. Je l'ai essayé, mais il ne traite pas correctement les espaces: le chemin d'accès/tmp/foo bar
entraîne deux entrées de complétion/tmp/foo
etbar
. À propos des indésirables--arg=<SPACE>
: j'ai trouvé la solution à cela et je l'ai affichée dans la réponse ci-dessous .