*** empty log message ***
authorRichard M. Stallman <rms@gnu.org>
Thu, 18 Aug 2005 15:03:37 +0000 (15:03 +0000)
committerRichard M. Stallman <rms@gnu.org>
Thu, 18 Aug 2005 15:03:37 +0000 (15:03 +0000)
etc/NEWS
lisp/ChangeLog
lisp/scroll-lock.el [new file with mode: 0644]
man/ChangeLog

index 0d4b2b3..14414e9 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1747,6 +1747,12 @@ recognized.
 ---
 ** The TCL package tcl-mode.el was replaced by tcl.el.
 This was actually done in Emacs-21.1, and was not documented.
+
+** The new package scroll-lock.el provides the Scroll Lock minor mode
+for pager-like scrolling.  Keys which normally move point by line or
+paragraph will scroll the buffer by the respective amount of lines
+instead and point will be kept vertically fixed relative to window
+boundaries during scrolling.
 \f
 * Changes in Specialized Modes and Packages in Emacs 22.1:
 
index 0caf88a..ef16c69 100644 (file)
@@ -1,3 +1,7 @@
+2005-08-18  Richard M. Stallman  <rms@gnu.org>
+
+       * scroll-lock.el: New file.
+
 2005-08-18  Thien-Thi Nguyen  <ttn@gnu.org>
 
        * dired.el (dired-move-to-end-of-filename):
diff --git a/lisp/scroll-lock.el b/lisp/scroll-lock.el
new file mode 100644 (file)
index 0000000..7b2beb5
--- /dev/null
@@ -0,0 +1,130 @@
+;;; scroll-lock.el --- Scroll lock scrolling.
+
+;; Copyright (C) 2005 Free Software Foundation, Inc.
+
+;; Author: Ralf Angeli <angeli@iwi.uni-sb.de>
+;; Maintainer: FSF
+;; Created: 2005-06-18
+
+;; This file is part of GNU Emacs.
+
+;; 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)
+;; any later version.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program; see the file COPYING.  If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; By activating Scroll Lock mode, keys for moving point by line or
+;; paragraph will scroll the buffer by the respective amount of lines
+;; instead.  Point will be kept vertically fixed relative to window
+;; boundaries.
+
+;;; Code:
+
+(defvar scroll-lock-mode-map
+  (let ((map (make-sparse-keymap)))
+    (define-key map [remap next-line] 'scroll-lock-next-line)
+    (define-key map [remap previous-line] 'scroll-lock-previous-line)
+    (define-key map [remap forward-paragraph] 'scroll-lock-forward-paragrap=
+h)
+    (define-key map [remap backward-paragraph] 'scroll-lock-backward-paragr=
+aph)
+    map)
+  "Keymap for Scroll Lock mode.")
+
+(defvar scroll-lock-preserve-screen-pos-save scroll-preserve-screen-position
+  "Used for saving the state of `scroll-preserve-screen-position'.")
+(make-variable-buffer-local 'scroll-lock-preserve-screen-pos-save)
+
+(defvar scroll-lock-temporary-goal-column 0
+  "Like `temporary-goal-column' but for scroll-lock-* commands.")
+
+;;;###autoload
+(define-minor-mode scroll-lock-mode
+  "Minor mode for pager-like scrolling.
+Keys which normally move point by line or paragraph will scroll
+the buffer by the respective amount of lines instead and point
+will be kept vertically fixed relative to window boundaries
+during scrolling."
+  :lighter " ScrLck"
+  :keymap scroll-lock-mode-map
+  (if scroll-lock-mode
+      (progn
+       (setq scroll-lock-preserve-screen-pos-save
+             scroll-preserve-screen-position)
+       (set (make-local-variable 'scroll-preserve-screen-position) 'always))
+    (setq scroll-preserve-screen-position
+         scroll-lock-preserve-screen-pos-save)))
+
+(defun scroll-lock-update-goal-column ()
+  "Update `scroll-lock-temporary-goal-column' if necessary."
+  (unless (memq last-command '(scroll-lock-next-line
+                              scroll-lock-previous-line
+                              scroll-lock-forward-paragraph
+                              scroll-lock-backward-paragraph))
+    (setq scroll-lock-temporary-goal-column (current-column))))
+
+(defun scroll-lock-move-to-column (column)
+  "Like `move-to-column' but cater for wrapped lines."
+  (if (or (bolp)
+         ;; Start of a screen line.
+         (not (zerop (mod (- (point) (line-beginning-position))
+                          (window-width)))))
+      (move-to-column column)
+    (forward-char (min column (- (line-end-position) (point))))))
+
+(defun scroll-lock-next-line (&optional arg)
+  "Scroll up ARG lines keeping point fixed."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (scroll-lock-update-goal-column)
+  (if (pos-visible-in-window-p (point-max))
+      (next-line arg)
+    (scroll-up arg))
+  (scroll-lock-move-to-column scroll-lock-temporary-goal-column))
+
+(defun scroll-lock-previous-line (&optional arg)
+  "Scroll up ARG lines keeping point fixed."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (scroll-lock-update-goal-column)
+  (condition-case nil
+      (scroll-down arg)
+    (beginning-of-buffer (previous-line arg)))
+  (scroll-lock-move-to-column scroll-lock-temporary-goal-column))
+
+(defun scroll-lock-forward-paragraph (&optional arg)
+  "Scroll down ARG paragraphs keeping point fixed."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (scroll-lock-update-goal-column)
+  (scroll-up (count-screen-lines (point) (save-excursion
+                                          (forward-paragraph arg)
+                                          (point))))
+  (scroll-lock-move-to-column scroll-lock-temporary-goal-column))
+
+(defun scroll-lock-backward-paragraph (&optional arg)
+  "Scroll up ARG paragraphs keeping point fixed."
+  (interactive "p")
+  (or arg (setq arg 1))
+  (scroll-lock-update-goal-column)
+  (let ((goal (save-excursion (backward-paragraph arg) (point))))
+    (condition-case nil
+       (scroll-down (count-screen-lines goal (point)))
+      (beginning-of-buffer (goto-char goal))))
+  (scroll-lock-move-to-column scroll-lock-temporary-goal-column))
+
+(provide 'scroll-lock)
+
+;;; scroll-lock.el ends here
index b36f6c1..1375018 100644 (file)
@@ -1,3 +1,18 @@
+2005-08-18  Richard M. Stallman  <rms@gnu.org>
+
+       * trouble.texi (Unasked-for Search): Delete xref to Keyboard Translations.
+
+       * glossary.texi (Glossary): Delete xref.
+
+       * faq.texi (Swapping keys): Xref for normal-erase-is-backspace-mode,
+       not keyboard-translate.
+
+       * custom.texi (Minor Modes): Say that the list here is not complete.
+       (Keyboard Translations): Node deleted.
+       (Disabling): Delete xref to it.
+       (Customization Groups): Fix Custom buffer example.
+       (Hooks): Mention remove-hooks.
+
 2005-08-17  Luc Teirlinck  <teirllm@auburn.edu>
 
        * building.texi (GDB Graphical Interface): Improve filling of menu