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

Reply via email to