]> code.delx.au - gnu-emacs-elpa/commitdiff
* ggtags.el: improve handling of GTAGSLIBPATH in ggtags-tag-names
authorLeo Liu <sdl.web@gmail.com>
Wed, 6 Feb 2013 18:16:58 +0000 (02:16 +0800)
committerLeo Liu <sdl.web@gmail.com>
Wed, 6 Feb 2013 18:16:58 +0000 (02:16 +0800)
packages/ggtags/ggtags.el

index 08f36eb39517201b3cbd34f8a16899817b91ac03..d5a403728db0d7ce883522784d1ef9271cdd34cb 100644 (file)
@@ -3,7 +3,7 @@
 ;; Copyright (C) 2013  Free Software Foundation, Inc.
 
 ;; Author: Leo Liu <sdl.web@gmail.com>
-;; Version: 0.5
+;; Version: 0.6
 ;; Keywords: tools, convenience
 ;; Created: 2013-01-29
 ;; URL: https://github.com/leoliu/ggtags
@@ -69,6 +69,10 @@ If nil, use Emacs default."
 
 (defvar ggtags-current-tag-name nil)
 
+;; Used by ggtags-global-mode
+(defvar ggtags-global-error "match"
+  "Stem of message to print when no matches are found.")
+
 (defmacro ggtags-ignore-file-error (&rest body)
   (declare (indent 0))
   `(condition-case nil
@@ -92,6 +96,9 @@ Return -1 if it does not exist."
         (float-time (nth 5 (file-attributes file)))
       -1)))
 
+(defun ggtags-get-libpath ()
+  (split-string (or (getenv "GTAGSLIBPATH") "") ":" t))
+
 (defun ggtags-cache-get (key)
   (assoc key ggtags-cache))
 
@@ -142,6 +149,19 @@ Return -1 if it does not exist."
                   (error "%s" (comment-string-strip (buffer-string) t t))))))
         (error "Aborted"))))
 
+(defun ggtags-tag-names-1 (root &optional prefix)
+  (when root
+    (if (ggtags-cache-stale-p root)
+        (let* ((default-directory (file-name-as-directory root))
+               (tags (with-demoted-errors
+                       (split-string
+                        (with-output-to-string
+                          (call-process "global" nil (list standard-output nil)
+                                        nil "-c" (or prefix "")))))))
+          (and tags (ggtags-cache-set root tags))
+          tags)
+      (cadr (ggtags-cache-get root)))))
+
 ;;;###autoload
 (defun ggtags-tag-names (&optional prefix)
   "Get a list of tag names starting with PREFIX."
@@ -150,16 +170,9 @@ Return -1 if it does not exist."
       (if (zerop (call-process "global" nil nil nil "-u"))
           (ggtags-cache-mark-dirty root nil)
         (message "ggtags: error running 'global -u'")))
-    (if (ggtags-cache-stale-p root)
-        (let ((tags (ggtags-ignore-file-error
-                      (split-string
-                       (with-output-to-string
-                         (call-process "global" nil (list standard-output nil)
-                                       nil "-cT" (or prefix "")))))))
-          (when tags
-            (ggtags-cache-set root tags))
-          tags)
-      (cadr (ggtags-cache-get root)))))
+    (apply 'append (mapcar (lambda (r)
+                             (ggtags-tag-names-1 r prefix))
+                           (cons root (ggtags-get-libpath))))))
 
 (defun ggtags-read-tag (quick)
   (ggtags-ensure-root-directory)
@@ -356,8 +369,7 @@ When called with prefix, ask the name and kind of tag."
   "Kill all buffers visiting files in the root directory."
   (interactive "p")
   (ggtags-check-root-directory)
-  (let ((gtagslibpath (split-string (or (getenv "GTAGSLIBPATH") "") ":" t))
-        (root (ggtags-root-directory))
+  (let ((root (ggtags-root-directory))
         (count 0)
         (some (lambda (pred list)
                 (loop for x in list when (funcall pred x) return it))))
@@ -367,7 +379,7 @@ When called with prefix, ask the name and kind of tag."
                        (buffer-file-name buf))))
         (when (and file (funcall some (apply-partially #'file-in-directory-p
                                                        (file-truename file))
-                                 (cons root gtagslibpath)))
+                                 (cons root (ggtags-get-libpath))))
           (and (kill-buffer buf)
                (incf count)))))
     (and interactive
@@ -442,10 +454,6 @@ When called with prefix, ask the name and kind of tag."
     (forward-line (1- line))
     (ggtags-move-to-tag name)))
 
-;; NOTE: `ggtags-build-imenu-index' is signficantly faster and more
-;; precise than the similar feature provided by cc mode. Tested with
-;; ClassFileWriter.java of the rhino project.
-
 ;;;###autoload
 (defun ggtags-build-imenu-index ()
   "A function suitable for `imenu-create-index-function'."