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