前回はdaemonコマンドに対する補完機能を設定する方法について述べた。今回はさらに補完機能を高める方法について解説しよう。

引数のコマンドに対してそれぞれ補完が効くようにする

daemonコマンドは引数にコマンドをとる。そのため、コマンドを補完対象とでるように設定したわけだが、これだけでは使いにくい。コマンドを補完表示したあとは、そのコマンドの補完設定が機能するようにしたいところだ。

そこで、コマンド補完の後に「'*::args:_normal'」を追加しよう。これは、引数のコマンドに対して補完が有効になる設定だ。指定する順番がそのままコマンド補完の補完場所に対応している。

リスト1.1 補完されて表示されるコマンドに対して補完設定が有効になるように設定を追加


#compdef daemon

_arguments \
  ':command:_command_names -e' \
  '*::args:_normal'

リスト1.1のように設定すれば、例えばプロンプト1.1のように補完されたコマンドに対してさらに補完機能が適用されるようになる。

プロンプト1.1 補完されたコマンドに対してコマンド補完機能が適用されるようになった


% daemon tar [ここでタブキーを押すとコマンドの補完が展開される]
A  -- append to an archive
c  -- create a new archive
f  -- specify archive file or device
t  -- list archive contents
u  -- update archive
v  -- verbose output
x  -- extract files from an archive

オプション補完を実現しよう

引数の補完設定ができたので、次はdaemonコマンドのオプション補完機能を実現するとしよう。FreeBSD 7-currentのdaemonコマンドには。-c、-f、-p、-uのコマンドオプションがある。その中で、まずは引数をとらない単体オプションの-cと-fを設定する。設定は、 '-c[change the current working directory to the root]'のようにオプションとその説明を追加すればよい。動作説明は、マニュアルから引用しよう。

リスト2.1 オプションを設定


#compdef daemon

_arguments \
  '-c[change the current working directory to the root]' \
  '-f[redirect standard input, standard output and standard error to /dev/null]' \
  ':command:_command_names -e' \
  '*::args:_normal'

リスト2.1のように設定すると、プロンプト2.1のように「-タブキー」でオプションが補完表示されるようになる。さらにオプション補完を実行しようとすれば、プロンプト2.2のように残りのオプションが補完表示されるようになる。これだけの設定でここまで動くようになるのだから、なかなか便利だ。

プロンプト2.1 「-タブキー」でオプションが補完表示されるようになった


% daemon -[ここでタブキーを押すとオプションの候補が表示される]
-c  -- change the current working directory to the root
-f  -- redirect standard input, standard output and standard error to /dev/null

プロンプト2.3 残りのオプションが補完候補として表示される


% daemon -c -[ここでタブキーを押すと残りの候補が補完表示される]
-f  -- redirect standard input, standard output and standard error to /dev/null

値をとるオプション補完も実現しよう

FreeBSD daemonコマンドでは-pでプロセスIDを出力するファイルを、-uで実行するユーザを指定できる。ファイルを補完するなら:file:_filesを、ユーザ名を補完するなら:user:_users'をオプション補完設定に追加すればよい。つまり-uなら'-u[run the program with the rights of user specified]:user:_users'のようになるわけだ。

リスト3.1 オプションに対して補完設定が効くように設定を追加


#compdef daemon

_arguments \
  '-c[change the current working directory to the root]' \
  '-f[redirect standard input, standard output and standard error to /dev/null]' \
  '-p[write the ID of the created process into the file]:file:_files' \
  '-u[run the program with the rights of user specified]:user:_users' \
  ':command:_command_names -e' \
  '*::args:_normal'

リスト3.1のように設定すれば、プロンプト3.1やプロンプト3.2のようにオプション後に補完が効くようになる。

プロンプト3.1 -pオプションに対してファイル名が補完されている


% daemon -p [ここでタブキーを押すとファイルが補完表示される]
COPYRIGHT.txt  dir02/         file01         file03         file05       
dir01/         dir03/         file02         file04       

プロンプト3.2 -uオプションに対してユーザ名が補完されている


% daemon -u [ここでタブキーを押すとユーザ名が補完表示される]
_dhcp    bind    daichi     kmem        news      polkit  sasaki    test   uucp
_pflogd  cups    games      mailnull    nobody    pop     smmsp     test2  www
avahi    cyrus   gdm        man         operator  proxy   sshd      toor     
bin      daemon  haldaemon  messagebus  ozawa     root    takasyou  tty

これだけの設定でオプション補完、オプションの引数補完、補完されたコマンドに対しての補完機能が有効になるわけだ。これらの設定は、ほかのコマンドにも適用できる典型的な設定パターンなので覚えておくと便利だ。

オプションのショートカットドキュメントとして補完設定を活用

重宝するコマンドであっても、使っていなければオプションは忘れるものだ。そういうときはマニュアルを見るわけだが、なかなか面倒くさい。そこでzshの補完機能を活用しよう。

よく使うオプションをあらかじめオプション補完設定として設定しておく。そうすれば「-タブキー」でそれらオプションが表示されるというわけだ。これはクセになるほど便利な機能である。

とはいっても、補完機能を使ってToDoリストを作成するとか、そういった意味があるのか無いのか不明なこともできるし、応用範囲は広い。とりあえず補完設定が用意されていないコマンドがあれば、どんどん設定しよう。