コラム
見落とされがちでちょっと便利な機能を少しずつ紹介していきます。
タグファイルをまとめる方法(2014年12月27日)
GLOBAL のタグファイルは GTAGS, GRTAGS, GPATH と三つもあり、目障りに感じる人も 多いようです。そこでこれらのファイルを一つのディレクトリで置き換える方法を 説明します。 BSD 起源の obj ディレクトリという仕掛けを利用します。
1. obj ディレクトリを使用する
前準備として、プロジェクトディレクトリに 'obj' という名前のディレクトリを作っておきます。
タグの作成には -O (--objdir) オプションを指定します。 するとタグファイルはすべて obj ディレクトリ内に作成されます。
$ mkdir obj
global コマンドの使い方はいつもと同じです。 global コマンドは obj ディレクトリを理解するので、特別な指定は不要です。
$ gtags -O $ ls obj GPATH GRTAGS GTAGS
$ global -x main ...
2. obj ディレクトリの名前を変更する
obj ディレクトリは好きな名前に変更できます。 環境変数 MAKEOBJDIR に名前を設定します。 次の例では、'mytags' にしています。
この場合、global コマンドを実行する時も 環境変数 MAKEOBJDIR に名前を設定しておく必要があります。
$ export MAKEOBJDIR=mytags $ mkdir mytags $ gtags -O $ ls mytags GPATH GRTAGS GTAGS
3. obj ディレクトリを見えなくする
obj ディレクトリを見えなくするには、'.'(ドット) で始まるディレクトリ名を使います。 '.'(ドット) で始まるファイルは UNIX では通常は表示されません。
これで目障りな三つのタグファイルが視界から消えて、使い勝手はもとのままです。
$ export MAKEOBJDIR=.gtags $ mkdir .gtags $ gtags -O
grep 拡張機能(2014年2月8日)
grep の拡張版といえば、ack, ag などが有名ですが、 global の -g コマンドもgrep 拡張の一つです。
基本機能は次のとおりです。
- プロジェクト内のディレクトリを再帰的にたどって検索する
- バイナリファイルを検索対象としない
- スキップするファイル・ディレクトリを指定できる
1. プロジェクトを認識する
global はプロジェクトを認識するので、プロジェクト内のどこにいてもプロジェクト全体を検索対象にできます。
次の例では、linux の 'drivers/media' ディレクトリの中で、 カレントディレクトリ以下の検索と、プロジェクト全体の検索を切り替えています。 -l (--local) オプションをつけるとカレントディレクトリ以下の検索、つけなければ プロジェクト全体の検索です。
$ cd drivers/media $ global -g 'please email' -l # カレントディレクトリ以下を検索 pci/bt8xx/dst.c usb/em28xx/em28xx-cards.c $ global -g 'please email' # プロジェクト全体を検索 ../dio/dio.c pci/bt8xx/dst.c usb/em28xx/em28xx-cards.c ../../fs/ntfs/mft.c ../../include/scsi/osd_protocol.h $ _
プロジェクト全体を検索する際に、いちいちプロジェクトルートディレクトリに移動する必要がない 点にご注目ください。逆に検索対象のディレクトリに移動するのが面倒な場合は、 ディレクトリを移動する代わりに-S (--scope) オプションでディレクトリを指定します。
2. ソースファイルを認識する
global はソースファイルとそれ以外のテキストファイルを区別するので、 オプション指定によって検索対象を切り替えられます。
次の例は、-O (--only-other) オプションを使って、 前項の検索をソースファイル以外のテキストファイルを対象に行っています。
global はデフォルトでソースファイルのみを検索対象とします。 両方とも検索するときは、-o (--other) オプションを指定します。
$ global -g 'please email' -O # ソースファイル以外のテキストファイルを検索 Documentation/DocBook/uio-howto.tmpl Documentation/arm/IXP4xx Documentation/rt-mutex-design.txt Documentation/scsi/osd.txt $ _
3. 検索対象をさらに絞り込む
global -P コマンドと組み合わせると、検索文字列だけではなく、検索対象のファイルのパス名にも 正規表現が適用できます。
ソースファイルのうち、インクルードファイルだけを検索するには次のようにします。
$ global -P '\.h$' | global -L- -gx 'please email'
"global -P '\.h$'" で拡張子'.h'を持つファイルを抽出しています。 GLOBAL はパスもタグ化しているので抽出は高速です。 受け側の -L は検索対象をファイルリストの形で受け取るためのオプションです。 検索対象がしぼられるので、全体の検索時間も短縮されます。
なお上のコマンドライン前半の global -P 〜 は、UNIX の find コマンドに置き換え可能です。 後半の global -L 〜 は、UNIX の xargs + grep コマンドに置き換え可能です。 find の -print0 に相当する global のオプションは --print0 です。