(replace_buffer_in_all_windows):
[bpt/emacs.git] / lisp / auto-show.el
CommitLineData
be010748 1;;; auto-show.el --- perform automatic horizontal scrolling as point moves
4d235ac7 2;;; This file is in the public domain.
495a2b0a 3
4d235ac7
RS
4;;; Keywords: scroll display minor-mode
5;;; Author: Pete Ware <ware@cis.ohio-state.edu>
6;;; Maintainer: FSF
7
8;;; Commentary:
9
10;;; This file provides functions that
495a2b0a 11;;; automatically scroll the window horizontally when the point moves
4d235ac7
RS
12;;; off the left or right side of the window.
13
14;;; Once this library is loaded, automatic horizontal scrolling
15;;; occurs whenever long lines are being truncated.
16;;; To request truncation of long lines, set the variable
17;;; Setting the variable `truncate-lines' to non-nil.
18;;; You can do this for all buffers as follows:
495a2b0a
RS
19;;;
20;;; (set-default 'truncate-lines t)
495a2b0a 21
4d235ac7 22;;; Here is how to do it for C mode only:
495a2b0a
RS
23;;;
24;;; (set-default 'truncate-lines nil) ; this is the original value
25;;; (defun my-c-mode-hook ()
26;;; "Run when C-mode starts up. Changes ..."
27;;; ... set various personal preferences ...
28;;; (setq truncate-lines t))
29;;; (add-hook 'c-mode-hook 'my-c-mode-hook)
30;;;
31;;;
4d235ac7
RS
32;;; As a finer level of control, you can still have truncated lines but
33;;; without the automatic horizontal scrolling by setting the buffer
34;;; local variable `auto-show-mode' to nil. The default value is t.
35;;; The command `auto-show-mode' toggles the value of the variable
36;;; `auto-show-mode'.
495a2b0a 37
4d235ac7 38;;; Code:
495a2b0a 39
4d235ac7
RS
40(defvar auto-show-mode t
41 "*Non-nil enables automatic horizontal scrolling, when lines are truncated.
42The default value is t. To change the default, do this:
43 (set-default 'auto-show-mode nil)
44See also command `auto-show-mode'.
50b3531c
RS
45This variable has no effect when lines are not being truncated.
46This variable is automatically local in each buffer where it is set.")
495a2b0a 47
4d235ac7 48(make-variable-buffer-local 'auto-show-mode)
495a2b0a
RS
49
50(defvar auto-show-shift-amount 8
4d235ac7 51 "*Extra columns to scroll. for automatic horizontal scrolling.")
495a2b0a
RS
52
53(defvar auto-show-show-left-margin-threshold 50
4d235ac7
RS
54 "*Threshold column for automatic horizontal scrolling to the right.
55If point is before this column, we try to scroll to make the left margin
495a2b0a
RS
56visible. Setting this to 0 disables this feature.")
57
58(defun auto-show-truncationp ()
4d235ac7 59 "True if line truncation is enabled for the selected window."
495a2b0a
RS
60 (or truncate-lines
61 (and truncate-partial-width-windows
62 (< (window-width) (frame-width)))))
63
4d235ac7
RS
64;;;###autoload
65(defun auto-show-mode (arg)
66 "Turn automatic horizontal scroll mode on or off.
50b3531c
RS
67With arg, turn auto scrolling on if arg is positive, off otherwise.
68This mode is enabled or disabled for each buffer individually.
69It takes effect only when `truncate-lines' is non-nil."
4d235ac7
RS
70 (interactive "P")
71 (setq auto-show-mode
72 (if (null arg)
73 (not auto-show-mode)
74 (> (prefix-numeric-value arg) 0))))
495a2b0a
RS
75
76(defun auto-show-make-point-visible (&optional ignore-arg)
4d235ac7
RS
77 "Scroll horizontally to make point visible, if that is enabled.
78This function only does something if `auto-show-mode' is non-nil
79and longlines are being truncated in the selected window.
50b3531c 80See also the command `auto-show-mode'."
495a2b0a 81 (interactive)
4d235ac7 82 (if (and auto-show-mode (auto-show-truncationp)
495a2b0a
RS
83 (equal (window-buffer) (current-buffer)))
84 (let* ((col (current-column)) ;column on line point is at
85 (scroll (window-hscroll)) ;how far window is scrolled
86 (w-width (- (window-width)
87 (if (> scroll 0)
88 2 1))) ;how wide window is on the screen
89 (right-col (+ scroll w-width)))
90 (if (and (< col auto-show-show-left-margin-threshold)
91 (< col (window-width))
92 (> scroll 0))
93 (scroll-right scroll)
94 (if (< col scroll) ;to the left of the screen
95 (scroll-right (+ (- scroll col) auto-show-shift-amount))
96 (if (or (> col right-col) ;to the right of the screen
97 (and (= col right-col)
98 (not (eolp))))
99 (scroll-left (+ auto-show-shift-amount
100 (- col (+ scroll w-width))))
101 )
102 )
103 )
104 )
105 )
106 )
107
4d235ac7
RS
108;; Do auto-scrolling after commands.
109(add-hook 'post-command-hook 'auto-show-make-point-visible)
495a2b0a 110
4d235ac7
RS
111;; Do auto-scrolling in comint buffers after process output also.
112(add-hook 'comint-output-filter-functions 'auto-show-make-point-visible t)
113
114(provide 'auto-show)
495a2b0a 115
4d235ac7 116;; auto-show.el ends here
495a2b0a 117