(defgroup master nil
"Support for master/slave relationships between buffers."
(defvar master-of nil
"Slave buffer of the current buffer. See `master-mode'.
You can set this variable using `master-set-slave'.")
(defvar master-set-slave-hook nil
"Hook run after the slave is changed using \\[master-set-slave].")
"Toggle Master mode.
With no argument, this command toggles the mode.
Non-null prefix argument turns on the mode.
Null prefix argument turns off the mode.
When Master mode is enabled, you can scroll the slave buffer using the
The slave buffer is stored in the buffer-local variable `master-of'.
You can set this variable using `master-set-slave'. You can show
yourself the value of `master-of' by calling `master-show-slave'."
'(("\C-c\C-n" . master-says-scroll-up)
("\C-c\C-p" . master-says-scroll-down)
("\C-c<" . master-says-beginning-of-buffer)
("\C-c>" . master-says-end-of-buffer)
("\C-c\C-l" . master-says-recenter)))
(defun master-set-slave (buffer)
"Makes BUFFER the slave of the current buffer.
Use \\[master-mode] to toggle control of the slave buffer."
(interactive "bSlave: ")
(setq master-of buffer)
(defun master-show-slave ()
"Displays a message with the name of the slave buffer."
(message "This buffer is the master of %s. Master-mode is %S."
(or master-of "none")
(defun master-says-scroll-up (&optional arg)
"Display and scroll the slave buffer up.
(master-says 'scroll-up arg))
(defun master-says-scroll-down (&optional arg)
"Display and scroll the slave buffer down.
(master-says 'scroll-down arg))
(defun master-says-beginning-of-buffer (&optional arg)
"Display and move to the beginning of the slave buffer.
(master-says 'beginning-of-buffer arg))
(defun master-says-end-of-buffer (&optional arg)
"Display and move to the end of the slave buffer.
(master-says 'end-of-buffer arg))
(defun master-says-recenter (&optional arg)
"Recenter the slave buffer.
(master-says 'recenter arg))
(defun master-says (&optional command arg)
"Display slave buffer and execute COMMAND with ARG in its window."
(if (null (buffer-live-p (get-buffer master-of)))
(error "Slave buffer has disappeared")
(let ((window (selected-window)))
(if (not (eq (window-buffer window) (get-buffer master-of)))
(if command (condition-case nil (apply command arg) (error nil)))