annotate lisp/hscroll.el @ 25373:6e6b29a72e2c

(gap_left): Use BUF_COMPUTE_UNCHANGED. (gap_right): Ditto. (modify_region): Ditto. (gap_left): Compute beg/end_unchanged per buffer. (gap_right): Ditto. (adjust_after_replace): Likewise. (replace_range, del_range_2, modify_region): Likewise.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 23 Aug 1999 00:11:45 +0000
parents db6ed843d5e8
children 856179ce1645
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
1 ;;; hscroll.el: Minor mode to automatically scroll truncated lines horizontally
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
2 ;;; Copyright (C) 1992, 1993, 1995, 1996 Free Software Foundation, Inc.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
3
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
4 ;; Author: Wayne Mesard <wmesard@esd.sgi.com>
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
5 ;; Keywords: display
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
6
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
7 ;; This file is part of GNU Emacs.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
8
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
9 ;; GNU Emacs is free software; you can redistribute it and/or modify
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
10 ;; it under the terms of the GNU General Public License as published by
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
11 ;; the Free Software Foundation; either version 2, or (at your option)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
12 ;; any later version.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
13
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
14 ;; GNU Emacs is distributed in the hope that it will be useful,
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
17 ;; GNU General Public License for more details.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
18
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
19 ;; You should have received a copy of the GNU General Public License
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
20 ;; along with GNU Emacs; see the file COPYING. If not, write to the
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
22 ;; Boston, MA 02111-1307, USA.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
23
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
24 ;;; Commentary:
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
25 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
26 ;; Automatically scroll horizontally when the point moves off the
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
27 ;; left or right edge of the window.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
28 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
29 ;; - Type "M-x hscroll-mode" to enable it in the current buffer.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
30 ;; - Type "M-x hscroll-global-mode" to enable it in every buffer.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
31 ;; - "turn-on-hscroll" is useful in mode hooks as in:
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
32 ;; (add-hook 'text-mode-hook 'turn-on-hscroll)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
33 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
34 ;; - hscroll-margin controls how close the cursor can get to the edge
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
35 ;; of the window.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
36 ;; - hscroll-step-percent controls how far to jump once we decide to do so.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
37 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
38 ;; Most users won't want to mess with the other variables defined
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
39 ;; here. But they're all documented, and they all start with
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
40 ;; "hscroll-" if you're curious.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
41 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
42 ;; Oh, you should also know that if you set the hscroll-margin and
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
43 ;; hscroll-step-percent large enough, you can get an interesting, but
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
44 ;; undesired ping-pong effect as the point bounces from one edge to
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
45 ;; the other.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
46 ;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
47 ;; wmesard@sgi.com
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
48
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
49 ;;; Code:
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
50
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
51 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
52 ;;; PUBLIC VARIABLES
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
53 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
54
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
55 (defvar hscroll-version "2.2")
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
56
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
57 (defgroup hscroll nil
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
58 "Minor mode to automatically scroll truncated lines horizontally."
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
59 :group 'editing)
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
60
20765
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
61
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
62 (defcustom hscroll-global-mode nil
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
63 "Toggle horizontal scrolling.
24643
563d3e9af0fd (hscroll-global-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24550
diff changeset
64 Setting this variable directly does not take effect;
563d3e9af0fd (hscroll-global-mode): Doc fix.
Dave Love <fx@gnu.org>
parents: 24550
diff changeset
65 use either \\[customize] or the function `hscroll-global-mode'."
20765
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
66 :set (lambda (symbol value)
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
67 (hscroll-global-mode (if value 1 -1)))
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
68 :initialize 'custom-initialize-default
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
69 :group 'hscroll
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
70 :type 'boolean
21670
808ecc2eaa84 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20765
diff changeset
71 :require 'hscroll
808ecc2eaa84 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 20765
diff changeset
72 :version "20.3")
20765
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
73
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
74 (defcustom hscroll-margin 5
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
75 "*How many columns away from the edge of the window point is allowed to get
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
76 before HScroll will horizontally scroll the window."
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
77 :group 'hscroll
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
78 :type 'integer)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
79
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
80 (defcustom hscroll-snap-threshold 30
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
81 "*When point is this many columns (or less) from the left edge of the document,
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
82 don't do any horizontal scrolling. In other words, be biased towards the left
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
83 edge of the document.
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
84 Set this variable to zero to disable this bias."
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
85 :group 'hscroll
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
86 :type 'integer)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
87
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
88 (defcustom hscroll-step-percent 25
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
89 "*How far away to place the point from the window's edge when scrolling.
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
90 Expressed as a percentage of the window's width."
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
91 :group 'hscroll
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
92 :type 'integer)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
93
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
94 (defcustom hscroll-mode-name " Hscr"
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
95 "*Horizontal scrolling mode line indicator.
19420
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
96 Set this to nil to conserve valuable mode line space."
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
97 :group 'hscroll
681823a203b6 Customized.
Richard M. Stallman <rms@gnu.org>
parents: 16583
diff changeset
98 :type 'string)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
99
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
100 (or (assq 'hscroll-mode minor-mode-alist)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
101 (setq minor-mode-alist
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
102 (cons '(hscroll-mode hscroll-mode-name) minor-mode-alist)))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
103
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
104
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
105 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
106 ;;; PRIVATE VARIABLES
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
107 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
108
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
109 (defvar hscroll-mode nil
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
110 "Non-nil if HScroll mode is enabled.")
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
111 (make-variable-buffer-local 'hscroll-mode)
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
112 ;; Make it a permanent local
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
113 ;; so it will only turn off when WE turn it off.
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
114 (put 'hscroll-mode 'permanent-local t)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
115
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
116 (defvar hscroll-timer nil
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
117 "Timer used by HScroll mode.")
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
118
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
119 (defvar hscroll-old-truncate-local nil)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
120 (defvar hscroll-old-truncate-was-global nil)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
121 (make-variable-buffer-local 'hscroll-old-truncate)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
122 (make-variable-buffer-local 'hscroll-old-truncate-was-global)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
123
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
124 (defvar hscroll-old-truncate-default nil)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
125
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
126 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
127 ;;; PUBLIC COMMANDS
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
128 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
129
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
130 ;;;###autoload
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
131 (defun turn-on-hscroll ()
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
132 "Unconditionally turn on Hscroll mode in the current buffer."
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
133 (hscroll-mode 1))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
134
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
135 ;;;###autoload
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
136 (defun hscroll-mode (&optional arg)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
137 "Toggle HScroll mode in the current buffer.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
138 With ARG, turn HScroll mode on if ARG is positive, off otherwise.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
139 In HScroll mode, truncated lines will automatically scroll left or
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
140 right when point gets near either edge of the window.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
141 See also \\[hscroll-global-mode]."
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
142 (interactive "P")
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
143 (let ((newmode (if (null arg)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
144 (not hscroll-mode)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
145 (> (prefix-numeric-value arg) 0))))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
146
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
147 (if newmode
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
148 ;; Turn it on.
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
149 (if (not hscroll-mode)
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
150 ;; It was off.
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
151 (let ((localp (local-variable-p 'truncate-lines)))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
152 (if localp
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
153 (setq hscroll-old-truncate-local truncate-lines))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
154 (setq hscroll-old-truncate-was-global (not localp))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
155 (setq truncate-lines t)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
156 (setq hscroll-timer
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
157 (run-with-idle-timer 0 t 'hscroll-window-maybe))))
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
158 ;; Turn it off.
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
159 (if hscroll-mode
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
160 ;; It was on.
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
161 (progn
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
162 (if hscroll-old-truncate-was-global
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
163 (kill-local-variable 'truncate-lines)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
164 (setq truncate-lines hscroll-old-truncate-local))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
165 (if (not truncate-lines)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
166 (set-window-hscroll (selected-window) 0))
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
167 ;; If hscroll is not enabled in any buffer now,
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
168 ;; turn off the timer.
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
169 (unless (memq t (mapcar (lambda (buffer)
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
170 (with-current-buffer buffer
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
171 hscroll-mode))
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
172 (buffer-list)))
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
173 (cancel-timer hscroll-timer)))))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
174
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
175 (setq hscroll-mode newmode)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
176 (force-mode-line-update nil)))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
177
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
178
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
179 ;;;###autoload
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
180 (defun hscroll-global-mode (&optional arg)
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
181 "Toggle HScroll mode in all buffers (excepting minibuffers).
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
182 With ARG, turn HScroll mode on if ARG is positive, off otherwise.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
183 If a buffer ever has HScroll mode set locally (via \\[hscroll-mode]),
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
184 it will forever use the local value (i.e., \\[hscroll-global-mode]
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
185 will have no effect on it).
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
186 See also \\[hscroll-mode]."
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
187 (interactive "P")
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
188 (let* ((oldmode (default-value 'hscroll-mode))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
189 (newmode (if (null arg)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
190 (not oldmode)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
191 (> (prefix-numeric-value arg) 0))))
20765
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
192 (setq hscroll-global-mode newmode)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
193 (if newmode
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
194 ;; turn it on
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
195 (if (not hscroll-mode)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
196 ;; it was off
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
197 (progn
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
198 (setq hscroll-old-truncate-default (default-value truncate-lines))
24939
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
199 (setq-default hscroll-old-truncate-was-global t)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
200 (setq-default truncate-lines t)
24939
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
201 (add-hook 'minibuffer-setup-hook 'hscroll-minibuffer-hook)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
202 (setq hscroll-timer
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
203 (run-with-idle-timer 0 t 'hscroll-window-maybe))))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
204 ;; turn it off
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
205 (if hscroll-mode
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
206 ;; it was on
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
207 (progn
24939
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
208 (remove-hook 'minibuffer-setup-hook 'hscroll-minibuffer-hook)
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
209 (setq-default truncate-lines hscroll-old-truncate-default)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
210 (cancel-timer hscroll-timer))))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
211
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
212 (setq-default hscroll-mode newmode)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
213 (force-mode-line-update t)))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
214
24939
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
215 (defun hscroll-minibuffer-hook ()
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
216 (setq truncate-lines hscroll-old-truncate-default))
db6ed843d5e8 (hscroll-minibuffer-hook): New function.
Richard M. Stallman <rms@gnu.org>
parents: 24922
diff changeset
217
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
218 (defun hscroll-window-maybe ()
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
219 "Scroll horizontally if point is off or nearly off the edge of the window.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
220 This is called automatically when in HScroll mode, but it can be explicitly
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
221 invoked as well (i.e., it can be bound to a key).
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
222 This does nothing in the minibuffer."
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
223 (interactive)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
224 ;; Only consider scrolling if truncate-lines is true,
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
225 ;; the window is already scrolled or partial-widths is true and this is
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
226 ;; a partial width window. See display_text_line in xdisp.c.
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
227 (if (and hscroll-mode
24922
ebff04ce5d74 (hscroll-window-maybe): Do nothing in the minibuffer.
Richard M. Stallman <rms@gnu.org>
parents: 24643
diff changeset
228 (not (window-minibuffer-p (selected-window)))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
229 (or truncate-lines
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
230 (not (zerop (window-hscroll)))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
231 (and truncate-partial-width-windows
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
232 (< (window-width) (frame-width)))))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
233 (let ((linelen (save-excursion (end-of-line) (current-column)))
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
234 (rightmost-char (+ (window-width) (window-hscroll))))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
235 (if (< (current-column) hscroll-snap-threshold)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
236 (set-window-hscroll
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
237 (selected-window)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
238 (- (window-hscroll)))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
239 (if (>= (current-column)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
240 (- rightmost-char hscroll-margin
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
241 ;; Off-by-one if the left edge is scrolled
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
242 (if (not (zerop (window-hscroll))) 1 0)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
243 ;; Off by one if the right edge is scrolled
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
244 (if (> linelen rightmost-char) 1 0)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
245 ))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
246 ;; Scroll to the left a proportion of the window's width.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
247 (set-window-hscroll
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
248 (selected-window)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
249 (- (+ (current-column)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
250 (/ (* (window-width) hscroll-step-percent) 100))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
251 (window-width)))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
252 (if (< (current-column) (+ (window-hscroll) hscroll-margin))
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
253 ;; Scroll to the right a proportion of the window's width.
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
254 (set-window-hscroll
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
255 (selected-window)
23789
7d763e90da82 (hscroll-mode, hscroll-global-mode, hscroll-window-maybe):
Richard M. Stallman <rms@gnu.org>
parents: 21670
diff changeset
256 (- (current-column) (/ (* (window-width) hscroll-step-percent) 100)))))))))
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
257
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
258 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
259 ;;; It's not a bug, it's a *feature*
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
260 ;;;
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
261
20765
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
262 (if hscroll-global-mode
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
263 (hscroll-global-mode 1))
2bdc3877262b (hscroll-global-mode): New customize variable to automatically load the
Stephen Eglen <stephen@gnu.org>
parents: 19420
diff changeset
264
16583
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
265 (provide 'hscroll)
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
266
483fc45a80b6 Initial revision
Karl Heuer <kwzh@gnu.org>
parents:
diff changeset
267 ;;; hscroll.el ends here