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