X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/39d9e44fa78b0db04b0771aa02302c1d7eeefe67..c5f6df4d5b7686049a85a13fd4d94993eb75f8f6:/lisp/view.el diff --git a/lisp/view.el b/lisp/view.el index 57d264d2b8..c152383a48 100644 --- a/lisp/view.el +++ b/lisp/view.el @@ -11,7 +11,7 @@ ;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) +;; the Free Software Foundation; either version 3, or (at your option) ;; any later version. ;; GNU Emacs is distributed in the hope that it will be useful, @@ -375,7 +375,8 @@ Use this argument instead of explicitly setting `view-exit-action'." ;; bindings instead of using the \\[] construction. The reason for this ;; is that most commands have more than one key binding. "Toggle View mode, a minor mode for viewing text but not editing it. -With ARG, turn View mode on iff ARG is positive. +With prefix argument ARG, turn View mode on if ARG is positive, otherwise +turn it off. Emacs commands that do not change the buffer contents are available as usual. Kill commands insert text in kill buffers but do not delete. Other commands @@ -989,27 +990,27 @@ for highlighting the match that is found." times (if no "no " "") regexp) (sit-for 4)))) +;; This is the dumb approach, looking at each line. The original +;; version of this function looked like it might have been trying to +;; do something clever, but not succeeding: +;; http://lists.gnu.org/archive/html/bug-gnu-emacs/2007-09/msg00073.html (defun view-search-no-match-lines (times regexp) - ;; Search for the TIMESt occurrence of line with no match for REGEXP. - (let ((back (and (< times 0) (setq times (- times)) -1)) - n) - (while (> times 0) - (save-excursion (beginning-of-line (if back (- times) (1+ times))) - (setq n (point))) - (setq times - (cond - ((< (count-lines (point) n) times) -1) ; Not enough lines. - ((or (null (re-search-forward regexp nil t back)) - (if back (and (< (match-end 0) n) - (> (count-lines (match-end 0) n) 1)) - (and (< n (match-beginning 0)) - (> (count-lines n (match-beginning 0)) 1)))) - 0) ; No match within lines. - (back (count-lines (max n (match-beginning 0)) (match-end 0))) - (t (count-lines (match-beginning 0) (min n (match-end 0)))))) - (goto-char n)) - (and (zerop times) (looking-at "^.*$")))) - + "Search for the TIMESth occurrence of a line with no match for REGEXP. +If such a line is found, return non-nil and set the match-data to that line. +If TIMES is negative, search backwards." + (let ((step (if (>= times 0) 1 + (setq times (- times)) + -1))) + ;; Note that we do not check the current line. + (while (and (> times 0) + (zerop (forward-line step))) + ;; (forward-line 1) returns 0 on moving within the last line. + (if (eobp) + (setq times -1) + (or (re-search-forward regexp (line-end-position) t) + (setq times (1- times)))))) + (and (zerop times) + (looking-at ".*"))) (provide 'view)