| 1 | ;;; scroll-all.el -- scroll all buffers together minor mode |
| 2 | |
| 3 | ;; Copyright (C) 1997 Free Software Foundation, Inc. |
| 4 | |
| 5 | ;; Author: Gary D. Foster <Gary.Foster@corp.sun.com> |
| 6 | ;; Keywords: scroll crisp brief lock |
| 7 | |
| 8 | ;; This file is part of GNU Emacs. |
| 9 | |
| 10 | ;; GNU Emacs is free software; you can redistribute it and/or modify |
| 11 | ;; it under the terms of the GNU General Public License as published by |
| 12 | ;; the Free Software Foundation; either version 2, or (at your option) |
| 13 | ;; any later version. |
| 14 | |
| 15 | ;; GNU Emacs is distributed in the hope that it will be useful, |
| 16 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 17 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 18 | ;; GNU General Public License for more details. |
| 19 | |
| 20 | ;; You should have received a copy of the GNU General Public License |
| 21 | ;; along with GNU Emacs; see the file COPYING. If not, write to the |
| 22 | ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
| 23 | ;; Boston, MA 02111-1307, USA. |
| 24 | |
| 25 | ;; Commentary |
| 26 | ;; This mode allows multiple buffers to be 'locked' so that scrolling |
| 27 | ;; up or down lines in any buffer causes all the buffers to mirror |
| 28 | ;; the scrolling. It hooks into the post-command-hook to check for |
| 29 | ;; potential scrolling commands and if we're locked, mirrors them in all |
| 30 | ;; windows. This allows us to grab line-at-a-time scrolling as well as |
| 31 | ;; screen-at-a-time scrolling, and doesn't remap any of the keyboard |
| 32 | ;; commands to do it. |
| 33 | |
| 34 | ;; You can enable and disable this mode with the 'scroll-all-mode' command. |
| 35 | |
| 36 | ;; Suggestions/ideas from: |
| 37 | ;; Rick Macdonald <rickm@vsl.com> |
| 38 | ;; Anders Lindgren <andersl@csd.uu.se> |
| 39 | |
| 40 | (defvar running-xemacs (string-match "XEmacs\\|Lucid" emacs-version)) |
| 41 | (defvar scroll-all-mode nil |
| 42 | "Track status of scroll locking.") |
| 43 | (if running-xemacs |
| 44 | (add-minor-mode 'scroll-all-mode " *SL*") |
| 45 | (or (assq 'scroll-all-mode-mode minor-mode-alist) |
| 46 | (setq minor-mode-alist |
| 47 | (cons '(scroll-all-mode-mode " *SL*") minor-mode-alist)))) |
| 48 | |
| 49 | (defun scroll-all-scroll-down-all (arg) |
| 50 | "Scroll down all visible windows." |
| 51 | (interactive "P") |
| 52 | (let ((num-windows (count-windows)) |
| 53 | (count 1)) |
| 54 | (if (> num-windows 1) |
| 55 | ( progn (other-window 1) |
| 56 | (while (< count num-windows) |
| 57 | (if (not (eq (point) (point-max))) |
| 58 | (progn (call-interactively 'next-line))) |
| 59 | (other-window 1) |
| 60 | (setq count (1+ count))))))) |
| 61 | |
| 62 | (defun scroll-all-scroll-up-all (arg) |
| 63 | "Scroll up all visible windows." |
| 64 | (interactive "P") |
| 65 | (let ((num-windows (count-windows)) |
| 66 | (count 1)) |
| 67 | (if (> num-windows 1) |
| 68 | ( progn (other-window 1) |
| 69 | (while (< count num-windows) |
| 70 | (if (not (eq (point) (point-min))) |
| 71 | (progn (call-interactively 'previous-line))) |
| 72 | (other-window 1) |
| 73 | (setq count (1+ count))))))) |
| 74 | |
| 75 | (defun scroll-all-page-down-all (arg) |
| 76 | "Page down in all visible windows." |
| 77 | (interactive "P") |
| 78 | (let ((num-windows (count-windows)) |
| 79 | (count 1)) |
| 80 | (if (> num-windows 1) |
| 81 | (progn (other-window 1) |
| 82 | (while (< count num-windows) |
| 83 | (call-interactively 'fkey-scroll-up) |
| 84 | (other-window 1) |
| 85 | (setq count (1+ count))))))) |
| 86 | |
| 87 | (defun scroll-all-page-up-all (arg) |
| 88 | "Page up in all visible windows." |
| 89 | (interactive "P") |
| 90 | (let ((num-windows (count-windows)) |
| 91 | (count 1)) |
| 92 | (if (> num-windows 1) |
| 93 | (progn (other-window 1) |
| 94 | (while (< count num-windows) |
| 95 | (call-interactively 'fkey-scroll-down) |
| 96 | (other-window 1) |
| 97 | (setq count (1+ count))))))) |
| 98 | |
| 99 | |
| 100 | (defun scroll-all-check-to-scroll () |
| 101 | "Check `last-command' to see if a scroll was done." |
| 102 | (if (eq this-command 'next-line) |
| 103 | (call-interactively 'scroll-all-scroll-down-all)) |
| 104 | (if (eq this-command 'previous-line) |
| 105 | (call-interactively 'scroll-all-scroll-up-all)) |
| 106 | (if (eq this-command 'fkey-scroll-up) |
| 107 | (call-interactively 'scroll-all-page-down-all)) |
| 108 | (if (eq this-command 'fkey-scroll-down) |
| 109 | (call-interactively 'scroll-all-page-up-all))) |
| 110 | |
| 111 | |
| 112 | (defun scroll-all-mode (arg) |
| 113 | "Toggle Scroll-All minor mode." |
| 114 | (interactive "P") |
| 115 | (setq scroll-all-mode (not scroll-all-mode)) |
| 116 | (cond |
| 117 | ((eq scroll-all-mode 't) |
| 118 | (add-hook 'post-command-hook 'scroll-all-check-to-scroll)) |
| 119 | ((eq scroll-all-mode 'nil) |
| 120 | (remove-hook 'post-command-hook 'scroll-all-check-to-scroll)))) |
| 121 | |
| 122 | (provide 'scroll-all) |
| 123 | |
| 124 | ;; scroll-all.el ends here |