xargs と etags でちょっちはまったのでメモ。

どもです。
相変わらず,腰が痛すぎで何をやるにもやる気がでねぇ。
というか長時間椅子に座ってられないから,色々できねぇ。
結果,ベッドでうつぶせになって lisp の式を手書きで展開したりして,
勉強するも,すぐに手が疲れるし,この関数ってどういう挙動するんだろうと
思っても試せないし。非常にまいる。本を読んだりしているけど,
眠くなって寝る。偏頭痛持ちのワタシにとっては,こういう睡眠は危険なので,
できたら避けたい。うーん,詰みです。


そうは言っても眠気には勝てないので,寝た。起きたらだいぶましになったので,
こうしてパチパチとしているわけです。
それから,auto-complete-etags のバグっぽいのを見つけたので,
それを修正。勉強もいいけど,何か作るのは楽しい。テンションが違う。
ほいで,ちょいとタグファイルの作成でハマッタのでメモ。

Qt のヘッダファイルからタグファイルを作成しようとしたけど失敗したり。

最初は,以下を実行した。
※適当に改行入れてます。

% find /cygdrive/e/Qt/QtSDK/2011.05/Desktop/Qt/4.7.3/mingw/include/ -type f -name '*.h' -print0 |\
xargs -0 etags --language-force="C++" --c++-kinds=+px --fields=+fkiasS --extra=+q -a -f ./qt.TAGS


ほいで,色々やってたんだけど,思ったモノが補完されない。はて。何故?
ほいで,qt.TAGS の中身を見たら,その対象が載ってない。あれれ?


うーん。ということで色々試してみるも,変わらず。
man xargs とか,Wikipedia とか,man etags とかみたけど解らず。
けど,作成されたタグファイルに,本来載っているであろうファイルパスが書かれてないので,
もしやそのファイルを見てないのでは? と予想。
でもって,そのファイル自体を指定して etags してみるとちゃんと作成される。
ほう。


エスパーするに,入力行がたくさんすぎで途中で切り捨て御免されてるのでは?
確認のために,先のコマンドを実行して,終了ステータスを見たけど,0だった。
えー。
ものはためしと,以下を実行。
やってることはというと,対象のヘッダファイルが1589ファイルあったので,
まず最初の800ファイルからタグファイルを作成して,
つぎに,残りのファイルからタグを作成して,先のタグファイルに追記。
(※ 2011/05/13 sed に渡す範囲を間違えていたので修正)

% find /cygdrive/e/Qt/QtSDK/2011.05/Desktop/Qt/4.7.3/mingw/include/ -type f -name '*.h' | wc -l
1589

% find /cygdrive/e/Qt/QtSDK/2011.05/Desktop/Qt/4.7.3/mingw/include/ -type f -name '*.h' | \
sed -n '1,800p' | xargs etags --language-force="C++" --c++-kinds=+px --fields=+fkiasS --extra=+q -f \
 ./qt.new.TAGS

% find /cygdrive/e/Qt/QtSDK/2011.05/Desktop/Qt/4.7.3/mingw/include/ -type f -name '*.h' | \
sed -n '801,$p' | xargs etags --language-force="C++" --c++-kinds=+px --fields=+fkiasS --extra=+q -a \
-f ./qt.new.TAGS


結果,最初のやり方では,300kに満たなかったタグファイルが,2回にわけてやってみたら,
6.7M になった。そして,無事に補完してくれるようになった!!
最初のタグテーブル作成するのはちょっち時間がかかったけど。

おまけ

そもそも,etags のタグファイルのフォーマットは決めうちだから,
「--fields」 オプションは意味ないはず。
「--c++-kinds=+px」,「--extra=+q」あたり,もしくはどちらか一方は意味があった気がするが,
記憶が定かではない。たしかオーバーロードされた関数とかを見てくれたりしたような。
ま,--fields オプションを指定しても害はないだろうからいいちゃいいんだけど。


結局 QtCreator を使うことになるからとか(ry