[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] 01/38: New command ggtags-show-definition
From: |
Leo Liu |
Subject: |
[elpa] 01/38: New command ggtags-show-definition |
Date: |
Mon, 24 Mar 2014 09:31:31 +0000 |
leoliu pushed a commit to branch master
in repository elpa.
commit 9ae7b47544887344bf2a6ca8b67ca10c31e5e348
Author: Leo Liu <address@hidden>
Date: Mon Mar 3 14:27:41 2014 +0800
New command ggtags-show-definition
New function ggtags-global-output to handle global output.
Rename ggtags-global-next-error-hook to ggtags-find-tag-hook.
---
ggtags.el | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
1 files changed, 60 insertions(+), 4 deletions(-)
diff --git a/ggtags.el b/ggtags.el
index 32a069e..542affe 100644
--- a/ggtags.el
+++ b/ggtags.el
@@ -3,7 +3,7 @@
;; Copyright (C) 2013-2014 Free Software Foundation, Inc.
;; Author: Leo Liu <address@hidden>
-;; Version: 0.7.12
+;; Version: 0.8.0
;; Keywords: tools, convenience
;; Created: 2013-01-29
;; URL: https://github.com/leoliu/ggtags
@@ -177,12 +177,18 @@ If an integer abbreviate only names longer than that
number."
:type 'number
:group 'ggtags)
-(defcustom ggtags-global-next-error-hook nil
+(defcustom ggtags-find-tag-hook nil
"Hook run immediately after finding a tag."
- :options '(reposition-window recenter)
+ :options '(recenter reposition-window)
:type 'hook
:group 'ggtags)
+(defcustom ggtags-show-definition-function #'ggtags-show-definition-default
+ "Function called by `ggtags-show-definition' to show definition.
+It is passed a list of definnition candidates."
+ :type 'function
+ :group 'ggtags)
+
(defcustom ggtags-mode-sticky t
"If non-nil enable Ggtags Mode in files visited."
:safe 'booleanp
@@ -1217,7 +1223,7 @@ Global and Emacs."
(move-overlay ggtags-global-line-overlay
(line-beginning-position) (line-end-position)
(current-buffer))))
- (run-hooks 'ggtags-global-next-error-hook))
+ (run-hooks 'ggtags-find-tag-hook))
(define-minor-mode ggtags-navigation-mode nil
:lighter
@@ -1281,6 +1287,53 @@ Global and Emacs."
(process-file "global" nil 0 nil "--single-update"
(file-relative-name buffer-file-name))))))
+(defun ggtags-global-output (cmds buffer callback &optional cutoff)
+ "Asynchrously pipe the output of CMDS to BUFFER.
+Invoke CALLBACK in BUFFER with process exit status when finished."
+ (or buffer (error "Output buffer required"))
+ (let* ((default-directory (or (ggtags-current-project-root)
default-directory))
+ (program (car cmds))
+ (args (cdr cmds))
+ (cutoff (+ cutoff (if (get-buffer buffer)
+ (with-current-buffer buffer
+ (line-number-at-pos (point-max)))
+ 0)))
+ (proc (apply #'start-file-process program buffer program args))
+ (filter (lambda (proc string)
+ (and (buffer-live-p (process-buffer proc))
+ (with-current-buffer (process-buffer proc)
+ (goto-char (process-mark proc))
+ (insert string)
+ (when (and (> (line-number-at-pos (point-max))
cutoff)
+ (process-live-p proc))
+ (interrupt-process (current-buffer)))))))
+ (sentinel (lambda (proc _msg)
+ (when (memq (process-status proc) '(exit signal))
+ (with-current-buffer (process-buffer proc)
+ (set-process-buffer proc nil)
+ (funcall callback (process-status proc)))))))
+ (set-process-query-on-exit-flag proc nil)
+ (and cutoff (set-process-filter proc filter))
+ (set-process-sentinel proc sentinel)
+ proc))
+
+(defun ggtags-show-definition-default (defs)
+ (let (message-log-max)
+ (message "%s" (or (car defs) "[definition not found]"))))
+
+(defun ggtags-show-definition (name)
+ (interactive (list (ggtags-read-tag)))
+ (let* ((re (cadr (assq 'grep ggtags-global-error-regexp-alist-alist)))
+ (buffer (get-buffer-create " *ggtags-output*"))
+ (fn ggtags-show-definition-function)
+ (show (lambda (_status)
+ (goto-char (point-min))
+ (funcall fn (loop while (re-search-forward re nil t)
+ collect (buffer-substring (1+ (match-end 2))
+
(line-end-position))))
+ (kill-buffer buffer))))
+ (ggtags-global-output (list "global" "--result=grep" name) buffer show
30)))
+
(defvar ggtags-mode-prefix-map
(let ((m (make-sparse-keymap)))
(define-key m "\M-'" 'previous-error)
@@ -1296,6 +1349,7 @@ Global and Emacs."
(define-key m "\M-h" 'ggtags-view-tag-history)
(define-key m "\M-j" 'ggtags-visit-project-root)
(define-key m (kbd "M-%") 'ggtags-query-replace)
+ (define-key m "\M-?" 'ggtags-show-definition)
m))
(defvar ggtags-mode-map
@@ -1360,6 +1414,8 @@ Global and Emacs."
'(menu-item "Find other symbol" ggtags-find-other-symbol))
(define-key menu [find-tag-regexp]
'(menu-item "Find tag matching regexp" ggtags-find-tag-regexp))
+ (define-key menu [show-definition]
+ '(menu-item "Show definition" ggtags-show-definition))
(define-key menu [find-reference]
'(menu-item "Find reference" ggtags-find-reference))
(define-key menu [find-tag-continue]
- [elpa] branch master updated (0601efd -> f11199d), Leo Liu, 2014/03/24
- [elpa] 02/38: Give ggtags-show-definition-function full information, Leo Liu, 2014/03/24
- [elpa] 01/38: New command ggtags-show-definition,
Leo Liu <=
- [elpa] 08/38: Call ggtags-show-definition-function in the original buffer, Leo Liu, 2014/03/24
- [elpa] 03/38: Don't display buffer if ggtags-navigation-mode is exited, Leo Liu, 2014/03/24
- [elpa] 07/38: Fix some errors in ggtags-global-output, Leo Liu, 2014/03/24
- [elpa] 04/38: Combine ggtags-global-column and tag name search, Leo Liu, 2014/03/24
- [elpa] 06/38: Fix #34: New variable ggtags-global-always-update, Leo Liu, 2014/03/24
- [elpa] 09/38: Replace ignore-errors with condition-case-unless-debug, Leo Liu, 2014/03/24
- [elpa] 10/38: Automatically use GTAGSCONF file at project root, Leo Liu, 2014/03/24
- [elpa] 05/38: Improve completion support for all tag types, Leo Liu, 2014/03/24
- [elpa] 11/38: Make last change acutally work, Leo Liu, 2014/03/24
- [elpa] 12/38: Fix compatibility for locate-dominating-file, Leo Liu, 2014/03/24