Help us understand the problem. What is going on with this article?

bash なんて書いたことない人が補完関数をとりあえず自作する

More than 3 years have passed since last update.

概要

手順

おおざっぱな手順になります。

  1. 補完のための関数をかく。
  2. complete コマンドで コマンド関数 ひもづける。
  3. 12 がかかれたスクリプトを読み込む。

例えば、 chrome と入力してTAB×2した時に、 standardbetadevcanary と候補を表示してくれるスクリプトは以下です。

~/bash_completion.d/chrome_completion.bash
#!bash

_chrome()
{
  COMPREPLY=( standard beta dev canary )
}

complete -F _chrome chrome

補完関数

候補 -> 補完

上記の例では候補は表示してくれますが補完はしてくれません。そこで以下のようにします。

~/bash_completion.d/chrome_completion.bash
#!bash

_chrome()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  COMPREPLY=( $(compgen -W "standard beta dev canary" -- $cur) )
}

complete -F _chrome chrome

まず、補完をするためにうちかけているサブコマンドの文字列を取得したいです。それが

cur=${COMP_WORDS[COMP_CWORD]}

です。COMP_CWORD には補完対象の引数の番号が入っていますと言われてもピンとこないと思い人は次の例を見てください。

また、compgen という魔法のコマンドを使ってあげるとなんと補完されてしまいます汗すごい。

-- はオプションの終わりの印です。

サブコマンドなどによる場合分け

補完はできましたが、今度は chrome dev と入力してTAB×2した時には、カレントディレクトリのファイルなどを候補に補完してほしいとします。そこで以下のようにします。

~/bash_completion.d/chrome_completion.bash
#!bash

_chrome()
{
  local cur=${COMP_WORDS[COMP_CWORD]}
  case "$COMP_CWORD" in
  1)
    COMPREPLY=( $(compgen -W "standard beta dev canary" -- $cur) );;
  *)
    COMPREPLY=( $(compgen -W "$(ls)" -- $cur) );;
  esac
}

complete -F _chrome chrome

これで、COMP_CWORD に入っているものが感覚的にわかるんじゃないかと思います。

また、このように、-W "$(ls)"とすることで ls コマンドの出力をそのまま補完候補として使えます汗すごい。

ls では普通ですが、他のコマンドと組み合わせればいくらでもできそうです。

変数

変数名
COMP_CWORD 補完対象の引数の番号
COMP_LINE コマンドライン全体の文字
COMP_POINT カーソルの位置

complete と compgen

$ help complete
complete: complete [-abcdefgjksuv] [-pr] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [name ...]
    For each NAME, specify how arguments are to be completed.
    If the -p option is supplied, or if no options are supplied, existing
    completion specifications are printed in a way that allows them to be
    reused as input.  The -r option removes a completion specification for
    each NAME, or, if no NAMEs are supplied, all completion specifications.
$ help compgen
compgen: compgen [-abcdefgjksuv] [-o option] [-A action] [-G globpat] [-W wordlist] [-P prefix] [-S suffix] [-X filterpat] [-F function] [-C command] [word]
    Display the possible completions depending on the options.  Intended
    to be used from within a shell function generating possible completions.
    If the optional WORD argument is supplied, matches against WORD are
    generated.

読み込み

bash_completion.d フォルダ下に置く方法と .bashrc などに読み込むコードを追記する方法とあります。

前者では、/etc/bash_completion.d/usr/local/etc/bash_completion.d~/bash_completion.d があります。

後者では、source /path/to/chrome_completion.bash.bashrc などに追記します。

参考

もっと詳しくはこちらを見てください。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした