Mozilla Mile Ston 9 (通称M9)へ向けて、コードフリーズがかかった模様。
(99/08/10の深夜にフリーズがかかったらしい。)
でもでも、FreeBSDでbuildしてmozilla-apprunner.shを実行すると、null pointer access で速攻落ちるんだけど〜。
tinderbox: SeaMonkeyページで、buildと走行チェックの状況を見ていると、Mac/Win/Solaris/Linuxではうまくいっているみたい。
なんでやねん。
ちくとデバッガで追い掛けてみたが、確かにnull pointerにアクセスしとるわ………てなくらいしかわからんかったよ。
ちなみに、mozilla-viewer.shは一応動作する模様。
(だけど、日本語ページはあいかわらず文字化けする………)。
別にMozilla専用ちうわけでもないけど。 Mozillaのソースをつらつら見ていると、「このマクロはどこで定義されてるねん!」という状況にしばしば陥る。 そこで、関数/マクロ定義の場所を一発で表示してくれる global / gtags コマンドを使う。 gtagsはソースディレクトリのトップで一度だけ使うと、勝手に下のディレクトリまで探してくれて、定義場所一覧ファイルを作成してくれる。 でもって、global 「探したいマクロ名 or 関数名」と入力すると、定義場所が表示されるという便利なアイテムなのだ。
定義場所まで一発ジャンプを行うためのコマンドとしては、ctagsとかetagsが有名なんだけど、globalは「同名の定義が複数あってもオッケーよん」とか、「定義されている場所へのジャンプだけじゃなくて、使用されている場所一覧から選択してジャンプもできるよん」という特徴があるのだ。
muleからetagsを使いまくっている私としては、etagsのかわりにglobalを使えるようになるemacs lispがどこかに落ちていると便利なんだけど………。 多分どっかにはあるよな〜〜。
GLOBAL - source code tag system(global本家)をチェックすると、emacsから使えるちう記述があるぞ。 FreeBSD 2.2.2R以降なら、globalは標準コマンドとして入っているらしい。 とゆーことは、gtags.elはどこかいな?
george@magi ~ $ locate gtags /usr/bin/gtags /usr/share/man/ja/man1/gtags.1.gz /usr/share/man/man1/gtags.1.gz /usr/src/contrib/global/gtags /usr/src/contrib/global/gtags/Makefile /usr/src/contrib/global/gtags/gtags.1 /usr/src/contrib/global/gtags/gtags.c /usr/src/contrib/global/gtags.el /usr/src/contrib/global/lib/gtagsop.c /usr/src/contrib/global/lib/gtagsop.h /usr/src/usr.bin/global/gtags /usr/src/usr.bin/global/gtags/Makefile
みっけた。 そんなわけで、早速 cp -p /usr/src/contrib/global/gtags.el ~/emacslisp。 (ウチの環境では、~/emacslispはload-pathの先頭に置いてあるので。)
しかしまぁ、globalって随分昔からあるんぢゃねーか………。
使い始めたのは今日だというのに………。
とりあえず、gtags-modeの使い方メモ。
Ctrl-] | カーソル位置の単語でタグ検索。カーソル位置の単語が、定義部分だった場合は、リファレンス検索を行う。通常の単語なら、定義位置までジャンプ。これは便利。 |
Ctrl-t | タグ検索を実行する前の位置まで戻る。WWWブラウザのBackボタンと同じ動作。こちらも便利。 |
ESC-t | タグ検索。タグの入力モードになる。 |
ESC-r | タグのリファレンス検索。タグの入力モードになる。 |
ESC-s | シンボルの検索。検索文字列入力モードになる。 |
ESC-g | 文字列の検索。検索文字列入力モードになる。 |
こりゃ、やたら便利だ。
新しいCのソースファイルをオープンするごとに、毎回手動でgtags-modeにするのも面倒なので、c-mode-common-hookあたりに仕込んでおこう。
; ~/.emacs に追加 ; ; global (gtags.el) を使う ; (autoload 'gtags-mode "gtags" "" t)
; ~/.emacs に追加 (for mule-19.34.1 or 19.28.1) ; ; cc-mode.el with Emacs 19.34.1 の設定 ; (add-hook 'c-mode-common-hook '(lambda () (progn ; 基本スタイルはBSD (c-set-style "bsd") ; (中略) ; gtags-mode (global/gtabsを使ったtag jump) ; を利用可能にする。 (gtags-mode))) t)
でも、この設定をやると、Cのソースファイルを開く度に「Do you use function name completion?(y or n) って聞かれてうざい………。 最新のglobal-3.44.tar.gzをゲットして、配布物に含まれているgtags.elとFreeBSD 3.2Rのcontrib以下に含まれているgtags.elと比較。
george@magi ~/global-3.44 $ diff -uw /usr/src/contrib/global/gtags.el gtags.el --- /usr/src/contrib/global/gtags.el Mon Jan 18 16:30:26 1999 +++ gtags.el Sat Jul 24 14:26:34 1999 @@ -30,12 +30,12 @@ ;; OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF ;; SUCH DAMAGE. ;; -;; gtags.el 8-Jan-99 +;; gtags.el 10-Jan-99 ;; ;; This file is part of GLOBAL. -;; Author: Shigio Yamaguchi <shigio@wafu.netgate.net> -;; Version: 1.5 +;; Author: Shigio Yamaguchi <shigio@tamacom.com> +;; Version: 1.51 ;; Keywords: tools ;;; Code @@ -58,6 +58,7 @@ (define-key gtags-mode-map "\er" 'gtags-find-rtag) (define-key gtags-mode-map "\es" 'gtags-find-symbol) (define-key gtags-mode-map "\eg" 'gtags-find-pattern) +(define-key gtags-mode-map "\ec" 'gtags-make-complete-list) (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here) (define-key gtags-mode-map "\eh" 'gtags-display-browser) (define-key gtags-mode-map "\C-t" 'gtags-pop-stack) @@ -331,10 +332,11 @@ (use-local-map gtags-mode-map)))) ;; make complete list -(defun make-gtags-complete-list () -;; "Make tag name list for completion." -;; (interactive) +(defun gtags-make-complete-list () + "Make tag name list for completion." + (interactive) (save-excursion + (message "Making completion list...") (setq gtags-complete-list (make-vector 63 0)) (set-buffer (generate-new-buffer "*Completions*")) (call-process "global" nil t nil "-c") @@ -342,14 +344,13 @@ (while (looking-at symbol-regexp) (intern (util-match-string 0) gtags-complete-list) (forward-line)) + (message "Making completion list... done") (kill-buffer (current-buffer)))) ;;;###autoload (defun gtags-mode () "Minor mode for browsing C source using GLOBAL." (interactive) - (if (y-or-n-p "Do you use function name completion?") - (make-gtags-complete-list)) (use-local-map gtags-mode-map) (run-hooks 'gtags-mode-hook))
最新版のglobal-3.44についてくるgtags.elの場合、補完リストを作成するキーバインド ESC-c が独立して、gtags-modeをやった場合に毎回質問してくることはなくなったのね。
これ、即採用。
cp -p gtags.el ~/emacslisp だわ。
mozillaのソースをサカナに、ちょっくらglobalをつかってみる。
mozillaに使うなら、やぱしC++に対応してないと辛いかもしんない。
あと、#define を使って定数定義している場所にジャンプしてほしいのに、なぜか使用している場所一覧モードになること多数(汗)。
ESC-g の文字列検索モードぢゃないと、うまく #define の所にジャンプできないのがちと不便かも。
(なんとなく、#define による定数定義はglobalのタグとして登録されていないような気がする……。関数定義なんかはバッチリ登録されているんだけど。)
etagsと併用するしかないかな?
でも、上のc-mode-common-hookを入れて常にgtags-modeを使うように設定していると、etagsが無効になっているような気がしないでもない。
うーむむむ。
以上、DOS/V ISSUEより。
そんなわけで、寝る/積読になっていた月刊紙を読みあさっていたら夏休みが終わってしまった。
Daiki's pc-info(99/08/16の所)には、FreeBSDのmake worldの時間が載っていた。 Athlon 500MHz vs Pentium III 616MHzの勝負だと、Athlon 500MHzの方が速いらしい。 個人的には、カーネルコンフィギュレーションベンチ結果の比較じゃないと、結果がよくわからないあたりがちと悲しい。 (make worldしたことないのよ。)
ウテナを朝まで見ていたので、結構眠い。
globalの使い心地追加。
ソースファイルを編集して行数が変動すると、gtagsで作成したインデックスと実際の関数定義行がずれてしまい、ジャンプしたときの表示位置がずれるので、ちと不便だ。
etags/etags.elの場合は、etags.el内部でタグジャンプ先の文字列内容で検索しているので、編集によって多少行数が前後しても平気だったんだけど。
このあたりはgtags.elを改造しないといけないかな。
最近購入したMITSUMI ATAPI CD-ROMドライブの調子が悪い(メディアを入れてもアクセスランプが点灯しない………)とか。
新品の540MOメディアをMOドライブに挿入したら、アクセスランプが点滅を繰り返してメディア容量を取得できなかったりとか。
別の540MOメディアに取り替えたら、そんな症状はでなかったけど。
CD-ROMドライブが動かないのはしゃれになっていないので、また購入かな〜。
F.S.SからL-GAIMとF.S.Sの素敵な関係へ。
うーむ。
対応取れ過ぎ。
freebsd-users-jp [44989] によると、Athlon 500MHzでカーネルコンフィギュレーションをすると、101秒らしい。 ちなみに、ウチのCeleron 400MHzだと2分45秒(=165秒)。 結構速いぢゃん>Athlon。
大雨が降った日。
傘を持たずにメシを食いに行って、帰る頃には超大雨状態。
しばしサ店に入って雨が弱まるのを待つが、一向に弱まる気配無し。
おいらは、このままさらにずるずるとお茶して雨が弱まるのを待と〜よ〜とか主張したんだけど、そんなに遊んでいるわけにもいかんとゆーことで、ダッシュ。
めちゃめちゃ濡れた〜〜〜。
ソースをちょっとだけ編集した場合は、gtags -i (インクリメンタルなタグ更新)が良い感じかも。 gtagsとオプションなしで起動すると、結構時間がかかるから。
msdosfsでマウントしたMOドライブを、sambaで他のWindowsマシンから見えるようにして、WAVEファイルを転送したり、WAVE→MP3変換したり。
ひょっとすると飛ぶかもしれないとか思いつつ試したんだけど、結構平気な感じで動いている。
とりあえず、globa-3.44に付属のgtags.elをベースに、ESC-t または ESC-r に定義されているコマンドをちくと編集。 カーソル付近にある単語をデフォルトのタグとして入力するように変更。 ついでに、ヒストリもつけてみた。 さらに、etags-style-find-tagはetags.elを利用するように変更。 #define 定義元へのジャンプは etags.el の方が便利だし。
diff -uw -r1.1 gtags.el --- gtags.el 1999/08/26 00:52:13 1.1 +++ gtags.el 1999/08/26 01:33:09 @@ -46,6 +46,8 @@ "Stack for tag browsing.") (defvar gtags-complete-list nil "Gtags complete list.") +(defvar gtags-history-list nil + "Gtags history list.") (defconst symbol-regexp "[A-Za-z_][A-Za-z_0-9]*" "Regexp matching tag name.") (defconst definition-regexp "#[ \t]*define[ \t]+\\|ENTRY(\\|ALTENTRY(" @@ -62,7 +64,7 @@ (define-key gtags-mode-map "\C-]" 'gtags-find-tag-from-here) (define-key gtags-mode-map "\eh" 'gtags-display-browser) (define-key gtags-mode-map "\C-t" 'gtags-pop-stack) -(define-key gtags-mode-map "\e." 'etags-style-find-tag) +;(define-key gtags-mode-map "\e." 'etags-style-find-tag) (define-key gtags-mode-map [mouse-2] 'gtags-find-tag-by-event) (define-key gtags-mode-map [mouse-3] 'gtags-pop-stack) @@ -155,8 +157,15 @@ (defun gtags-find-tag () "Input tag name and move to the definition." (interactive) - (let (tagname) - (setq tagname (completing-read ":tag " gtags-complete-list)) + (let (tagname prompt input) + (setq tagname (gtags-current-token)) + (if tagname + (setq prompt (concat ":tag (default " tagname ") ")) + (setq prompt ":tag ")) + (setq input (completing-read prompt gtags-complete-list + nil nil nil gtags-history-list)) + (if (not (equal "" input)) + (setq tagname input)) (push-context) (gtags-goto-tag tagname ""))) @@ -202,8 +211,15 @@ (defun gtags-find-rtag () "Input tag name and move to the referenced point." (interactive) - (let (tagname) - (setq tagname (completing-read ":rtag " gtags-complete-list)) + (let (tagname prompt input) + (setq tagname (gtags-current-token)) + (if tagname + (setq prompt (concat ":rtag (default " tagname ") ")) + (setq prompt ":rtag ")) + (setq input (completing-read prompt gtags-complete-list + nil nil nil gtags-history-list)) + (if (not (equal "" input)) + (setq tagname input)) (push-context) (gtags-goto-tag tagname "r")))
他のコマンド ( ESC-s とか ESC-g とか ) は、カーソル周辺の単語をデフォルトのタグとして取り扱うのに、なんで ESC-t / ESC-r はやっていないんだろう?
などのページをぐるぐる。
熱い漢(おとこ)達の饗宴って感じ〜〜。
見ているだけで楽しいや。
もっとも、壊れるのが恐いし、器用な半田付けもできないから、自分のマシンではクロックアップはやんないと思うけど。