Как получить завершение bash для псевдонимов команд?

Я ищу, чтобы получить завершение табуляции в моих псевдонимах командной строки, например, я определил следующий псевдоним:

alias apt-inst='sudo aptitude install' 

Есть ли способ получить завершение, предоставленное aptitude, когда я нажимаю клавишу табуляции? т.е. когда я пишу 'sudo aptitude install gnumer' и hit tab, aptitude завершает это до gnumeric, или если список неопределенностей содержит все доступные пакеты, начиная с gnumer. Если я сделаю это, используя мой псевдоним, ничего – не завершение.

Об этом сообщается на форумах Ubuntu . Ole J предлагает следующую функцию определения завершения псевдонима:

 function make-completion-wrapper () { local function_name="$2" local arg_count=$(($#-3)) local comp_function_name="$1" shift 2 local function=" function $function_name { ((COMP_CWORD+=$arg_count)) COMP_WORDS=( "$@" \${COMP_WORDS[@]:1} ) "$comp_function_name" return 0 }" eval "$function" echo $function_name echo "$function" } 

Используйте его для определения функции завершения для вашего псевдонима, затем укажите эту функцию как дополнение для псевдонима:

 make-completion-wrapper _apt_get _apt_get_install apt-get install complete -F _apt_get_install apt-inst 

Я предпочитаю использовать псевдонимы для добавления всегда используемых аргументов к существующим программам. Например, с grep , я всегда хочу пропустить устройства и двоичные файлы, поэтому я делаю псевдоним для grep . Для добавления новых команд, таких как grepbin , я использую скрипт оболочки в папке ~/bin . Если эта папка находится на вашем пути, она будет автоматически заполнена.

Попробуйте полный псевдоним , который точно решает эту проблему.

Чтобы использовать его, просто вставьте содержимое completions/bash_completion.sh в ~/.bash_completion и заполните псевдоним:

 complete -F _complete_alias <myalias> 

Одну и ту же функцию завершения можно использовать против любого псевдонима.

Подробнее см. README на домашней странице проекта.

Вот код из ответа Шон Дж. Гоффа с некоторыми улучшениями:

  • Исправлены ошибки синтаксиса, выделенные с помощью shell-check , например, первая " из "$@" фактически закончила строку определения функции.
  • Удалено return 0 так что возвращаемое значение базовой функции может быть передано обратно вызывающему.

,

 # Wraps a completion function, eg for use with an alias. # Usage: # make-completion-wrapper <actual completion function> <name of new func.> # <command name> <list supplied arguments> # eg. # alias agi='apt-get install' # make-completion-wrapper _apt_get _apt_get_install apt-get install # # defines a function called _apt_get_install (that's $2) that will # # complete the 'agi' alias. # complete -F _apt_get_install agi function make-completion-wrapper { local function_name="$2" local arg_count=$(( $#-3 )) local comp_function_name="$1" shift 2 local function="function $function_name { (( COMP_CWORD += $arg_count )) COMP_WORDS=( \"\$@\" \${COMP_WORDS[@]:1} ) \"$comp_function_name\" }" eval "$function" # echo "$function" } export -f make-completion-wrapper