]> code.delx.au - gnu-emacs/blobdiff - lisp/textmodes/page.el
Merge from emacs--rel--22
[gnu-emacs] / lisp / textmodes / page.el
index cb9b3aa78f39a9885a0f6075066c65db2d63352f..7b7fb474afcc1d3291c0e815b7fd61e99728f54e 100644 (file)
@@ -1,8 +1,10 @@
-;;; page.el --- page motion commands for emacs.
+;;; page.el --- page motion commands for Emacs
 
-;; Copyright (C) 1985 Free Software Foundation, Inc.
+;; Copyright (C) 1985, 2001, 2002, 2003, 2004, 2005,
+;;   2006, 2007 Free Software Foundation, Inc.
 
 ;; Maintainer: FSF
+;; Keywords: wp convenience
 
 ;; This file is part of GNU Emacs.
 
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This code provides the page-oriented movement and selection commands
+;; documented in the Emacs manual.
 
 ;;; Code:
 
@@ -29,14 +37,24 @@ A page boundary is any line whose beginning matches the regexp
   (interactive "p")
   (or count (setq count 1))
   (while (and (> count 0) (not (eobp)))
+    ;; In case the page-delimiter matches the null string,
+    ;; don't find a match without moving.
+    (if (bolp) (forward-char 1))
     (if (re-search-forward page-delimiter nil t)
        nil
       (goto-char (point-max)))
     (setq count (1- count)))
   (while (and (< count 0) (not (bobp)))
+    ;; In case the page-delimiter matches the null string,
+    ;; don't find a match without moving.
+    (and (save-excursion (re-search-backward page-delimiter nil t))
+        (= (match-end 0) (point))
+        (goto-char (match-beginning 0)))
     (forward-char -1)
     (if (re-search-backward page-delimiter nil t)
+       ;; We found one--move to the end of it.
        (goto-char (match-end 0))
+      ;; We found nothing--go to beg of buffer.
       (goto-char (point-min)))
     (setq count (1+ count))))
 
@@ -59,7 +77,7 @@ thus marking a page other than the one point was originally in."
     (if (< arg 0)
         (forward-page (1- arg))))
   (forward-page)
-  (push-mark nil t)
+  (push-mark nil t t)
   (forward-page -1))
 
 (defun narrow-to-page (&optional arg)
@@ -73,15 +91,29 @@ thus showing a page other than the one point was originally in."
     (if (> arg 0)
        (forward-page arg)
       (if (< arg 0)
-         (forward-page (1- arg))))
+         (let ((adjust 0)
+               (opoint (point)))
+           ;; If we are not now at the beginning of a page,
+           ;; move back one extra time, to get to the start of this page.
+           (save-excursion
+             (beginning-of-line)
+             (or (and (looking-at page-delimiter)
+                      (eq (match-end 0) opoint))
+                 (setq adjust 1)))
+           (forward-page (- arg adjust)))))
     ;; Find the end of the page.
+    (set-match-data nil)
     (forward-page)
     ;; If we stopped due to end of buffer, stay there.
     ;; If we stopped after a page delimiter, put end of restriction
     ;; at the beginning of that line.
-    (if (save-excursion (beginning-of-line)
-                       (looking-at page-delimiter))
-       (beginning-of-line))
+    ;; Before checking the match that was found,
+    ;; verify that forward-page actually set the match data.
+    (if (and (match-beginning 0)
+            (save-excursion
+              (goto-char (match-beginning 0)) ; was (beginning-of-line)
+              (looking-at page-delimiter)))
+       (goto-char (match-beginning 0))) ; was (beginning-of-line)
     (narrow-to-region (point)
                      (progn
                        ;; Find the top of the page.
@@ -128,5 +160,9 @@ thus showing a page other than the one point was originally in."
        (message "Page %d, line %d"
                 count
                 (1+ (count-lines (point) opoint)))))))
+\f
+;;; Place `provide' at end of file.
+(provide 'page)
 
+;;; arch-tag: e8d7a0bd-8655-4b6e-b852-f2ee25316a1d
 ;;; page.el ends here