1;;; master.el --- make a buffer the master over another buffer 2 3;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 4;; Free Software Foundation, Inc. 5 6;; Author: Alex Schroeder <alex@gnu.org> 7;; Maintainer: Alex Schroeder <alex@gnu.org> 8;; Version: 1.0.2 9;; Keywords: comm 10 11;; This file is part of GNU Emacs. 12 13;; GNU Emacs is free software; you can redistribute it and/or modify 14;; it under the terms of the GNU General Public License as published by 15;; the Free Software Foundation; either version 2, or (at your option) 16;; any later version. 17 18;; GNU Emacs is distributed in the hope that it will be useful, 19;; but WITHOUT ANY WARRANTY; without even the implied warranty of 20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 21;; GNU General Public License for more details. 22 23;; You should have received a copy of the GNU General Public License 24;; along with GNU Emacs; see the file COPYING. If not, write to the 25;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 26;; Boston, MA 02110-1301, USA. 27 28;;; Commentary: 29 30;; master-mode is a minor mode which enables you to scroll another 31;; buffer (the slave) without leaving your current buffer (the master). 32 33;; It can be used by sql.el, for example: The SQL buffer is the master 34;; and its SQLi buffer is the slave. This allows you to scroll the SQLi 35;; buffer containing the output from the SQL buffer containing the 36;; commands. 37;; 38;; This is how to use sql.el and master.el together: The variable 39;; sql-buffer contains the slave buffer. It is a local variable in the 40;; SQL buffer. 41;; 42;; (add-hook 'sql-mode-hook 43;; (function (lambda () 44;; (master-mode t) 45;; (master-set-slave sql-buffer)))) 46;; (add-hook 'sql-set-sqli-hook 47;; (function (lambda () 48;; (master-set-slave sql-buffer)))) 49 50;;; Thanks to all the people who helped me out: 51;; 52;; Rob Riepel <networking.stanford.edu> 53 54;;; History: 55;; 56 57;;; Code: 58 59(defgroup master nil 60 "Support for master/slave relationships between buffers." 61 :version "22.1" 62 :group 'convenience) 63 64;; Variables that don't need initialization. 65 66(defvar master-of nil 67 "Slave buffer of the current buffer. See `master-mode'. 68You can set this variable using `master-set-slave'.") 69 70(defvar master-set-slave-hook nil 71 "Hook run after the slave is changed using \\[master-set-slave].") 72 73;;; Define master mode. 74 75;;;###autoload 76(define-minor-mode master-mode 77 "Toggle Master mode. 78With no argument, this command toggles the mode. 79Non-null prefix argument turns on the mode. 80Null prefix argument turns off the mode. 81 82When Master mode is enabled, you can scroll the slave buffer using the 83following commands: 84 85\\{master-mode-map} 86 87The slave buffer is stored in the buffer-local variable `master-of'. 88You can set this variable using `master-set-slave'. You can show 89yourself the value of `master-of' by calling `master-show-slave'." 90 :group 'master 91 :keymap 92 '(("\C-c\C-n" . master-says-scroll-up) 93 ("\C-c\C-p" . master-says-scroll-down) 94 ("\C-c<" . master-says-beginning-of-buffer) 95 ("\C-c>" . master-says-end-of-buffer) 96 ("\C-c\C-l" . master-says-recenter))) 97 98;; Initialize Master mode by setting a slave buffer. 99 100(defun master-set-slave (buffer) 101 "Makes BUFFER the slave of the current buffer. 102Use \\[master-mode] to toggle control of the slave buffer." 103 (interactive "bSlave: ") 104 (make-local-variable 'master-of) 105 (setq master-of buffer) 106 (run-hooks 'master-set-slave-hook)) 107 108(defun master-show-slave () 109 "Displays a message with the name of the slave buffer." 110 (interactive) 111 (message "This buffer is the master of %s. Master-mode is %S." 112 (or master-of "none") 113 master-mode)) 114 115 116 117;;; Functions that the master buffer can call for the slave buffer. 118 119(defun master-says-scroll-up (&optional arg) 120 "Display and scroll the slave buffer up. 121See `scroll-up'." 122 (interactive) 123 (master-says 'scroll-up arg)) 124 125(defun master-says-scroll-down (&optional arg) 126 "Display and scroll the slave buffer down. 127See `scroll-down'." 128 (interactive) 129 (master-says 'scroll-down arg)) 130 131(defun master-says-beginning-of-buffer (&optional arg) 132 "Display and move to the beginning of the slave buffer. 133See `beginning-of-buffer'." 134 (interactive) 135 (master-says 'beginning-of-buffer arg)) 136 137(defun master-says-end-of-buffer (&optional arg) 138 "Display and move to the end of the slave buffer. 139See `end-of-buffer'." 140 (interactive) 141 (master-says 'end-of-buffer arg)) 142 143(defun master-says-recenter (&optional arg) 144 "Recenter the slave buffer. 145See `recenter'." 146 (interactive) 147 (master-says 'recenter arg)) 148 149;; The master function doing the stuff. 150 151(defun master-says (&optional command arg) 152 "Display slave buffer and execute COMMAND with ARG in its window." 153 (interactive) 154 (if (null (buffer-live-p (get-buffer master-of))) 155 (error "Slave buffer has disappeared") 156 (let ((window (selected-window))) 157 (if (not (eq (window-buffer window) (get-buffer master-of))) 158 (switch-to-buffer-other-window master-of)) 159 (if command (condition-case nil (apply command arg) (error nil))) 160 (select-window window)))) 161 162(provide 'master) 163 164;;; arch-tag: dca08daa-8127-45ae-b77e-b135160dce98 165;;; master.el ends here 166