Bash

如何獲得命令別名的 bash 補全?

  • February 10, 2022

我希望在我的命令行別名上獲得製表符補全,例如,假設我定義了以下別名:

alias apt-inst='sudo aptitude install'

當我按 Tab 鍵時,有沒有辦法獲得 aptitude 提供的補全?即,當我編寫“sudo aptitude install gnumer”並點擊選項卡時,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文件夾中使用了一個 shell 腳本。如果該文件夾在您的路徑中,它將自動完成。

試試complete-alias,它正好解決了這個問題。(免責聲明:我是作者complete_alias

安裝後,您可以使用一個通用函式來完成許多這樣的別名:

complete -F _complete_alias <myalias1>
complete -F _complete_alias <myalias2>
complete -F _complete_alias <myalias3>

您可能希望通過或類似complete_alias方式在每個 bash 實例中獲取文件。.bash_profile

安裝

mkdir ~/.bash_completion.d
curl https://raw.githubusercontent.com/cykerway/complete-alias/master/complete_alias \
    > ~/.bash_completion.d/complete_alias

應用

source ~/.bash_completion.d/complete_alias

alias container=docker\ container
complete -F _complete_alias container

container現在可以由原始_docker()完成處理程序自動完成;

$ container l<Tab>
logs  ls    

$ container s<Tab>
start  stats  stop   

引用自:https://unix.stackexchange.com/questions/4219