zshにはあらかじめコマンド補完の設定が用意されている。しかしサードパーティアプリケーションや、あまり使われていないコマンドに対しては補完設定が用意されていない。そのようなわけで、こういったコマンドの補完設定について紹介していこう。今回は、trafshowコマンドを取り上げる。

trafshowコマンド

ここで紹介するtrafshowコマンドは、ネットワークを流れているパケットを監視するアプリケーションである。ターミナルで実行してtopコマンドのように流通状況を確認できる。ネットワークが重いときなどに、どのホストのどのアプリケーションが帯域を占領しているのかを簡単にチェックできる便利なコマンドだ。

このtrafshowコマンドには、オプションがいくつもある。その中で典型的な使い方というと、スーパーユーザが使う「trafshow -i ネットワークインタフェース名」だろう。それでは、この補完設定を作成してみよう。

trafshowコマンド補完設定ファイル

zshの補完設定は強力なわけだが、筆者は今のところ分かりやすいチュートリアルやマニュアルを見たことがない。仕方が無いので、既存の設定ファイルから設定内容を抽出して応用していくとしよう。

trafshowコマンドの補完設定で欲しいのは、ネットワークインタフェース名の補完機能である。ネットワークインタフェースの補完といえば、ifconfigコマンドで実現されているので、そこから設定を探るとする。

ifconfigコマンドの補完設定ファイルを調べると、リスト2.1のあたりが参考になりそうだ。「'1:network interface:_net_interfaces'」がネットワークインタフェースの補完設定だろう。

リスト2.1 ifconfigコマンドの補完設定ファイルのネットワークインタフェースの補完設定らしい部分


- 省略 -

;;
  esac
  _arguments -C "$args[@]" \
  '-a[apply to all interfaces]' \
  '1:network interface:_net_interfaces' \
  '::address family:(atalk ether inet inet6 ax25 ddp ipx netrom)' \
  '*:option:->options' && ret=0

  [[ -n "$state" ]] && _values -S ' ' -w 'option' "$opts[@]" 
  \
  '(down)up[activate interface]' \
  '(up)down[shut down interface]' \

- 省略 -

これと前回daemonコマンドの補完設定で使った設定内容を組み合わせて、stafshowコマンドの補完設定ファイルを作成する。trafshowのusage出力やマニュアルからテキストを引用するとして、リスト2.2のような設定ファイルでOKだ。

リスト2.2 trafshowコマンド補完設定ファイル


  #compdef trafshow

  _arguments \
  '-v[print version number, compile-time definitions, and exit]' \
  '-p[do not put the interface(s) into promiscuous mode]' \
  '-n[do not convert numeric values to names]' \
  '-b[to place a backflow near to the main stream]' \
  '-a[to aggregate IP addresses using the prefix length]' \
  '-c[color config file instead of default /usr/local/etc/trafshow]:file:_files' \
  '-i[network interface name; all by default]:network interface:_net_interfaces' \
  '-s[to search & follow for string in the list show]' \
  '-u[UDP port number to listen for Cisco Netflow; default 9995]' \
  '-R[set the refresh-period of data show to seconds; default 2 sec]' \
  '-P[set the expired data purge-period to seconds; default 10 sec]' \
  '-F[use file as input for the filter expression]:file:_files'

「'-i[network interface name; all by default]:network interface:_net_interfaces'」の部分が-iオプションにおけるネットワークインタフェースの補完設定だ。「-i」に対して「network interface name; all by default」という説明文を表示しつつ、「:network interface:_net_interfaces」の指定に従ってネットワークインタフェースが補完候補として表示される、という内容だ。

これは、図2.1と図2.2のように動作する。-iの引数にネットワークインタフェースが補完候補として表示されるようになったことが分かるだろう。

図2.1 オプションの補完候補が表示される

図2.2 -iオプションでネットワークインタフェースの補完候補が表示される

もちろん「コマンド補完設定 - daemonコマンド編(1)」で説明したように基本的な設定は行っておくように。こんな感じで、次回以降は徐々に対応する機能を増やしていくとしよう。