annotate lisp/follow.el @ 79168:a14b49f75b09

(msb-menu-bar-update-buffers): Use global-buffers-menu-map. (msb-sort-by-directory, msb--choose-menu, msb--mode-menu-cond) (msb--most-recently-used-menu, msb--create-buffer-menu-2): Use with-current-buffer.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Mon, 22 Oct 2007 04:26:47 +0000
parents 6ddbf3d3f1a7
children 3e37b479924d
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36904
diff changeset
1 ;;; follow.el --- synchronize windows showing the same buffer
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
3 ;; Copyright (C) 1995, 1996, 1997, 1999, 2001, 2002, 2003, 2004,
75347
e3694f1cb928 Add 2007 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 73760
diff changeset
4 ;; 2005, 2006, 2007 Free Software Foundation, Inc.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
6 ;; Author: Anders Lindgren <andersl@andersl.com>
65538
84cee1f8c06a Change Maintainer field.
Richard M. Stallman <rms@gnu.org>
parents: 64762
diff changeset
7 ;; Maintainer: FSF (Anders' email bounces, Sep 2005)
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
8 ;; Created: 1995-05-25
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21937
diff changeset
9 ;; Keywords: display, window, minor-mode, convenience
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
10
14992
83b3924347a9 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14609
diff changeset
11 ;; This file is part of GNU Emacs.
83b3924347a9 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14609
diff changeset
12
83b3924347a9 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14609
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
78236
9355f9b7bbff Switch license to GPLv3 or later.
Glenn Morris <rgm@gnu.org>
parents: 78162
diff changeset
15 ;; the Free Software Foundation; either version 3, or (at your option)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16 ;; any later version.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
17
14992
83b3924347a9 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14609
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
14992
83b3924347a9 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 14609
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62495
diff changeset
25 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62495
diff changeset
26 ;; Boston, MA 02110-1301, USA.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 ;;{{{ Documentation
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
32 ;; `Follow mode' is a minor mode for Emacs and XEmacs that
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
33 ;; combines windows into one tall virtual window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
34 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
35 ;; The feeling of a "virtual window" has been accomplished by the use
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
36 ;; of two major techniques:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
37 ;;
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
38 ;; * The windows always display adjacent sections of the buffer.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
39 ;; This means that whenever one window is moved, all the
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
40 ;; others will follow. (Hence the name Follow mode.)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41 ;;
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
42 ;; * Should the point (cursor) end up outside a window, another
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
43 ;; window displaying that point is selected, if possible. This
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
44 ;; makes it possible to walk between windows using normal cursor
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
45 ;; movement commands.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
46 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
47 ;; Follow mode comes to its prime when a large screen and two
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
48 ;; side-by-side window are used. The user can, with the help of Follow
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
49 ;; mode, use two full-height windows as though they are one.
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
50 ;; Imagine yourself editing a large function, or section of text,
18028
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
51 ;; and being able to use 144 lines instead of the normal 72... (your
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
52 ;; mileage may vary).
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
53
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
54 ;; To test this package, make sure `follow' is loaded, or will be
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
55 ;; autoloaded when activated (see below). Then do the following:
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
57 ;; * Find your favorite file (preferably a long one).
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
58 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
59 ;; * Resize Emacs so that it will be wide enough for two full size
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
60 ;; columns. Delete the other windows and split the window with
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
61 ;; the commands `C-x 1 C-x 3'.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
62 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
63 ;; * Give the command:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
64 ;; M-x follow-mode <RETURN>
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
65 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
66 ;; * Now the display should look something like (assuming the text "71"
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
67 ;; is on line 71):
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
68 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
69 ;; +----------+----------+
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
70 ;; |1 |73 |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
71 ;; |2 |74 |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
72 ;; |3 |75 |
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
73 ;; ... ...
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
74 ;; |71 |143 |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
75 ;; |72 |144 |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
76 ;; +----------+----------+
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
77 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
78 ;; As you can see, the right-hand window starts at line 73, the line
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
79 ;; immediately below the end of the left-hand window. As long as
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
80 ;; `follow-mode' is active, the two windows will follow each other!
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
81 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
82 ;; * Play around and enjoy! Scroll one window and watch the other.
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
83 ;; Jump to the beginning or end. Press `Cursor down' at the last
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
84 ;; line of the left-hand window. Enter new lines into the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
85 ;; text. Enter long lines spanning several lines, or several
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
86 ;; windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
88 ;; * Should you find `Follow' mode annoying, just type
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
89 ;; M-x follow-mode <RETURN>
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
90 ;; to turn it off.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
91
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
92
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93 ;; The command `follow-delete-other-windows-and-split' maximises the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
94 ;; visible area of the current buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
96 ;; I recommend adding it, and `follow-mode', to hotkeys in the global
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
97 ;; key map. To do so, add the following lines (replacing `[f7]' and
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
98 ;; `[f8]' with your favorite keys) to the init file:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100 ;; (global-set-key [f8] 'follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
101 ;; (global-set-key [f7] 'follow-delete-other-windows-and-split)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
102
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
104 ;; There exist two system variables that control the appearence of
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
105 ;; lines wider than the window containing them. The default is to
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
106 ;; truncate long lines whenever a window isn't as wide as the frame.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
107 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108 ;; To make sure lines are never truncated, please place the following
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 ;; lines in your init file:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
111 ;; (setq truncate-lines nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
112 ;; (setq truncate-partial-width-windows nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
113
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
114
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
115 ;; Since the display of XEmacs is pixel-oriented, a line could be
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
116 ;; clipped in half at the bottom of the window.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
117 ;;
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
118 ;; To make XEmacs avoid clipping (normal) lines, please place the
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
119 ;; following line in your init-file:
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
120 ;;
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
121 ;; (setq pixel-vertical-clip-threshold 30)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
122
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
123
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 ;; The correct way to cofigurate Follow mode, or any other mode for
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
125 ;; that matter, is to create one or more functions that do
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
126 ;; whatever you would like to do. These functions are then added to
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127 ;; a hook.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
128 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
129 ;; When `Follow' mode is activated, functions stored in the hook
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130 ;; `follow-mode-hook' are called. When it is deactivated
48409
09f47b7d547d Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 47628
diff changeset
131 ;; `follow-mode-off-hook' is run.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133 ;; The keymap `follow-key-map' contains key bindings activated by
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134 ;; `follow-mode'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
136 ;; Example:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
137 ;; (add-hook 'follow-mode-hook 'my-follow-mode-hook)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139 ;; (defun my-follow-mode-hook ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 ;; (define-key follow-mode-map "\C-ca" 'your-favorite-function)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 ;; (define-key follow-mode-map "\C-cb" 'another-function))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 ;; Usage:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 ;;
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
146 ;; To activate, issue the command "M-x follow-mode"
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
147 ;; and press Return. To deactivate, do it again.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
148 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
149 ;; The following is a list of commands useful when follow-mode is active.
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
150 ;;
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
151 ;; follow-scroll-up C-c . C-v
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
152 ;; Scroll text in a Follow mode window chain up.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
153 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
154 ;; follow-scroll-down C-c . v
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155 ;; Like `follow-scroll-up', but in the other direction.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
156 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
157 ;; follow-delete-other-windows-and-split C-c . 1
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
158 ;; Maximize the visible area of the current buffer,
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
159 ;; and enter Follow mode. This is a very convenient
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
160 ;; way to start Follow mode, hence we recomend that
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
161 ;; this command be added to the global keymap.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 ;; follow-recenter C-c . C-l
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 ;; Place the point in the center of the middle window,
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
165 ;; or a specified number of lines from either top or bottom.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
167 ;; follow-switch-to-buffer C-c . b
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
168 ;; Switch buffer in all windows displaying the current buffer
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
169 ;; in this frame.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
170 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
171 ;; follow-switch-to-buffer-all C-c . C-b
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
172 ;; Switch buffer in all windows in the selected frame.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
173 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174 ;; follow-switch-to-current-buffer-all
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 ;; Show the current buffer in all windows on the current
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
176 ;; frame and turn on `follow-mode'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
178 ;; follow-first-window C-c . <
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
179 ;; Select the first window in the frame showing the same buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
180 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
181 ;; follow-last-window C-c . >
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182 ;; Select the last window in the frame showing the same buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 ;; follow-next-window C-c . n
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 ;; Select the next window in the frame showing the same buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187 ;; follow-previous-window C-c . p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 ;; Select the previous window showing the same buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 ;; Well, it seems ok, but what if I really want to look at two different
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
192 ;; positions in the text? Here are two simple methods to use:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 ;; 1) Use multiple frames; `follow' mode only affects windows displayed
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195 ;; in the same frame. (My apoligies to you who can't use frames.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197 ;; 2) Bind `follow-mode' to key so you can turn it off whenever
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
198 ;; you want to view two locations. Of course, `follow' mode can
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
199 ;; be reactivated by hitting the same key again.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
201 ;; Example from my ~/.emacs:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
202 ;; (global-set-key [f8] 'follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
203
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
204
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
205 ;; Implementation:
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
206 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
207 ;; In an ideal world, follow mode would have been implemented in the
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
208 ;; kernel of the display routines, making sure that the windows (using
78774
a4cabf2eaad3 Fix typos in file header commentary.
Eli Zaretskii <eliz@gnu.org>
parents: 78772
diff changeset
209 ;; follow mode) ALWAYS are aligned. On planet Earth, however, we must
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
210 ;; accept a solution where we ALMOST ALWAYS can make sure that the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211 ;; windows are aligned.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
213 ;; Follow mode does this in three places:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
214 ;; 1) After each user command.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
215 ;; 2) After a process output has been perfomed.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
216 ;; 3) When a scrollbar has been moved.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
217 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
218 ;; This will cover most situations. (Let me know if there are other
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
219 ;; situations that should be covered.)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
221 ;; Note that only the selected window is checked, for the reason of
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
222 ;; efficiency and code complexity. (I.e. it is possible to make a
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
223 ;; non-selected windows unaligned. It will, however, pop right back
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224 ;; when it is selected.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
226 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
227
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
228 ;;; Code:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
229
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230 ;;{{{ Preliminaries
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
231
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
232 ;; Make the compiler shut up!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
233 ;; There are two strategies:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
234 ;; 1) Shut warnings off completely.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
235 ;; 2) Handle each warning separately.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
236 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
237 ;; Since I would like to see real errors, I've selected the latter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
238 ;; method.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
239 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
240 ;; The problem with undefined variables and functions has been solved
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
241 ;; by using `set', `symbol-value' and `symbol-function' rather than
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
242 ;; `setq' and direct references to variables and functions.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
243 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
244 ;; For example:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
245 ;; (if (boundp 'foo) ... (symbol-value 'foo) )
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
246 ;; (set 'foo ...) <-- XEmacs doesn't fall for this one.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
247 ;; (funcall (symbol-function 'set) 'bar ...)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
248 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
249 ;; Note: When this file is interpreted, `eval-when-compile' is
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
250 ;; evaluted. Since it doesn't hurt to evaluate it, but it is a bit
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
251 ;; annoying, we test if the byte-compiler has been loaded. This can,
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
252 ;; of course, lead to some occasional unintended evaluation...
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254 ;; Should someone come up with a better solution, please let me
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255 ;; know.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
256
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257 (eval-when-compile
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 (if (or (featurep 'bytecomp)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259 (featurep 'byte-compile))
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
260 (cond ((featurep 'xemacs)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261 ;; Make XEmacs shut up! I'm using standard Emacs
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
262 ;; functions, they are NOT obsolete!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
263 (if (eq (get 'force-mode-line-update 'byte-compile)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
264 'byte-compile-obsolete)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
265 (put 'force-mode-line-update 'byte-compile 'nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
266 (if (eq (get 'frame-first-window 'byte-compile)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
267 'byte-compile-obsolete)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
268 (put 'frame-first-window 'byte-compile 'nil))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
269
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
270 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
271 ;;{{{ Variables
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
272
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
273 (defgroup follow nil
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
274 "Synchronize windows showing the same buffer."
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
275 :prefix "follow-"
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21937
diff changeset
276 :group 'windows
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 21937
diff changeset
277 :group 'convenience)
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
278
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
279 (defcustom follow-mode-hook nil
79020
f59eafc3c43c (follow-mode-hook, follow-mode): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 79004
diff changeset
280 "Normal hook run by `follow-mode'."
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
281 :type 'hook
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
282 :group 'follow)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
283
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
284 (defcustom follow-mode-off-hook nil
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
285 "Hooks to run when Follow mode is turned off."
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
286 :type 'hook
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
287 :group 'follow)
79020
f59eafc3c43c (follow-mode-hook, follow-mode): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 79004
diff changeset
288 (make-obsolete-variable 'follow-mode-off-hook 'follow-mode-hook "22.2")
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
289
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
290 ;;{{{ Keymap/Menu
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
291
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
292 ;; Define keys for the follow-mode minor mode map and replace some
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
293 ;; functions in the global map. All `follow' mode special functions
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
294 ;; can be found on (the somewhat cumbersome) "C-c . <key>"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
295 ;; (Control-C dot <key>). (As of Emacs 19.29 the keys
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
296 ;; C-c <punctuation character> are reserved for minor modes.)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
297 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
298 ;; To change the prefix, redefine `follow-mode-prefix' before
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
299 ;; `follow' is loaded, or see the section on `follow-mode-hook'
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
300 ;; above for an example of how to bind the keys the way you like.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
301 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
302 ;; Please note that the keymap is defined the first time this file is
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
303 ;; loaded. Also note that the only legal way to manipulate the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
304 ;; keymap is to use `define-key'. Don't change it using `setq' or
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
305 ;; similar!
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
306
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
307 (defcustom follow-mode-prefix "\C-c."
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
308 "Prefix key to use for follow commands in Follow mode.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
309 The value of this variable is checked as part of loading Follow mode.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
310 After that, changing the prefix key requires manipulating keymaps."
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
311 :type 'string
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
312 :group 'follow)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
313
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
314 (defvar follow-mode-map
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
315 (let ((mainmap (make-sparse-keymap))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
316 (map (make-sparse-keymap)))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
317 (define-key map "\C-v" 'follow-scroll-up)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
318 (define-key map "\M-v" 'follow-scroll-down)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
319 (define-key map "v" 'follow-scroll-down)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
320 (define-key map "1" 'follow-delete-other-windows-and-split)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
321 (define-key map "b" 'follow-switch-to-buffer)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
322 (define-key map "\C-b" 'follow-switch-to-buffer-all)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
323 (define-key map "\C-l" 'follow-recenter)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
324 (define-key map "<" 'follow-first-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
325 (define-key map ">" 'follow-last-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
326 (define-key map "n" 'follow-next-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
327 (define-key map "p" 'follow-previous-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
328
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
329 (define-key mainmap follow-mode-prefix map)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
330
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
331 ;; Replace the standard `end-of-buffer', when in Follow mode. (I
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
332 ;; don't see the point in trying to replace every function that
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
333 ;; could be enhanced in Follow mode. End-of-buffer is a special
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
334 ;; case since it is very simple to define and it greatly enhances
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
335 ;; the look and feel of Follow mode.)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
336 (define-key mainmap [remap end-of-buffer] 'follow-end-of-buffer)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
337
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
338 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
339 ;; The menu.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
340 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
341
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
342 (if (not (featurep 'xemacs))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
343
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
344 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
345 ;; Emacs
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
346 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
347 (let ((menumap (funcall (symbol-function 'make-sparse-keymap)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
348 "Follow"))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
349 (count 0)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
350 id)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
351 (mapcar
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
352 (function
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
353 (lambda (item)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
354 (setq id
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
355 (or (cdr item)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
356 (progn
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
357 (setq count (+ count 1))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
358 (intern (format "separator-%d" count)))))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
359 (define-key menumap (vector id) item)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
360 (or (eq id 'follow-mode)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
361 (put id 'menu-enable 'follow-mode))))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
362 ;; In reverse order:
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
363 '(("Toggle Follow mode" . follow-mode)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
364 ("--")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
365 ("Recenter" . follow-recenter)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
366 ("--")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
367 ("Previous Window" . follow-previous-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
368 ("Next Windows" . follow-next-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
369 ("Last Window" . follow-last-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
370 ("First Window" . follow-first-window)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
371 ("--")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
372 ("Switch To Buffer (all windows)"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
373 . follow-switch-to-buffer-all)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
374 ("Switch To Buffer" . follow-switch-to-buffer)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
375 ("--")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
376 ("Delete Other Windows and Split"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
377 . follow-delete-other-windows-and-split)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
378 ("--")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
379 ("Scroll Down" . follow-scroll-down)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
380 ("Scroll Up" . follow-scroll-up)))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
381
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
382 ;; If there is a `tools' menu, we use it. However, we can't add a
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
383 ;; minor-mode specific item to it (it's broken), so we make the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
384 ;; contents ghosted when not in use, and add ourselves to the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
385 ;; global map. If no `tools' menu is present, just make a
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
386 ;; top-level menu visible when the mode is activated.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
387
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
388 (let ((tools-map (lookup-key (current-global-map) [menu-bar tools]))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
389 (last nil))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
390 (if (sequencep tools-map)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
391 (progn
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
392 ;; Find the last entry in the menu and store it in `last'.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
393 (mapcar (function
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
394 (lambda (x)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
395 (setq last (or (cdr-safe
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
396 (cdr-safe
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
397 (cdr-safe x)))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
398 last))))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
399 tools-map)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
400 (if last
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
401 (progn
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
402 (funcall (symbol-function 'define-key-after)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
403 tools-map [separator-follow] '("--") last)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
404 (funcall (symbol-function 'define-key-after)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
405 tools-map [follow] (cons "Follow" menumap)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
406 'separator-follow))
79149
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
407 ;; Didn't find the last item, adding to the top of
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
408 ;; tools. (This will probably never happen...)
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
409 (define-key (current-global-map) [menu-bar tools follow]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
410 (cons "Follow" menumap))))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
411 ;; No tools menu, add "Follow" to the menubar.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
412 (define-key mainmap [menu-bar follow]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
413 (cons "Follow" menumap)))))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
414
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
415 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
416 ;; XEmacs.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
417 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
418
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
419 ;; place the menu in the `Tools' menu.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
420 (let ((menu '("Follow"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
421 :filter follow-menu-filter
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
422 ["Scroll Up" follow-scroll-up t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
423 ["Scroll Down" follow-scroll-down t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
424 ["Delete Other Windows and Split"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
425 follow-delete-other-windows-and-split t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
426 ["Switch To Buffer" follow-switch-to-buffer t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
427 ["Switch To Buffer (all windows)"
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
428 follow-switch-to-buffer-all t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
429 ["First Window" follow-first-window t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
430 ["Last Window" follow-last-window t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
431 ["Next Windows" follow-next-window t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
432 ["Previous Window" follow-previous-window t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
433 ["Recenter" follow-recenter t]
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
434 ["Deactivate" follow-mode t])))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
435
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
436 ;; Why not just `(set-buffer-menubar current-menubar)'? The
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
437 ;; question is a very good question. The reason is that under
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
438 ;; Emacs, neither `set-buffer-menubar' nor
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
439 ;; `current-menubar' is defined, hence the byte-compiler will
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
440 ;; warn.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
441 (funcall (symbol-function 'set-buffer-menubar)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
442 (symbol-value 'current-menubar))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
443 (funcall (symbol-function 'add-submenu) '("Tools") menu))
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
444
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
445 ;; When the mode is not activated, only one item is visible:
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
446 ;; "Activate".
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
447 (defun follow-menu-filter (menu)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
448 (if follow-mode
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
449 menu
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
450 '(["Activate " follow-mode t]))))
73760
6165f9a35bd8 (follow-avoid-tail-recenter-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 70226
diff changeset
451
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
452 mainmap)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
453 "Minor mode keymap for Follow mode.")
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
454
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
455 ;;}}}
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
456
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
457 (defcustom follow-mode-line-text " Follow"
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
458 "Text shown in the mode line when Follow mode is active.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
459 Defaults to \" Follow\". Examples of other values
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
460 are \" Fw\", or simply \"\"."
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
461 :type 'string
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
462 :group 'follow)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
463
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
464 (defcustom follow-auto nil
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
465 "Non-nil activates Follow mode whenever a file is loaded."
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
466 :type 'boolean
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
467 :group 'follow)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
468
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
469 (defcustom follow-intercept-processes (fboundp 'start-process)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
470 "When non-nil, Follow mode will monitor process output."
21088
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
471 :type 'boolean
ac1673121774 Customized.
Stephen Eglen <stephen@gnu.org>
parents: 18144
diff changeset
472 :group 'follow)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
473
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
474 (defvar follow-avoid-tail-recenter-p (not (featurep 'xemacs))
73760
6165f9a35bd8 (follow-avoid-tail-recenter-p): Fix typo in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 70226
diff changeset
475 "*When non-nil, patch Emacs so that tail windows won't be recentered.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
476
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
477 A \"tail window\" is a window that displays only the end of
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
478 the buffer. Normally it is practical for the user that empty
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
479 windows are recentered automatically. However, when using
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
480 Follow mode it breaks the display when the end is displayed
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
481 in a window \"above\" the last window. This is for
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
482 example the case when displaying a short page in info.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
483
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
484 Must be set before Follow mode is loaded.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
485
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
486 Please note that it is not possible to fully prevent Emacs from
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
487 recentering empty windows. Please report if you find a repeatable
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
488 situation in which Emacs recenters empty windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
489
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
490 XEmacs, as of 19.12, does not recenter windows, good!")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
491
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
492 (defvar follow-cache-command-list
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
493 '(next-line previous-line forward-char backward-char)
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
494 "List of commands that don't require recalculation.
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
495
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
496 In order to be able to use the cache, a command should not change the
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
497 contents of the buffer, nor should it change selected window or current
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
498 buffer.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
499
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
500 The commands in this list are checked at load time.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
501
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
502 To mark other commands as suitable for caching, set the symbol
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
503 property `follow-mode-use-cache' to non-nil.")
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
504
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
505 (defvar follow-debug nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
506 "*Non-nil when debugging Follow mode.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
507
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
508
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
509 ;; Internal variables:
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
510
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
511 (defvar follow-internal-force-redisplay nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
512 "True when Follow mode should redisplay the windows.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
513
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
514 (defvar follow-process-filter-alist '()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
515 "The original filters for processes intercepted by Follow mode.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
516
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
517 (defvar follow-active-menu nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
518 "The menu visible when Follow mode is active.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
519
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
520 (defvar follow-deactive-menu nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
521 "The menu visible when Follow mode is deactivated.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
522
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
523 (defvar follow-inside-post-command-hook nil
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
524 "Non-nil when inside Follow modes `post-command-hook'.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
525 Used by `follow-window-size-change'.")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
526
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
527 (defvar follow-windows-start-end-cache nil
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
528 "Cache used by `follow-window-start-end'.")
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
529
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
530 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
531 ;;{{{ Debug messages
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
532
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
533 ;; This inline function must be as small as possible!
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
534 ;; Maybe we should define a macro that expands to nil if
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
535 ;; the variable is not set.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
536
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
537 (defsubst follow-debug-message (&rest args)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
538 "Like message, but only active when `follow-debug' is non-nil."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
539 (if (and (boundp 'follow-debug) follow-debug)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
540 (apply 'message args)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
541
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
542 ;;}}}
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
543 ;;{{{ Cache
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
544
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
545 (dolist (cmd follow-cache-command-list)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
546 (put cmd 'follow-mode-use-cache t))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
547
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
548 ;;}}}
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
549
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
550 ;;{{{ The mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
551
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
552 ;;;###autoload
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
553 (defun turn-on-follow-mode ()
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
554 "Turn on Follow mode. Please see the function `follow-mode'."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
555 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
556 (follow-mode 1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
557
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
558
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
559 ;;;###autoload
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
560 (defun turn-off-follow-mode ()
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
561 "Turn off Follow mode. Please see the function `follow-mode'."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
562 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
563 (follow-mode -1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
564
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
565 (put 'follow-mode 'permanent-local t)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
566 ;;;###autoload
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
567 (define-minor-mode follow-mode
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
568 "Minor mode that combines windows into one tall virtual window.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
569
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
570 The feeling of a \"virtual window\" has been accomplished by the use
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
571 of two major techniques:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
572
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
573 * The windows always displays adjacent sections of the buffer.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
574 This means that whenever one window is moved, all the
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
575 others will follow. (Hence the name Follow mode.)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
576
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
577 * Should the point (cursor) end up outside a window, another
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
578 window displaying that point is selected, if possible. This
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
579 makes it possible to walk between windows using normal cursor
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
580 movement commands.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
581
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
582 Follow mode comes to its prime when used on a large screen and two
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
583 side-by-side windows are used. The user can, with the help of Follow
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
584 mode, use two full-height windows as though they would have been
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
585 one. Imagine yourself editing a large function, or section of text,
18028
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
586 and being able to use 144 lines instead of the normal 72... (your
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
587 mileage may vary).
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
588
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
589 To split one large window into two side-by-side windows, the commands
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
590 `\\[split-window-horizontally]' or \
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
591 `M-x follow-delete-other-windows-and-split' can be used.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
592
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
593 Only windows displayed in the same frame follow each other.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
594
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
595 If the variable `follow-intercept-processes' is non-nil, Follow mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
596 will listen to the output of processes and redisplay accordingly.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
597 \(This is the default.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
598
79020
f59eafc3c43c (follow-mode-hook, follow-mode): Doc fixes.
Juanma Barranquero <lekktu@gmail.com>
parents: 79004
diff changeset
599 This command runs the normal hook `follow-mode-hook'.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
600
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
601 Keys specific to Follow mode:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
602 \\{follow-mode-map}"
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
603 :keymap follow-mode-map
79004
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
604 (when (and follow-mode follow-intercept-processes)
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
605 (follow-intercept-process-output))
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
606 (cond (follow-mode ; On
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
607 ;; XEmacs: If this is non-nil, the window will scroll before
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
608 ;; the point will have a chance to get into the next window.
79004
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
609 (when (boundp 'scroll-on-clipped-lines)
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
610 (setq scroll-on-clipped-lines nil))
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
611 (force-mode-line-update)
79004
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
612 (add-hook 'post-command-hook 'follow-post-command-hook t))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
613
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
614 ((not follow-mode) ; Off
79004
d771a0b43ed5 (follow-mode): Don't run hooks twice. Use `when'.
Juanma Barranquero <lekktu@gmail.com>
parents: 78774
diff changeset
615 (force-mode-line-update))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
616
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
617 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
618 ;;{{{ Find file hook
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
619
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
620 ;; This will start follow-mode whenever a new file is loaded, if
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
621 ;; the variable `follow-auto' is non-nil.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
622
60902
7160fe3a7ef1 find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55257
diff changeset
623 (add-hook 'find-file-hook 'follow-find-file-hook t)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
624
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
625 (defun follow-find-file-hook ()
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
626 "Find-file hook for Follow mode. See the variable `follow-auto'."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
627 (if follow-auto (follow-mode t)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
628
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
629 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
630
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
631 ;;{{{ User functions
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
632
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
633 ;;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
634 ;;; User functions usable when in Follow mode.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
635 ;;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
636
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
637 ;;{{{ Scroll
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
638
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
639 ;; `scroll-up' and `-down', but for windows in Follow mode.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
640 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
641 ;; Almost like the real thing, excpet when the cursor ends up outside
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
642 ;; the top or bottom... In our case however, we end up outside the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
643 ;; window and hence we are recenterd. Should we let `recenter' handle
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
644 ;; the point position we would never leave the selected window. To do
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
645 ;; it ourselves we would need to do our own redisplay, which is easier
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
646 ;; said than done. (Why didn't I do a real display abstraction from
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
647 ;; the beginning?)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
648 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
649 ;; We must sometimes set `follow-internal-force-redisplay', otherwise
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
650 ;; our post-command-hook will move our windows back into the old
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
651 ;; position... (This would also be corrected if we would have had a
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
652 ;; good redisplay abstraction.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
653
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
654 (defun follow-scroll-up (&optional arg)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
655 "Scroll text in a Follow mode window chain up.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
656
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
657 If called with no ARG, the `next-screen-context-lines' last lines of
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
658 the bottom window in the chain will be visible in the top window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
659
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
660 If called with an argument, scroll ARG lines up.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
661 Negative ARG means scroll downward.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
662
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
663 Works like `scroll-up' when not in Follow mode."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
664 (interactive "P")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
665 (cond ((not (and (boundp 'follow-mode) follow-mode))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
666 (scroll-up arg))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
667 (arg
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
668 (save-excursion (scroll-up arg))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
669 (setq follow-internal-force-redisplay t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
670 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
671 (let* ((windows (follow-all-followers))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
672 (end (window-end (car (reverse windows)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
673 (if (eq end (point-max))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
674 (signal 'end-of-buffer nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
675 (select-window (car windows))
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
676 ;; `window-end' might return nil.
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
677 (if end
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
678 (goto-char end))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
679 (vertical-motion (- next-screen-context-lines))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
680 (set-window-start (car windows) (point)))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
681
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
682
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
683 (defun follow-scroll-down (&optional arg)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
684 "Scroll text in a Follow mode window chain down.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
685
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
686 If called with no ARG, the `next-screen-context-lines' top lines of
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
687 the top window in the chain will be visible in the bottom window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
688
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
689 If called with an argument, scroll ARG lines down.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
690 Negative ARG means scroll upward.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
691
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
692 Works like `scroll-up' when not in Follow mode."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
693 (interactive "P")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
694 (cond ((not (and (boundp 'follow-mode) follow-mode))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
695 (scroll-up arg))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
696 (arg
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
697 (save-excursion (scroll-down arg)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
698 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
699 (let* ((windows (follow-all-followers))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
700 (win (car (reverse windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
701 (start (window-start (car windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
702 (if (eq start (point-min))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
703 (signal 'beginning-of-buffer nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
704 (select-window win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
705 (goto-char start)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
706 (vertical-motion (- (- (window-height win)
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
707 1
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
708 next-screen-context-lines)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
709 (set-window-start win (point))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
710 (goto-char start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
711 (vertical-motion (- next-screen-context-lines 1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
712 (setq follow-internal-force-redisplay t))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
713
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
714 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
715 ;;{{{ Buffer
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
716
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
717 ;;;###autoload
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
718 (defun follow-delete-other-windows-and-split (&optional arg)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
719 "Create two side by side windows and enter Follow mode.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
720
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
721 Execute this command to display as much as possible of the text
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
722 in the selected window. All other windows, in the current
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
723 frame, are deleted and the selected window is split in two
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
724 side-by-side windows. Follow mode is activated, hence the
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
725 two windows always will display two successive pages.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
726 \(If one window is moved, the other one will follow.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
727
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
728 If ARG is positive, the leftmost window is selected. If negative,
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
729 the rightmost is selected. If ARG is nil, the leftmost window is
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
730 selected if the original window is the first one in the frame.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
731
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
732 To bind this command to a hotkey, place the following line
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
733 in your `~/.emacs' file, replacing [f7] by your favourite key:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
734 (global-set-key [f7] 'follow-delete-other-windows-and-split)"
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
735 (interactive "P")
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
736 (let ((other (or (and (null arg)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
737 (not (eq (selected-window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
738 (frame-first-window (selected-frame)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
739 (and arg
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
740 (< (prefix-numeric-value arg) 0))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
741 (start (window-start)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
742 (delete-other-windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
743 (split-window-horizontally)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
744 (if other
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
745 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
746 (other-window 1)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
747 (set-window-start (selected-window) start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
748 (setq follow-internal-force-redisplay t)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
749 (follow-mode 1)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
750
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
751 (defun follow-switch-to-buffer (buffer)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
752 "Show BUFFER in all windows in the current Follow mode window chain."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
753 (interactive "BSwitch to Buffer: ")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
754 (let ((orig-window (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
755 (windows (follow-all-followers)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
756 (while windows
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
757 (select-window (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
758 (switch-to-buffer buffer)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
759 (setq windows (cdr windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
760 (select-window orig-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
761
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
762
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
763 (defun follow-switch-to-buffer-all (&optional buffer)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
764 "Show BUFFER in all windows on this frame.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
765 Defaults to current buffer."
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
766 (interactive (list (read-buffer "Switch to Buffer: "
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
767 (current-buffer))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
768 (or buffer (setq buffer (current-buffer)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
769 (let ((orig-window (selected-window)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
770 (walk-windows
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
771 (function
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
772 (lambda (win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
773 (select-window win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
774 (switch-to-buffer buffer))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
775 (select-window orig-window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
776 (follow-redisplay)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
777
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
778
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
779 (defun follow-switch-to-current-buffer-all ()
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
780 "Show current buffer in all windows on this frame, and enter Follow mode.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
781
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
782 To bind this command to a hotkey place the following line
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
783 in your `~/.emacs' file:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
784 (global-set-key [f7] 'follow-switch-to-current-buffer-all)"
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
785 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
786 (or (and (boundp 'follow-mode) follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
787 (follow-mode 1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
788 (follow-switch-to-buffer-all))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
789
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
790 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
791 ;;{{{ Movement
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
792
79149
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
793 ;; Note, these functions are not very useful, at least not unless you
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
794 ;; rebind the rather cumbersome key sequence `C-c . p'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
795
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
796 (defun follow-next-window ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
797 "Select the next window showing the same buffer."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
798 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
799 (let ((succ (cdr (follow-split-followers (follow-all-followers)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
800 (if succ
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
801 (select-window (car succ))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
802 (error "%s" "No more windows"))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
803
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
804
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
805 (defun follow-previous-window ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
806 "Select the previous window showing the same buffer."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
807 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
808 (let ((pred (car (follow-split-followers (follow-all-followers)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
809 (if pred
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
810 (select-window (car pred))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
811 (error "%s" "No more windows"))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
812
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
813
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
814 (defun follow-first-window ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
815 "Select the first window in the frame showing the same buffer."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
816 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
817 (select-window (car (follow-all-followers))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
818
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
819
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
820 (defun follow-last-window ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
821 "Select the last window in the frame showing the same buffer."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
822 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
823 (select-window (car (reverse (follow-all-followers)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
824
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
825 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
826 ;;{{{ Redraw
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
827
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
828 (defun follow-recenter (&optional arg)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
829 "Recenter the middle window around point.
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
830 Rearrange all other windows around the middle window.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
831
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
832 With a positive argument, place the current line ARG lines
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
833 from the top. With a negative argument, place it -ARG lines
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
834 from the bottom."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
835 (interactive "P")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
836 (if arg
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
837 (let ((p (point))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
838 (arg (prefix-numeric-value arg)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
839 (if (>= arg 0)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
840 ;; Recenter relative to the top.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
841 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
842 (follow-first-window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
843 (goto-char p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
844 (recenter arg))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
845 ;; Recenter relative to the bottom.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
846 (follow-last-window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
847 (goto-char p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
848 (recenter arg)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
849 ;; Otherwise, our post-command-hook will move the window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
850 ;; right back.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
851 (setq follow-internal-force-redisplay t)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
852 ;; Recenter in the middle.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
853 (let* ((dest (point))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
854 (windows (follow-all-followers))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
855 (win (nth (/ (- (length windows) 1) 2) windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
856 (select-window win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
857 (goto-char dest)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
858 (recenter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
859 ;;(setq follow-internal-force-redisplay t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
860 )))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
861
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
862
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
863 (defun follow-redraw ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
864 "Arrange windows displaying the same buffer in successor order.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
865 This function can be called even if the buffer is not in Follow mode.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
866
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
867 Hopefully, there should be no reason to call this function when in
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
868 Follow mode since the windows should always be aligned."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
869 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
870 (sit-for 0)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
871 (follow-redisplay))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
872
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
873 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
874 ;;{{{ End of buffer
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
875
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
876 (defun follow-end-of-buffer (&optional arg)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
877 "Move point to the end of the buffer, Follow mode style.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
878
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
879 If the end is not visible, it will be displayed in the last possible
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
880 window in the Follow mode window chain.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
881
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
882 The mark is left at the previous position. With arg N, put point N/10
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
883 of the way from the true end."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
884 (interactive "P")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
885 (let ((followers (follow-all-followers))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
886 (pos (point)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
887 (cond (arg
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
888 (select-window (car (reverse followers))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
889 ((follow-select-if-end-visible
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
890 (follow-windows-start-end followers)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
891 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
892 (select-window (car (reverse followers)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
893 (goto-char pos)
61772
bd5a90076cd2 (follow-end-of-buffer): Use with-no-warnings.
Richard M. Stallman <rms@gnu.org>
parents: 60902
diff changeset
894 (with-no-warnings
bd5a90076cd2 (follow-end-of-buffer): Use with-no-warnings.
Richard M. Stallman <rms@gnu.org>
parents: 60902
diff changeset
895 (end-of-buffer arg))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
896
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
897 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
898
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
899 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
900
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
901 ;;{{{ Display
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
902
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
903 ;;;; The display routines
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
904
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
905 ;;{{{ Information gathering functions
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
906
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
907 (defun follow-all-followers (&optional testwin)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
908 "Return all windows displaying the same buffer as the TESTWIN.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
909 The list contains only windows displayed in the same frame as TESTWIN.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
910 If TESTWIN is nil the selected window is used."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
911 (or (and testwin (window-live-p testwin))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
912 (setq testwin (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
913 (let* ((top (frame-first-window (window-frame testwin)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
914 (win top)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
915 (done nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
916 (windows '())
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
917 (buffer (window-buffer testwin)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
918 (while (and (not done) win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
919 (if (eq (window-buffer win) buffer)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
920 (setq windows (cons win windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
921 (setq win (next-window win 'not))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
922 (if (eq win top)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
923 (setq done t)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
924 (nreverse windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
925
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
926
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
927 (defun follow-split-followers (windows &optional win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
928 "Split the WINDOWS into the sets: predecessors and successors.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
929 Return `(PRED . SUCC)' where `PRED' and `SUCC' are ordered starting
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
930 from the selected window."
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
931 (or win
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
932 (setq win (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
933 (let ((pred '()))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
934 (while (not (eq (car windows) win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
935 (setq pred (cons (car windows) pred))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
936 (setq windows (cdr windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
937 (cons pred (cdr windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
938
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
939
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
940 ;; This function is optimized function for speed!
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
941
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
942 (defun follow-calc-win-end (&optional win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
943 "Calculate the presumed window end for WIN.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
944
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
945 Actually, the position returned is the start of the next
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
946 window, normally is the end plus one.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
947
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
948 If WIN is nil, the selected window is used.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
949
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
950 Returns (end-pos end-of-buffer-p)"
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
951 (if (featurep 'xemacs)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
952 ;; XEmacs can calculate the end of the window by using
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
953 ;; the 'guarantee options. GOOD!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
954 (let ((end (window-end win t)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
955 (if (= end (funcall (symbol-function 'point-max)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
956 (window-buffer win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
957 (list end t)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
958 (list (+ end 1) nil)))
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
959 ;; Emacs: We have to calculate the end by ourselves.
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
960 ;; This code works on both XEmacs and Emacs, but now
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
961 ;; that XEmacs has got custom-written code, this could
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
962 ;; be optimized for Emacs.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
963 (let ((orig-win (and win (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
964 height
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
965 buffer-end-p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
966 (if win (select-window win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
967 (prog1
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
968 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
969 (goto-char (window-start))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
970 (setq height (- (window-height) 1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
971 (setq buffer-end-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
972 (if (bolp)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
973 (not (= height (vertical-motion height)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
974 (save-restriction
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
975 ;; Fix a mis-feature in `vertical-motion':
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
976 ;; The start of the window is assumed to
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
977 ;; coinside with the start of a line.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
978 (narrow-to-region (point) (point-max))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
979 (not (= height (vertical-motion height))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
980 (list (point) buffer-end-p))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
981 (if orig-win
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
982 (select-window orig-win))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
983
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
984
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
985 ;; Can't use `save-window-excursion' since it triggers a redraw.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
986 (defun follow-calc-win-start (windows pos win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
987 "Calculate where WIN will start if the first in WINDOWS start at POS.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
988
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
989 If WIN is nil the point below all windows is returned."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
990 (let (start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
991 (while (and windows (not (eq (car windows) win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
992 (setq start (window-start (car windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
993 (set-window-start (car windows) pos 'noforce)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
994 (setq pos (car (inline (follow-calc-win-end (car windows)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
995 (set-window-start (car windows) start 'noforce)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
996 (setq windows (cdr windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
997 pos))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
998
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
999
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1000 ;; The result from `follow-windows-start-end' is cached when using
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1001 ;; a handful simple commands, like cursor movement commands.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1002
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1003 (defsubst follow-cache-valid-p (windows)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1004 "Test if the cached value of `follow-windows-start-end' can be used.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1005 Note that this handles the case when the cache has been set to nil."
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1006 (let ((res t)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1007 (cache follow-windows-start-end-cache))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1008 (while (and res windows cache)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1009 (setq res (and (eq (car windows)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1010 (car (car cache)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1011 (eq (window-start (car windows))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1012 (car (cdr (car cache))))))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1013 (setq windows (cdr windows))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1014 (setq cache (cdr cache)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1015 (and res (null windows) (null cache))))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1016
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1017
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1018 (defsubst follow-invalidate-cache ()
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1019 "Force `follow-windows-start-end' to recalculate the end of the window."
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1020 (setq follow-windows-start-end-cache nil))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1021
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1022
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1023 ;; Build a list of windows and their start and end positions.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1024 ;; Useful to avoid calculating start/end position whenever they are needed.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1025 ;; The list has the format:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1026 ;; ((Win Start End End-of-buffer-visible-p) ...)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1027
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1028 ;; Used to have a `save-window-excursion', but it obviously triggered
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1029 ;; redraws of the display. Check if I used it for anything.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1030
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1031
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1032 (defun follow-windows-start-end (windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1033 "Builds a list of (WIN START END BUFFER-END-P) for every window in WINDOWS."
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1034 (if (follow-cache-valid-p windows)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1035 follow-windows-start-end-cache
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1036 (let ((win-start-end '())
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1037 (orig-win (selected-window)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1038 (while windows
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1039 (select-window (car windows))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1040 (setq win-start-end
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1041 (cons (cons (car windows)
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1042 (cons (window-start)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1043 (follow-calc-win-end)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1044 win-start-end))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1045 (setq windows (cdr windows)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1046 (select-window orig-win)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1047 (setq follow-windows-start-end-cache (nreverse win-start-end))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1048 follow-windows-start-end-cache)))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1049
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1050
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1051 (defsubst follow-pos-visible (pos win win-start-end)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1052 "Non-nil when POS is visible in WIN."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1053 (let ((wstart-wend-bend (cdr (assq win win-start-end))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1054 (and (>= pos (car wstart-wend-bend))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1055 (or (< pos (car (cdr wstart-wend-bend)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1056 (nth 2 wstart-wend-bend)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1057
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1058
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1059 ;; By `aligned' we mean that for all adjecent windows, the end of the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1060 ;; first is equal with the start of the successor. The first window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1061 ;; should start at a full screen line.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1062
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1063 (defsubst follow-windows-aligned-p (win-start-end)
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1064 "Non-nil if the follower windows are aligned."
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1065 (let ((res t))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1066 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1067 (goto-char (window-start (car (car win-start-end))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1068 (if (bolp)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1069 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1070 (vertical-motion 0 (car (car win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1071 (setq res (eq (point) (window-start (car (car win-start-end)))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1072 (while (and res (cdr win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1073 ;; At least two followers left
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1074 (setq res (eq (car (cdr (cdr (car win-start-end))))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1075 (car (cdr (car (cdr win-start-end))))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1076 (setq win-start-end (cdr win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1077 res))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1078
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1079
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1080 ;; Check if the point is visible in all windows. (So that
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1081 ;; no one will be recentered.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1082
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1083 (defun follow-point-visible-all-windows-p (win-start-end)
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1084 "Non-nil when the `window-point' is visible in all windows."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1085 (let ((res t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1086 (while (and res win-start-end)
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1087 (setq res (follow-pos-visible (window-point (car (car win-start-end)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1088 (car (car win-start-end))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1089 win-start-end))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1090 (setq win-start-end (cdr win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1091 res))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1092
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1093
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1094 ;; Make sure WIN always starts at the beginning of an whole screen
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1095 ;; line. If WIN is not aligned the start is updated which probably
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1096 ;; will lead to a redisplay of the screen later on.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1097 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1098 ;; This is used with the first window in a follow chain. The reason
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1099 ;; is that we want to detect that the point is outside the window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1100 ;; (Without the update, the start of the window will move as the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1101 ;; user presses BackSpace, and the other window redisplay routines
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1102 ;; will move the start of the window in the wrong direction.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1103
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1104 (defun follow-update-window-start (win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1105 "Make sure that the start of WIN starts at a full screen line."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1106 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1107 (goto-char (window-start win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1108 (if (bolp)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1109 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1110 (vertical-motion 0 win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1111 (if (eq (point) (window-start win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1112 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1113 (vertical-motion 1 win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1114 (set-window-start win (point) 'noforce)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1115
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1116 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1117 ;;{{{ Selection functions
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1118
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1119 ;; Make a window in WINDOWS selected if it currently
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1120 ;; is displaying the position DEST.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1121 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1122 ;; We don't select a window if it just has been moved.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1123
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1124 (defun follow-select-if-visible (dest win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1125 "Select and return a window, if DEST is visible in it.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1126 Return the selected window."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1127 (let ((win nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1128 (while (and (not win) win-start-end)
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1129 ;; Don't select a window that was just moved. This makes it
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1130 ;; possible to later select the last window after a `end-of-buffer'
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1131 ;; command.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1132 (if (follow-pos-visible dest (car (car win-start-end)) win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1133 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1134 (setq win (car (car win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1135 (select-window win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1136 (setq win-start-end (cdr win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1137 win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1138
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1139
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1140 ;; Lets select a window showing the end. Make sure we only select it if it
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1141 ;; it wasn't just moved here. (i.e. M-> shall not unconditionally place
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1142 ;; the point in the selected window.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1143 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1144 ;; (Compability cludge: in Emacs `window-end' is equal to `point-max';
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1145 ;; in XEmacs, it is equal to `point-max + 1'. Should I really bother
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1146 ;; checking `window-end' now when I check `end-of-buffer' explicitly?)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1147
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1148 (defun follow-select-if-end-visible (win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1149 "Select and return a window, if end is visible in it."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1150 (let ((win nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1151 (while (and (not win) win-start-end)
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1152 ;; Don't select a window that was just moved. This makes it
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1153 ;; possible to later select the last window after a `end-of-buffer'
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1154 ;; command.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1155 (if (and (eq (point-max) (nth 2 (car win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1156 (nth 3 (car win-start-end))
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1157 ;; `window-end' might return nil.
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1158 (let ((end (window-end (car (car win-start-end)))))
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1159 (and end
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1160 (eq (point-max) (min (point-max) end)))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1161 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1162 (setq win (car (car win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1163 (select-window win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1164 (setq win-start-end (cdr win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1165 win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1166
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1167
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1168 ;; Select a window that will display the point if the windows would
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1169 ;; be redisplayed with the first window fixed. This is useful for
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1170 ;; example when the user has pressed return at the bottom of a window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1171 ;; as the point is not visible in any window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1172
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1173 (defun follow-select-if-visible-from-first (dest windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1174 "Select and return a window with DEST, if WINDOWS are redrawn from top."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1175 (let ((win nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1176 end-pos-end-p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1177 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1178 (goto-char (window-start (car windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1179 ;; Make sure the line start in the beginning of a real screen
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1180 ;; line.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1181 (vertical-motion 0 (car windows))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1182 (if (< dest (point))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1183 ;; Above the start, not visible.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1184 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1185 ;; At or below the start. Check the windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1186 (save-window-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1187 (while (and (not win) windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1188 (set-window-start (car windows) (point) 'noforce)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1189 (setq end-pos-end-p (follow-calc-win-end (car windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1190 (goto-char (car end-pos-end-p))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1191 ;; Visible, if dest above end, or if eob is visible inside
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1192 ;; the window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1193 (if (or (car (cdr end-pos-end-p))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1194 (< dest (point)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1195 (setq win (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1196 (setq windows (cdr windows)))))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1197 (if win
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1198 (select-window win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1199 win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1200
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1201
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1202 ;;}}}
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1203 ;;{{{ Redisplay
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1204
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1205 ;; Redraw all the windows on the screen, starting with the top window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1206 ;; The window used as as marker is WIN, or the selcted window if WIN
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1207 ;; is nil.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1208
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1209 (defun follow-redisplay (&optional windows win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1210 "Reposition the WINDOWS around WIN.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1211 Should the point be too close to the roof we redisplay everything
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1212 from the top. WINDOWS should contain a list of windows to
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1213 redisplay, it is assumed that WIN is a member of the list.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1214 Should WINDOWS be nil, the windows displaying the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1215 same buffer as WIN, in the current frame, are used.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1216 Should WIN be nil, the selected window is used."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1217 (or win
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1218 (setq win (selected-window)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1219 (or windows
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1220 (setq windows (follow-all-followers win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1221 (follow-downward windows (follow-calculate-first-window-start windows win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1222
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1223
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1224 ;; Redisplay a chain of windows. Start every window directly after the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1225 ;; end of the previous window, to make sure long lines are displayed
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1226 ;; correctly.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1227
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1228 (defun follow-downward (windows pos)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1229 "Redisplay all WINDOWS starting at POS."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1230 (while windows
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1231 (set-window-start (car windows) pos)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1232 (setq pos (car (follow-calc-win-end (car windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1233 (setq windows (cdr windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1234
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1235
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1236 ;;(defun follow-downward (windows pos)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1237 ;; "Redisplay all WINDOWS starting at POS."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1238 ;; (let (p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1239 ;; (while windows
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1240 ;; (setq p (window-point (car windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1241 ;; (set-window-start (car windows) pos)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1242 ;; (set-window-point (car windows) (max p pos))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1243 ;; (setq pos (car (follow-calc-win-end (car windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1244 ;; (setq windows (cdr windows)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1245
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1246
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1247 ;; Return the start of the first window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1248 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1249 ;; First, estimate the position. It the value is not perfect (i.e. we
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1250 ;; have somewhere splited a line between windows) we try to enhance
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1251 ;; the value.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1252 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1253 ;; The guess is always perfect if no long lines is split between
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1254 ;; windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1255 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1256 ;; The worst case peformace of probably very bad, but it is very
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1257 ;; unlikely that we ever will miss the correct start by more than one
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1258 ;; or two lines.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1259
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1260 (defun follow-calculate-first-window-start (windows &optional win start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1261 "Calculate the start of the first window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1262
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1263 WINDOWS is a chain of windows to work with. WIN is the window
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1264 to recenter around. It is assumed that WIN starts at position
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1265 START."
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1266 (or win
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1267 (setq win (selected-window)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1268 (or start
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1269 (setq start (window-start win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1270 (let ((guess (follow-estimate-first-window-start windows win start)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1271 (if (car guess)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1272 (cdr guess)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1273 ;; The guess wasn't exact, try to enhance it.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1274 (let ((win-start (follow-calc-win-start windows (cdr guess) win)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1275 (cond ((= win-start start)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1276 (follow-debug-message "exact")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1277 (cdr guess))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1278 ((< win-start start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1279 (follow-debug-message "above")
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1280 (follow-calculate-first-window-start-from-above
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1281 windows (cdr guess) win start))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1282 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1283 (follow-debug-message "below")
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1284 (follow-calculate-first-window-start-from-below
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1285 windows (cdr guess) win start)))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1286
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1287
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1288 ;; `exact' is disabled due to XEmacs and fonts of variable
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1289 ;; height.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1290 (defun follow-estimate-first-window-start (windows win start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1291 "Estimate the position of the first window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1292
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1293 Returns (EXACT . POS). If EXACT is non-nil, POS is the starting
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1294 position of the first window. Otherwise it is a good guess."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1295 (let ((pred (car (follow-split-followers windows win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1296 (exact nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1297 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1298 (goto-char start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1299 ;(setq exact (bolp))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1300 (vertical-motion 0 win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1301 (while pred
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1302 (vertical-motion (- 1 (window-height (car pred))) (car pred))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1303 (if (not (bolp))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1304 (setq exact nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1305 (setq pred (cdr pred)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1306 (cons exact (point)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1307
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1308
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1309 ;; Find the starting point, start at GUESS and search downward.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1310 ;; The returned point is always a point below GUESS.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1311
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1312 (defun follow-calculate-first-window-start-from-above
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1313 (windows guess win start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1314 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1315 (let ((done nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1316 win-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1317 res)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1318 (goto-char guess)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1319 (while (not done)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1320 (if (not (= (vertical-motion 1 (car windows)) 1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1321 ;; Hit bottom! (Can we really do this?)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1322 ;; We'll keep it, since it ensures termination.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1323 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1324 (setq done t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1325 (setq res (point-max)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1326 (setq win-start (follow-calc-win-start windows (point) win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1327 (if (>= win-start start)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1328 (progn
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1329 (setq done t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1330 (setq res (point))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1331 res)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1332
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1333
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1334 ;; Find the starting point, start at GUESS and search upward. Return
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1335 ;; a point on the same line as GUESS, or above.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1336 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1337 ;; (Is this ever used? I must make sure it works just in case it is
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1338 ;; ever called.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1339
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1340 (defun follow-calculate-first-window-start-from-below
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1341 (windows guess &optional win start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1342 (setq win (or win (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1343 (setq start (or start (window-start win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1344 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1345 (let ((done nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1346 win-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1347 res)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1348 ;; Always calculate what happend when no line is displayed in the first
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1349 ;; window. (The `previous' res is needed below!)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1350 (goto-char guess)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1351 (vertical-motion 0 (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1352 (setq res (point))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1353 (while (not done)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1354 (if (not (= (vertical-motion -1 (car windows)) -1))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1355 ;; Hit roof!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1356 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1357 (setq done t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1358 (setq res (point-min)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1359 (setq win-start (follow-calc-win-start windows (point) win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1360 (cond ((= win-start start) ; Perfect match, use this value
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1361 (setq done t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1362 (setq res (point)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1363 ((< win-start start) ; Walked to far, use preious result
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1364 (setq done t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1365 (t ; Store result for next iteration
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1366 (setq res (point))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1367 res)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1368
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1369 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1370 ;;{{{ Avoid tail recenter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1371
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1372 ;; This sets the window internal flag `force_start'. The effect is that
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1373 ;; windows only displaying the tail isn't recentered.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1374 ;; Has to be called before every redisplay... (Great isn't it?)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1375 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1376 ;; XEmacs doesn't recenter the tail, GOOD!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1377 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1378 ;; A window displaying only the tail, is a windows whose
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1379 ;; window-start position is equal to (point-max) of the buffer it
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1380 ;; displays.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1381 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1382 ;; This function is also added to `post-command-idle-hook', introduced
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1383 ;; in Emacs 19.30. This is needed since the vaccine injected by the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1384 ;; call from `post-command-hook' only works until the next redisplay.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1385 ;; It is possible that the functions in the `post-command-idle-hook'
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1386 ;; can cause a redisplay, and hence a new vaccine is needed.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1387 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1388 ;; Sometimes, calling this function could actually cause a redisplay,
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1389 ;; especially if it is placed in the debug filter section. I must
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1390 ;; investigate this further...
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1391
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1392 (defun follow-avoid-tail-recenter (&rest rest)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1393 "Make sure windows displaying the end of a buffer aren't recentered.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1394
36904
ad219664900c (follow-avoid-tail-recenter): Doc fix.
Gerd Moellmann <gerd@gnu.org>
parents: 26523
diff changeset
1395 This is done by reading and rewriting the start position of
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1396 non-first windows in Follow mode."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1397 (if follow-avoid-tail-recenter-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1398 (let* ((orig-buffer (current-buffer))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1399 (top (frame-first-window (selected-frame)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1400 (win top)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1401 (who '()) ; list of (buffer . frame)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1402 start
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1403 pair) ; (buffer . frame)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1404 ;; If the only window in the frame is a minibuffer
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1405 ;; window, `next-window' will never find it again...
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1406 (if (window-minibuffer-p top)
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1407 nil
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1408 (while ;; look, no body!
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1409 (progn
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1410 (setq start (window-start win))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1411 (set-buffer (window-buffer win))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1412 (setq pair (cons (window-buffer win) (window-frame win)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1413 (if (member pair who)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1414 (if (and (boundp 'follow-mode) follow-mode
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1415 (eq (point-max) start))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1416 ;; Write the same window start back, but don't
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1417 ;; set the NOFORCE flag.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1418 (set-window-start win start))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1419 (setq who (cons pair who)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1420 (setq win (next-window win 'not t))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1421 (not (eq win top)))) ;; Loop while this is true.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1422 (set-buffer orig-buffer)))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1423
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1424 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1425
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1426 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1427 ;;{{{ Post Command Hook
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1428
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1429 ;; The magic little box. This function is called after every command.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1430
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1431 ;; This is not as complicated as it seems. It is simply a list of common
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1432 ;; display situations and the actions to take, plus commands for redrawing
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1433 ;; the screen if it should be unaligned.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1434 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1435 ;; We divide the check into two parts; whether we are at the end or not.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1436 ;; This is due to the fact that the end can actaually be visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1437 ;; in several window even though they are aligned.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1438
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1439 (defun follow-post-command-hook ()
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1440 "Ensure that the windows in Follow mode are adjacent after each command."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1441 (setq follow-inside-post-command-hook t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1442 (if (or (not (input-pending-p))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1443 ;; Sometimes, in XEmacs, mouse events are not handled
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1444 ;; properly by `input-pending-p'. A typical example is
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1445 ;; when clicking on a node in `info'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1446 (and (boundp 'current-mouse-event)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1447 (symbol-value 'current-mouse-event)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1448 (fboundp 'button-event-p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1449 (funcall (symbol-function 'button-event-p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1450 (symbol-value 'current-mouse-event))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1451 ;; Work in the selected window, not in the current buffer.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1452 (let ((orig-buffer (current-buffer))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1453 (win (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1454 (set-buffer (window-buffer win))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1455 (or (and (symbolp this-command)
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1456 (get this-command 'follow-mode-use-cache))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1457 (follow-invalidate-cache))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1458 (if (and (boundp 'follow-mode) follow-mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1459 (not (window-minibuffer-p win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1460 ;; The buffer shown in the selected window is in follow
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1461 ;; mode, lets find the current state of the display and
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1462 ;; cache the result for speed (i.e. `aligned' and `visible'.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1463 (let* ((windows (inline (follow-all-followers win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1464 (dest (point))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1465 (win-start-end (inline
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1466 (follow-update-window-start (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1467 (follow-windows-start-end windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1468 (aligned (follow-windows-aligned-p win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1469 (visible (follow-pos-visible dest win win-start-end)))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1470 (if (not (and aligned visible))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1471 (follow-invalidate-cache))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1472 (inline (follow-avoid-tail-recenter))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1473 ;; Select a window to display the point.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1474 (or follow-internal-force-redisplay
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1475 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1476 (if (eq dest (point-max))
55257
c4d464135bfc Fix typo in comment.
Juanma Barranquero <lekktu@gmail.com>
parents: 52401
diff changeset
1477 ;; We're at the end, we have to be careful since
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1478 ;; the display can be aligned while `dest' can
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1479 ;; be visible in several windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1480 (cond
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1481 ;; Select the current window, but only when
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1482 ;; the display is correct. (When inserting
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1483 ;; character in a tail window, the display is
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1484 ;; not correct, as they are shown twice.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1485 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1486 ;; Never stick to the current window after a
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1487 ;; deletion. The reason is cosmetic, when
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1488 ;; typing `DEL' in a window showing only the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1489 ;; end of the file, character are removed
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1490 ;; from the window above, which is very
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1491 ;; unintuitive.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1492 ((and visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1493 aligned
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1494 (not (memq this-command
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1495 '(backward-delete-char
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1496 delete-backward-char
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1497 backward-delete-char-untabify
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1498 kill-region))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1499 (follow-debug-message "Max: same"))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1500 ;; If the end is visible, and the window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1501 ;; doesn't seems like it just has been moved,
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1502 ;; select it.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1503 ((follow-select-if-end-visible win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1504 (follow-debug-message "Max: end visible")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1505 (setq visible t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1506 (setq aligned nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1507 (goto-char dest))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1508 ;; Just show the end...
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1509 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1510 (follow-debug-message "Max: default")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1511 (select-window (car (reverse windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1512 (goto-char dest)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1513 (setq visible nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1514 (setq aligned nil)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1515
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1516 ;; We're not at the end, here life is much simpler.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1517 (cond
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1518 ;; This is the normal case!
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1519 ;; It should be optimized for speed.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1520 ((and visible aligned)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1521 (follow-debug-message "same"))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1522 ;; Pick a position in any window. If the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1523 ;; display is ok, this will pick the `correct'
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1524 ;; window. If the display is wierd do this
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1525 ;; anyway, this will be the case after a delete
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1526 ;; at the beginning of the window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1527 ((follow-select-if-visible dest win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1528 (follow-debug-message "visible")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1529 (setq visible t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1530 (goto-char dest))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1531 ;; Not visible anywhere else, lets pick this one.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1532 ;; (Is this case used?)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1533 (visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1534 (follow-debug-message "visible in selected."))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1535 ;; Far out!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1536 ((eq dest (point-min))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1537 (follow-debug-message "min")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1538 (select-window (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1539 (goto-char dest)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1540 (set-window-start (selected-window) (point-min))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1541 (setq win-start-end (follow-windows-start-end windows))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1542 (follow-invalidate-cache)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1543 (setq visible t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1544 (setq aligned nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1545 ;; If we can position the cursor without moving the first
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1546 ;; window, do it. This is the case that catches `RET'
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1547 ;; at the bottom of a window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1548 ((follow-select-if-visible-from-first dest windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1549 (follow-debug-message "Below first")
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1550 (setq visible t)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1551 (setq aligned t)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1552 (follow-redisplay windows (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1553 (goto-char dest))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1554 ;; None of the above. For simplicity, we stick to the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1555 ;; selected window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1556 (t
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1557 (follow-debug-message "None")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1558 (setq visible nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1559 (setq aligned nil))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1560 ;; If a new window has been selected, make sure that the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1561 ;; old is not scrolled when the point is outside the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1562 ;; window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1563 (or (eq win (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1564 (let ((p (window-point win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1565 (set-window-start win (window-start win) nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1566 (set-window-point win p)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1567 ;; Make sure the point is visible in the selected window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1568 ;; (This could lead to a scroll.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1569 (if (or visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1570 (follow-pos-visible dest win win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1571 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1572 (sit-for 0)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1573 (follow-avoid-tail-recenter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1574 (setq win-start-end (follow-windows-start-end windows))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1575 (follow-invalidate-cache)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1576 (setq aligned nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1577 ;; Redraw the windows whenever needed.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1578 (if (or follow-internal-force-redisplay
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1579 (not (or aligned
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1580 (follow-windows-aligned-p win-start-end)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1581 (not (inline (follow-point-visible-all-windows-p
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1582 win-start-end))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1583 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1584 (setq follow-internal-force-redisplay nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1585 (follow-redisplay windows (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1586 (setq win-start-end (follow-windows-start-end windows))
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1587 (follow-invalidate-cache)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1588 ;; When the point ends up in another window. This
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1589 ;; happends when dest is in the beginning of the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1590 ;; file and the selected window is not the first.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1591 ;; It can also, in rare situations happend when
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1592 ;; long lines are used and there is a big
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1593 ;; difference between the width of the windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1594 ;; (When scrolling one line in a wide window which
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1595 ;; will cause a move larger that an entire small
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1596 ;; window.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1597 (if (follow-pos-visible dest win win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1598 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1599 (follow-select-if-visible dest win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1600 (goto-char dest))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1601
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1602 ;; If the region is visible, make it look good when spanning
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1603 ;; multiple windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1604 (if (or (and (boundp 'mark-active) (symbol-value 'mark-active))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1605 (and (fboundp 'region-active-p)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1606 (funcall (symbol-function 'region-active-p))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1607 (follow-maximize-region
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1608 (selected-window) windows win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1609
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
1610 (inline (follow-avoid-tail-recenter))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1611 ;; DEBUG
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1612 ;;(if (not (follow-windows-aligned-p
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1613 ;; (follow-windows-start-end windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1614 ;; (message "follow-mode: windows still unaligend!"))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1615 ;; END OF DEBUG
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1616 ) ; Matches (let*
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1617 ;; Buffer not in follow mode:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1618 ;; We still must update the windows displaying the tail so that
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1619 ;; Emacs won't recenter them.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1620 (follow-avoid-tail-recenter))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1621 (set-buffer orig-buffer)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1622 (setq follow-inside-post-command-hook nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1623
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1624 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1625 ;;{{{ The region
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1626
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1627 ;; Tries to make the highlighted area representing the region look
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1628 ;; good when spanning several windows.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1629 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1630 ;; Not perfect, as the point can't be placed at window end, only at
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1631 ;; end-1. This will highlight a little bit in windows above
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1632 ;; the current.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1633
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1634 (defun follow-maximize-region (win windows win-start-end)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1635 "Make a highlighted region stretching multiple windows look good."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1636 (let* ((all (follow-split-followers windows win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1637 (pred (car all))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1638 (succ (cdr all))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1639 data)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1640 (while pred
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1641 (setq data (assq (car pred) win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1642 (set-window-point (car pred) (max (nth 1 data) (- (nth 2 data) 1)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1643 (setq pred (cdr pred)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1644 (while succ
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1645 (set-window-point (car succ) (nth 1 (assq (car succ) win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1646 (setq succ (cdr succ)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1647
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1648 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1649 ;;{{{ Scroll bar
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1650
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1651 ;;;; Scroll-bar support code.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1652
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1653 ;; Why is it needed? Well, if the selected window is in follow mode,
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1654 ;; all its follower stick to it blindly. If one of them is scrolled,
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1655 ;; it immediately returns to the original position when the mouse is
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1656 ;; released. If the selected window is not a follower of the dragged
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1657 ;; window the windows will be unaligned.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1658
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1659 ;; The advices doesn't get compiled. Aestetically, this might be a
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1660 ;; problem but in practical life it isn't.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1661
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1662 ;; Discussion: Now when the other windows in the chain follow the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1663 ;; dragged, should we really select it?
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1664
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1665 (cond ((fboundp 'scroll-bar-drag)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1666 ;;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1667 ;;; Emacs style scrollbars.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1668 ;;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1669
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1670 ;; Select the dragged window if it is a follower of the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1671 ;; selected window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1672 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1673 ;; Generate advices of the form:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1674 ;; (defadvice scroll-bar-drag (after follow-scroll-bar-drag activate)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1675 ;; "Adviced by `follow-mode'."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1676 ;; (follow-redraw-after-event (ad-get-arg 0)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1677 (let ((cmds '(scroll-bar-drag
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1678 scroll-bar-drag-1 ; Executed at every move.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1679 scroll-bar-scroll-down
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1680 scroll-bar-scroll-up
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1681 scroll-bar-set-window-start)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1682 (while cmds
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1683 (eval
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1684 `(defadvice ,(intern (symbol-name (car cmds)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1685 (after
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1686 ,(intern (concat "follow-" (symbol-name (car cmds))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1687 activate)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1688 "Adviced by Follow mode."
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1689 (follow-redraw-after-event (ad-get-arg 0))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1690 (setq cmds (cdr cmds))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1691
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1692
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1693 (defun follow-redraw-after-event (event)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1694 "Adviced by Follow mode."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1695 (condition-case nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1696 (let* ((orig-win (selected-window))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1697 (win (nth 0 (funcall
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1698 (symbol-function 'event-start) event)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1699 (fmode (assq 'follow-mode
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1700 (buffer-local-variables
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1701 (window-buffer win)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1702 (if (and fmode (cdr fmode))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1703 ;; The selected window is in follow-mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1704 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1705 ;; Recenter around the dragged window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1706 (select-window win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1707 (follow-redisplay)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1708 (select-window orig-win))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1709 (error nil))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1710
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1711
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1712 ((fboundp 'scrollbar-vertical-drag)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1713 ;;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1714 ;;; XEmacs style scrollbars.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1715 ;;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1716
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1717 ;; Advice all scrollbar functions on the form:
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1718 ;;
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1719 ;; (defadvice scrollbar-line-down
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1720 ;; (after follow-scrollbar-line-down activate)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1721 ;; (follow-xemacs-scrollbar-support (ad-get-arg 0)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1722
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1723 (let ((cmds '(scrollbar-line-down ; Window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1724 scrollbar-line-up
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1725 scrollbar-page-down ; Object
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1726 scrollbar-page-up
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1727 scrollbar-to-bottom ; Window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1728 scrollbar-to-top
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1729 scrollbar-vertical-drag ; Object
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1730 )))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1731
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1732 (while cmds
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1733 (eval
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1734 `(defadvice ,(intern (symbol-name (car cmds)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1735 (after
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1736 ,(intern (concat "follow-" (symbol-name (car cmds))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1737 activate)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1738 "Adviced by `follow-mode'."
26523
c06aa85fd1ad Use modern backquote syntax. Minor comment update.
Gerd Moellmann <gerd@gnu.org>
parents: 22250
diff changeset
1739 (follow-xemacs-scrollbar-support (ad-get-arg 0))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1740 (setq cmds (cdr cmds))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1741
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1742
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1743 (defun follow-xemacs-scrollbar-support (window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1744 "Redraw windows showing the same buffer as shown in WINDOW.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1745 WINDOW is either the dragged window, or a cons containing the
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1746 window as its first element. This is called while the user drags
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1747 the scrollbar.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1748
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1749 WINDOW can be an object or a window."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1750 (condition-case nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1751 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1752 (if (consp window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1753 (setq window (car window)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1754 (let ((fmode (assq 'follow-mode
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1755 (buffer-local-variables
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1756 (window-buffer window))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1757 (orig-win (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1758 (if (and fmode (cdr fmode))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1759 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1760 ;; Recenter around the dragged window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1761 (select-window window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1762 (follow-redisplay)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1763 (select-window orig-win)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1764 (error nil)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1765
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1766 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1767 ;;{{{ Process output
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1768
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1769 ;; The following sections installs a spy that listens to process
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1770 ;; output and tries to reposition the windows whose buffers are in
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1771 ;; Follow mode. We play safe as much as possible...
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1772 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1773 ;; When follow-mode is activated all active processes are
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1774 ;; intercepted. All new processes that change their filter function
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1775 ;; using `set-process-filter' are also intercepted. The reason is
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1776 ;; that a process can cause a redisplay recentering "tail" windows.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1777 ;; Note that it doesn't hurt to spy on more processes than needed.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1778 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1779 ;; Technically, we set the process filter to `follow-generic-filter'.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1780 ;; The original filter is stored in `follow-process-filter-alist'.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1781 ;; Our generic filter calls the original filter, or inserts the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1782 ;; output into the buffer, if the buffer originally didn't have an
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1783 ;; output filter. It also makes sure that the windows connected to
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1784 ;; the buffer are aligned.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1785 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1786 ;; Discussion: How do we find processes that don't call
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1787 ;; `set-process-filter'? (How often are processes created in a
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1788 ;; buffer after Follow mode are activated?)
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1789 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1790 ;; Discussion: Should we also advice `process-filter' to make our
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1791 ;; filter invisible to others?
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1792
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1793 ;;{{{ Advice for `set-process-filter'
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1794
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1795 ;; Do not call this with 'follow-generic-filter as the name of the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1796 ;; filter...
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1797
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1798 (defadvice set-process-filter (before follow-set-process-filter activate)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1799 "Ensure process output will be displayed correctly in Follow mode buffers.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1800
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1801 Follow mode inserts its own process filter to do its
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1802 magic stuff before the real process filter is called."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1803 (if follow-intercept-processes
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1804 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1805 (setq follow-process-filter-alist
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1806 (delq (assq (ad-get-arg 0) follow-process-filter-alist)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1807 follow-process-filter-alist))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1808 (follow-tidy-process-filter-alist)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1809 (cond ((eq (ad-get-arg 1) t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1810 ((eq (ad-get-arg 1) nil)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1811 (ad-set-arg 1 'follow-generic-filter))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1812 (t
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1813 (setq follow-process-filter-alist
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1814 (cons (cons (ad-get-arg 0) (ad-get-arg 1))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1815 follow-process-filter-alist))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1816 (ad-set-arg 1 'follow-generic-filter))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1817
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1818
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1819 (defun follow-call-set-process-filter (proc filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1820 "Call original `set-process-filter' without the Follow mode advice."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1821 (ad-disable-advice 'set-process-filter 'before
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1822 'follow-set-process-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1823 (ad-activate 'set-process-filter)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1824 (prog1
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1825 (set-process-filter proc filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1826 (ad-enable-advice 'set-process-filter 'before
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1827 'follow-set-process-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1828 (ad-activate 'set-process-filter)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1829
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1830
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1831 (defadvice process-filter (after follow-process-filter activate)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1832 "Return the original process filter, not `follow-generic-filter'."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1833 (cond ((eq ad-return-value 'follow-generic-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1834 (setq ad-return-value
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1835 (cdr-safe (assq (ad-get-arg 0)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1836 follow-process-filter-alist))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1837
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1838
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1839 (defun follow-call-process-filter (proc)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1840 "Call original `process-filter' without the Follow mode advice."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1841 (ad-disable-advice 'process-filter 'after
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1842 'follow-process-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1843 (ad-activate 'process-filter)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1844 (prog1
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1845 (process-filter proc)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1846 (ad-enable-advice 'process-filter 'after
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1847 'follow-process-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1848 (ad-activate 'process-filter)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1849
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1850
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1851 (defun follow-tidy-process-filter-alist ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1852 "Remove old processes from `follow-process-filter-alist'."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1853 (let ((alist follow-process-filter-alist)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1854 (ps (process-list))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1855 (new ()))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1856 (while alist
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1857 (if (and (not (memq (process-status (car (car alist)))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1858 '(exit signal closed nil)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1859 (memq (car (car alist)) ps))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1860 (setq new (cons (car alist) new)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1861 (setq alist (cdr alist)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1862 (setq follow-process-filter-alist new)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1863
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1864 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1865 ;;{{{ Start/stop interception of processes.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1866
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1867 ;; Normally, all new processed are intercepted by our `set-process-filter'.
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
1868 ;; This is needed to intercept old processed that were started before we were
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1869 ;; loaded, and processes we have forgotten by calling
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1870 ;; `follow-stop-intercept-process-output'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1871
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1872 (defun follow-intercept-process-output ()
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1873 "Intercept all active processes.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1874
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1875 This is needed so that Follow mode can track all display events in the
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
1876 system. (See `follow-mode'.)"
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1877 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1878 (let ((list (process-list)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1879 (while list
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1880 (if (eq (process-filter (car list)) 'follow-generic-filter)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1881 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1882 ;; The custom `set-process-filter' defined above.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1883 (set-process-filter (car list) (process-filter (car list))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1884 (setq list (cdr list))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1885 (setq follow-intercept-processes t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1886
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1887
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1888 (defun follow-stop-intercept-process-output ()
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
1889 "Stop Follow mode from spying on processes.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1890
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1891 All current spypoints are removed and no new will be added.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1892
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1893 The effect is that Follow mode won't be able to handle buffers
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1894 connected to processes.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1895
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1896 The only reason to call this function is if the Follow mode spy filter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1897 would interfere with some other package. If this happens, please
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1898 report this using the `report-emacs-bug' function."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1899 (interactive)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1900 (follow-tidy-process-filter-alist)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1901 (let ((list (process-list)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1902 (while list
79037
e68bb9eaf3a5 (follow-stop-intercept-process-output):
Juanma Barranquero <lekktu@gmail.com>
parents: 79028
diff changeset
1903 (if (eq (follow-call-process-filter (car list)) 'follow-generic-filter)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1904 (progn
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1905 (follow-call-set-process-filter
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1906 (car list)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1907 (cdr-safe (assq (car list) follow-process-filter-alist)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1908 (setq follow-process-filter-alist
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1909 (delq (assq (car list) follow-process-filter-alist)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1910 follow-process-filter-alist))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1911 (setq list (cdr list))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1912 (setq follow-intercept-processes nil))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1913
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1914 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1915 ;;{{{ The filter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1916
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1917 ;; The following section is a naive method to make buffers with
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1918 ;; process output to work with Follow mode. Whenever the start of the
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1919 ;; window displaying the buffer is moved, we moves it back to its
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1920 ;; original position and try to select a new window. (If we fail,
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1921 ;; the normal redisplay functions of Emacs will scroll it right
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
1922 ;; back!)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1923
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1924 (defun follow-generic-filter (proc output)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1925 "Process output filter for process connected to buffers in Follow mode."
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1926 (let* ((old-buffer (current-buffer))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1927 (orig-win (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1928 (buf (process-buffer proc))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1929 (win (and buf (if (eq buf (window-buffer orig-win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1930 orig-win
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1931 (get-buffer-window buf t))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1932 (return-to-orig-win (and win (not (eq win orig-win))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1933 (orig-window-start (and win (window-start win))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1934
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1935 ;; If input is pending, the `sit-for' below won't redraw the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1936 ;; display. In that case, calling `follow-avoid-tail-recenter' may
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1937 ;; provoke the process hadnling code to sceduling a redisplay.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1938 ;(or (input-pending-p)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1939 ; (follow-avoid-tail-recenter))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1940
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1941 ;; Output the `output'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1942 (let ((filter (cdr-safe (assq proc follow-process-filter-alist))))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1943 (cond
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1944 ;; Call the original filter function
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1945 (filter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1946 (funcall filter proc output))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1947
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1948 ;; No filter, but we've got a buffer. Just output into it.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1949 (buf
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1950 (set-buffer buf)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1951 (if (not (marker-buffer (process-mark proc)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1952 (set-marker (process-mark proc) (point-max)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1953 (let ((moving (= (point) (process-mark proc)))
47628
e44b96f09893 (follow-generic-filter): Simply bind deactivate-mark.
Richard M. Stallman <rms@gnu.org>
parents: 42880
diff changeset
1954 deactivate-mark
e44b96f09893 (follow-generic-filter): Simply bind deactivate-mark.
Richard M. Stallman <rms@gnu.org>
parents: 42880
diff changeset
1955 (inhibit-read-only t))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1956 (save-excursion
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1957 (goto-char (process-mark proc))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1958 ;; `insert-before-markers' just in case the users next
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1959 ;; command is M-y.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1960 (insert-before-markers output)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1961 (set-marker (process-mark proc) (point)))
47628
e44b96f09893 (follow-generic-filter): Simply bind deactivate-mark.
Richard M. Stallman <rms@gnu.org>
parents: 42880
diff changeset
1962 (if moving (goto-char (process-mark proc)))))))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1963
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1964 ;; If we're in follow mode, do our stuff. Select a new window and
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1965 ;; redisplay. (Actually, it is redundant to check `buf', but I
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1966 ;; feel it's more correct.)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1967 (if (and buf win (window-live-p win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1968 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1969 (set-buffer buf)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1970 (if (and (boundp 'follow-mode) follow-mode)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1971 (progn
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1972 (select-window win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1973 (let* ((windows (follow-all-followers win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1974 (win-start-end (follow-windows-start-end windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1975 (new-window-start (window-start win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1976 (new-window-point (window-point win)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1977 (cond
42880
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1978 ;; The start of the selected window was repositioned.
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1979 ;; Try to use the original start position and continue
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1980 ;; working with a window to the "right" in the window
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1981 ;; chain. This will create the effect that the output
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1982 ;; starts in one window and continues into the next.
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1983
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1984 ;; If the display has changed so much that it is not
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1985 ;; possible to keep the original window fixed and still
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1986 ;; display the point then we give up and use the new
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1987 ;; window start.
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1988
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1989 ;; This case is typically used when the process filter
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1990 ;; tries to reposition the start of the window in order
196bb8bbcc88 Comment fix.
Pavel Janík <Pavel@Janik.cz>
parents: 42758
diff changeset
1991 ;; to view the tail of the output.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1992 ((not (eq orig-window-start new-window-start))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1993 (follow-debug-message "filter: Moved")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1994 (set-window-start win orig-window-start)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1995 (follow-redisplay windows win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1996 (setq win-start-end (follow-windows-start-end windows))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
1997 (follow-select-if-visible new-window-point
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1998 win-start-end)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1999 (goto-char new-window-point)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2000 (if (eq win (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2001 (set-window-start win new-window-start))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2002 (setq win-start-end (follow-windows-start-end windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2003 ;; Stick to this window, if point is visible in it.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2004 ((pos-visible-in-window-p new-window-point)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2005 (follow-debug-message "filter: Visible in window"))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2006 ;; Avoid redisplaying the first window. If the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2007 ;; point is visible at a window below,
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2008 ;; redisplay and select it.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2009 ((follow-select-if-visible-from-first
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2010 new-window-point windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2011 (follow-debug-message "filter: Seen from first")
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2012 (follow-redisplay windows (car windows))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2013 (goto-char new-window-point)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2014 (setq win-start-end
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2015 (follow-windows-start-end windows)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2016 ;; None of the above. We stick to the current window.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2017 (t
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2018 (follow-debug-message "filter: nothing")))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2019
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2020 ;; Here we have slected a window. Make sure the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2021 ;; windows are aligned and the point is visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2022 ;; in the selected window.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2023 (if (and (not (follow-pos-visible
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2024 (point) (selected-window) win-start-end))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2025 (not return-to-orig-win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2026 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2027 (sit-for 0)
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2028 (setq win-start-end
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2029 (follow-windows-start-end windows))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2030
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2031 (if (or follow-internal-force-redisplay
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2032 (not (follow-windows-aligned-p win-start-end)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2033 (follow-redisplay windows)))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2034
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2035 ;; return to the original window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2036 (if return-to-orig-win
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2037 (select-window orig-win))
18028
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2038 ;; Restore the orignal buffer, unless the filter explicitly
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2039 ;; changed buffer or killed the old buffer.
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2040 (if (and (eq buf (current-buffer))
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2041 (buffer-name old-buffer))
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2042 (set-buffer old-buffer)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2043
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2044 (follow-invalidate-cache)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2045
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2046 ;; Normally, if the display has been changed, it is redrawn. All
78772
578320c8f7ec (follow-generic-filter): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 78236
diff changeset
2047 ;; windows showing only the end of a buffer are unconditionally
578320c8f7ec (follow-generic-filter): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 78236
diff changeset
2048 ;; recentered; we can't prevent that by calling
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2049 ;; `follow-avoid-tail-recenter'.
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2050 ;;
78772
578320c8f7ec (follow-generic-filter): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 78236
diff changeset
2051 ;; We force a redisplay here on our own, so Emacs does need to.
578320c8f7ec (follow-generic-filter): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 78236
diff changeset
2052 ;; (However, redisplaying when there's input available just seems
578320c8f7ec (follow-generic-filter): Fix a typo in a comment.
Eli Zaretskii <eliz@gnu.org>
parents: 78236
diff changeset
2053 ;; to make things worse, so we exclude that case.)
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2054 (if (and follow-avoid-tail-recenter-p
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2055 (not (input-pending-p)))
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2056 (sit-for 0)))
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2057
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2058 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2059
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2060 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2061 ;;{{{ Window size change
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2062
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2063 ;; In Emacs 19.29, the functions in `window-size-change-functions' are
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2064 ;; called every time a window in a frame changes size. Most notably, it
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2065 ;; is called after the frame has been resized.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2066 ;;
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
2067 ;; We basically call our post-command-hook for every buffer that is
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2068 ;; visible in any window in the resized frame, which is in follow-mode.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2069 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2070 ;; Since this function can be called indirectly from
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2071 ;; `follow-post-command-hook' we have a potential infinite loop. We
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2072 ;; handle this problem by simply not doing anything at all in this
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2073 ;; situation. The variable `follow-inside-post-command-hook' contains
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2074 ;; information about whether the execution actually is inside the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2075 ;; post-command-hook or not.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2076
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2077 (if (boundp 'window-size-change-functions)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2078 (add-hook 'window-size-change-functions 'follow-window-size-change))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2079
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2080
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2081 (defun follow-window-size-change (frame)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2082 "Redraw all windows in FRAME, when in Follow mode."
78162
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
2083 ;; Below, we call `post-command-hook'. This makes sure that we
a09176483fa1 (follow-mode-hook, follow-mode-off-hook, follow-mode,
Juanma Barranquero <lekktu@gmail.com>
parents: 75347
diff changeset
2084 ;; don't start a mutually recursive endless loop.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2085 (if follow-inside-post-command-hook
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2086 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2087 (let ((buffers '())
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2088 (orig-window (selected-window))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2089 (orig-buffer (current-buffer))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2090 (orig-frame (selected-frame))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2091 windows
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2092 buf)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2093 (select-frame frame)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2094 (unwind-protect
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2095 (walk-windows
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2096 (function
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2097 (lambda (win)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2098 (setq buf (window-buffer win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2099 (if (memq buf buffers)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2100 nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2101 (set-buffer buf)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2102 (if (and (boundp 'follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2103 follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2104 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2105 (setq windows (follow-all-followers win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2106 (if (memq orig-window windows)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2107 (progn
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2108 ;; Make sure we're redrawing around the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2109 ;; selected window.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2110 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2111 ;; We must be really careful not to do this
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2112 ;; when we are (indirectly) called by
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2113 ;; `post-command-hook'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2114 (select-window orig-window)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2115 (follow-post-command-hook)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2116 (setq orig-window (selected-window)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2117 (follow-redisplay windows win))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2118 (setq buffers (cons buf buffers))))))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2119 (select-frame orig-frame)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2120 (set-buffer orig-buffer)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2121 (select-window orig-window)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2122
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2123 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2124
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2125 ;;{{{ XEmacs isearch
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2126
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2127 ;; In XEmacs, isearch often finds matches in other windows than the
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2128 ;; currently selected. However, when exiting the old window
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2129 ;; configuration is restored, with the exception of the beginning of
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2130 ;; the start of the window for the selected window. This is not much
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2131 ;; help for us.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2132 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2133 ;; We overwrite the stored window configuration with the current,
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2134 ;; unless we are in `slow-search-mode', i.e. only a few lines
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2135 ;; of text is visible.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2136
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2137 (if (featurep 'xemacs)
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2138 (defadvice isearch-done (before follow-isearch-done activate)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2139 (if (and (boundp 'follow-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2140 follow-mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2141 (boundp 'isearch-window-configuration)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2142 isearch-window-configuration
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2143 (boundp 'isearch-slow-terminal-mode)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2144 (not isearch-slow-terminal-mode))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2145 (let ((buf (current-buffer)))
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2146 (setq isearch-window-configuration
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2147 (current-window-configuration))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2148 (set-buffer buf)))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2149
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2150 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2151 ;;{{{ Tail window handling
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2152
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2153 ;; In Emacs (not XEmacs) windows showing nothing are sometimes
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
2154 ;; recentered. When in Follow mode, this is not desirable for
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2155 ;; non-first windows in the window chain. This section tries to
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2156 ;; make the windows stay where they should be.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2157 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2158 ;; If the display is updated, all windows starting at (point-max) are
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2159 ;; going to be recentered at the next redisplay, unless we do a
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2160 ;; read-and-write cycle to update the `force' flag inside the windows.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2161 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2162 ;; In 19.30, a new varible `window-scroll-functions' is called every
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2163 ;; time a window is recentered. It is not perfect for our situation,
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2164 ;; since when it is called for a tail window, it is to late. However,
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2165 ;; if it is called for another window, we can try to update our
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2166 ;; windows.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2167 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2168 ;; By patching `sit-for' we can make sure that to catch all explicit
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2169 ;; updates initiated by lisp programs. Internal calls, on the other
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2170 ;; hand, are not handled.
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2171 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2172 ;; Please note that the function `follow-avoid-tail-recenter' is also
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2173 ;; called from other places, e.g. `post-command-hook' and
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2174 ;; `post-command-idle-hook'.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2175
18028
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2176 ;; If this function is called it is too late for this window, but
89f6e1e17d2d (follow-submit-feedback, follow-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 16425
diff changeset
2177 ;; we might save other windows from being recentered.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2178
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2179 (if (and follow-avoid-tail-recenter-p (boundp 'window-scroll-functions))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2180 (add-hook 'window-scroll-functions 'follow-avoid-tail-recenter t))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2181
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2182
21333
a6119c0748e9 (follow-scroll-up): Cope if `window-end' returns nil.
Richard M. Stallman <rms@gnu.org>
parents: 21088
diff changeset
2183 ;; This prevents all packages that calls `sit-for' directly
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2184 ;; to recenter tail windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2185
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2186 (if follow-avoid-tail-recenter-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2187 (defadvice sit-for (before follow-sit-for activate)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
2188 "Adviced by Follow mode.
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2189
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2190 Avoid to recenter windows displaying only the end of a file as when
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
2191 displaying a short file in two windows, using Follow mode."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2192 (follow-avoid-tail-recenter)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2193
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2194
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2195 ;; Without this advice, `mouse-drag-region' would start to recenter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2196 ;; tail windows.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2197
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2198 (if (and follow-avoid-tail-recenter-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2199 (fboundp 'move-overlay))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2200 (defadvice move-overlay (before follow-move-overlay activate)
79028
31b72d0abff5 Change all instances of "Follow Mode" to "Follow mode" in docstrings and messages.
Juanma Barranquero <lekktu@gmail.com>
parents: 79020
diff changeset
2201 "Adviced by Follow mode.
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2202 Don't recenter windows showing only the end of a buffer.
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2203 This prevents `mouse-drag-region' from messing things up."
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2204 (follow-avoid-tail-recenter)))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2205
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2206 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2207 ;;{{{ profile support
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2208
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2209 ;; The following (non-evaluated) section can be used to
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2210 ;; profile this package using `elp'.
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2211 ;;
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2212 ;; Invalid indentation on purpose!
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2213
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2214 (cond (nil
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2215 (setq elp-function-list
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2216 '(window-end
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2217 vertical-motion
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2218 ; sit-for ;; elp can't handle advices...
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2219 follow-mode
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2220 follow-all-followers
18133
7900f6f3c36e (follow-windows-aligned-p): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 18028
diff changeset
2221 follow-split-followers
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2222 follow-redisplay
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2223 follow-downward
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2224 follow-calculate-first-window-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2225 follow-estimate-first-window-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2226 follow-calculate-first-window-start-from-above
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2227 follow-calculate-first-window-start-from-below
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2228 follow-calc-win-end
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2229 follow-calc-win-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2230 follow-pos-visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2231 follow-windows-start-end
14609
a8eeafa7c4af Update some doc string. Call `add-minor-mode'.
Karl Heuer <kwzh@gnu.org>
parents: 14578
diff changeset
2232 follow-cache-valid-p
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2233 follow-select-if-visible
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2234 follow-select-if-visible-from-first
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2235 follow-windows-aligned-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2236 follow-point-visible-all-windows-p
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2237 follow-avoid-tail-recenter
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2238 follow-update-window-start
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2239 follow-post-command-hook
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2240 ))))
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2241
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2242 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2243
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2244 ;;{{{ The end
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2245
79149
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2246 (defun follow-unload-function ()
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2247 (follow-stop-intercept-process-output)
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2248 (dolist (group '((before
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2249 ;; XEmacs
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2250 isearch-done
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2251 ;; both
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2252 set-process-filter sit-for move-overlay)
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2253 (after
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2254 ;; Emacs
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2255 scroll-bar-drag scroll-bar-drag-1 scroll-bar-scroll-down
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2256 scroll-bar-scroll-up scroll-bar-set-window-start
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2257 ;; XEmacs
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2258 scrollbar-line-down scrollbar-line-up scrollbar-page-down
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2259 scrollbar-page-up scrollbar-to-bottom scrollbar-to-top
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2260 scrollbar-vertical-drag
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2261 ;; both
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2262 process-filter)))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2263 (let ((class (car group)))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2264 (dolist (fun (cdr group))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2265 (when (functionp fun)
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2266 (condition-case nil
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2267 (progn
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2268 (ad-remove-advice fun class
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2269 (intern (concat "follow-" (symbol-name fun))))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2270 (ad-update fun))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2271 (error nil))))))
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2272 nil)
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2273
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2274 (defvar follow-unload-function 'follow-unload-function)
6ddbf3d3f1a7 (follow-unload-function): New function.
Juanma Barranquero <lekktu@gmail.com>
parents: 79037
diff changeset
2275
70226
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2276 ;;
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2277 ;; We're done!
6bc1222277e1 Use (featurep 'xemacs) everywhere.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
2278 ;;
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2279
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2280 (provide 'follow)
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2281
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2282 ;;}}}
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2283
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2284 ;; /------------------------------------------------------------------------\
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2285 ;; | "I [..] am rarely happier then when spending an entire day programming |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2286 ;; | my computer to perform automatically a task that it would otherwise |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2287 ;; | take me a good ten seconds to do by hand. Ten seconds, I tell myself, |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2288 ;; | is ten seconds. Time is valuable and ten seconds' worth of it is well |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2289 ;; | worth the investment of a day's happy activity working out a way to |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2290 ;; | save it". -- Douglas Adams, "Last Chance to See" |
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2291 ;; \------------------------------------------------------------------------/
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2292
60902
7160fe3a7ef1 find-file-hooks -> find-file-hook.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 55257
diff changeset
2293 ;; arch-tag: 7b16bb1a-808c-4991-a8cc-66d3822936d0
14578
55d804f97ffc Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2294 ;;; follow.el ends here