В bash достаточно легко настроить настраиваемое завершение аргументов команды с помощью complete
встроенного. Например, если для гипотетической команды с кратким изложением foo --a | --b | --c
, вы могли бы сделатьcomplete -W '--a --b --c' foo
Вы также можете настроить завершение вы получаете , когда вы нажимаете Tabна пустой строке , используя complete -E
, например, complete -E -W 'foo bar'
. Тогда нажатие вкладки в пустом приглашении предложит только foo
и bar
.
Как настроить завершение команды в не пустом приглашении? Например, если я сижу по адресу:
anthony@Zia:~$ f
как настроить завершение так, чтобы нажатие вкладки всегда завершалось foo
?
(Фактический случай, который мне нужен, это loc
TAB→ localc
. И мой брат, который побудил меня спросить об этом, хочет это с помощью mplayer).
источник
loc
кlocalc
? Я предлагаю альтернативы, потому что после долгого времени копания и поиска я не нашел способа настроить завершение bash таким образом. Это может быть невозможно.locate
,locale
,lockfile
или любой из других расширенийloc
. Возможно, лучшим подходом было бы сопоставить другой ключ с этим конкретным завершением.loc<TAB>->localc
)?Ответы:
Завершение команды (наряду с другими вещами) обрабатывается посредством завершения чтения bash . Это работает на несколько более низком уровне, чем обычное «программируемое завершение» (которое вызывается только после идентификации команды и двух особых случаев, которые вы определили выше).
Обновление: новая версия bash-5.0 (январь 2019) добавляет
complete -I
именно эту проблему.Соответствующие команды readline:
По аналогии с более распространенным
complete -F
, некоторые из них могут быть переданы функции с помощьюbind -x
.Это позволяет подключать свои собственные строки команд или префиксов
~/.complete.d/
. Например, если вы создаете исполняемый файл~/.complete.d/loc
с:Это будет делать (примерно) то, что вы ожидаете.
Вышеприведенная функция идет вразрез с тем, чтобы эмулировать нормальное поведение завершения команды bash, хотя она несовершенна (особенно сомнительное
sort | fmt | column
продолжение для отображения списка совпадений).Однако нетривиальная проблема, связанная с этим, заключается в том, что она может использовать функцию только для замены привязки к основной
complete
функции (вызывается с помощью TAB по умолчанию).Этот подход будет хорошо работать с другой привязкой ключа, используемой только для пользовательского завершения команды, но он просто не реализует логику полного завершения после этого (например, более поздние слова в командной строке). Для этого потребуется анализ командной строки, работа с позицией курсора и другие хитрые вещи, которые, вероятно, не следует учитывать в сценарии оболочки ...
источник
Я не знаю, понял ли я вашу потребность в этом ...
Это означало бы, что ваш bash знает только одну команду, начинающуюся с
f
.Основная идея завершения: если это неоднозначно, распечатайте возможные варианты.
Таким образом, вы можете установить
PATH
директорию, содержащую только эту команду, и отключить все встроенные команды bash, чтобы получить эту работу.Во всяком случае, я могу дать вам также своего рода обходной путь:
Так что если вы наберете,
_ <Tab>
он будет завершен,_ foo
который выполняетfoo
.Но тем не менее
alias f='foo'
было бы намного легче.источник
Простой ответ для вас будет
только основные выводы
просто добавьте нужную программу для автоматического завершения до завершения bash
источник
Запустите команду ниже, чтобы найти, где установлен двоичный файл mplayer:
ИЛИ используйте путь к двоичному файлу mplayer, если вы его знаете, в приведенной ниже команде:
В идеале все, что вы вводите, ищется во всех каталогах, указанных в
$PATH
переменной.источник
mplayer
что уже в их,$PATH
и они хотят что-то вродеmp<tab>
производитьmplayer
, а не все двоичные файлы, которые начинаются сmp
(например,mpage
mpcd
mpartition
mplayer
и т. Д.)