У меня настроена куча сценариев завершения bash (в основном с использованием bash-it и некоторых настроек вручную).
У меня также есть куча псевдонимов для общих задач, например gco
для git checkout
. Прямо сейчас я могу напечатать git checkout d
Tabи develop
закончен для меня, но когда я печатаю, gco d
Tabэто не завершает.
Я предполагаю, что это потому, что сценарий завершения завершается, git
и он не видит gco
.
Есть ли способ, чтобы в общем / программно заставить все мои сценарии завершения работать с моими псевдонимами? Неспособность выполнить при использовании псевдонима побеждает цель псевдонима.
bash
tab-completion
dstarh
источник
источник
bash --version
чтобы получить это (не используйте-v
, другой вывод).ll --[TAB]
его, будет напечатан список параметров дляls
? Я довольно скептически отношусь к этому, но если вы уверены, что такая вещь существовала в 11.10, мне было бы любопытно покопаться в ней и определить, что было удалено.Ответы:
Следующий код, адаптированный из этого ответа о переполнении стека и этой ветки обсуждений на форумах Ubuntu , добавит дополнения для всех определенных вами псевдонимов:
Для простых (только команда, без аргументов) псевдонимов он назначит исходную функцию завершения псевдониму; для псевдонимов с аргументами он создает функцию-обертку, которая вставляет дополнительные аргументы в исходную функцию завершения.
В отличие от сценариев, из которых она произошла, функция учитывает кавычки как для команды alias, так и для ее аргументов (но первые должны совпадать с командой завершения и не могут быть вложенными), и она должна надежно отфильтровывать псевдонимы для списков команд и каналы (которые пропускаются, так как невозможно выяснить, что в них выполнить, не создавая заново логику разбора командной строки оболочки).
использование
Либо сохраните код в виде файла сценария оболочки и источника , в котором он находится, либо скопируйте оптовую функцию в
.bashrc
(или ваш соответствующий файл точек ). Важно вызвать функцию после завершения определения bash и определения псевдонимов (приведенный выше код вызывает функцию сразу после ее определения в духе «источник и забыл», но вы можете переместить вызов куда-нибудь вниз по течению, если это тебе подходит лучше). Если вам не нужна функция в вашей среде после ее выхода, вы можете добавить ееunset -f alias_completion
после вызова.Заметки
Если вы используете
bash
версию 4.1 или выше и используете динамически загруженные завершения, скрипт попытается загрузить завершения для всех ваших псевдонимов, чтобы он мог построить функции-оболочки для ваших псевдонимов.источник
~/.bashrc
. Либо сохраните его в виде файла сценария оболочки и отправьте его (. /path/to/alias_completion.sh
), либо скопируйте и вставьте код оптом./usr/share/bash-completion/completions/
они загружаются только первый раз, когда пользователь действительно нажимает[TAB]
. Таким образом, даже если функция загружена из~/.bashrc
нее, она не будет генерировать дополнения для псевдонимов команд в ней. Проверивcomplete -p
работает наapt-get
иapt-cache
я копировать-вставить вашу функцию в терминал и он работает правильно./tmp
в~/.bash_completion
и вручную добавил в его начале соответствующиеsource /usr/share/bash-completion/completions/
записи (отдельно дляapt-get
иapt-cache
-apt-{cache,get}
не работает).Да, вот проект с полным псевдонимом, который точно решает вашу проблему. Он обеспечивает общее и программное завершение псевдонимов без использования
eval
.источник
Это ручной способ для тех, кто ищет это.
Сначала посмотрите исходную команду завершения. Пример:
Теперь добавьте их в свой скрипт запуска (например, ~ / .bashrc):
источник: https://superuser.com/a/1004334
источник