On Sat, Mar 7, 2009 at 10:52 AM, Shigio YAMAGUCHI <[email protected]> wrote:
> Hi,
>> The global tag stack is shared between different frames in emacs.
>> That means if i
>> do gtags-find-tag on two frames, gtags-pop-stack would get completely
>> confused
>> regarding where to go back. Is there a way to make gtags-pop-stack
>> local to each frame ?
>
> You are right. Gtags mode has only one tag stack.
> I added the facility of 'Tag stack per window' to the TODO list.
> [http://www.gnu.org/software/global/plans.html]
I am using it with this change below. This make some of the global
variables per frame
-aneesh
--- /usr/share/emacs/site-lisp/global/gtags.el 2009-01-05 15:17:28.000000000 +0530
+++ emacs/gtags.el 2009-03-07 01:51:31.000000000 +0530
@@ -93,12 +93,6 @@
:type 'boolean)
;; Variables
-(defvar gtags-current-buffer nil
- "Current buffer.")
-(defvar gtags-buffer-stack nil
- "Stack for tag browsing.")
-(defvar gtags-point-stack nil
- "Stack for tag browsing.")
(defvar gtags-history-list nil
"Gtags history list.")
(defconst gtags-symbol-regexp "[A-Za-z_][A-Za-z_0-9]*"
@@ -191,22 +185,34 @@
;; push current context to stack
(defun gtags-push-context ()
- (setq gtags-buffer-stack (cons (current-buffer) gtags-buffer-stack))
- (setq gtags-point-stack (cons (point) gtags-point-stack)))
+ (let (cur-frame (selected-frame))
+ (setq gtags-buffer-stack (cons (current-buffer) (frame-parameter cur-frame 'buffer-stack)))
+ (modify-frame-parameters cur-frame `((buffer-stack . ,gtags-buffer-stack)))
+ (setq gtags-point-stack (cons (point) (frame-parameter cur-frame 'point-stack)))
+ (modify-frame-parameters cur-frame `((point-stack . ,gtags-point-stack)))))
;; pop context from stack
(defun gtags-pop-context ()
- (if (not gtags-buffer-stack) nil
- (let (buffer point)
- (setq buffer (car gtags-buffer-stack))
- (setq gtags-buffer-stack (cdr gtags-buffer-stack))
- (setq point (car gtags-point-stack))
- (setq gtags-point-stack (cdr gtags-point-stack))
+ (if (not (frame-parameter (selected-frame) 'buffer-stack)) nil
+ (let (buffer point (cur-frame (selected-frame)))
+ (setq buffer (car (frame-parameter cur-frame 'buffer-stack)))
+ (setq gtags-buffer-stack (cdr (frame-parameter cur-frame 'buffer-stack)))
+ (modify-frame-parameters cur-frame `((buffer-stack . ,gtags-buffer-stack)))
+ (setq point (car (frame-parameter cur-frame 'point-stack)))
+ (setq gtags-point-stack (cdr (frame-parameter cur-frame 'point-stack)))
+ (modify-frame-parameters cur-frame `((point-stack . ,gtags-point-stack)))
(list buffer point))))
+(defun gtags-get-current-buffer ()
+ (frame-parameter (selected-frame) 'g-current-buffer))
+
+(defun gtags-set-current-buffer (buffer)
+ (modify-frame-parameters (selected-frame) `((g-current-buffer . ,buffer))))
+
+
;; if the buffer exist in the stack
(defun gtags-exist-in-stack (buffer)
- (memq buffer gtags-buffer-stack))
+ (memq buffer (frame-parameter (selected-frame) 'buffer-stack)))
;; get current line number
(defun gtags-current-lineno ()
@@ -432,9 +438,9 @@
"Move to previous point on the stack."
(interactive)
(let (delete context buffer)
- (if (and (not (equal gtags-current-buffer nil))
- (not (equal gtags-current-buffer (current-buffer))))
- (switch-to-buffer gtags-current-buffer)
+ (if (and (not (equal (gtags-get-current-buffer) nil))
+ (not (equal (gtags-get-current-buffer) (current-buffer))))
+ (switch-to-buffer (gtags-get-current-buffer))
; By default, the buffer of the referred file is left.
; If gtags-pop-delete is set to t, the file is deleted.
; Gtags select mode buffer is always deleted.
@@ -447,7 +453,7 @@
(if delete
(kill-buffer (current-buffer)))
(switch-to-buffer (nth 0 context))
- (setq gtags-current-buffer (current-buffer))
+ (gtags-set-current-buffer (current-buffer))
(goto-char (nth 1 context))))))
;;
@@ -566,7 +572,7 @@
(if (null other-win) (find-file file)
(find-file-other-window file)))
(if delete (kill-buffer prev-buffer)))
- (setq gtags-current-buffer (current-buffer))
+ (gtags-set-current-buffer (current-buffer))
(goto-line line)
(gtags-mode 1))))
@@ -640,7 +646,7 @@
truncate-lines t
major-mode 'gtags-select-mode
mode-name "Gtags-Select")
- (setq gtags-current-buffer (current-buffer))
+ (gtags-set-current-buffer (current-buffer))
(goto-char (point-min))
(message "[GTAGS SELECT MODE] %d lines" (count-lines (point-min) (point-max)))
(run-hooks 'gtags-select-mode-hook))
_______________________________________________
Bug-global mailing list
[email protected]
http://lists.gnu.org/mailman/listinfo/bug-global