1;;; scroll-all.el --- scroll all buffers together minor mode 2 3;; Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, 4;; 2006, 2007 Free Software Foundation, Inc. 5 6;; Author: Gary D. Foster <Gary.Foster@corp.sun.com> 7;; Keywords: scroll crisp brief lock 8 9;; This file is part of GNU Emacs. 10 11;; GNU Emacs is free software; you can redistribute it and/or modify 12;; it under the terms of the GNU General Public License as published by 13;; the Free Software Foundation; either version 2, or (at your option) 14;; any later version. 15 16;; GNU Emacs is distributed in the hope that it will be useful, 17;; but WITHOUT ANY WARRANTY; without even the implied warranty of 18;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19;; GNU General Public License for more details. 20 21;; You should have received a copy of the GNU General Public License 22;; along with GNU Emacs; see the file COPYING. If not, write to the 23;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 24;; Boston, MA 02110-1301, USA. 25 26;;; Commentary: 27;; This mode allows multiple buffers to be 'locked' so that scrolling 28;; up or down lines in any buffer causes all the buffers to mirror 29;; the scrolling. It hooks into the post-command-hook to check for 30;; potential scrolling commands and if we're locked, mirrors them in all 31;; windows. This allows us to grab line-at-a-time scrolling as well as 32;; screen-at-a-time scrolling, and doesn't remap any of the keyboard 33;; commands to do it. 34 35;; You can enable and disable this mode with the 'scroll-all-mode' command. 36 37;; Suggestions/ideas from: 38;; Rick Macdonald <rickm@vsl.com> 39;; Anders Lindgren <andersl@csd.uu.se> 40 41;;; Code: 42 43(defun scroll-all-function-all (func arg) 44 "Apply function FUNC with argument ARG to all visible windows." 45 (let ((num-windows (count-windows)) 46 (count 1)) 47 (when (> num-windows 1) 48 (other-window 1) 49 (while (< count num-windows) 50 (condition-case nil 51 (funcall func arg) 52 ;; Ignore beginning- or end-of-buffer error in other windows. 53 (error nil) 54 ) 55 (other-window 1) 56 (setq count (1+ count)))))) 57 58(defun scroll-all-scroll-down-all (arg) 59 "Scroll down in all visible windows." 60 (interactive "p") 61 (scroll-all-function-all 'next-line arg)) 62 63(defun scroll-all-scroll-up-all (arg) 64 "Scroll up in all visible windows." 65 (interactive "p") 66 (scroll-all-function-all 'previous-line arg)) 67 68(defun scroll-all-page-down-all (arg) 69 "Page down in all visible windows." 70 (interactive "P") 71 (scroll-all-function-all 'scroll-up arg)) 72 73(defun scroll-all-page-up-all (arg) 74 "Page up in all visible windows." 75 (interactive "P") 76 (scroll-all-function-all 'scroll-down arg)) 77 78(defun scroll-all-beginning-of-buffer-all (arg) 79 "Go to the beginning of the buffer in all visible windows." 80 (interactive "P") 81 (scroll-all-function-all 'beginning-of-buffer arg)) 82 83(defun scroll-all-end-of-buffer-all (arg) 84 "Go to the end of the buffer in all visible windows." 85 (interactive "P") 86 (scroll-all-function-all 'end-of-buffer arg)) 87 88 89(defun scroll-all-check-to-scroll () 90 "Check `this-command' to see if a scroll is to be done." 91 (cond ((eq this-command 'next-line) 92 (call-interactively 'scroll-all-scroll-down-all)) 93 ((eq this-command 'previous-line) 94 (call-interactively 'scroll-all-scroll-up-all)) 95 ((eq this-command 'scroll-up) 96 (call-interactively 'scroll-all-page-down-all)) 97 ((eq this-command 'scroll-down) 98 (call-interactively 'scroll-all-page-up-all)) 99 ((eq this-command 'beginning-of-buffer) 100 (call-interactively 'scroll-all-beginning-of-buffer-all)) 101 ((eq this-command 'end-of-buffer) 102 (call-interactively 'scroll-all-end-of-buffer-all)))) 103 104 105;;;###autoload 106(define-minor-mode scroll-all-mode 107 "Toggle Scroll-All minor mode. 108With ARG, turn Scroll-All minor mode on if ARG is positive, off otherwise. 109When Scroll-All mode is on, scrolling commands entered in one window 110apply to all visible windows in the same frame." 111 nil " *SL*" nil 112 :global t 113 :group 'windows 114 :group 'scrolling 115 (if scroll-all-mode 116 (add-hook 'post-command-hook 'scroll-all-check-to-scroll) 117 (remove-hook 'post-command-hook 'scroll-all-check-to-scroll))) 118 119(provide 'scroll-all) 120 121;;; arch-tag: db20089a-b157-45df-b5d4-2430e60acdd8 122;;; scroll-all.el ends here 123