GNU grepには行番号を表示するオプション( -n, --line-number )があります。このオプションはソースコードから目的の箇所を探すためによく使われます。例えば、カレントディレクトリから文字列 with data set が含まれるファイルを検索し、見つかったファイル名とその文字列が存在する行番号および内容を出力するコマンドは下記のようになります。
$ find . -type f | xargs grep -n 'with data set'
./Framework/TestCase.php:882: $buffer .= sprintf(' with data set #%d', $this->dataName);
./Framework/TestCase.php:884: $buffer .= sprintf(' with data set "%s"', $this->dataName);
このファイル名をもとにファイルを開きます。プレビュー程度であれば lv や less などのコマンドで十分ですが、不具合の原因を追求するようなケースでは使いなれたエディタで開きたいこともよくあります。筆者の使いなれたエディタはEmacsなので、gnuclient を使ってファイルを開きます。
gnuclient -q ./Framework/TestCase.php
すると、ファイルの内容がEmacsに表示されますので、M-x goto-line を実行し指定行にジャンプします。ファイルを開いてから指定行にジャンプというのが何とも格好悪いです。行番号を指定して開くことができたらどんなに素晴らしいでしょう!なんとかならないか、gnuclient の使い方を調べてみると、
$ gnuclient --foo
Usage: gnuclient [-display display] [-q] [-v] [-l library]
[-batch] [-f function] [-eval form]
[-h host] [-p port] [-r remote-path] [[+line] file] ...
おお、+line というそれらしいオプションが見つかりました。早速使ってみます。( --fooはオプションを表示させるための苦肉の策です。オプションを表示させるための適切な引数があれば是非教えてください。 )
gnuclient -q +882 ./Framework/TestCase.php
すると、ファイルの内容が指定した行番号を中心にバッファに表示されました。
恥ずかしながら筆者がこのオプションを知ったのはごく最近です。まったく、今まで何をやっていたんでしょうか。
このままでは恥ずかしい気持ちが消え去らないので、ここはもう少し便利になるように突っ込んでみたいと思います。今のままでは何が不便かを理解していただくために、上記の行番号指定のコマンドを実行するときの筆者の具体的な手順を示します。
- gnuc を入力する
- タブ( Ctrl+I )でコマンド名を補完する
- △-q+882△を入力する(△は半角スペース)
- 検索結果の ./Framework/TestCase.php:882: 部分をダブルクリックする
- すると ./Framework/TestCase.php:882: 部分が反転するので Ctrl+C でコピーする
- 入力行に戻りペーストする
- Ctrl+B で.phpの次の : (コロン)にカーソルを移動する
- Alt+D を2回入力してカーソルより後ろの文字を削除する
- Ctrl+M を入力してコマンドを実行する
こうして書き出してみると結構多いことがわかりました。これは不便です。筆者は考えました。コピーした ./Framework/TestCase.php:882: を直接 gnuclient に渡せたら少しは楽になるんじゃないかと。
とはいうものの gnuclient はC言語で記述されていますので、これに手を入れるのは面倒です。次回も引き続きこの不便さの改善に取り組みます。
トラックバック(0)
- このブログ記事のトラックバックURL:
