changeset 97352:ed0e9fcb94ac

(change-log-search-tag-name) (change-log-goto-source): Fix behavior when point is not on tag.
author Martin Rudalics <rudalics@gmx.at>
date Thu, 07 Aug 2008 09:29:10 +0000
parents 945ae0a5779f
children ca9f9affed30
files lisp/add-log.el
diffstat 1 files changed, 59 insertions(+), 48 deletions(-) [+]
line wrap: on
line diff
--- a/lisp/add-log.el	Thu Aug 07 08:54:11 2008 +0000
+++ b/lisp/add-log.el	Thu Aug 07 09:29:10 2008 +0000
@@ -365,14 +365,14 @@
 		  (change-log-search-tag-name-1 at)))
 	    (error nil))
 	  (condition-case nil
-	      ;; Before parenthesized list?
+	      ;; Before parenthesized list on same line?
 	      (save-excursion
 		(when (and (skip-chars-forward " \t")
 			   (looking-at change-log-tag-re))
 		  (change-log-search-tag-name-1)))
 	    (error nil))
 	  (condition-case nil
-	      ;; Near filename?
+	      ;; Near file name?
 	      (save-excursion
 		(when (and (progn
 			     (beginning-of-line)
@@ -383,40 +383,32 @@
 		  (change-log-search-tag-name-1)))
 	    (error nil))
 	  (condition-case nil
-	      ;; Before filename?
-	      (save-excursion
-		(when (and (progn
-			     (skip-syntax-backward " ")
-			     (beginning-of-line)
-			     (looking-at change-log-file-names-re))
-			   (goto-char (match-end 0))
-			   (skip-syntax-forward " ")
-			   (looking-at change-log-tag-re))
-		  (change-log-search-tag-name-1)))
-	    (error nil))
-	  (condition-case nil
-	      ;; Near start entry?
-	      (save-excursion
-		(when (and (progn
-			     (beginning-of-line)
-			     (looking-at change-log-start-entry-re))
-			   (forward-line) ; Won't work for multiple
-					  ; names, etc.
-			   (skip-syntax-forward " ")
-			   (progn
-			     (beginning-of-line)
-			     (looking-at change-log-file-names-re))
-			   (goto-char (match-end 0))
-			   (re-search-forward change-log-tag-re))
-		  (change-log-search-tag-name-1)))
-	    (error nil))
-	  (condition-case nil
-	      ;; After parenthesized list?.
-	      (when (re-search-backward change-log-tag-re)
-		(save-restriction
-		  (narrow-to-region (match-beginning 1) (match-end 1))
-		  (goto-char (point-max))
-		  (cons (find-tag-default) (point-max))))
+	      ;; Anywhere else within current entry?
+	      (let ((from
+		     (save-excursion
+		       (end-of-line)
+		       (if (re-search-backward change-log-start-entry-re nil t)
+			   (match-beginning 0)
+			 (point-min))))
+		    (to
+		     (save-excursion
+		       (end-of-line)
+		       (if (re-search-forward change-log-start-entry-re nil t)
+			   (match-beginning 0)
+			 (point-max)))))
+		(when (and (< from to) (<= from at) (<= at to))
+		  (save-restriction
+		    ;; Narrow to current change log entry.
+		    (narrow-to-region from to)
+		    (cond
+		     ((re-search-backward change-log-tag-re nil t)
+		      (narrow-to-region (match-beginning 1) (match-end 1))
+		      (goto-char (point-max))
+		      (cons (find-tag-default) (point-max)))
+		     ((re-search-forward change-log-tag-re nil t)
+		      (narrow-to-region (match-beginning 1) (match-end 1))
+		      (goto-char (point-min))
+		      (cons (find-tag-default) (point-min)))))))
 	    (error nil))))))
 
 (defvar change-log-find-head nil)
@@ -481,9 +473,10 @@
       nil)))
 
 (defun change-log-goto-source ()
-  "Go to source location of change log tag near `point'.
+  "Go to source location of \"change log tag\" near `point'.
 A change log tag is a symbol within a parenthesized,
-comma-separated list."
+comma-separated list.  If no suitable tag can be found nearby,
+try to visit the file for the change under `point' instead."
   (interactive)
   (if (and (eq last-command 'change-log-goto-source)
 	   change-log-find-tail)
@@ -496,20 +489,38 @@
 		       (car change-log-find-head)
 		       (nth 2 change-log-find-head)))))
     (save-excursion
-      (let* ((tag-at (change-log-search-tag-name))
+      (let* ((at (point))
+	     (tag-at (change-log-search-tag-name))
 	     (tag (car tag-at))
-	     (file (when tag-at
-		     (change-log-search-file-name (cdr tag-at)))))
-	(if (or (not tag) (not file))
-	    (error "No suitable tag near `point'")
+	     (file (when tag-at (change-log-search-file-name (cdr tag-at))))
+	     (file-at (when file (match-beginning 2)))
+	     ;; `file-2' is the file `change-log-search-file-name' finds
+	     ;; at `point'.  We use `file-2' as a fallback when `tag' or
+	     ;; `file' are not suitable for some reason.
+	     (file-2 (change-log-search-file-name at))
+	     (file-2-at (when file-2 (match-beginning 2))))
+	(cond
+	 ((and (or (not tag) (not file) (not (file-exists-p file)))
+	       (or (not file-2) (not (file-exists-p file-2))))
+	  (error "Cannot find tag or file near `point'"))
+	 ((and file-2 (file-exists-p file-2)
+	       (or (not tag) (not file) (not (file-exists-p file))
+		   (and (or (and (< file-at file-2-at) (<= file-2-at at))
+			    (and (<= at file-2-at) (< file-2-at file-at))))))
+	  ;; We either have not found a suitable file name or `file-2'
+	  ;; provides a "better" file name wrt `point'.  Go to the
+	  ;; buffer of `file-2' instead.
+	  (display-buffer (find-file-noselect file-2)))
+	 (t
 	  (setq change-log-find-head
 		(list tag (concat "\\_<" (regexp-quote tag) "\\_>")
 		      file (find-file-noselect file)))
 	  (condition-case nil
 	      (setq change-log-find-tail
 		    (apply 'change-log-goto-source-1 change-log-find-head))
-	    (error (format "Cannot find matches for tag `%s' in `%s'"
-			   tag file))))))))
+	    (error
+	     (format "Cannot find matches for tag `%s' in file `%s'"
+		     tag file)))))))))
 
 (defun change-log-next-error (&optional argp reset)
   "Move to the Nth (default 1) next match in an Occur mode buffer.
@@ -520,15 +531,15 @@
 	 (down (< argp 0))		; are we going down? (is argp negative?)
 	 (up (not down))
 	 (search-function (if up 're-search-forward 're-search-backward)))
-    
+
     ;; set the starting position
     (goto-char (cond (reset (point-min))
 		     (down (line-beginning-position))
 		     (up (line-end-position))
 		     ((point))))
-    
+
     (funcall search-function change-log-file-names-re nil t count))
-  
+
   (beginning-of-line)
   ;; if we found a place to visit...
   (when (looking-at change-log-file-names-re)