anything-gtags復活

id:shive:20090806:1249528810
以前NTEmacs23に移行したらanything-gtagsのgtags-select-modeの横取りが動かなくなった件を書きましたが、何とか対応できました。

--- anything-gtags.el.orig
+++ anything-gtags.el
@@ -184,8 +184,10 @@
   (declare (special save buffer))
   (let* ((anything-candidate-number-limit 9999)
          (pwd (with-current-buffer buffer (expand-file-name default-directory)))
-         (basename (substring (with-current-buffer save buffer-file-name)
-                              (length pwd)))
+         (basename (if (buffer-file-name save)
+                       (substring (with-current-buffer save buffer-file-name)
+                                  (length pwd))
+                     (buffer-name save)))
          (lineno (with-current-buffer save
                    (save-restriction
                      (widen)
@@ -199,13 +201,15 @@
                             (aggs-set-anything-current-position)
                             (anything-candidate-buffer buffer)))
                        ,@aggs-base-source)))))
+    (if (get-buffer aggs-buffer)
+        (kill-buffer aggs-buffer))
     (with-current-buffer (get-buffer-create aggs-buffer)
       (set (make-local-variable 'buffer) buffer)
-      (set (make-local-variable 'pwd) pwd))
+      (set (make-local-variable 'pwd) pwd)
     (anything
      sources
      nil nil nil (format "\\(\\(%d\\) +%s\\)" lineno (regexp-quote basename))
-     aggs-buffer)))
+       aggs-buffer))))
 
 (defun aggs-candidate-buffer-by-filename (filename)
   (get-buffer-create (concat "*anything gtags*" filename)))

これで何で動くのかは正直ちゃんと理解できていないのですが、要点は2つ。

  • 最後のanythingを呼び出すときにカレントバッファがaggs-bufferになっていないといけない。
  • aggs-bufferに中身が残ってるとうまく動かない。

これの対処を入れたら動くようになりました。ちなみにbasenameに細工しているのは、diredや*scratch*などのファイルパスが入っていないバッファに居るときにエラーになってしまっていたので、適当にバッファ名を入れて動かすようにしてみました。これは地味に便利。