From bf6a77f31c3c5618cd37cb7c70b6e9a29df9bce2 Mon Sep 17 00:00:00 2001 From: Daniel Colascione Date: Sun, 5 Jan 2014 23:33:06 -0800 Subject: [PATCH] Fix defun navigation in vc log view. --- lisp/ChangeLog | 14 ++++++++++++++ lisp/vc/log-view.el | 45 +++++++++++++++++++++++++++++++++------------ 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 41e267efe1d..93e22172af2 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,17 @@ +2014-01-06 Daniel Colascione + + Fix defun navigation in vc log view. + + * vc/log-view.el (log-view-beginning-of-defun): Rewrite to behave + like `beginning-of-defun'. + (log-view-end-of-defun,log-view-end-of-defun-1): Rename old + log-view-end-of-defun to log-view-end-of-defun-1. Replace + log-view-end-of-defun with wrapper that behaves like + `end-of-defun'. + (log-view-extract-comment): Call `log-view-current-entry' directly + instead of relying on broken `log-view-beginning-of-defun' + behavior. + 2014-01-06 Paul Eggert Spelling fixes. diff --git a/lisp/vc/log-view.el b/lisp/vc/log-view.el index 3006081fb55..bacf96c4677 100644 --- a/lisp/vc/log-view.el +++ b/lisp/vc/log-view.el @@ -429,18 +429,28 @@ to the beginning of the ARGth following entry. This is Log View mode's default `beginning-of-defun-function'. It assumes that a log entry starts with a line matching `log-view-message-re'." - (if (or (null arg) (zerop arg)) - (setq arg 1)) + (when (null arg) (setf arg 1)) (if (< arg 0) - (dotimes (_n (- arg)) - (log-view-end-of-defun)) - (catch 'beginning-of-buffer - (dotimes (_n arg) - (or (log-view-current-entry nil t) - (throw 'beginning-of-buffer nil))) - (point)))) - -(defun log-view-end-of-defun () + (log-view-end-of-defun (- arg)) + (let ((found t)) + (while (> arg 0) + (setf arg (1- arg)) + (let ((cur-start (log-view-current-entry))) + (setf found + (cond ((null cur-start) + (goto-char (point-min)) + nil) + ((>= (car cur-start) (point)) + (unless (bobp) + (forward-line -1) + (setf arg (1+ arg))) + nil) + (t + (goto-char (car cur-start)) + t))))) + found))) + +(defun log-view-end-of-defun-1 () "Move forward to the next Log View entry." (let ((looping t)) (if (looking-at log-view-message-re) @@ -457,6 +467,16 @@ It assumes that a log entry starts with a line matching (setq looping nil) (forward-line -1)))))) +(defun log-view-end-of-defun (&optional arg) + "Move forward to the next Log View entry. +Works like `end-of-defun'." + (when (null arg) (setf arg 1)) + (if (< arg 0) + (log-view-beginning-of-defun (- arg)) + (dotimes (_n arg) + (log-view-end-of-defun-1) + t))) + (defvar cvs-minor-current-files) (defvar cvs-branch-prefix) (defvar cvs-secondary-branch-prefix) @@ -511,7 +531,8 @@ If called interactively, visit the version at point." (cond ((eq backend 'SVN) (forward-line -1))) (setq en (point)) - (log-view-beginning-of-defun) + (or (log-view-current-entry nil t) + (throw 'beginning-of-buffer nil)) (cond ((memq backend '(SCCS RCS CVS MCVS SVN)) (forward-line 2)) ((eq backend 'Hg) -- 2.39.2