Я хочу создать скрипт завершения bash, который распознает аргументы формы --arg
и --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
.
Сейчас я испытываю две проблемы:
chromium --u<TAB>
расширяется доchromium --user-data-dir=<SPACE>
(я не хочу места).- Пути (каталоги и файлы) больше не завершены.
Как я могу решить эти проблемы?
bash
autocomplete
chrome
Роб W
источник
источник
Ответы:
Я нашел решение обеих проблем!
Чтобы не добавлять пробел, используйте
nospace
опцию. Это можно сделать двумя способами:complete
:complete -o nospace -F _chromium chromium
compopt
встроенное:compopt -o nospace
(чтобы включить опцию)compopt +o nospace
(чтобы отключить опцию)Я нашел это в документации по Bash на gnu.org, 8.7 Встроенные функции программируемого завершения .
-f
флаг сcompgen
. Я последовал этому совету и реализовал его какCOMPREPLY=( $(compgen -f "$cur") )
. Это работало нормально, пока я не попытался завершить путь, содержащий пробелы.На переполнении стека я нашел этот ответ, который рекомендует создавать список завершения вручную (без использования
compgen
). Этот подход работал нормально.filenames
опцию, чтобы сообщить Readline, что compspec генерирует имена файлов, чтобы он мог:colored-stats
включенным)С помощью манипуляций со строками Bash (для расширения
~
и обработки пробелов) я создал сценарии завершения bash, которые соответствуют всем критериям, изложенным в вопросе.источник
-f
переключатель для завершения пути к файлу, но он не завершает/
символ, если он является каталогом ... хотя это мелочь.Чтобы завершить имена файлов, попробуйте перейти
-f
кcompgen
.Боюсь, вы не сможете избавиться от пробелов после опций, поскольку именно так работает завершение - как только оно находит уникальное совпадение, оно завершает его полностью.
источник
-f
. Я пробовал, но он не правильно обрабатывает пробелы: путь/tmp/foo bar
приводит к двум записям завершения/tmp/foo
иbar
. О нежелательном--arg=<SPACE>
: я нашел решение этого и разместил его в ответе ниже .