home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #26 / NN_1992_26.iso / spool / gnu / emacs / sources / 790 < prev    next >
Encoding:
Text File  |  1992-11-11  |  5.0 KB  |  158 lines

  1. Newsgroups: gnu.emacs.sources
  2. Path: sparky!uunet!convex!darwin.sura.net!zaphod.mps.ohio-state.edu!usc!elroy.jpl.nasa.gov!ames!pacbell.com!iggy.GW.Vitalink.COM!cs.widener.edu!eff!world!barryn
  3. From: barryn@world.std.com (Barry N. Nelson)
  4. Subject: tag-backwards
  5. Message-ID: <BARRYN.92Nov12110856@world.std.com>
  6. Sender: barryn@world.std.com (barry n nelson)
  7. Organization: The World
  8. Distribution: gnu
  9. Date: Thu, 12 Nov 1992 16:08:56 GMT
  10. Lines: 146
  11.  
  12. tag-backwards() will let you "undo" find-tag().  In other words you
  13. can switch back to the buffers where the calling functions are and put
  14. the mouse at the places where you did find-tag().  This feature
  15. simulates a backtrace available in a debugger.
  16.  
  17. ;; ============================================
  18. ;; tagring.el - undo tag-find
  19. ;;
  20. ;; Auther: Jamie Tan, General Signal Corp./Drytek
  21. ;; <barryn@world.std.com>
  22. ;;
  23. ;; USAGE: 
  24. ;; After you have done 'find-tag', you can press M-' to switch back to the 
  25. ;; buffers where the calling functions are and put the cursor at the
  26. ;; places where you did find-tag(). You can continue pressing M-' to
  27. ;; trace back to the first level of your calling routines.
  28.  
  29. (require 'comint)
  30. (require 'tags)
  31.  
  32. (defvar tag-ring-size 30
  33.   "Size of tag ring.")
  34.  
  35. (defvar tag-ring-index 0
  36.   "index of tag ring.")
  37.  
  38. (defun tags-completion-alist ()
  39.   "Return an alist of tags in the current buffer, which is a tag table."
  40.   (let (alist next)
  41.     (message "Making tags completion alist...")
  42.     (save-excursion
  43.       (goto-char (point-min))
  44.     (while (search-forward "\177" nil t)
  45.       (if (save-excursion
  46.         (skip-chars-forward "^\001\n")
  47.         (setq next (1+ (point)))
  48.         (= (following-char) ?\001))
  49.           ;;; If there are ^A's, get tags after them.
  50.           (progn
  51.         (goto-char next)    ;; after the first ^A
  52.         (while (= (preceding-char) ?\001)
  53.           (setq alist
  54.             (cons (cons (buffer-substring
  55.                      (point)
  56.                      (progn (skip-chars-forward "^\001\n")
  57.                         (point)))
  58.                     nil)
  59.                   alist))
  60.           (forward-char 1)))
  61.         ;;; If no ^A's, get tags from before the ^?.
  62.         (skip-chars-backward "^-A-Za-z0-9_$\n")
  63.         (or (bolp)
  64.         (setq alist
  65.               (cons (cons (buffer-substring
  66.                    (point)
  67.                    (progn
  68.                      (skip-chars-backward "-A-Za-z0-9_$")
  69.                      ;;; `::' in the middle of a C++ tag.
  70.                      (while (and (= (preceding-char) ?:)
  71.                          (= (char-after (- (point) 2)) ?:))
  72.                        (progn (backward-char 2)
  73.                           (skip-chars-backward
  74.                            "-A-Za-z0-9_$")))
  75.                      (point)))
  76.                   nil)
  77.                 alist)))
  78.         (goto-char next)        ; next line
  79.         )))
  80.     (message "Making tags completion alist...done")
  81.     alist)
  82.  
  83.   ;; Init tag-ring
  84.   (setq buffer-ring (make-ring tag-ring-size))
  85.   (setq offset-ring (make-ring tag-ring-size))
  86.   (setq tag-ring-index 0))
  87.  
  88. (defun find-tag (tagname &optional next-p other-window regexp-p)
  89.   "Find tag (in current tag table) whose name contains TAGNAME;
  90. more exact matches are found first.
  91. Select the buffer containing the tag's definition and move point there.
  92. The default for TAGNAME is the expression in the buffer after or around point.
  93.  
  94. If second arg NEXT-P is non-nil (interactively, with prefix arg), search
  95. for another tag that matches the last tagname or regexp used.
  96.  
  97. If third arg OTHER-WINDOW is non-nil, select the buffer in another window.
  98.  
  99. If fourth arg REGEXP-P is non-nil, treat TAGNAME as a regexp.
  100.  
  101. See documentation of variable `tags-file-name'."
  102.   (interactive (if current-prefix-arg
  103.            '(nil t)
  104.            (list (prompt-for-tag "Find tag: "))))
  105.   (setq calling-buffer (current-buffer))
  106.   (setq calling-point (point))
  107.   (cond
  108.    (next-p (find-tag-in-order nil nil nil nil nil other-window))
  109.    (regexp-p (find-tag-in-order tagname
  110.                 're-search-forward
  111.                 '(tag-re-match-p)
  112.                 t
  113.                 "matching"
  114.                 other-window))
  115.    (t (find-tag-in-order
  116.        tagname
  117.        'search-forward
  118.        '(tag-exact-match-p tag-word-match-p tag-any-match-p)
  119.        nil
  120.        "containing"
  121.        other-window)))
  122.  
  123.   ;; update the tag-file ring
  124.   (ring-insert buffer-ring calling-buffer)
  125.   (ring-insert offset-ring calling-point)
  126.   (setq tag-ring-index 0)
  127.   (message "point=%d" calling-point))
  128.  
  129. (defun tag-backwards (arg)
  130.   "Cycle backwards through tag-ring."
  131.   (interactive "p")
  132.   (let ((len (ring-length buffer-ring)))
  133.     (if (<= len 0)
  134.     (message "Empty tag ring")
  135.       (setq arg
  136.         (if (> arg 0) 1
  137.           (if (< arg 0) -1 0)))
  138.       (switch-to-buffer (ring-ref buffer-ring tag-ring-index))
  139.       (goto-char (ring-ref offset-ring tag-ring-index))
  140.       (setq tag-ring-index (comint-mod (+ tag-ring-index arg) len))
  141.       (message "%d" (ring-ref offset-ring tag-ring-index)))))
  142.  
  143. (define-key esc-map "'" 'tag-backwards);
  144.  
  145. (defun tag-forwards (arg)
  146.   "Cycle forwards through tag-ring."
  147.   (interactive "p")
  148.   (tag-backwards (- arg)))
  149.  
  150. (define-key esc-map "`" 'tag-forwards);
  151.  
  152.  
  153. -- 
  154. Barry N. Nelson             --------- __o       __o       __o       __o
  155. barryn@world.std.com        ------- _`\<,_    _`\<,_    _`\<,_    _`\<,_
  156. Drytek (508) 657-3933 X4317 ------ (*)/ (*)  (*)/ (*)  (*)/ (*)  (*)/ (*)
  157. A Unit of General Signal    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  158.