コマンドエイリアスのbashの完成を取得するには?

コマンドエイリアスのbashの完成を取得するには?

コマンドラインエイリアスでタブ補完機能を使用したいと思います。たとえば、次のエイリアスを定義するとします。

alias apt-inst='sudo aptitude install'

Tabキーを押したときにaptitudeが提供する完成を得る方法はありますか?つまり、「sudo aptitude install gnumer」と書いてタブを押すと、aptitudeがgnumericで完了するか、わからない場合はgnumerで始まる利用可能なすべてのパッケージが一覧表示されます。私のエイリアスを使ってこれを行うと、何も起こりません。何もしません。

答え1

努力する完全エイリアス、この問題を正確に解決します。 (婦人声明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   

答え2

持つ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))
      # Quotes here are important
      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。フォルダがパスにある場合は自動的に実行されます。

答え3

この問題はインターネット検索で終わったので、他の答えの方法を試しました。実際には理解できないさまざまな理由で、Ubuntu 16.04では正しく機能しませんでした。

結局のところ、私のために働いたのは予想以上に些細なことでした。と同じオートコンプリートrsync機能を使いたいですmycommand。それでオートコンプリート機能を見つけてそれに合わせてcomplete呼び出しました。

# Lookup of name of autocompletion function used for rsync
_completion_loader rsync; complete -p rsync
# Returns: complete -o nospace -F _rsync rsync

# Sourcing the rsync functions before, then using the same function for 'mycommand'
. /usr/share/bash-completion/completions/rsync
complete -o nospace -F _rsync mycommand

免責事項:他の方法と比較すると、私の方法の欠点が何であるかわかりません。私は主に人々に役立つことができ、この簡単なアプローチで十分であるため、この記事を書いています。

答え4

2018年の回答

「complete」プログラムにエイリアスを追加する必要があります。達成したいオートコンプリートの種類に応じて、-cまたは-Fを使用する必要があります。

パッケージオートコンプリートの場合:

complete -c name_of_your_alias

コマンドオートコンプリートの場合:

complete -F name_of_your_alias

エイリアスが正しく追加されたことを確認するには、次の手順を実行します。

complete | grep name_of_your_alias

最後に、「フル」からエイリアスを削除します。

complete -r name_of_your_alias

あなたの場合:

complete -c apt-inst

関連情報