# HG changeset patch # User Roland McGrath # Date 763105764 0 # Node ID 3ad3a0150b6dc8f42232c33b8cc4b25d8640967b # Parent 25d0943a4f4e6cecca2531b5a4331f18abc8b9c2 (etags-tags-completion-table): Let the line number or char pos be empty. (etags-snarf-tag): Look for line number as well as char pos. Let either be empty; return both. (etags-goto-tag-location): Arg also contains line number. If char pos is nil, use line number. diff -r 25d0943a4f4e -r 3ad3a0150b6d lisp/progmodes/etags.el --- a/lisp/progmodes/etags.el Tue Mar 08 05:37:15 1994 +0000 +++ b/lisp/progmodes/etags.el Tue Mar 08 05:49:24 1994 +0000 @@ -935,7 +935,8 @@ ;; \7 is the char to start searching at. (while (re-search-forward "^\\(\\(.+[^-a-zA-Z0-9_$]+\\)?\\([-a-zA-Z0-9_$]+\\)\ -\[^-a-zA-Z0-9_$]*\\)\177\\(\\([^\n\001]+\\)\001\\)?\\([0-9]+\\),\\([0-9]+\\)\n" +\[^-a-zA-Z0-9_$]*\\)\177\\(\\([^\n\001]+\\)\001\\)?\ +\\([0-9]+\\)?,\\([0-9]+\\)?\n" nil t) (intern (if (match-beginning 5) ;; There is an explicit tag name. @@ -946,29 +947,36 @@ table)) (defun etags-snarf-tag () - (let (tag-text startpos) + (let (tag-text line startpos) (search-forward "\177") (setq tag-text (buffer-substring (1- (point)) (save-excursion (beginning-of-line) (point)))) ;; Skip explicit tag name if present. (search-forward "\001" (save-excursion (forward-line 1) (point)) t) - (search-forward ",") - (setq startpos (string-to-int (buffer-substring + (if (looking-at "[0-9]") + (setq line (string-to-int (buffer-substring (point) (progn (skip-chars-forward "0-9") - (point))))) + (point)))))) + (search-forward ",") + (if (looking-at "[0-9]") + (setq startpos (string-to-int (buffer-substring + (point) + (progn (skip-chars-forward "0-9") + (point)))))) ;; Leave point on the next line of the tags file. (forward-line 1) - (cons tag-text startpos))) + (cons tag-text (cons line startpos)))) -;; TAG-INFO is a cons (TEXT . POSITION) where TEXT is the initial part of a -;; line containing the tag and POSITION is the character position of TEXT -;; within the file (starting from 1). If the tag isn't exactly at the -;; given position then look around that position using a search window -;; which expands until it hits the start of file. +;; TAG-INFO is a cons (TEXT LINE . POSITION) where TEXT is the initial part +;; of a line containing the tag and POSITION is the character position of +;; TEXT within the file (starting from 1); LINE is the line number. Either +;; LINE or POSITION may be nil; POSITION is used if present. If the tag +;; isn't exactly at the given position then look around that position using +;; a search window which expands until it hits the start of file. (defun etags-goto-tag-location (tag-info) - (let ((startpos (cdr tag-info)) + (let ((startpos (cdr (cdr tag-info))) ;; This constant is 1/2 the initial search window. ;; There is no sense in making it too small, ;; since just going around the loop once probably @@ -978,6 +986,11 @@ (pat (concat (if (eq selective-display t) "\\(^\\|\^m\\)" "^") (regexp-quote (car tag-info))))) + ;; If no char pos was given, try the given line number. + (or startpos + (if (car (cdr tag-info)) + (setq startpos (progn (goto-line (car (cdr tag-info))) + (point))))) (or startpos (setq startpos (point-min))) ;; First see if the tag is right at the specified location.