;;; follow.el --- synchronize windows showing the same buffer
;; Copyright (C) 1995, 1996, 1997, 1999, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007 Free Software Foundation, Inc.
+;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
;; Author: Anders Lindgren <andersl@andersl.com>
;; Maintainer: FSF (Anders' email bounces, Sep 2005)
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; above for an example of how to bind the keys the way you like.
;;
;; Please note that the keymap is defined the first time this file is
-;; loaded. Also note that the only legal way to manipulate the
+;; loaded. Also note that the only valid way to manipulate the
;; keymap is to use `define-key'. Don't change it using `setq' or
;; similar!
(select-window win)
(goto-char start)
(vertical-motion (- (- (window-height win)
- 1
+ (if header-line-format 2 1)
next-screen-context-lines)))
(set-window-start win (point))
(goto-char start)
;;}}}
;;{{{ Movement
-;; Note, these functions are not very useful, atleast not unless you
+;; Note, these functions are not very useful, at least not unless you
;; rebind the rather cumbersome key sequence `C-c . p'.
(defun follow-next-window ()
(prog1
(save-excursion
(goto-char (window-start))
- (setq height (- (window-height) 1))
+ (setq height
+ (- (window-height)
+ (if header-line-format 2 1)))
(setq buffer-end-p
(if (bolp)
(not (= height (vertical-motion height)))
;(setq exact (bolp))
(vertical-motion 0 win)
(while pred
- (vertical-motion (- 1 (window-height (car pred))) (car pred))
+ (vertical-motion
+ (- (if header-line-format 2 1)
+ (window-height (car pred))) (car pred))
(if (not (bolp))
(setq exact nil))
(setq pred (cdr pred)))
(let ((done nil)
win-start
res)
- ;; Always calculate what happend when no line is displayed in the first
+ ;; Always calculate what happens when no line is displayed in the first
;; window. (The `previous' res is needed below!)
(goto-char guess)
(vertical-motion 0 (car windows))
;; the screen if it should be unaligned.
;;
;; We divide the check into two parts; whether we are at the end or not.
-;; This is due to the fact that the end can actaually be visible
+;; This is due to the fact that the end can actually be visible
;; in several window even though they are aligned.
(defun follow-post-command-hook ()
(setq win-start-end (follow-windows-start-end windows))
(follow-invalidate-cache)
;; When the point ends up in another window. This
- ;; happends when dest is in the beginning of the
+ ;; happens when dest is in the beginning of the
;; file and the selected window is not the first.
- ;; It can also, in rare situations happend when
+ ;; It can also, in rare situations happen when
;; long lines are used and there is a big
;; difference between the width of the windows.
;; (When scrolling one line in a wide window which
;; If the region is visible, make it look good when spanning
;; multiple windows.
(if (or (and (boundp 'mark-active) (symbol-value 'mark-active))
+ ;; The following isn't used in Emacs,
+ ;; since `mark-active' is bound.
(and (fboundp 'region-active-p)
(funcall (symbol-function 'region-active-p))))
(follow-maximize-region
;;{{{ The end
+(defun follow-unload-function ()
+ "Unload Follow mode library."
+ (easy-menu-remove-item nil '("Tools") "Follow")
+ (follow-stop-intercept-process-output)
+ (dolist (group '((before
+ ;; XEmacs
+ isearch-done
+ ;; both
+ set-process-filter sit-for move-overlay)
+ (after
+ ;; Emacs
+ scroll-bar-drag scroll-bar-drag-1 scroll-bar-scroll-down
+ scroll-bar-scroll-up scroll-bar-set-window-start
+ ;; XEmacs
+ scrollbar-line-down scrollbar-line-up scrollbar-page-down
+ scrollbar-page-up scrollbar-to-bottom scrollbar-to-top
+ scrollbar-vertical-drag
+ ;; both
+ process-filter)))
+ (let ((class (car group)))
+ (dolist (fun (cdr group))
+ (when (functionp fun)
+ (condition-case nil
+ (progn
+ (ad-remove-advice fun class
+ (intern (concat "follow-" (symbol-name fun))))
+ (ad-update fun))
+ (error nil))))))
+ ;; continue standard processing
+ nil)
+
;;
;; We're done!
;;