Add "Package:" file headers to denote built-in packages.
[bpt/emacs.git] / lisp / simple.el
CommitLineData
c88ab9ce
ER
1;;; simple.el --- basic editing commands for Emacs
2
c6db81aa 3;; Copyright (C) 1985, 1986, 1987, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
114f9c96 4;; 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
bf825c62 5;; Free Software Foundation, Inc.
2076c87c 6
30764597
PJ
7;; Maintainer: FSF
8;; Keywords: internal
bd78fa1d 9;; Package: emacs
30764597 10
2076c87c
JB
11;; This file is part of GNU Emacs.
12
eb3fa2cf 13;; GNU Emacs is free software: you can redistribute it and/or modify
2076c87c 14;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
2076c87c
JB
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
eb3fa2cf 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
2076c87c 25
d9ecc911
ER
26;;; Commentary:
27
28;; A grab-bag of basic Emacs commands not specifically related to some
29;; major mode or to file-handling.
30
3a801d0c 31;;; Code:
2076c87c 32
30ee26a9
EZ
33;; This is for lexical-let in apply-partially.
34(eval-when-compile (require 'cl))
35
f31b1257
DN
36(declare-function widget-convert "wid-edit" (type &rest args))
37(declare-function shell-mode "shell" ())
d01a33cf 38
ca60ee11
JB
39(defvar compilation-current-error)
40
7fcce20f 41(defcustom idle-update-delay 0.5
1d2b0303 42 "Idle time delay before updating various things on the screen.
7fcce20f
RS
43Various Emacs features that update auxiliary information when point moves
44wait this many seconds after Emacs becomes idle before doing an update."
45 :type 'number
46 :group 'display
47 :version "22.1")
d01a33cf 48
69c1dd37 49(defgroup killing nil
c9f0110e 50 "Killing and yanking commands."
69c1dd37
RS
51 :group 'editing)
52
69c1dd37
RS
53(defgroup paren-matching nil
54 "Highlight (un)matching of parens and expressions."
69c1dd37
RS
55 :group 'matching)
56
7979163c
JL
57(defun get-next-valid-buffer (list &optional buffer visible-ok frame)
58 "Search LIST for a valid buffer to display in FRAME.
a74f9094
KL
59Return nil when all buffers in LIST are undesirable for display,
60otherwise return the first suitable buffer in LIST.
61
62Buffers not visible in windows are preferred to visible buffers,
63unless VISIBLE-OK is non-nil.
64If the optional argument FRAME is nil, it defaults to the selected frame.
7979163c 65If BUFFER is non-nil, ignore occurrences of that buffer in LIST."
a74f9094
KL
66 ;; This logic is more or less copied from other-buffer.
67 (setq frame (or frame (selected-frame)))
68 (let ((pred (frame-parameter frame 'buffer-predicate))
69 found buf)
70 (while (and (not found) list)
71 (setq buf (car list))
72 (if (and (not (eq buffer buf))
73 (buffer-live-p buf)
74 (or (null pred) (funcall pred buf))
75 (not (eq (aref (buffer-name buf) 0) ?\s))
76 (or visible-ok (null (get-buffer-window buf 'visible))))
77 (setq found buf)
78 (setq list (cdr list))))
79 (car list)))
80
7979163c 81(defun last-buffer (&optional buffer visible-ok frame)
4dc1abeb
MR
82 "Return the last buffer in FRAME's buffer list.
83If BUFFER is the last buffer, return the preceding buffer instead.
a74f9094
KL
84Buffers not visible in windows are preferred to visible buffers,
85unless optional argument VISIBLE-OK is non-nil.
4dc1abeb
MR
86Optional third argument FRAME nil or omitted means use the
87selected frame's buffer list.
88If no such buffer exists, return the buffer `*scratch*', creating
89it if necessary."
a74f9094 90 (setq frame (or frame (selected-frame)))
a18b8cb5
KL
91 (or (get-next-valid-buffer (nreverse (buffer-list frame))
92 buffer visible-ok frame)
4dc1abeb
MR
93 (get-buffer "*scratch*")
94 (let ((scratch (get-buffer-create "*scratch*")))
95 (set-buffer-major-mode scratch)
96 scratch)))
97
f54b0d85
RS
98(defun next-buffer ()
99 "Switch to the next buffer in cyclic order."
100 (interactive)
a18b8cb5 101 (let ((buffer (current-buffer)))
a74f9094 102 (switch-to-buffer (other-buffer buffer t))
a18b8cb5 103 (bury-buffer buffer)))
a74f9094
KL
104
105(defun previous-buffer ()
f54b0d85
RS
106 "Switch to the previous buffer in cyclic order."
107 (interactive)
a18b8cb5 108 (switch-to-buffer (last-buffer (current-buffer) t)))
a74f9094 109
ee9c5954 110\f
50f007fb 111;;; next-error support framework
bbf41690
RS
112
113(defgroup next-error nil
f33321ad 114 "`next-error' support framework."
bbf41690 115 :group 'compilation
bf247b6e 116 :version "22.1")
bbf41690
RS
117
118(defface next-error
119 '((t (:inherit region)))
120 "Face used to highlight next error locus."
121 :group 'next-error
bf247b6e 122 :version "22.1")
bbf41690 123
7408ee97 124(defcustom next-error-highlight 0.5
1d2b0303 125 "Highlighting of locations in selected source buffers.
676b1a74
CY
126If a number, highlight the locus in `next-error' face for the given time
127in seconds, or until the next command is executed.
128If t, highlight the locus until the next command is executed, or until
129some other locus replaces it.
bbf41690
RS
130If nil, don't highlight the locus in the source buffer.
131If `fringe-arrow', indicate the locus by the fringe arrow."
6d3c944b 132 :type '(choice (number :tag "Highlight for specified time")
c81b29e6 133 (const :tag "Semipermanent highlighting" t)
bbf41690 134 (const :tag "No highlighting" nil)
6d3c944b 135 (const :tag "Fringe arrow" fringe-arrow))
bbf41690 136 :group 'next-error
bf247b6e 137 :version "22.1")
bbf41690 138
7408ee97 139(defcustom next-error-highlight-no-select 0.5
1d2b0303 140 "Highlighting of locations in `next-error-no-select'.
f33321ad 141If number, highlight the locus in `next-error' face for given time in seconds.
6d3c944b 142If t, highlight the locus indefinitely until some other locus replaces it.
bbf41690
RS
143If nil, don't highlight the locus in the source buffer.
144If `fringe-arrow', indicate the locus by the fringe arrow."
6d3c944b 145 :type '(choice (number :tag "Highlight for specified time")
c81b29e6 146 (const :tag "Semipermanent highlighting" t)
bbf41690 147 (const :tag "No highlighting" nil)
6d3c944b 148 (const :tag "Fringe arrow" fringe-arrow))
bbf41690 149 :group 'next-error
bf247b6e 150 :version "22.1")
bbf41690 151
446b609e 152(defcustom next-error-recenter nil
1d2b0303 153 "Display the line in the visited source file recentered as specified.
28adf31c
TTN
154If non-nil, the value is passed directly to `recenter'."
155 :type '(choice (integer :tag "Line to recenter to")
156 (const :tag "Center of window" (4))
446b609e
TTN
157 (const :tag "No recentering" nil))
158 :group 'next-error
159 :version "23.1")
160
d634a3a2 161(defcustom next-error-hook nil
1d2b0303 162 "List of hook functions run by `next-error' after visiting source file."
d634a3a2
JL
163 :type 'hook
164 :group 'next-error)
165
814c3037
JL
166(defvar next-error-highlight-timer nil)
167
9c9b00d6 168(defvar next-error-overlay-arrow-position nil)
6bdad9ae 169(put 'next-error-overlay-arrow-position 'overlay-arrow-string (purecopy "=>"))
9c9b00d6
JL
170(add-to-list 'overlay-arrow-variable-list 'next-error-overlay-arrow-position)
171
50f007fb 172(defvar next-error-last-buffer nil
f33321ad 173 "The most recent `next-error' buffer.
50f007fb
KS
174A buffer becomes most recent when its compilation, grep, or
175similar mode is started, or when it is used with \\[next-error]
176or \\[compile-goto-error].")
177
178(defvar next-error-function nil
e462ab77
SM
179 "Function to use to find the next error in the current buffer.
180The function is called with 2 parameters:
181ARG is an integer specifying by how many errors to move.
182RESET is a boolean which, if non-nil, says to go back to the beginning
183of the errors before moving.
184Major modes providing compile-like functionality should set this variable
185to indicate to `next-error' that this is a candidate buffer and how
186to navigate in it.")
50f007fb
KS
187(make-variable-buffer-local 'next-error-function)
188
8cdba32b
RS
189(defvar next-error-move-function nil
190 "Function to use to move to an error locus.
191It takes two arguments, a buffer position in the error buffer
192and a buffer position in the error locus buffer.
193The buffer for the error locus should already be current.
194nil means use goto-char using the second argument position.")
195(make-variable-buffer-local 'next-error-move-function)
196
f1e2a033 197(defsubst next-error-buffer-p (buffer
e967cd11 198 &optional avoid-current
f1e2a033 199 extra-test-inclusive
5f9e0ca5 200 extra-test-exclusive)
f33321ad 201 "Test if BUFFER is a `next-error' capable buffer.
e967cd11
RS
202
203If AVOID-CURRENT is non-nil, treat the current buffer
204as an absolute last resort only.
205
206The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffer
207that normally would not qualify. If it returns t, the buffer
208in question is treated as usable.
209
7979163c 210The function EXTRA-TEST-EXCLUSIVE, if non-nil, is called in each buffer
01ba9662 211that would normally be considered usable. If it returns nil,
e967cd11
RS
212that buffer is rejected."
213 (and (buffer-name buffer) ;First make sure it's live.
214 (not (and avoid-current (eq buffer (current-buffer))))
215 (with-current-buffer buffer
216 (if next-error-function ; This is the normal test.
217 ;; Optionally reject some buffers.
218 (if extra-test-exclusive
219 (funcall extra-test-exclusive)
220 t)
221 ;; Optionally accept some other buffers.
222 (and extra-test-inclusive
223 (funcall extra-test-inclusive))))))
224
225(defun next-error-find-buffer (&optional avoid-current
f1e2a033 226 extra-test-inclusive
5f9e0ca5 227 extra-test-exclusive)
f33321ad 228 "Return a `next-error' capable buffer.
7979163c 229
e967cd11
RS
230If AVOID-CURRENT is non-nil, treat the current buffer
231as an absolute last resort only.
232
01ba9662 233The function EXTRA-TEST-INCLUSIVE, if non-nil, is called in each buffer
e967cd11
RS
234that normally would not qualify. If it returns t, the buffer
235in question is treated as usable.
236
7979163c 237The function EXTRA-TEST-EXCLUSIVE, if non-nil, is called in each buffer
e967cd11
RS
238that would normally be considered usable. If it returns nil,
239that buffer is rejected."
03e75c7e
JL
240 (or
241 ;; 1. If one window on the selected frame displays such buffer, return it.
242 (let ((window-buffers
243 (delete-dups
244 (delq nil (mapcar (lambda (w)
245 (if (next-error-buffer-p
e967cd11
RS
246 (window-buffer w)
247 avoid-current
f1e2a033 248 extra-test-inclusive extra-test-exclusive)
03e75c7e
JL
249 (window-buffer w)))
250 (window-list))))))
03e75c7e
JL
251 (if (eq (length window-buffers) 1)
252 (car window-buffers)))
e967cd11 253 ;; 2. If next-error-last-buffer is an acceptable buffer, use that.
03e75c7e 254 (if (and next-error-last-buffer
e967cd11 255 (next-error-buffer-p next-error-last-buffer avoid-current
f1e2a033 256 extra-test-inclusive extra-test-exclusive))
e967cd11
RS
257 next-error-last-buffer)
258 ;; 3. If the current buffer is acceptable, choose it.
259 (if (next-error-buffer-p (current-buffer) avoid-current
260 extra-test-inclusive extra-test-exclusive)
03e75c7e 261 (current-buffer))
e967cd11 262 ;; 4. Look for any acceptable buffer.
03e75c7e
JL
263 (let ((buffers (buffer-list)))
264 (while (and buffers
e967cd11
RS
265 (not (next-error-buffer-p
266 (car buffers) avoid-current
267 extra-test-inclusive extra-test-exclusive)))
03e75c7e 268 (setq buffers (cdr buffers)))
e967cd11
RS
269 (car buffers))
270 ;; 5. Use the current buffer as a last resort if it qualifies,
271 ;; even despite AVOID-CURRENT.
272 (and avoid-current
273 (next-error-buffer-p (current-buffer) nil
274 extra-test-inclusive extra-test-exclusive)
275 (progn
ee4dc5d9 276 (message "This is the only buffer with error message locations")
e967cd11
RS
277 (current-buffer)))
278 ;; 6. Give up.
ee4dc5d9 279 (error "No buffers contain error message locations")))
50f007fb 280
310abb0b 281(defun next-error (&optional arg reset)
f33321ad 282 "Visit next `next-error' message and corresponding source code.
50f007fb
KS
283
284If all the error messages parsed so far have been processed already,
285the message buffer is checked for new ones.
286
e462ab77 287A prefix ARG specifies how many error messages to move;
50f007fb
KS
288negative means move back to previous error messages.
289Just \\[universal-argument] as a prefix means reparse the error message buffer
290and start at the first error.
291
e249a6d8 292The RESET argument specifies that we should restart from the beginning.
50f007fb
KS
293
294\\[next-error] normally uses the most recently started
295compilation, grep, or occur buffer. It can also operate on any
296buffer with output from the \\[compile], \\[grep] commands, or,
297more generally, on any buffer in Compilation mode or with
298Compilation Minor mode enabled, or any buffer in which
03e75c7e
JL
299`next-error-function' is bound to an appropriate function.
300To specify use of a particular buffer for error messages, type
301\\[next-error] in that buffer when it is the only one displayed
302in the current frame.
50f007fb 303
d634a3a2
JL
304Once \\[next-error] has chosen the buffer for error messages, it
305runs `next-error-hook' with `run-hooks', and stays with that buffer
306until you use it in some other buffer which uses Compilation mode
307or Compilation Minor mode.
50f007fb
KS
308
309See variables `compilation-parse-errors-function' and
310\`compilation-error-regexp-alist' for customization ideas."
311 (interactive "P")
e462ab77 312 (if (consp arg) (setq reset t arg nil))
50f007fb
KS
313 (when (setq next-error-last-buffer (next-error-find-buffer))
314 ;; we know here that next-error-function is a valid symbol we can funcall
315 (with-current-buffer next-error-last-buffer
d634a3a2 316 (funcall next-error-function (prefix-numeric-value arg) reset)
446b609e
TTN
317 (when next-error-recenter
318 (recenter next-error-recenter))
d634a3a2 319 (run-hooks 'next-error-hook))))
50f007fb 320
56ab610b
RS
321(defun next-error-internal ()
322 "Visit the source code corresponding to the `next-error' message at point."
323 (setq next-error-last-buffer (current-buffer))
324 ;; we know here that next-error-function is a valid symbol we can funcall
325 (with-current-buffer next-error-last-buffer
326 (funcall next-error-function 0 nil)
446b609e
TTN
327 (when next-error-recenter
328 (recenter next-error-recenter))
56ab610b
RS
329 (run-hooks 'next-error-hook)))
330
50f007fb
KS
331(defalias 'goto-next-locus 'next-error)
332(defalias 'next-match 'next-error)
333
310abb0b 334(defun previous-error (&optional n)
f33321ad 335 "Visit previous `next-error' message and corresponding source code.
50f007fb
KS
336
337Prefix arg N says how many error messages to move backwards (or
338forwards, if negative).
339
340This operates on the output from the \\[compile] and \\[grep] commands."
341 (interactive "p")
310abb0b 342 (next-error (- (or n 1))))
50f007fb 343
310abb0b 344(defun first-error (&optional n)
50f007fb
KS
345 "Restart at the first error.
346Visit corresponding source code.
347With prefix arg N, visit the source code of the Nth error.
348This operates on the output from the \\[compile] command, for instance."
349 (interactive "p")
350 (next-error n t))
351
310abb0b 352(defun next-error-no-select (&optional n)
f33321ad 353 "Move point to the next error in the `next-error' buffer and highlight match.
50f007fb
KS
354Prefix arg N says how many error messages to move forwards (or
355backwards, if negative).
356Finds and highlights the source line like \\[next-error], but does not
357select the source buffer."
358 (interactive "p")
ee9c5954
JL
359 (let ((next-error-highlight next-error-highlight-no-select))
360 (next-error n))
50f007fb
KS
361 (pop-to-buffer next-error-last-buffer))
362
310abb0b 363(defun previous-error-no-select (&optional n)
f33321ad 364 "Move point to the previous error in the `next-error' buffer and highlight match.
50f007fb
KS
365Prefix arg N says how many error messages to move backwards (or
366forwards, if negative).
367Finds and highlights the source line like \\[previous-error], but does not
368select the source buffer."
369 (interactive "p")
310abb0b 370 (next-error-no-select (- (or n 1))))
50f007fb 371
85be9ec4 372;; Internal variable for `next-error-follow-mode-post-command-hook'.
282d6eae
EZ
373(defvar next-error-follow-last-line nil)
374
2a223f35 375(define-minor-mode next-error-follow-minor-mode
282d6eae 376 "Minor mode for compilation, occur and diff modes.
2a223f35
EZ
377When turned on, cursor motion in the compilation, grep, occur or diff
378buffer causes automatic display of the corresponding source code
379location."
ed8e0f0a 380 :group 'next-error :init-value nil :lighter " Fol"
8a98a6c2 381 (if (not next-error-follow-minor-mode)
282d6eae
EZ
382 (remove-hook 'post-command-hook 'next-error-follow-mode-post-command-hook t)
383 (add-hook 'post-command-hook 'next-error-follow-mode-post-command-hook nil t)
e56dd5c6 384 (make-local-variable 'next-error-follow-last-line)))
282d6eae 385
85be9ec4
SM
386;; Used as a `post-command-hook' by `next-error-follow-mode'
387;; for the *Compilation* *grep* and *Occur* buffers.
282d6eae
EZ
388(defun next-error-follow-mode-post-command-hook ()
389 (unless (equal next-error-follow-last-line (line-number-at-pos))
390 (setq next-error-follow-last-line (line-number-at-pos))
391 (condition-case nil
392 (let ((compilation-context-lines nil))
393 (setq compilation-current-error (point))
394 (next-error-no-select 0))
395 (error t))))
396
ee9c5954 397\f
50f007fb
KS
398;;;
399
93be67de
KH
400(defun fundamental-mode ()
401 "Major mode not specialized for anything in particular.
402Other major modes are defined by comparison with this one."
403 (interactive)
e174f8db 404 (kill-all-local-variables)
56924d99 405 (run-mode-hooks 'fundamental-mode-hook))
eaae8106 406
d445b3f8
SM
407;; Special major modes to view specially formatted data rather than files.
408
409(defvar special-mode-map
410 (let ((map (make-sparse-keymap)))
411 (suppress-keymap map)
412 (define-key map "q" 'quit-window)
413 (define-key map " " 'scroll-up)
414 (define-key map "\C-?" 'scroll-down)
415 (define-key map "?" 'describe-mode)
416 (define-key map ">" 'end-of-buffer)
417 (define-key map "<" 'beginning-of-buffer)
418 (define-key map "g" 'revert-buffer)
419 map))
1d2b0303 420
d445b3f8
SM
421(put 'special-mode 'mode-class 'special)
422(define-derived-mode special-mode nil "Special"
423 "Parent major mode from which special major modes should inherit."
424 (setq buffer-read-only t))
425
10dcc561
SM
426;; Major mode meant to be the parent of programming modes.
427
b2a15250
SM
428(defvar prog-mode-map
429 (let ((map (make-sparse-keymap)))
430 (define-key map [?\C-\M-q] 'prog-indent-sexp)
431 map)
432 "Keymap used for programming modes.")
433
434(defun prog-indent-sexp ()
435 "Indent the expression after point."
436 (interactive)
437 (let ((start (point))
438 (end (save-excursion (forward-sexp 1) (point))))
439 (indent-region start end nil)))
440
10dcc561
SM
441(define-derived-mode prog-mode fundamental-mode "Prog"
442 "Major mode for editing programming language source code."
443 (set (make-local-variable 'require-final-newline) mode-require-final-newline)
444 (set (make-local-variable 'parse-sexp-ignore-comments) t))
445
93be67de
KH
446;; Making and deleting lines.
447
28fab7b5
GM
448(defvar hard-newline (propertize "\n" 'hard t 'rear-nonsticky '(hard))
449 "Propertized string representing a hard newline character.")
4ea0018b 450
30bb9754 451(defun newline (&optional arg)
d133d835 452 "Insert a newline, and move to left margin of the new line if it's blank.
058d4999
DL
453If `use-hard-newlines' is non-nil, the newline is marked with the
454text-property `hard'.
76c64e24 455With ARG, insert that many newlines.
058d4999 456Call `auto-fill-function' if the current column number is greater
6688f85f 457than the value of `fill-column' and ARG is nil."
30bb9754 458 (interactive "*P")
4c4cbf11 459 (barf-if-buffer-read-only)
30bb9754
BG
460 ;; Inserting a newline at the end of a line produces better redisplay in
461 ;; try_window_id than inserting at the beginning of a line, and the textual
462 ;; result is the same. So, if we're at beginning of line, pretend to be at
463 ;; the end of the previous line.
1e722f9f 464 (let ((flag (and (not (bobp))
30bb9754 465 (bolp)
1cd24721
RS
466 ;; Make sure no functions want to be told about
467 ;; the range of the changes.
1cd24721
RS
468 (not after-change-functions)
469 (not before-change-functions)
fd977703
RS
470 ;; Make sure there are no markers here.
471 (not (buffer-has-markers-at (1- (point))))
2f047f6c 472 (not (buffer-has-markers-at (point)))
1cd24721
RS
473 ;; Make sure no text properties want to know
474 ;; where the change was.
475 (not (get-char-property (1- (point)) 'modification-hooks))
476 (not (get-char-property (1- (point)) 'insert-behind-hooks))
477 (or (eobp)
478 (not (get-char-property (point) 'insert-in-front-hooks)))
31a5333f
MB
479 ;; Make sure the newline before point isn't intangible.
480 (not (get-char-property (1- (point)) 'intangible))
481 ;; Make sure the newline before point isn't read-only.
482 (not (get-char-property (1- (point)) 'read-only))
483 ;; Make sure the newline before point isn't invisible.
484 (not (get-char-property (1- (point)) 'invisible))
485 ;; Make sure the newline before point has the same
486 ;; properties as the char before it (if any).
1e722f9f 487 (< (or (previous-property-change (point)) -2)
d133d835
RS
488 (- (point) 2))))
489 (was-page-start (and (bolp)
490 (looking-at page-delimiter)))
491 (beforepos (point)))
30bb9754
BG
492 (if flag (backward-char 1))
493 ;; Call self-insert so that auto-fill, abbrev expansion etc. happens.
8989a920
GM
494 ;; Set last-command-event to tell self-insert what to insert.
495 (let ((last-command-event ?\n)
30bb9754 496 ;; Don't auto-fill if we have a numeric argument.
3954fff9
RS
497 ;; Also not if flag is true (it would fill wrong line);
498 ;; there is no need to since we're at BOL.
499 (auto-fill-function (if (or arg flag) nil auto-fill-function)))
4cc9d0dc
RS
500 (unwind-protect
501 (self-insert-command (prefix-numeric-value arg))
502 ;; If we get an error in self-insert-command, put point at right place.
503 (if flag (forward-char 1))))
2f047f6c
KH
504 ;; Even if we did *not* get an error, keep that forward-char;
505 ;; all further processing should apply to the newline that the user
506 ;; thinks he inserted.
507
30bb9754
BG
508 ;; Mark the newline(s) `hard'.
509 (if use-hard-newlines
2f047f6c 510 (set-hard-newline-properties
3137dda8 511 (- (point) (prefix-numeric-value arg)) (point)))
d133d835
RS
512 ;; If the newline leaves the previous line blank,
513 ;; and we have a left margin, delete that from the blank line.
514 (or flag
515 (save-excursion
516 (goto-char beforepos)
517 (beginning-of-line)
518 (and (looking-at "[ \t]$")
519 (> (current-left-margin) 0)
520 (delete-region (point) (progn (end-of-line) (point))))))
d133d835
RS
521 ;; Indent the line after the newline, except in one case:
522 ;; when we added the newline at the beginning of a line
523 ;; which starts a page.
524 (or was-page-start
525 (move-to-left-margin nil t)))
30bb9754
BG
526 nil)
527
55741b46
RS
528(defun set-hard-newline-properties (from to)
529 (let ((sticky (get-text-property from 'rear-nonsticky)))
530 (put-text-property from to 'hard 't)
531 ;; If rear-nonsticky is not "t", add 'hard to rear-nonsticky list
532 (if (and (listp sticky) (not (memq 'hard sticky)))
533 (put-text-property from (point) 'rear-nonsticky
534 (cons 'hard sticky)))))
eaae8106 535
e249a6d8 536(defun open-line (n)
ff1fbe3e 537 "Insert a newline and leave point before it.
f33321ad
JB
538If there is a fill prefix and/or a `left-margin', insert them
539on the new line if the line would have been blank.
616ed245 540With arg N, insert N newlines."
2076c87c 541 (interactive "*p")
616ed245 542 (let* ((do-fill-prefix (and fill-prefix (bolp)))
3db1e3b5 543 (do-left-margin (and (bolp) (> (current-left-margin) 0)))
207d7545
GM
544 (loc (point))
545 ;; Don't expand an abbrev before point.
546 (abbrev-mode nil))
e249a6d8 547 (newline n)
d133d835 548 (goto-char loc)
e249a6d8 549 (while (> n 0)
d133d835
RS
550 (cond ((bolp)
551 (if do-left-margin (indent-to (current-left-margin)))
552 (if do-fill-prefix (insert-and-inherit fill-prefix))))
553 (forward-line 1)
e249a6d8 554 (setq n (1- n)))
d133d835
RS
555 (goto-char loc)
556 (end-of-line)))
2076c87c 557
da7d231b
KS
558(defun split-line (&optional arg)
559 "Split current line, moving portion beyond point vertically down.
560If the current line starts with `fill-prefix', insert it on the new
f33321ad 561line as well. With prefix ARG, don't insert `fill-prefix' on new line.
da7d231b 562
e249a6d8 563When called from Lisp code, ARG may be a prefix string to copy."
da7d231b 564 (interactive "*P")
2076c87c 565 (skip-chars-forward " \t")
d77bbdc9
RS
566 (let* ((col (current-column))
567 (pos (point))
568 ;; What prefix should we check for (nil means don't).
569 (prefix (cond ((stringp arg) arg)
570 (arg nil)
571 (t fill-prefix)))
572 ;; Does this line start with it?
573 (have-prfx (and prefix
574 (save-excursion
575 (beginning-of-line)
576 (looking-at (regexp-quote prefix))))))
28191e20 577 (newline 1)
d77bbdc9 578 (if have-prfx (insert-and-inherit prefix))
2076c87c
JB
579 (indent-to col 0)
580 (goto-char pos)))
581
2076c87c
JB
582(defun delete-indentation (&optional arg)
583 "Join this line to previous and fix up whitespace at join.
ccc58657 584If there is a fill prefix, delete it from the beginning of this line.
2076c87c
JB
585With argument, join this line to following line."
586 (interactive "*P")
587 (beginning-of-line)
588 (if arg (forward-line 1))
589 (if (eq (preceding-char) ?\n)
590 (progn
591 (delete-region (point) (1- (point)))
ccc58657
RS
592 ;; If the second line started with the fill prefix,
593 ;; delete the prefix.
594 (if (and fill-prefix
01b8e020 595 (<= (+ (point) (length fill-prefix)) (point-max))
ccc58657
RS
596 (string= fill-prefix
597 (buffer-substring (point)
598 (+ (point) (length fill-prefix)))))
599 (delete-region (point) (+ (point) (length fill-prefix))))
2076c87c
JB
600 (fixup-whitespace))))
601
fc025090 602(defalias 'join-line #'delete-indentation) ; easier to find
eaae8106 603
2076c87c
JB
604(defun delete-blank-lines ()
605 "On blank line, delete all surrounding blank lines, leaving just one.
606On isolated blank line, delete that one.
6d30d416 607On nonblank line, delete any immediately following blank lines."
2076c87c
JB
608 (interactive "*")
609 (let (thisblank singleblank)
610 (save-excursion
611 (beginning-of-line)
612 (setq thisblank (looking-at "[ \t]*$"))
70e14c01 613 ;; Set singleblank if there is just one blank line here.
2076c87c
JB
614 (setq singleblank
615 (and thisblank
616 (not (looking-at "[ \t]*\n[ \t]*$"))
617 (or (bobp)
618 (progn (forward-line -1)
619 (not (looking-at "[ \t]*$")))))))
70e14c01 620 ;; Delete preceding blank lines, and this one too if it's the only one.
2076c87c
JB
621 (if thisblank
622 (progn
623 (beginning-of-line)
624 (if singleblank (forward-line 1))
625 (delete-region (point)
626 (if (re-search-backward "[^ \t\n]" nil t)
627 (progn (forward-line 1) (point))
628 (point-min)))))
70e14c01
JB
629 ;; Delete following blank lines, unless the current line is blank
630 ;; and there are no following blank lines.
2076c87c
JB
631 (if (not (and thisblank singleblank))
632 (save-excursion
633 (end-of-line)
634 (forward-line 1)
635 (delete-region (point)
636 (if (re-search-forward "[^ \t\n]" nil t)
637 (progn (beginning-of-line) (point))
70e14c01
JB
638 (point-max)))))
639 ;; Handle the special case where point is followed by newline and eob.
640 ;; Delete the line, leaving point at eob.
641 (if (looking-at "^[ \t]*\n\\'")
642 (delete-region (point) (point-max)))))
2076c87c 643
eaae8106
SS
644(defun delete-trailing-whitespace ()
645 "Delete all the trailing whitespace across the current buffer.
646All whitespace after the last non-whitespace character in a line is deleted.
103db06c
RS
647This respects narrowing, created by \\[narrow-to-region] and friends.
648A formfeed is not considered whitespace by this function."
eaae8106
SS
649 (interactive "*")
650 (save-match-data
651 (save-excursion
652 (goto-char (point-min))
5c9b3fac
MB
653 (while (re-search-forward "\\s-$" nil t)
654 (skip-syntax-backward "-" (save-excursion (forward-line 0) (point)))
3a768251 655 ;; Don't delete formfeeds, even if they are considered whitespace.
661aa5c7
GM
656 (save-match-data
657 (if (looking-at ".*\f")
658 (goto-char (match-end 0))))
7981d89f 659 (delete-region (point) (match-end 0))))))
eaae8106 660
2076c87c
JB
661(defun newline-and-indent ()
662 "Insert a newline, then indent according to major mode.
ff1fbe3e 663Indentation is done using the value of `indent-line-function'.
2076c87c 664In programming language modes, this is the same as TAB.
ff1fbe3e 665In some text modes, where TAB inserts a tab, this command indents to the
eed5698b 666column specified by the function `current-left-margin'."
2076c87c 667 (interactive "*")
5ff4ba3d 668 (delete-horizontal-space t)
46947372 669 (newline)
2076c87c
JB
670 (indent-according-to-mode))
671
672(defun reindent-then-newline-and-indent ()
673 "Reindent current line, insert newline, then indent the new line.
674Indentation of both lines is done according to the current major mode,
ff1fbe3e 675which means calling the current value of `indent-line-function'.
2076c87c
JB
676In programming language modes, this is the same as TAB.
677In some text modes, where TAB inserts a tab, this indents to the
eed5698b 678column specified by the function `current-left-margin'."
2076c87c 679 (interactive "*")
e1e04350
SM
680 (let ((pos (point)))
681 ;; Be careful to insert the newline before indenting the line.
682 ;; Otherwise, the indentation might be wrong.
683 (newline)
684 (save-excursion
685 (goto-char pos)
eb3d6c67
SM
686 ;; We are at EOL before the call to indent-according-to-mode, and
687 ;; after it we usually are as well, but not always. We tried to
688 ;; address it with `save-excursion' but that uses a normal marker
689 ;; whereas we need `move after insertion', so we do the save/restore
690 ;; by hand.
691 (setq pos (copy-marker pos t))
692 (indent-according-to-mode)
693 (goto-char pos)
694 ;; Remove the trailing white-space after indentation because
695 ;; indentation may introduce the whitespace.
6b61353c 696 (delete-horizontal-space t))
e1e04350 697 (indent-according-to-mode)))
eaae8106 698
93be67de
KH
699(defun quoted-insert (arg)
700 "Read next input character and insert it.
701This is useful for inserting control characters.
5626c14e 702With argument, insert ARG copies of the character.
2076c87c 703
93be67de
KH
704If the first character you type after this command is an octal digit,
705you should type a sequence of octal digits which specify a character code.
706Any nondigit terminates the sequence. If the terminator is a RET,
707it is discarded; any other terminator is used itself as input.
708The variable `read-quoted-char-radix' specifies the radix for this feature;
709set it to 10 or 16 to use decimal or hex instead of octal.
dff7d67f 710
93be67de
KH
711In overwrite mode, this function inserts the character anyway, and
712does not handle octal digits specially. This means that if you use
713overwrite as your normal editing mode, you can use this function to
714insert characters when necessary.
dff7d67f 715
93be67de
KH
716In binary overwrite mode, this function does overwrite, and octal
717digits are interpreted as a character code. This is intended to be
718useful for editing binary files."
719 (interactive "*p")
a6c39c14
EZ
720 (let* ((char
721 ;; Avoid "obsolete" warnings for translation-table-for-input.
722 (with-no-warnings
723 (let (translation-table-for-input input-method-function)
724 (if (or (not overwrite-mode)
725 (eq overwrite-mode 'overwrite-mode-binary))
726 (read-quoted-char)
727 (read-char))))))
0e3269e5
JL
728 ;; This used to assume character codes 0240 - 0377 stand for
729 ;; characters in some single-byte character set, and converted them
730 ;; to Emacs characters. But in 23.1 this feature is deprecated
731 ;; in favor of inserting the corresponding Unicode characters.
732 ;; (if (and enable-multibyte-characters
733 ;; (>= char ?\240)
734 ;; (<= char ?\377))
735 ;; (setq char (unibyte-char-to-multibyte char)))
93be67de
KH
736 (if (> arg 0)
737 (if (eq overwrite-mode 'overwrite-mode-binary)
738 (delete-char arg)))
739 (while (> arg 0)
740 (insert-and-inherit char)
741 (setq arg (1- arg)))))
eaae8106 742
6b61353c 743(defun forward-to-indentation (&optional arg)
93be67de 744 "Move forward ARG lines and position at first nonblank character."
109cfe4e 745 (interactive "^p")
6b61353c 746 (forward-line (or arg 1))
93be67de 747 (skip-chars-forward " \t"))
cc2b2b6c 748
6b61353c 749(defun backward-to-indentation (&optional arg)
93be67de 750 "Move backward ARG lines and position at first nonblank character."
109cfe4e 751 (interactive "^p")
6b61353c 752 (forward-line (- (or arg 1)))
93be67de 753 (skip-chars-forward " \t"))
2076c87c 754
93be67de
KH
755(defun back-to-indentation ()
756 "Move point to the first non-whitespace character on this line."
109cfe4e 757 (interactive "^")
93be67de 758 (beginning-of-line 1)
1e96c007 759 (skip-syntax-forward " " (line-end-position))
b9863466
RS
760 ;; Move back over chars that have whitespace syntax but have the p flag.
761 (backward-prefix-chars))
93be67de
KH
762
763(defun fixup-whitespace ()
764 "Fixup white space between objects around point.
765Leave one space or none, according to the context."
766 (interactive "*")
767 (save-excursion
768 (delete-horizontal-space)
769 (if (or (looking-at "^\\|\\s)")
770 (save-excursion (forward-char -1)
771 (looking-at "$\\|\\s(\\|\\s'")))
772 nil
f33321ad 773 (insert ?\s))))
93be67de 774
5ff4ba3d
MB
775(defun delete-horizontal-space (&optional backward-only)
776 "Delete all spaces and tabs around point.
1cfcd2db 777If BACKWARD-ONLY is non-nil, only delete them before point."
a168699d 778 (interactive "*P")
9ab59a1a
MB
779 (let ((orig-pos (point)))
780 (delete-region
781 (if backward-only
782 orig-pos
783 (progn
784 (skip-chars-forward " \t")
785 (constrain-to-field nil orig-pos t)))
5ff4ba3d 786 (progn
9ab59a1a
MB
787 (skip-chars-backward " \t")
788 (constrain-to-field nil orig-pos)))))
93be67de 789
68c16b59 790(defun just-one-space (&optional n)
56abefac
RS
791 "Delete all spaces and tabs around point, leaving one space (or N spaces)."
792 (interactive "*p")
9ab59a1a
MB
793 (let ((orig-pos (point)))
794 (skip-chars-backward " \t")
795 (constrain-to-field nil orig-pos)
68c16b59 796 (dotimes (i (or n 1))
f33321ad 797 (if (= (following-char) ?\s)
56abefac 798 (forward-char 1)
f33321ad 799 (insert ?\s)))
9ab59a1a
MB
800 (delete-region
801 (point)
802 (progn
803 (skip-chars-forward " \t")
804 (constrain-to-field nil orig-pos t)))))
2d88b556 805\f
2076c87c
JB
806(defun beginning-of-buffer (&optional arg)
807 "Move point to the beginning of the buffer; leave mark at previous position.
a416e7ef
KS
808With \\[universal-argument] prefix, do not set mark at previous position.
809With numeric arg N, put point N/10 of the way from the beginning.
c66587fe
RS
810
811If the buffer is narrowed, this command uses the beginning and size
812of the accessible part of the buffer.
ff1fbe3e
RS
813
814Don't use this command in Lisp programs!
2076c87c 815\(goto-char (point-min)) is faster and avoids clobbering the mark."
109cfe4e 816 (interactive "^P")
24199fe7 817 (or (consp arg)
d34c311a 818 (region-active-p)
705a5933 819 (push-mark))
c66587fe 820 (let ((size (- (point-max) (point-min))))
a416e7ef 821 (goto-char (if (and arg (not (consp arg)))
c66587fe
RS
822 (+ (point-min)
823 (if (> size 10000)
824 ;; Avoid overflow for large buffer sizes!
825 (* (prefix-numeric-value arg)
826 (/ size 10))
827 (/ (+ 10 (* size (prefix-numeric-value arg))) 10)))
828 (point-min))))
d7e7ecd7 829 (if (and arg (not (consp arg))) (forward-line 1)))
2076c87c
JB
830
831(defun end-of-buffer (&optional arg)
832 "Move point to the end of the buffer; leave mark at previous position.
a416e7ef
KS
833With \\[universal-argument] prefix, do not set mark at previous position.
834With numeric arg N, put point N/10 of the way from the end.
c66587fe
RS
835
836If the buffer is narrowed, this command uses the beginning and size
837of the accessible part of the buffer.
ff1fbe3e
RS
838
839Don't use this command in Lisp programs!
2076c87c 840\(goto-char (point-max)) is faster and avoids clobbering the mark."
109cfe4e 841 (interactive "^P")
d34c311a 842 (or (consp arg) (region-active-p) (push-mark))
c66587fe 843 (let ((size (- (point-max) (point-min))))
a416e7ef 844 (goto-char (if (and arg (not (consp arg)))
c66587fe
RS
845 (- (point-max)
846 (if (> size 10000)
847 ;; Avoid overflow for large buffer sizes!
848 (* (prefix-numeric-value arg)
849 (/ size 10))
850 (/ (* size (prefix-numeric-value arg)) 10)))
851 (point-max))))
3a801d0c
ER
852 ;; If we went to a place in the middle of the buffer,
853 ;; adjust it to the beginning of a line.
d7e7ecd7 854 (cond ((and arg (not (consp arg))) (forward-line 1))
919f2812 855 ((> (point) (window-end nil t))
314808dc
GM
856 ;; If the end of the buffer is not already on the screen,
857 ;; then scroll specially to put it near, but not at, the bottom.
858 (overlay-recenter (point))
859 (recenter -3))))
2076c87c 860
b9229673
CY
861(defcustom delete-active-region t
862 "Whether single-char deletion commands delete an active region.
863This has an effect only if Transient Mark mode is enabled, and
864affects `delete-forward-char' and `delete-backward-char', though
865not `delete-char'.
866
867If the value is the symbol `kill', the active region is killed
868instead of deleted."
869 :type '(choice (const :tag "Delete active region" t)
870 (const :tag "Kill active region" kill)
871 (const :tag "Do ordinary deletion" nil))
872 :group 'editing
873 :version "24.1")
874
875(defun delete-backward-char (n &optional killflag)
876 "Delete the previous N characters (following if N is negative).
877If Transient Mark mode is enabled, the mark is active, and N is 1,
878delete the text in the region and deactivate the mark instead.
879To disable this, set `delete-active-region' to nil.
880
881Optional second arg KILLFLAG, if non-nil, means to kill (save in
882kill ring) instead of delete. Interactively, N is the prefix
883arg, and KILLFLAG is set if N is explicitly specified.
884
885In Overwrite mode, single character backward deletion may replace
886tabs with spaces so as to back over columns, unless point is at
887the end of the line."
888 (interactive "p\nP")
889 (unless (integerp n)
890 (signal 'wrong-type-argument (list 'integerp n)))
891 (cond ((and (use-region-p)
892 delete-active-region
893 (= n 1))
894 ;; If a region is active, kill or delete it.
895 (if (eq delete-active-region 'kill)
896 (kill-region (region-beginning) (region-end))
897 (delete-region (region-beginning) (region-end))))
898 ;; In Overwrite mode, maybe untabify while deleting
899 ((null (or (null overwrite-mode)
900 (<= n 0)
901 (memq (char-before) '(?\t ?\n))
902 (eobp)
903 (eq (char-after) ?\n)))
904 (let* ((ocol (current-column))
905 (val (delete-char (- n) killflag)))
906 (save-excursion
907 (insert-char ?\s (- ocol (current-column)) nil))))
908 ;; Otherwise, do simple deletion.
909 (t (delete-char (- n) killflag))))
910
911(defun delete-forward-char (n &optional killflag)
4c5130d6 912 "Delete the following N characters (previous if N is negative).
b9229673
CY
913If Transient Mark mode is enabled, the mark is active, and N is 1,
914delete the text in the region and deactivate the mark instead.
915To disable this, set `delete-active-region' to nil.
916
917Optional second arg KILLFLAG non-nil means to kill (save in kill
918ring) instead of delete. Interactively, N is the prefix arg, and
919KILLFLAG is set if N was explicitly specified."
920 (interactive "p\nP")
921 (unless (integerp n)
922 (signal 'wrong-type-argument (list 'integerp n)))
923 (cond ((and (use-region-p)
924 delete-active-region
925 (= n 1))
926 ;; If a region is active, kill or delete it.
927 (if (eq delete-active-region 'kill)
928 (kill-region (region-beginning) (region-end))
929 (delete-region (region-beginning) (region-end))))
930 ;; Otherwise, do simple deletion.
931 (t (delete-char n killflag))))
932
2076c87c 933(defun mark-whole-buffer ()
70e14c01
JB
934 "Put point at beginning and mark at end of buffer.
935You probably should not use this function in Lisp programs;
936it is usually a mistake for a Lisp function to use any subroutine
937that uses or sets the mark."
2076c87c
JB
938 (interactive)
939 (push-mark (point))
fd0f4056 940 (push-mark (point-max) nil t)
2076c87c 941 (goto-char (point-min)))
2d88b556 942\f
eaae8106 943
93be67de
KH
944;; Counting lines, one way or another.
945
9af967bd
LK
946(defun goto-line (line &optional buffer)
947 "Goto LINE, counting from line 1 at beginning of buffer.
948Normally, move point in the current buffer, and leave mark at the
949previous position. With just \\[universal-argument] as argument,
a5785534 950move point in the most recently selected other buffer, and switch to it.
9af967bd 951
a5785534
SM
952If there's a number in the buffer at point, it is the default for LINE.
953
954This function is usually the wrong thing to use in a Lisp program.
955What you probably want instead is something like:
956 (goto-char (point-min)) (forward-line (1- N))
957If at all possible, an even better solution is to use char counts
958rather than line counts."
00a369ac
RS
959 (interactive
960 (if (and current-prefix-arg (not (consp current-prefix-arg)))
961 (list (prefix-numeric-value current-prefix-arg))
962 ;; Look for a default, a number in the buffer at point.
963 (let* ((default
964 (save-excursion
965 (skip-chars-backward "0-9")
966 (if (looking-at "[0-9]")
967 (buffer-substring-no-properties
968 (point)
969 (progn (skip-chars-forward "0-9")
970 (point))))))
971 ;; Decide if we're switching buffers.
972 (buffer
973 (if (consp current-prefix-arg)
974 (other-buffer (current-buffer) t)))
975 (buffer-prompt
976 (if buffer
977 (concat " in " (buffer-name buffer))
978 "")))
979 ;; Read the argument, offering that number (if any) as default.
980 (list (read-from-minibuffer (format (if default "Goto line%s (%s): "
981 "Goto line%s: ")
982 buffer-prompt
983 default)
984 nil nil t
985 'minibuffer-history
986 default)
987 buffer))))
988 ;; Switch to the desired buffer, one way or another.
989 (if buffer
990 (let ((window (get-buffer-window buffer)))
991 (if window (select-window window)
992 (switch-to-buffer-other-window buffer))))
f564644b 993 ;; Leave mark at previous position
d34c311a 994 (or (region-active-p) (push-mark))
00a369ac 995 ;; Move to the specified line number in that buffer.
93be67de
KH
996 (save-restriction
997 (widen)
a5785534 998 (goto-char (point-min))
93be67de 999 (if (eq selective-display t)
9af967bd
LK
1000 (re-search-forward "[\n\C-m]" nil 'end (1- line))
1001 (forward-line (1- line)))))
2076c87c
JB
1002
1003(defun count-lines-region (start end)
eb8c3be9 1004 "Print number of lines and characters in the region."
2076c87c
JB
1005 (interactive "r")
1006 (message "Region has %d lines, %d characters"
1007 (count-lines start end) (- end start)))
1008
1009(defun what-line ()
2578be76 1010 "Print the current buffer line number and narrowed line number of point."
2076c87c 1011 (interactive)
c6db81aa 1012 (let ((start (point-min))
6b61353c
KH
1013 (n (line-number-at-pos)))
1014 (if (= start 1)
1015 (message "Line %d" n)
1016 (save-excursion
1017 (save-restriction
1018 (widen)
1019 (message "line %d (narrowed line %d)"
1020 (+ n (line-number-at-pos start) -1) n))))))
2578be76 1021
2076c87c
JB
1022(defun count-lines (start end)
1023 "Return number of lines between START and END.
1024This is usually the number of newlines between them,
ff1fbe3e 1025but can be one more if START is not equal to END
2076c87c 1026and the greater of them is not at the start of a line."
e406700d
RS
1027 (save-excursion
1028 (save-restriction
1029 (narrow-to-region start end)
1030 (goto-char (point-min))
1031 (if (eq selective-display t)
1032 (save-match-data
dde92ca6
RS
1033 (let ((done 0))
1034 (while (re-search-forward "[\n\C-m]" nil t 40)
1035 (setq done (+ 40 done)))
1036 (while (re-search-forward "[\n\C-m]" nil t 1)
1037 (setq done (+ 1 done)))
043efc41
RS
1038 (goto-char (point-max))
1039 (if (and (/= start end)
1040 (not (bolp)))
1041 (1+ done)
e406700d
RS
1042 done)))
1043 (- (buffer-size) (forward-line (buffer-size)))))))
eaae8106 1044
6b61353c
KH
1045(defun line-number-at-pos (&optional pos)
1046 "Return (narrowed) buffer line number at position POS.
79ffb765
RS
1047If POS is nil, use current buffer location.
1048Counting starts at (point-min), so the value refers
1049to the contents of the accessible portion of the buffer."
6b61353c
KH
1050 (let ((opoint (or pos (point))) start)
1051 (save-excursion
1052 (goto-char (point-min))
1053 (setq start (point))
1054 (goto-char opoint)
1055 (forward-line 0)
1056 (1+ (count-lines start (point))))))
1057
d5d99b80
KH
1058(defun what-cursor-position (&optional detail)
1059 "Print info on cursor position (on screen and within buffer).
e38dff0c 1060Also describe the character after point, and give its character code
c6fcc518
KH
1061in octal, decimal and hex.
1062
1063For a non-ASCII multibyte character, also give its encoding in the
1064buffer's selected coding system if the coding system encodes the
1065character safely. If the character is encoded into one byte, that
1066code is shown in hex. If the character is encoded into more than one
1067byte, just \"...\" is shown.
e5a902cf 1068
24dad5d5 1069In addition, with prefix argument, show details about that character
0b69eec5 1070in *Help* buffer. See also the command `describe-char'."
d5d99b80 1071 (interactive "P")
2076c87c
JB
1072 (let* ((char (following-char))
1073 (beg (point-min))
1074 (end (point-max))
1075 (pos (point))
1076 (total (buffer-size))
1077 (percent (if (> total 50000)
1078 ;; Avoid overflow from multiplying by 100!
1079 (/ (+ (/ total 200) (1- pos)) (max (/ total 100) 1))
1080 (/ (+ (/ total 2) (* 100 (1- pos))) (max total 1))))
1081 (hscroll (if (= (window-hscroll) 0)
1082 ""
1083 (format " Hscroll=%d" (window-hscroll))))
1084 (col (current-column)))
1085 (if (= pos end)
1086 (if (or (/= beg 1) (/= end (1+ total)))
a17a79c0 1087 (message "point=%d of %d (%d%%) <%d-%d> column=%d%s"
2076c87c 1088 pos total percent beg end col hscroll)
a17a79c0 1089 (message "point=%d of %d (EOB) column=%d%s"
63219d53 1090 pos total col hscroll))
c6fcc518 1091 (let ((coding buffer-file-coding-system)
a41b50ca 1092 encoded encoding-msg display-prop under-display)
c6fcc518
KH
1093 (if (or (not coding)
1094 (eq (coding-system-type coding) t))
b56a5ae0 1095 (setq coding (default-value 'buffer-file-coding-system)))
8f924df7 1096 (if (eq (char-charset char) 'eight-bit)
28fd4883 1097 (setq encoding-msg
41882805 1098 (format "(%d, #o%o, #x%x, raw-byte)" char char char))
a41b50ca
KH
1099 ;; Check if the character is displayed with some `display'
1100 ;; text property. In that case, set under-display to the
1101 ;; buffer substring covered by that property.
1102 (setq display-prop (get-text-property pos 'display))
1103 (if display-prop
1104 (let ((to (or (next-single-property-change pos 'display)
1105 (point-max))))
1106 (if (< to (+ pos 4))
1107 (setq under-display "")
1108 (setq under-display "..."
1109 to (+ pos 4)))
1110 (setq under-display
1111 (concat (buffer-substring-no-properties pos to)
1112 under-display)))
1113 (setq encoded (and (>= char 128) (encode-coding-char char coding))))
28fd4883 1114 (setq encoding-msg
a41b50ca
KH
1115 (if display-prop
1116 (if (not (stringp display-prop))
a17a79c0 1117 (format "(%d, #o%o, #x%x, part of display \"%s\")"
a41b50ca 1118 char char char under-display)
a17a79c0 1119 (format "(%d, #o%o, #x%x, part of display \"%s\"->\"%s\")"
a41b50ca
KH
1120 char char char under-display display-prop))
1121 (if encoded
a17a79c0 1122 (format "(%d, #o%o, #x%x, file %s)"
a41b50ca
KH
1123 char char char
1124 (if (> (length encoded) 1)
1125 "..."
1126 (encoded-string-description encoded coding)))
a17a79c0 1127 (format "(%d, #o%o, #x%x)" char char char)))))
e5e89e48 1128 (if detail
24dad5d5 1129 ;; We show the detailed information about CHAR.
0b69eec5 1130 (describe-char (point)))
24dad5d5 1131 (if (or (/= beg 1) (/= end (1+ total)))
a17a79c0 1132 (message "Char: %s %s point=%d of %d (%d%%) <%d-%d> column=%d%s"
e5a902cf
KH
1133 (if (< char 256)
1134 (single-key-description char)
f0d16a7f 1135 (buffer-substring-no-properties (point) (1+ (point))))
24dad5d5 1136 encoding-msg pos total percent beg end col hscroll)
a17a79c0 1137 (message "Char: %s %s point=%d of %d (%d%%) column=%d%s"
a41b50ca
KH
1138 (if enable-multibyte-characters
1139 (if (< char 128)
1140 (single-key-description char)
1141 (buffer-substring-no-properties (point) (1+ (point))))
1142 (single-key-description char))
24dad5d5 1143 encoding-msg pos total percent col hscroll))))))
2d88b556 1144\f
71a05b36
RS
1145;; Initialize read-expression-map. It is defined at C level.
1146(let ((m (make-sparse-keymap)))
1147 (define-key m "\M-\t" 'lisp-complete-symbol)
1148 (set-keymap-parent m minibuffer-local-map)
1149 (setq read-expression-map m))
854c16c5 1150
8570b0ca
RM
1151(defvar read-expression-history nil)
1152
ad6aa5ed
CY
1153(defvar minibuffer-completing-symbol nil
1154 "Non-nil means completing a Lisp symbol in the minibuffer.")
1155
d658acb6
CY
1156(defvar minibuffer-default nil
1157 "The current default value or list of default values in the minibuffer.
1158The functions `read-from-minibuffer' and `completing-read' bind
1159this variable locally.")
1160
b49df39d 1161(defcustom eval-expression-print-level 4
2f7e1f5a 1162 "Value for `print-level' while printing value in `eval-expression'.
d26b26dc 1163A value of nil means no limit."
b49df39d 1164 :group 'lisp
058d4999 1165 :type '(choice (const :tag "No Limit" nil) integer)
b49df39d
RS
1166 :version "21.1")
1167
1168(defcustom eval-expression-print-length 12
2f7e1f5a 1169 "Value for `print-length' while printing value in `eval-expression'.
d26b26dc 1170A value of nil means no limit."
b49df39d 1171 :group 'lisp
058d4999 1172 :type '(choice (const :tag "No Limit" nil) integer)
b49df39d
RS
1173 :version "21.1")
1174
1175(defcustom eval-expression-debug-on-error t
2f7e1f5a 1176 "If non-nil set `debug-on-error' to t in `eval-expression'.
ed8bcabe 1177If nil, don't change the value of `debug-on-error'."
b49df39d
RS
1178 :group 'lisp
1179 :type 'boolean
1180 :version "21.1")
1181
fa219ebd
JL
1182(defun eval-expression-print-format (value)
1183 "Format VALUE as a result of evaluated expression.
1184Return a formatted string which is displayed in the echo area
1185in addition to the value printed by prin1 in functions which
1186display the result of expression evaluation."
1187 (if (and (integerp value)
c9f0110e 1188 (or (not (memq this-command '(eval-last-sexp eval-print-last-sexp)))
fa219ebd 1189 (eq this-command last-command)
56abefac 1190 (if (boundp 'edebug-active) edebug-active)))
fa219ebd 1191 (let ((char-string
9bb25ed3 1192 (if (or (if (boundp 'edebug-active) edebug-active)
3137dda8 1193 (memq this-command '(eval-last-sexp eval-print-last-sexp)))
fa219ebd
JL
1194 (prin1-char value))))
1195 (if char-string
1b5fd09e
SM
1196 (format " (#o%o, #x%x, %s)" value value char-string)
1197 (format " (#o%o, #x%x)" value value)))))
fa219ebd 1198
8570b0ca 1199;; We define this, rather than making `eval' interactive,
ac052b48 1200;; for the sake of completion of names like eval-region, eval-buffer.
ecb7ad00
RS
1201(defun eval-expression (eval-expression-arg
1202 &optional eval-expression-insert-value)
a6a1ee53
EZ
1203 "Evaluate EVAL-EXPRESSION-ARG and print value in the echo area.
1204Value is also consed on to front of the variable `values'.
a7a8618b
EZ
1205Optional argument EVAL-EXPRESSION-INSERT-VALUE non-nil (interactively,
1206with prefix argument) means insert the result into the current buffer
1207instead of printing it in the echo area. Truncates long output
1208according to the value of the variables `eval-expression-print-length'
1209and `eval-expression-print-level'.
b4f73994
RS
1210
1211If `eval-expression-debug-on-error' is non-nil, which is the default,
1212this command arranges for all errors to enter the debugger."
adca5fa6 1213 (interactive
ad6aa5ed
CY
1214 (list (let ((minibuffer-completing-symbol t))
1215 (read-from-minibuffer "Eval: "
1216 nil read-expression-map t
1217 'read-expression-history))
ecb7ad00 1218 current-prefix-arg))
eaae8106 1219
ed8bcabe
GM
1220 (if (null eval-expression-debug-on-error)
1221 (setq values (cons (eval eval-expression-arg) values))
1222 (let ((old-value (make-symbol "t")) new-value)
1223 ;; Bind debug-on-error to something unique so that we can
1224 ;; detect when evaled code changes it.
1225 (let ((debug-on-error old-value))
1226 (setq values (cons (eval eval-expression-arg) values))
1227 (setq new-value debug-on-error))
1228 ;; If evaled code has changed the value of debug-on-error,
1229 ;; propagate that change to the global binding.
1230 (unless (eq old-value new-value)
1231 (setq debug-on-error new-value))))
eaae8106 1232
b49df39d
RS
1233 (let ((print-length eval-expression-print-length)
1234 (print-level eval-expression-print-level))
6b61353c
KH
1235 (if eval-expression-insert-value
1236 (with-no-warnings
1237 (let ((standard-output (current-buffer)))
22e088c6 1238 (prin1 (car values))))
fa219ebd
JL
1239 (prog1
1240 (prin1 (car values) t)
1241 (let ((str (eval-expression-print-format (car values))))
1242 (if str (princ str t)))))))
2076c87c
JB
1243
1244(defun edit-and-eval-command (prompt command)
1245 "Prompting with PROMPT, let user edit COMMAND and eval result.
1246COMMAND is a Lisp expression. Let user edit that expression in
1247the minibuffer, then read and evaluate the result."
9f4b6084 1248 (let ((command
6b61353c
KH
1249 (let ((print-level nil)
1250 (minibuffer-history-sexp-flag (1+ (minibuffer-depth))))
1251 (unwind-protect
1252 (read-from-minibuffer prompt
1253 (prin1-to-string command)
1254 read-expression-map t
1255 'command-history)
1256 ;; If command was added to command-history as a string,
1257 ;; get rid of that. We want only evaluable expressions there.
1258 (if (stringp (car command-history))
1259 (setq command-history (cdr command-history)))))))
5d6c83ae
KH
1260
1261 ;; If command to be redone does not match front of history,
1262 ;; add it to the history.
1263 (or (equal command (car command-history))
1264 (setq command-history (cons command command-history)))
2076c87c
JB
1265 (eval command)))
1266
ebb61177 1267(defun repeat-complex-command (arg)
2076c87c
JB
1268 "Edit and re-evaluate last complex command, or ARGth from last.
1269A complex command is one which used the minibuffer.
1270The command is placed in the minibuffer as a Lisp form for editing.
1271The result is executed, repeating the command as changed.
5626c14e
JB
1272If the command has been changed or is not the most recent previous
1273command it is added to the front of the command history.
1274You can use the minibuffer history commands \
1275\\<minibuffer-local-map>\\[next-history-element] and \\[previous-history-element]
eb6e9899 1276to get different commands to edit and resubmit."
2076c87c 1277 (interactive "p")
ba343182 1278 (let ((elt (nth (1- arg) command-history))
2076c87c
JB
1279 newcmd)
1280 (if elt
854c16c5 1281 (progn
eab22e27 1282 (setq newcmd
74ae5fab
RS
1283 (let ((print-level nil)
1284 (minibuffer-history-position arg)
99ea24de 1285 (minibuffer-history-sexp-flag (1+ (minibuffer-depth))))
9f4b6084
MR
1286 (unwind-protect
1287 (read-from-minibuffer
1288 "Redo: " (prin1-to-string elt) read-expression-map t
1289 (cons 'command-history arg))
1290
1291 ;; If command was added to command-history as a
1292 ;; string, get rid of that. We want only
1293 ;; evaluable expressions there.
1294 (if (stringp (car command-history))
1295 (setq command-history (cdr command-history))))))
db16f109
RS
1296
1297 ;; If command to be redone does not match front of history,
1298 ;; add it to the history.
1299 (or (equal newcmd (car command-history))
1300 (setq command-history (cons newcmd command-history)))
2076c87c 1301 (eval newcmd))
536b728a
RS
1302 (if command-history
1303 (error "Argument %d is beyond length of command history" arg)
1304 (error "There are no previous complex commands to repeat")))))
7133b7ee
JL
1305
1306(defun read-extended-command ()
1307 "Read command name to invoke in `execute-extended-command'."
1308 (minibuffer-with-setup-hook
1309 (lambda ()
1310 (set (make-local-variable 'minibuffer-default-add-function)
1311 (lambda ()
1312 ;; Get a command name at point in the original buffer
1313 ;; to propose it after M-n.
1314 (with-current-buffer (window-buffer (minibuffer-selected-window))
1315 (and (commandp (function-called-at-point))
1316 (format "%S" (function-called-at-point)))))))
1317 ;; Read a string, completing from and restricting to the set of
1318 ;; all defined commands. Don't provide any initial input.
1319 ;; Save the command read on the extended-command history list.
1320 (completing-read
1321 (concat (cond
1322 ((eq current-prefix-arg '-) "- ")
1323 ((and (consp current-prefix-arg)
1324 (eq (car current-prefix-arg) 4)) "C-u ")
1325 ((and (consp current-prefix-arg)
1326 (integerp (car current-prefix-arg)))
1327 (format "%d " (car current-prefix-arg)))
1328 ((integerp current-prefix-arg)
1329 (format "%d " current-prefix-arg)))
1330 ;; This isn't strictly correct if `execute-extended-command'
1331 ;; is bound to anything else (e.g. [menu]).
1332 ;; It could use (key-description (this-single-command-keys)),
1333 ;; but actually a prompt other than "M-x" would be confusing,
1334 ;; because "M-x" is a well-known prompt to read a command
1335 ;; and it serves as a shorthand for "Extended command: ".
1336 "M-x ")
1337 obarray 'commandp t nil 'extended-command-history)))
1338
2d88b556 1339\f
854c16c5
RS
1340(defvar minibuffer-history nil
1341 "Default minibuffer history list.
1342This is used for all minibuffer input
e5f0c02f
EZ
1343except when an alternate history list is specified.
1344
1345Maximum length of the history list is determined by the value
1346of `history-length', which see.")
854c16c5 1347(defvar minibuffer-history-sexp-flag nil
6b61353c
KH
1348 "Control whether history list elements are expressions or strings.
1349If the value of this variable equals current minibuffer depth,
1350they are expressions; otherwise they are strings.
7979163c 1351\(That convention is designed to do the right thing for
6b61353c 1352recursive uses of the minibuffer.)")
e91f80c4 1353(setq minibuffer-history-variable 'minibuffer-history)
535c8bdb 1354(setq minibuffer-history-position nil) ;; Defvar is in C code.
854c16c5 1355(defvar minibuffer-history-search-history nil)
e91f80c4 1356
93cee14b
RS
1357(defvar minibuffer-text-before-history nil
1358 "Text that was in this minibuffer before any history commands.
1359This is nil if there have not yet been any history commands
1360in this use of the minibuffer.")
1361
1362(add-hook 'minibuffer-setup-hook 'minibuffer-history-initialize)
1363
1364(defun minibuffer-history-initialize ()
1365 (setq minibuffer-text-before-history nil))
1366
6e7d0ff7
MB
1367(defun minibuffer-avoid-prompt (new old)
1368 "A point-motion hook for the minibuffer, that moves point out of the prompt."
1369 (constrain-to-field nil (point-max)))
1370
6e30a99a 1371(defcustom minibuffer-history-case-insensitive-variables nil
1d2b0303 1372 "Minibuffer history variables for which matching should ignore case.
6e30a99a
RS
1373If a history variable is a member of this list, then the
1374\\[previous-matching-history-element] and \\[next-matching-history-element]\
1375 commands ignore case when searching it, regardless of `case-fold-search'."
1376 :type '(repeat variable)
1377 :group 'minibuffer)
1378
e91f80c4 1379(defun previous-matching-history-element (regexp n)
854c16c5
RS
1380 "Find the previous history element that matches REGEXP.
1381\(Previous history elements refer to earlier actions.)
1382With prefix argument N, search for Nth previous match.
5c2010f0 1383If N is negative, find the next or Nth next match.
9889af08
EZ
1384Normally, history elements are matched case-insensitively if
1385`case-fold-search' is non-nil, but an uppercase letter in REGEXP
1386makes the search case-sensitive.
6e30a99a 1387See also `minibuffer-history-case-insensitive-variables'."
854c16c5 1388 (interactive
c1172a19 1389 (let* ((enable-recursive-minibuffers t)
c1172a19
RS
1390 (regexp (read-from-minibuffer "Previous element matching (regexp): "
1391 nil
1392 minibuffer-local-map
1393 nil
5794c45d
RS
1394 'minibuffer-history-search-history
1395 (car minibuffer-history-search-history))))
c1172a19
RS
1396 ;; Use the last regexp specified, by default, if input is empty.
1397 (list (if (string= regexp "")
a8e96cea
KH
1398 (if minibuffer-history-search-history
1399 (car minibuffer-history-search-history)
1400 (error "No previous history search regexp"))
c1172a19 1401 regexp)
854c16c5 1402 (prefix-numeric-value current-prefix-arg))))
e276a14a
MB
1403 (unless (zerop n)
1404 (if (and (zerop minibuffer-history-position)
1405 (null minibuffer-text-before-history))
efaac2e6 1406 (setq minibuffer-text-before-history
6d74d713 1407 (minibuffer-contents-no-properties)))
e276a14a
MB
1408 (let ((history (symbol-value minibuffer-history-variable))
1409 (case-fold-search
1410 (if (isearch-no-upper-case-p regexp t) ; assume isearch.el is dumped
1411 ;; On some systems, ignore case for file names.
1412 (if (memq minibuffer-history-variable
1413 minibuffer-history-case-insensitive-variables)
1414 t
1415 ;; Respect the user's setting for case-fold-search:
1416 case-fold-search)
1417 nil))
1418 prevpos
1419 match-string
1420 match-offset
1421 (pos minibuffer-history-position))
1422 (while (/= n 0)
1423 (setq prevpos pos)
1424 (setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history)))
1425 (when (= pos prevpos)
e91f80c4 1426 (error (if (= pos 1)
ccc58657
RS
1427 "No later matching history item"
1428 "No earlier matching history item")))
e276a14a
MB
1429 (setq match-string
1430 (if (eq minibuffer-history-sexp-flag (minibuffer-depth))
7908d27c 1431 (let ((print-level nil))
e276a14a
MB
1432 (prin1-to-string (nth (1- pos) history)))
1433 (nth (1- pos) history)))
1434 (setq match-offset
1435 (if (< n 0)
1436 (and (string-match regexp match-string)
1437 (match-end 0))
1438 (and (string-match (concat ".*\\(" regexp "\\)") match-string)
1439 (match-beginning 1))))
1440 (when match-offset
1441 (setq n (+ n (if (< n 0) 1 -1)))))
1442 (setq minibuffer-history-position pos)
1443 (goto-char (point-max))
efaac2e6 1444 (delete-minibuffer-contents)
e276a14a 1445 (insert match-string)
6d74d713 1446 (goto-char (+ (minibuffer-prompt-end) match-offset))))
e1e04350
SM
1447 (if (memq (car (car command-history)) '(previous-matching-history-element
1448 next-matching-history-element))
854c16c5 1449 (setq command-history (cdr command-history))))
e91f80c4 1450
e91f80c4 1451(defun next-matching-history-element (regexp n)
854c16c5
RS
1452 "Find the next history element that matches REGEXP.
1453\(The next history element refers to a more recent action.)
1454With prefix argument N, search for Nth next match.
5c2010f0 1455If N is negative, find the previous or Nth previous match.
9889af08
EZ
1456Normally, history elements are matched case-insensitively if
1457`case-fold-search' is non-nil, but an uppercase letter in REGEXP
1458makes the search case-sensitive."
854c16c5 1459 (interactive
c1172a19 1460 (let* ((enable-recursive-minibuffers t)
c1172a19
RS
1461 (regexp (read-from-minibuffer "Next element matching (regexp): "
1462 nil
1463 minibuffer-local-map
1464 nil
e967cd11
RS
1465 'minibuffer-history-search-history
1466 (car minibuffer-history-search-history))))
c1172a19
RS
1467 ;; Use the last regexp specified, by default, if input is empty.
1468 (list (if (string= regexp "")
e967cd11
RS
1469 (if minibuffer-history-search-history
1470 (car minibuffer-history-search-history)
1471 (error "No previous history search regexp"))
c1172a19 1472 regexp)
854c16c5 1473 (prefix-numeric-value current-prefix-arg))))
e91f80c4 1474 (previous-matching-history-element regexp (- n)))
2076c87c 1475
8dc3ba7d
MB
1476(defvar minibuffer-temporary-goal-position nil)
1477
7f914bbe 1478(defvar minibuffer-default-add-function 'minibuffer-default-add-completions
0eb5f40f
JL
1479 "Function run by `goto-history-element' before consuming default values.
1480This is useful to dynamically add more elements to the list of default values
7f914bbe
JL
1481when `goto-history-element' reaches the end of this list.
1482Before calling this function `goto-history-element' sets the variable
1483`minibuffer-default-add-done' to t, so it will call this function only
1484once. In special cases, when this function needs to be called more
1485than once, it can set `minibuffer-default-add-done' to nil explicitly,
1486overriding the setting of this variable to t in `goto-history-element'.")
1487
1488(defvar minibuffer-default-add-done nil
1489 "When nil, add more elements to the end of the list of default values.
1490The value nil causes `goto-history-element' to add more elements to
1491the list of defaults when it reaches the end of this list. It does
1492this by calling a function defined by `minibuffer-default-add-function'.")
1493
1494(make-variable-buffer-local 'minibuffer-default-add-done)
1495
1496(defun minibuffer-default-add-completions ()
1497 "Return a list of all completions without the default value.
1498This function is used to add all elements of the completion table to
1499the end of the list of defaults just after the default value."
7f914bbe
JL
1500 (let ((def minibuffer-default)
1501 (all (all-completions ""
1502 minibuffer-completion-table
e96d62cd 1503 minibuffer-completion-predicate)))
7f914bbe
JL
1504 (if (listp def)
1505 (append def all)
1506 (cons def (delete def all)))))
1507
297b8ccd
JL
1508(defun goto-history-element (nabs)
1509 "Puts element of the minibuffer history in the minibuffer.
1510The argument NABS specifies the absolute history position."
1511 (interactive "p")
7f914bbe
JL
1512 (when (and (not minibuffer-default-add-done)
1513 (functionp minibuffer-default-add-function)
1514 (< nabs (- (if (listp minibuffer-default)
1515 (length minibuffer-default)
1516 1))))
1517 (setq minibuffer-default-add-done t
1518 minibuffer-default (funcall minibuffer-default-add-function)))
b38fc7f1
JL
1519 (let ((minimum (if minibuffer-default
1520 (- (if (listp minibuffer-default)
1521 (length minibuffer-default)
1522 1))
1523 0))
297b8ccd
JL
1524 elt minibuffer-returned-to-present)
1525 (if (and (zerop minibuffer-history-position)
1526 (null minibuffer-text-before-history))
1527 (setq minibuffer-text-before-history
1528 (minibuffer-contents-no-properties)))
1529 (if (< nabs minimum)
1530 (if minibuffer-default
7f914bbe 1531 (error "End of defaults; no next item")
297b8ccd
JL
1532 (error "End of history; no default available")))
1533 (if (> nabs (length (symbol-value minibuffer-history-variable)))
1534 (error "Beginning of history; no preceding item"))
1535 (unless (memq last-command '(next-history-element
1536 previous-history-element))
1537 (let ((prompt-end (minibuffer-prompt-end)))
1538 (set (make-local-variable 'minibuffer-temporary-goal-position)
1539 (cond ((<= (point) prompt-end) prompt-end)
1540 ((eobp) nil)
1541 (t (point))))))
1542 (goto-char (point-max))
1543 (delete-minibuffer-contents)
1544 (setq minibuffer-history-position nabs)
b38fc7f1
JL
1545 (cond ((< nabs 0)
1546 (setq elt (if (listp minibuffer-default)
1547 (nth (1- (abs nabs)) minibuffer-default)
1548 minibuffer-default)))
297b8ccd
JL
1549 ((= nabs 0)
1550 (setq elt (or minibuffer-text-before-history ""))
1551 (setq minibuffer-returned-to-present t)
1552 (setq minibuffer-text-before-history nil))
1553 (t (setq elt (nth (1- minibuffer-history-position)
1554 (symbol-value minibuffer-history-variable)))))
1555 (insert
1556 (if (and (eq minibuffer-history-sexp-flag (minibuffer-depth))
1557 (not minibuffer-returned-to-present))
1558 (let ((print-level nil))
1559 (prin1-to-string elt))
1560 elt))
1561 (goto-char (or minibuffer-temporary-goal-position (point-max)))))
1562
ebb61177 1563(defun next-history-element (n)
1459a43b
RS
1564 "Puts next element of the minibuffer history in the minibuffer.
1565With argument N, it uses the Nth following element."
2076c87c 1566 (interactive "p")
0818b15e 1567 (or (zerop n)
297b8ccd 1568 (goto-history-element (- minibuffer-history-position n))))
2076c87c 1569
ebb61177 1570(defun previous-history-element (n)
1459a43b
RS
1571 "Puts previous element of the minibuffer history in the minibuffer.
1572With argument N, it uses the Nth previous element."
2076c87c 1573 (interactive "p")
297b8ccd
JL
1574 (or (zerop n)
1575 (goto-history-element (+ minibuffer-history-position n))))
d0678801
RM
1576
1577(defun next-complete-history-element (n)
a4d1159b
GM
1578 "Get next history element which completes the minibuffer before the point.
1579The contents of the minibuffer after the point are deleted, and replaced
1580by the new completion."
d0678801 1581 (interactive "p")
b5e6f936
RM
1582 (let ((point-at-start (point)))
1583 (next-matching-history-element
a4d1159b 1584 (concat
efaac2e6 1585 "^" (regexp-quote (buffer-substring (minibuffer-prompt-end) (point))))
a4d1159b 1586 n)
b5e6f936
RM
1587 ;; next-matching-history-element always puts us at (point-min).
1588 ;; Move to the position we were at before changing the buffer contents.
1589 ;; This is still sensical, because the text before point has not changed.
1590 (goto-char point-at-start)))
d0678801
RM
1591
1592(defun previous-complete-history-element (n)
1f6fcec3 1593 "\
a4d1159b
GM
1594Get previous history element which completes the minibuffer before the point.
1595The contents of the minibuffer after the point are deleted, and replaced
1596by the new completion."
d0678801
RM
1597 (interactive "p")
1598 (next-complete-history-element (- n)))
a4d1159b 1599
efaac2e6 1600;; For compatibility with the old subr of the same name.
a4d1159b
GM
1601(defun minibuffer-prompt-width ()
1602 "Return the display width of the minibuffer prompt.
f33321ad 1603Return 0 if current buffer is not a minibuffer."
a4d1159b
GM
1604 ;; Return the width of everything before the field at the end of
1605 ;; the buffer; this should be 0 for normal buffers.
efaac2e6 1606 (1- (minibuffer-prompt-end)))
2d88b556 1607\f
297b8ccd
JL
1608;; isearch minibuffer history
1609(add-hook 'minibuffer-setup-hook 'minibuffer-history-isearch-setup)
1610
1611(defvar minibuffer-history-isearch-message-overlay)
1612(make-variable-buffer-local 'minibuffer-history-isearch-message-overlay)
1613
1614(defun minibuffer-history-isearch-setup ()
1615 "Set up a minibuffer for using isearch to search the minibuffer history.
1616Intended to be added to `minibuffer-setup-hook'."
1617 (set (make-local-variable 'isearch-search-fun-function)
1618 'minibuffer-history-isearch-search)
1619 (set (make-local-variable 'isearch-message-function)
1620 'minibuffer-history-isearch-message)
1621 (set (make-local-variable 'isearch-wrap-function)
1622 'minibuffer-history-isearch-wrap)
1623 (set (make-local-variable 'isearch-push-state-function)
1624 'minibuffer-history-isearch-push-state)
1625 (add-hook 'isearch-mode-end-hook 'minibuffer-history-isearch-end nil t))
1626
1627(defun minibuffer-history-isearch-end ()
1628 "Clean up the minibuffer after terminating isearch in the minibuffer."
1629 (if minibuffer-history-isearch-message-overlay
1630 (delete-overlay minibuffer-history-isearch-message-overlay)))
1631
1632(defun minibuffer-history-isearch-search ()
1633 "Return the proper search function, for isearch in minibuffer history."
1634 (cond
1635 (isearch-word
1636 (if isearch-forward 'word-search-forward 'word-search-backward))
1637 (t
1638 (lambda (string bound noerror)
1639 (let ((search-fun
1640 ;; Use standard functions to search within minibuffer text
1641 (cond
1642 (isearch-regexp
1643 (if isearch-forward 're-search-forward 're-search-backward))
1644 (t
1645 (if isearch-forward 'search-forward 'search-backward))))
1646 found)
1647 ;; Avoid lazy-highlighting matches in the minibuffer prompt when
1648 ;; searching forward. Lazy-highlight calls this lambda with the
1649 ;; bound arg, so skip the minibuffer prompt.
1650 (if (and bound isearch-forward (< (point) (minibuffer-prompt-end)))
1651 (goto-char (minibuffer-prompt-end)))
1652 (or
1653 ;; 1. First try searching in the initial minibuffer text
1654 (funcall search-fun string
1655 (if isearch-forward bound (minibuffer-prompt-end))
1656 noerror)
1657 ;; 2. If the above search fails, start putting next/prev history
1658 ;; elements in the minibuffer successively, and search the string
1659 ;; in them. Do this only when bound is nil (i.e. not while
1660 ;; lazy-highlighting search strings in the current minibuffer text).
1661 (unless bound
1662 (condition-case nil
1663 (progn
1664 (while (not found)
1665 (cond (isearch-forward
1666 (next-history-element 1)
1667 (goto-char (minibuffer-prompt-end)))
1668 (t
1669 (previous-history-element 1)
1670 (goto-char (point-max))))
1671 (setq isearch-barrier (point) isearch-opoint (point))
1672 ;; After putting the next/prev history element, search
1673 ;; the string in them again, until next-history-element
1674 ;; or previous-history-element raises an error at the
1675 ;; beginning/end of history.
1676 (setq found (funcall search-fun string
1677 (unless isearch-forward
1678 ;; For backward search, don't search
1679 ;; in the minibuffer prompt
1680 (minibuffer-prompt-end))
1681 noerror)))
1682 ;; Return point of the new search result
1683 (point))
1684 ;; Return nil when next(prev)-history-element fails
1685 (error nil)))))))))
1686
1687(defun minibuffer-history-isearch-message (&optional c-q-hack ellipsis)
1688 "Display the minibuffer history search prompt.
1689If there are no search errors, this function displays an overlay with
1690the isearch prompt which replaces the original minibuffer prompt.
1691Otherwise, it displays the standard isearch message returned from
1692`isearch-message'."
1693 (if (not (and (minibufferp) isearch-success (not isearch-error)))
1694 ;; Use standard function `isearch-message' when not in the minibuffer,
1695 ;; or search fails, or has an error (like incomplete regexp).
1696 ;; This function overwrites minibuffer text with isearch message,
1697 ;; so it's possible to see what is wrong in the search string.
1698 (isearch-message c-q-hack ellipsis)
1699 ;; Otherwise, put the overlay with the standard isearch prompt over
1700 ;; the initial minibuffer prompt.
1701 (if (overlayp minibuffer-history-isearch-message-overlay)
1702 (move-overlay minibuffer-history-isearch-message-overlay
1703 (point-min) (minibuffer-prompt-end))
1704 (setq minibuffer-history-isearch-message-overlay
1705 (make-overlay (point-min) (minibuffer-prompt-end)))
1706 (overlay-put minibuffer-history-isearch-message-overlay 'evaporate t))
1707 (overlay-put minibuffer-history-isearch-message-overlay
1708 'display (isearch-message-prefix c-q-hack ellipsis))
1709 ;; And clear any previous isearch message.
1710 (message "")))
1711
1712(defun minibuffer-history-isearch-wrap ()
1d2b0303 1713 "Wrap the minibuffer history search when search fails.
297b8ccd
JL
1714Move point to the first history element for a forward search,
1715or to the last history element for a backward search."
1716 (unless isearch-word
1717 ;; When `minibuffer-history-isearch-search' fails on reaching the
1718 ;; beginning/end of the history, wrap the search to the first/last
1719 ;; minibuffer history element.
1720 (if isearch-forward
1721 (goto-history-element (length (symbol-value minibuffer-history-variable)))
1722 (goto-history-element 0))
1723 (setq isearch-success t))
1724 (goto-char (if isearch-forward (minibuffer-prompt-end) (point-max))))
1725
1726(defun minibuffer-history-isearch-push-state ()
1727 "Save a function restoring the state of minibuffer history search.
1728Save `minibuffer-history-position' to the additional state parameter
1729in the search status stack."
1730 `(lambda (cmd)
1731 (minibuffer-history-isearch-pop-state cmd ,minibuffer-history-position)))
1732
1733(defun minibuffer-history-isearch-pop-state (cmd hist-pos)
1734 "Restore the minibuffer history search state.
5626c14e 1735Go to the history element by the absolute history position HIST-POS."
297b8ccd
JL
1736 (goto-history-element hist-pos))
1737
1738\f
2076c87c 1739;Put this on C-x u, so we can force that rather than C-_ into startup msg
8cb95edf 1740(define-obsolete-function-alias 'advertised-undo 'undo "23.2")
2076c87c 1741
1e96c007 1742(defconst undo-equiv-table (make-hash-table :test 'eq :weakness t)
713c9020
RS
1743 "Table mapping redo records to the corresponding undo one.
1744A redo record for undo-in-region maps to t.
1745A redo record for ordinary undo maps to the following (earlier) undo.")
1e96c007
SM
1746
1747(defvar undo-in-region nil
1748 "Non-nil if `pending-undo-list' is not just a tail of `buffer-undo-list'.")
1749
1750(defvar undo-no-redo nil
1751 "If t, `undo' doesn't go through redo entries.")
1752
a7fe694c
RS
1753(defvar pending-undo-list nil
1754 "Within a run of consecutive undo commands, list remaining to be undone.
8ac28be5 1755If t, we undid all the way to the end of it.")
a7fe694c 1756
2076c87c
JB
1757(defun undo (&optional arg)
1758 "Undo some previous changes.
1759Repeat this command to undo more changes.
5626c14e 1760A numeric ARG serves as a repeat count.
65627aad 1761
3c1b77ca 1762In Transient Mark mode when the mark is active, only undo changes within
1e96c007 1763the current region. Similarly, when not in Transient Mark mode, just \\[universal-argument]
3c1b77ca 1764as an argument limits undo to changes within the current region."
65627aad 1765 (interactive "*P")
2e033693
RS
1766 ;; Make last-command indicate for the next command that this was an undo.
1767 ;; That way, another undo will undo more.
1768 ;; If we get to the end of the undo history and get an error,
1769 ;; another undo command will find the undo history empty
1770 ;; and will get another error. To begin undoing the undos,
1771 ;; you must type some other command.
b553cffa 1772 (let ((modified (buffer-modified-p))
cb3b2ec0
RS
1773 (recent-save (recent-auto-save-p))
1774 message)
6b61353c
KH
1775 ;; If we get an error in undo-start,
1776 ;; the next command should not be a "consecutive undo".
1777 ;; So set `this-command' to something other than `undo'.
1778 (setq this-command 'undo-start)
1779
e967cd11 1780 (unless (and (eq last-command 'undo)
a7fe694c
RS
1781 (or (eq pending-undo-list t)
1782 ;; If something (a timer or filter?) changed the buffer
1783 ;; since the previous command, don't continue the undo seq.
1784 (let ((list buffer-undo-list))
1785 (while (eq (car list) nil)
1786 (setq list (cdr list)))
1787 ;; If the last undo record made was made by undo
1788 ;; it shows nothing else happened in between.
1789 (gethash list undo-equiv-table))))
1e96c007 1790 (setq undo-in-region
d34c311a 1791 (or (region-active-p) (and arg (not (numberp arg)))))
1e96c007 1792 (if undo-in-region
3c1b77ca
MB
1793 (undo-start (region-beginning) (region-end))
1794 (undo-start))
1795 ;; get rid of initial undo boundary
1796 (undo-more 1))
9a1120ea 1797 ;; If we got this far, the next command should be a consecutive undo.
6b61353c 1798 (setq this-command 'undo)
1e96c007
SM
1799 ;; Check to see whether we're hitting a redo record, and if
1800 ;; so, ask the user whether she wants to skip the redo/undo pair.
1801 (let ((equiv (gethash pending-undo-list undo-equiv-table)))
1802 (or (eq (selected-window) (minibuffer-window))
cb3b2ec0
RS
1803 (setq message (if undo-in-region
1804 (if equiv "Redo in region!" "Undo in region!")
1805 (if equiv "Redo!" "Undo!"))))
0047373b 1806 (when (and (consp equiv) undo-no-redo)
1e96c007
SM
1807 ;; The equiv entry might point to another redo record if we have done
1808 ;; undo-redo-undo-redo-... so skip to the very last equiv.
1809 (while (let ((next (gethash equiv undo-equiv-table)))
1810 (if next (setq equiv next))))
1811 (setq pending-undo-list equiv)))
3c1b77ca 1812 (undo-more
d34c311a 1813 (if (numberp arg)
3c1b77ca
MB
1814 (prefix-numeric-value arg)
1815 1))
1e96c007 1816 ;; Record the fact that the just-generated undo records come from an
713c9020
RS
1817 ;; undo operation--that is, they are redo records.
1818 ;; In the ordinary case (not within a region), map the redo
1819 ;; record to the following undos.
1e96c007 1820 ;; I don't know how to do that in the undo-in-region case.
86f0d932
SM
1821 (let ((list buffer-undo-list))
1822 ;; Strip any leading undo boundaries there might be, like we do
1823 ;; above when checking.
1824 (while (eq (car list) nil)
1825 (setq list (cdr list)))
1826 (puthash list (if undo-in-region t pending-undo-list)
1827 undo-equiv-table))
2512c9f0
RS
1828 ;; Don't specify a position in the undo record for the undo command.
1829 ;; Instead, undoing this should move point to where the change is.
1830 (let ((tail buffer-undo-list)
003550c5
GM
1831 (prev nil))
1832 (while (car tail)
1833 (when (integerp (car tail))
1834 (let ((pos (car tail)))
1e96c007
SM
1835 (if prev
1836 (setcdr prev (cdr tail))
1837 (setq buffer-undo-list (cdr tail)))
003550c5
GM
1838 (setq tail (cdr tail))
1839 (while (car tail)
1840 (if (eq pos (car tail))
1841 (if prev
1842 (setcdr prev (cdr tail))
1843 (setq buffer-undo-list (cdr tail)))
1844 (setq prev tail))
1845 (setq tail (cdr tail)))
1846 (setq tail nil)))
1847 (setq prev tail tail (cdr tail))))
e967cd11
RS
1848 ;; Record what the current undo list says,
1849 ;; so the next command can tell if the buffer was modified in between.
2076c87c 1850 (and modified (not (buffer-modified-p))
cb3b2ec0
RS
1851 (delete-auto-save-file-if-necessary recent-save))
1852 ;; Display a message announcing success.
1853 (if message
f6e7ec02 1854 (message "%s" message))))
2076c87c 1855
e967cd11
RS
1856(defun buffer-disable-undo (&optional buffer)
1857 "Make BUFFER stop keeping undo information.
1858No argument or nil as argument means do this for the current buffer."
1859 (interactive)
0d808a63 1860 (with-current-buffer (if buffer (get-buffer buffer) (current-buffer))
d020fce0 1861 (setq buffer-undo-list t)))
e967cd11 1862
1e96c007
SM
1863(defun undo-only (&optional arg)
1864 "Undo some previous changes.
1865Repeat this command to undo more changes.
5626c14e 1866A numeric ARG serves as a repeat count.
1e96c007
SM
1867Contrary to `undo', this will not redo a previous undo."
1868 (interactive "*p")
1869 (let ((undo-no-redo t)) (undo arg)))
1e96c007 1870
52d1110d
RS
1871(defvar undo-in-progress nil
1872 "Non-nil while performing an undo.
1873Some change-hooks test this variable to do something different.")
1874
8ac28be5 1875(defun undo-more (n)
2076c87c 1876 "Undo back N undo-boundaries beyond what was already undone recently.
ff1fbe3e
RS
1877Call `undo-start' to get ready to undo recent changes,
1878then call `undo-more' one or more times to undo them."
a7fe694c 1879 (or (listp pending-undo-list)
8ac28be5 1880 (error (concat "No further undo information"
00fa4024 1881 (and undo-in-region " for region"))))
52d1110d 1882 (let ((undo-in-progress t))
b553f685
AM
1883 ;; Note: The following, while pulling elements off
1884 ;; `pending-undo-list' will call primitive change functions which
1885 ;; will push more elements onto `buffer-undo-list'.
8ac28be5 1886 (setq pending-undo-list (primitive-undo n pending-undo-list))
a7fe694c
RS
1887 (if (null pending-undo-list)
1888 (setq pending-undo-list t))))
2076c87c 1889
65627aad
RS
1890;; Deep copy of a list
1891(defun undo-copy-list (list)
1892 "Make a copy of undo list LIST."
1893 (mapcar 'undo-copy-list-1 list))
1894
1895(defun undo-copy-list-1 (elt)
1896 (if (consp elt)
1897 (cons (car elt) (undo-copy-list-1 (cdr elt)))
1898 elt))
1899
1900(defun undo-start (&optional beg end)
1901 "Set `pending-undo-list' to the front of the undo list.
1902The next call to `undo-more' will undo the most recently made change.
1903If BEG and END are specified, then only undo elements
1904that apply to text between BEG and END are used; other undo elements
1905are ignored. If BEG and END are nil, all undo elements are used."
1906 (if (eq buffer-undo-list t)
1907 (error "No undo information in this buffer"))
1e722f9f 1908 (setq pending-undo-list
65627aad
RS
1909 (if (and beg end (not (= beg end)))
1910 (undo-make-selective-list (min beg end) (max beg end))
1911 buffer-undo-list)))
1912
1913(defvar undo-adjusted-markers)
1914
1915(defun undo-make-selective-list (start end)
1916 "Return a list of undo elements for the region START to END.
1917The elements come from `buffer-undo-list', but we keep only
1918the elements inside this region, and discard those outside this region.
1919If we find an element that crosses an edge of this region,
1920we stop and ignore all further elements."
1921 (let ((undo-list-copy (undo-copy-list buffer-undo-list))
1922 (undo-list (list nil))
1923 undo-adjusted-markers
1924 some-rejected
1925 undo-elt undo-elt temp-undo-list delta)
1926 (while undo-list-copy
1927 (setq undo-elt (car undo-list-copy))
1928 (let ((keep-this
1929 (cond ((and (consp undo-elt) (eq (car undo-elt) t))
1930 ;; This is a "was unmodified" element.
1931 ;; Keep it if we have kept everything thus far.
1932 (not some-rejected))
1933 (t
1934 (undo-elt-in-region undo-elt start end)))))
1935 (if keep-this
1936 (progn
1937 (setq end (+ end (cdr (undo-delta undo-elt))))
1938 ;; Don't put two nils together in the list
1939 (if (not (and (eq (car undo-list) nil)
1940 (eq undo-elt nil)))
1941 (setq undo-list (cons undo-elt undo-list))))
1942 (if (undo-elt-crosses-region undo-elt start end)
1943 (setq undo-list-copy nil)
1944 (setq some-rejected t)
1945 (setq temp-undo-list (cdr undo-list-copy))
1946 (setq delta (undo-delta undo-elt))
1947
1948 (when (/= (cdr delta) 0)
1949 (let ((position (car delta))
1950 (offset (cdr delta)))
1951
e1e04350
SM
1952 ;; Loop down the earlier events adjusting their buffer
1953 ;; positions to reflect the fact that a change to the buffer
1954 ;; isn't being undone. We only need to process those element
1955 ;; types which undo-elt-in-region will return as being in
1956 ;; the region since only those types can ever get into the
1957 ;; output
65627aad
RS
1958
1959 (while temp-undo-list
1960 (setq undo-elt (car temp-undo-list))
1961 (cond ((integerp undo-elt)
1962 (if (>= undo-elt position)
1963 (setcar temp-undo-list (- undo-elt offset))))
1964 ((atom undo-elt) nil)
1965 ((stringp (car undo-elt))
1966 ;; (TEXT . POSITION)
1967 (let ((text-pos (abs (cdr undo-elt)))
1968 (point-at-end (< (cdr undo-elt) 0 )))
1969 (if (>= text-pos position)
1e722f9f 1970 (setcdr undo-elt (* (if point-at-end -1 1)
65627aad
RS
1971 (- text-pos offset))))))
1972 ((integerp (car undo-elt))
1973 ;; (BEGIN . END)
1974 (when (>= (car undo-elt) position)
1975 (setcar undo-elt (- (car undo-elt) offset))
1976 (setcdr undo-elt (- (cdr undo-elt) offset))))
1977 ((null (car undo-elt))
1978 ;; (nil PROPERTY VALUE BEG . END)
1979 (let ((tail (nthcdr 3 undo-elt)))
1980 (when (>= (car tail) position)
1981 (setcar tail (- (car tail) offset))
1982 (setcdr tail (- (cdr tail) offset))))))
1983 (setq temp-undo-list (cdr temp-undo-list))))))))
1984 (setq undo-list-copy (cdr undo-list-copy)))
1985 (nreverse undo-list)))
1986
1987(defun undo-elt-in-region (undo-elt start end)
1988 "Determine whether UNDO-ELT falls inside the region START ... END.
1989If it crosses the edge, we return nil."
1990 (cond ((integerp undo-elt)
1991 (and (>= undo-elt start)
12a93712 1992 (<= undo-elt end)))
65627aad
RS
1993 ((eq undo-elt nil)
1994 t)
1995 ((atom undo-elt)
1996 nil)
1997 ((stringp (car undo-elt))
1998 ;; (TEXT . POSITION)
1999 (and (>= (abs (cdr undo-elt)) start)
2000 (< (abs (cdr undo-elt)) end)))
2001 ((and (consp undo-elt) (markerp (car undo-elt)))
2002 ;; This is a marker-adjustment element (MARKER . ADJUSTMENT).
2003 ;; See if MARKER is inside the region.
2004 (let ((alist-elt (assq (car undo-elt) undo-adjusted-markers)))
2005 (unless alist-elt
2006 (setq alist-elt (cons (car undo-elt)
2007 (marker-position (car undo-elt))))
2008 (setq undo-adjusted-markers
2009 (cons alist-elt undo-adjusted-markers)))
2010 (and (cdr alist-elt)
2011 (>= (cdr alist-elt) start)
12a93712 2012 (<= (cdr alist-elt) end))))
65627aad
RS
2013 ((null (car undo-elt))
2014 ;; (nil PROPERTY VALUE BEG . END)
2015 (let ((tail (nthcdr 3 undo-elt)))
2016 (and (>= (car tail) start)
12a93712 2017 (<= (cdr tail) end))))
65627aad
RS
2018 ((integerp (car undo-elt))
2019 ;; (BEGIN . END)
2020 (and (>= (car undo-elt) start)
12a93712 2021 (<= (cdr undo-elt) end)))))
65627aad
RS
2022
2023(defun undo-elt-crosses-region (undo-elt start end)
2024 "Test whether UNDO-ELT crosses one edge of that region START ... END.
2025This assumes we have already decided that UNDO-ELT
2026is not *inside* the region START...END."
2027 (cond ((atom undo-elt) nil)
2028 ((null (car undo-elt))
2029 ;; (nil PROPERTY VALUE BEG . END)
2030 (let ((tail (nthcdr 3 undo-elt)))
1f8a132d
RS
2031 (and (< (car tail) end)
2032 (> (cdr tail) start))))
65627aad
RS
2033 ((integerp (car undo-elt))
2034 ;; (BEGIN . END)
1f8a132d
RS
2035 (and (< (car undo-elt) end)
2036 (> (cdr undo-elt) start)))))
65627aad
RS
2037
2038;; Return the first affected buffer position and the delta for an undo element
2039;; delta is defined as the change in subsequent buffer positions if we *did*
2040;; the undo.
2041(defun undo-delta (undo-elt)
2042 (if (consp undo-elt)
2043 (cond ((stringp (car undo-elt))
2044 ;; (TEXT . POSITION)
2045 (cons (abs (cdr undo-elt)) (length (car undo-elt))))
2046 ((integerp (car undo-elt))
2047 ;; (BEGIN . END)
2048 (cons (car undo-elt) (- (car undo-elt) (cdr undo-elt))))
2049 (t
2050 '(0 . 0)))
2051 '(0 . 0)))
b6e8e8e5 2052
1223933d 2053(defcustom undo-ask-before-discard nil
28cb725d
LT
2054 "If non-nil ask about discarding undo info for the current command.
2055Normally, Emacs discards the undo info for the current command if
2056it exceeds `undo-outer-limit'. But if you set this option
2057non-nil, it asks in the echo area whether to discard the info.
a3545af4 2058If you answer no, there is a slight risk that Emacs might crash, so
28cb725d
LT
2059only do it if you really want to undo the command.
2060
2061This option is mainly intended for debugging. You have to be
2062careful if you use it for other purposes. Garbage collection is
2063inhibited while the question is asked, meaning that Emacs might
2064leak memory. So you should make sure that you do not wait
2065excessively long before answering the question."
2066 :type 'boolean
2067 :group 'undo
bf247b6e 2068 :version "22.1")
28cb725d 2069
a1a801de
RS
2070(defvar undo-extra-outer-limit nil
2071 "If non-nil, an extra level of size that's ok in an undo item.
2072We don't ask the user about truncating the undo list until the
28cb725d
LT
2073current item gets bigger than this amount.
2074
2075This variable only matters if `undo-ask-before-discard' is non-nil.")
a1a801de
RS
2076(make-variable-buffer-local 'undo-extra-outer-limit)
2077
28cb725d
LT
2078;; When the first undo batch in an undo list is longer than
2079;; undo-outer-limit, this function gets called to warn the user that
2080;; the undo info for the current command was discarded. Garbage
2081;; collection is inhibited around the call, so it had better not do a
2082;; lot of consing.
b6e8e8e5
RS
2083(setq undo-outer-limit-function 'undo-outer-limit-truncate)
2084(defun undo-outer-limit-truncate (size)
28cb725d
LT
2085 (if undo-ask-before-discard
2086 (when (or (null undo-extra-outer-limit)
2087 (> size undo-extra-outer-limit))
2088 ;; Don't ask the question again unless it gets even bigger.
2089 ;; This applies, in particular, if the user quits from the question.
2090 ;; Such a quit quits out of GC, but something else will call GC
2091 ;; again momentarily. It will call this function again,
2092 ;; but we don't want to ask the question again.
2093 (setq undo-extra-outer-limit (+ size 50000))
2094 (if (let (use-dialog-box track-mouse executing-kbd-macro )
d5aa078b 2095 (yes-or-no-p (format "Buffer `%s' undo info is %d bytes long; discard it? "
28cb725d
LT
2096 (buffer-name) size)))
2097 (progn (setq buffer-undo-list nil)
2098 (setq undo-extra-outer-limit nil)
2099 t)
2100 nil))
2101 (display-warning '(undo discard-info)
2102 (concat
d5aa078b 2103 (format "Buffer `%s' undo info was %d bytes long.\n"
28cb725d
LT
2104 (buffer-name) size)
2105 "The undo info was discarded because it exceeded \
2106`undo-outer-limit'.
2107
2108This is normal if you executed a command that made a huge change
2109to the buffer. In that case, to prevent similar problems in the
2110future, set `undo-outer-limit' to a value that is large enough to
2111cover the maximum size of normal changes you expect a single
2112command to make, but not so large that it might exceed the
2113maximum memory allotted to Emacs.
2114
2115If you did not execute any such command, the situation is
2116probably due to a bug and you should report it.
2117
2118You can disable the popping up of this buffer by adding the entry
14f01bef
CY
2119\(undo discard-info) to the user option `warning-suppress-types',
2120which is defined in the `warnings' library.\n")
28cb725d
LT
2121 :warning)
2122 (setq buffer-undo-list nil)
2123 t))
e1e04350 2124\f
009ef402 2125(defvar shell-command-history nil
e5f0c02f
EZ
2126 "History list for some commands that read shell commands.
2127
2128Maximum length of the history list is determined by the value
2129of `history-length', which see.")
009ef402 2130
6d341a2a 2131(defvar shell-command-switch (purecopy "-c")
59fc41e5
RS
2132 "Switch used to have the shell execute its command line argument.")
2133
cc039f78
KH
2134(defvar shell-command-default-error-buffer nil
2135 "*Buffer name for `shell-command' and `shell-command-on-region' error output.
637fff82 2136This buffer is used when `shell-command' or `shell-command-on-region'
cc039f78
KH
2137is run interactively. A value of nil means that output to stderr and
2138stdout will be intermixed in the output stream.")
2139
a98a2fe8 2140(declare-function mailcap-file-default-commands "mailcap" (files))
e0987650 2141(declare-function dired-get-filename "dired" (&optional localp no-error-if-not-filep))
a98a2fe8
JL
2142
2143(defun minibuffer-default-add-shell-commands ()
263bc3fa 2144 "Return a list of all commands associated with the current file.
086a7dd4 2145This function is used to add all related commands retrieved by `mailcap'
a98a2fe8
JL
2146to the end of the list of defaults just after the default value."
2147 (interactive)
2148 (let* ((filename (if (listp minibuffer-default)
2149 (car minibuffer-default)
2150 minibuffer-default))
2151 (commands (and filename (require 'mailcap nil t)
2152 (mailcap-file-default-commands (list filename)))))
2153 (setq commands (mapcar (lambda (command)
2154 (concat command " " filename))
2155 commands))
2156 (if (listp minibuffer-default)
2157 (append minibuffer-default commands)
2158 (cons minibuffer-default commands))))
2159
2e7bd464
GM
2160(defvar shell-delimiter-argument-list)
2161(defvar shell-file-name-chars)
2162(defvar shell-file-name-quote-list)
2163
e5c4079c
SM
2164(defun minibuffer-complete-shell-command ()
2165 "Dynamically complete shell command at point."
2166 (interactive)
2167 (require 'shell)
79ccd1b8
AS
2168 (let ((comint-delimiter-argument-list shell-delimiter-argument-list)
2169 (comint-file-name-chars shell-file-name-chars)
2170 (comint-file-name-quote-list shell-file-name-quote-list))
2171 (run-hook-with-args-until-success 'shell-dynamic-complete-functions)))
e5c4079c
SM
2172
2173(defvar minibuffer-local-shell-command-map
2174 (let ((map (make-sparse-keymap)))
2175 (set-keymap-parent map minibuffer-local-map)
2176 (define-key map "\t" 'minibuffer-complete-shell-command)
2177 map)
1d2b0303 2178 "Keymap used for completing shell commands in minibuffer.")
e5c4079c
SM
2179
2180(defun read-shell-command (prompt &optional initial-contents hist &rest args)
2181 "Read a shell command from the minibuffer.
2182The arguments are the same as the ones of `read-from-minibuffer',
2183except READ and KEYMAP are missing and HIST defaults
2184to `shell-command-history'."
d6601455
JL
2185 (minibuffer-with-setup-hook
2186 (lambda ()
2187 (set (make-local-variable 'minibuffer-default-add-function)
2188 'minibuffer-default-add-shell-commands))
2189 (apply 'read-from-minibuffer prompt initial-contents
2190 minibuffer-local-shell-command-map
2191 nil
2192 (or hist 'shell-command-history)
2193 args)))
e5c4079c 2194
c945a962
JL
2195(defun async-shell-command (command &optional output-buffer error-buffer)
2196 "Execute string COMMAND asynchronously in background.
2197
2198Like `shell-command' but if COMMAND doesn't end in ampersand, adds `&'
2199surrounded by whitespace and executes the command asynchronously.
5ad4bef5
SM
2200The output appears in the buffer `*Async Shell Command*'.
2201
2202In Elisp, you will often be better served by calling `start-process'
2203directly, since it offers more control and does not impose the use of a
2204shell (with its need to quote arguments)."
c945a962
JL
2205 (interactive
2206 (list
2207 (read-shell-command "Async shell command: " nil nil
2208 (and buffer-file-name
2209 (file-relative-name buffer-file-name)))
2210 current-prefix-arg
2211 shell-command-default-error-buffer))
2212 (unless (string-match "&[ \t]*\\'" command)
2213 (setq command (concat command " &")))
2214 (shell-command command output-buffer error-buffer))
2215
cc039f78 2216(defun shell-command (command &optional output-buffer error-buffer)
2076c87c 2217 "Execute string COMMAND in inferior shell; display output, if any.
0b3f96d4 2218With prefix argument, insert the COMMAND's output at point.
d382f610 2219
2076c87c 2220If COMMAND ends in ampersand, execute it asynchronously.
d382f610 2221The output appears in the buffer `*Async Shell Command*'.
bcad4985 2222That buffer is in shell mode.
d382f610 2223
939ac10c
GM
2224Otherwise, COMMAND is executed synchronously. The output appears in
2225the buffer `*Shell Command Output*'. If the output is short enough to
2226display in the echo area (which is determined by the variables
2227`resize-mini-windows' and `max-mini-window-height'), it is shown
2228there, but it is nonetheless available in buffer `*Shell Command
e1e04350 2229Output*' even though that buffer is not automatically displayed.
d0d74413 2230
07f458c1 2231To specify a coding system for converting non-ASCII characters
5626c14e 2232in the shell command output, use \\[universal-coding-system-argument] \
07f458c1
RS
2233before this command.
2234
2235Noninteractive callers can specify coding systems by binding
2236`coding-system-for-read' and `coding-system-for-write'.
2237
d0d74413
RS
2238The optional second argument OUTPUT-BUFFER, if non-nil,
2239says to put the output in some other buffer.
2240If OUTPUT-BUFFER is a buffer or buffer name, put the output there.
2241If OUTPUT-BUFFER is not a buffer and not nil,
2242insert output in current buffer. (This cannot be done asynchronously.)
e7791447
CY
2243In either case, the buffer is first erased, and the output is
2244inserted after point (leaving mark after it).
cc039f78 2245
2e033693
RS
2246If the command terminates without error, but generates output,
2247and you did not specify \"insert it in the current buffer\",
2248the output can be displayed in the echo area or in its buffer.
2249If the output is short enough to display in the echo area
2250\(determined by the variable `max-mini-window-height' if
5626c14e
JB
2251`resize-mini-windows' is non-nil), it is shown there.
2252Otherwise,the buffer containing the output is displayed.
2e033693
RS
2253
2254If there is output and an error, and you did not specify \"insert it
2255in the current buffer\", a message about the error goes at the end
2256of the output.
2257
2258If there is no output, or if output is inserted in the current buffer,
2259then `*Shell Command Output*' is deleted.
2260
cc039f78
KH
2261If the optional third argument ERROR-BUFFER is non-nil, it is a buffer
2262or buffer name to which to direct the command's standard error output.
2263If it is nil, error output is mingled with regular output.
2264In an interactive call, the variable `shell-command-default-error-buffer'
5ad4bef5
SM
2265specifies the value of ERROR-BUFFER.
2266
2267In Elisp, you will often be better served by calling `call-process' or
2268`start-process' directly, since it offers more control and does not impose
2269the use of a shell (with its need to quote arguments)."
cc039f78 2270
a98a2fe8
JL
2271 (interactive
2272 (list
d6601455 2273 (read-shell-command "Shell command: " nil nil
e0987650
JL
2274 (let ((filename
2275 (cond
2276 (buffer-file-name)
2277 ((eq major-mode 'dired-mode)
2278 (dired-get-filename nil t)))))
2279 (and filename (file-relative-name filename))))
a98a2fe8
JL
2280 current-prefix-arg
2281 shell-command-default-error-buffer))
c7edd03c
KH
2282 ;; Look for a handler in case default-directory is a remote file name.
2283 (let ((handler
2284 (find-file-name-handler (directory-file-name default-directory)
2285 'shell-command)))
2286 (if handler
cc039f78 2287 (funcall handler 'shell-command command output-buffer error-buffer)
c7edd03c
KH
2288 (if (and output-buffer
2289 (not (or (bufferp output-buffer) (stringp output-buffer))))
2e033693 2290 ;; Output goes in current buffer.
cc039f78 2291 (let ((error-file
1e722f9f 2292 (if error-buffer
b005abd5 2293 (make-temp-file
171a45d9
EZ
2294 (expand-file-name "scor"
2295 (or small-temporary-file-directory
2296 temporary-file-directory)))
cc039f78
KH
2297 nil)))
2298 (barf-if-buffer-read-only)
63437623 2299 (push-mark nil t)
cc039f78
KH
2300 ;; We do not use -f for csh; we will not support broken use of
2301 ;; .cshrcs. Even the BSD csh manual says to use
2302 ;; "if ($?prompt) exit" before things which are not useful
2303 ;; non-interactively. Besides, if someone wants their other
2304 ;; aliases for shell commands then they can still have them.
1e722f9f 2305 (call-process shell-file-name nil
cc039f78
KH
2306 (if error-file
2307 (list t error-file)
2308 t)
2309 nil shell-command-switch command)
2310 (when (and error-file (file-exists-p error-file))
2311 (if (< 0 (nth 7 (file-attributes error-file)))
2312 (with-current-buffer (get-buffer-create error-buffer)
2313 (let ((pos-from-end (- (point-max) (point))))
2314 (or (bobp)
2315 (insert "\f\n"))
2316 ;; Do no formatting while reading error file,
2317 ;; because that can run a shell command, and we
2318 ;; don't want that to cause an infinite recursion.
2319 (format-insert-file error-file nil)
2320 ;; Put point after the inserted errors.
2321 (goto-char (- (point-max) pos-from-end)))
2322 (display-buffer (current-buffer))))
2323 (delete-file error-file))
2324 ;; This is like exchange-point-and-mark, but doesn't
2325 ;; activate the mark. It is cleaner to avoid activation,
2326 ;; even though the command loop would deactivate the mark
2327 ;; because we inserted text.
2328 (goto-char (prog1 (mark t)
2329 (set-marker (mark-marker) (point)
2330 (current-buffer)))))
2e033693 2331 ;; Output goes in a separate buffer.
c7edd03c
KH
2332 ;; Preserve the match data in case called from a program.
2333 (save-match-data
aab5d2c5 2334 (if (string-match "[ \t]*&[ \t]*\\'" command)
c7edd03c
KH
2335 ;; Command ending with ampersand means asynchronous.
2336 (let ((buffer (get-buffer-create
2337 (or output-buffer "*Async Shell Command*")))
2338 (directory default-directory)
2339 proc)
2340 ;; Remove the ampersand.
2341 (setq command (substring command 0 (match-beginning 0)))
2342 ;; If will kill a process, query first.
2343 (setq proc (get-buffer-process buffer))
2344 (if proc
2345 (if (yes-or-no-p "A command is running. Kill it? ")
2346 (kill-process proc)
2347 (error "Shell command in progress")))
1e96c007 2348 (with-current-buffer buffer
c7edd03c
KH
2349 (setq buffer-read-only nil)
2350 (erase-buffer)
2351 (display-buffer buffer)
2352 (setq default-directory directory)
1e722f9f 2353 (setq proc (start-process "Shell" buffer shell-file-name
c7edd03c
KH
2354 shell-command-switch command))
2355 (setq mode-line-process '(":%s"))
c2020c27 2356 (require 'shell) (shell-mode)
c7edd03c 2357 (set-process-sentinel proc 'shell-command-sentinel)
50c737e4
JL
2358 ;; Use the comint filter for proper handling of carriage motion
2359 ;; (see `comint-inhibit-carriage-motion'),.
2360 (set-process-filter proc 'comint-output-filter)
c7edd03c 2361 ))
50c737e4 2362 ;; Otherwise, command is executed synchronously.
cc039f78
KH
2363 (shell-command-on-region (point) (point) command
2364 output-buffer nil error-buffer)))))))
eaae8106 2365
f69aad2b
MB
2366(defun display-message-or-buffer (message
2367 &optional buffer-name not-this-window frame)
2368 "Display MESSAGE in the echo area if possible, otherwise in a pop-up buffer.
2369MESSAGE may be either a string or a buffer.
2370
2371A buffer is displayed using `display-buffer' if MESSAGE is too long for
939ac10c
GM
2372the maximum height of the echo area, as defined by `max-mini-window-height'
2373if `resize-mini-windows' is non-nil.
f69aad2b 2374
2a3f00bf
MB
2375Returns either the string shown in the echo area, or when a pop-up
2376buffer is used, the window used to display it.
2377
f69aad2b
MB
2378If MESSAGE is a string, then the optional argument BUFFER-NAME is the
2379name of the buffer used to display it in the case where a pop-up buffer
2380is used, defaulting to `*Message*'. In the case where MESSAGE is a
2381string and it is displayed in the echo area, it is not specified whether
2382the contents are inserted into the buffer anyway.
2383
2384Optional arguments NOT-THIS-WINDOW and FRAME are as for `display-buffer',
2385and only used if a buffer is displayed."
39a8d88a 2386 (cond ((and (stringp message) (not (string-match "\n" message)))
f69aad2b
MB
2387 ;; Trivial case where we can use the echo area
2388 (message "%s" message))
2389 ((and (stringp message)
39a8d88a 2390 (= (string-match "\n" message) (1- (length message))))
f69aad2b
MB
2391 ;; Trivial case where we can just remove single trailing newline
2392 (message "%s" (substring message 0 (1- (length message)))))
2393 (t
2394 ;; General case
2395 (with-current-buffer
2396 (if (bufferp message)
2397 message
2398 (get-buffer-create (or buffer-name "*Message*")))
2399
2400 (unless (bufferp message)
2401 (erase-buffer)
2402 (insert message))
2403
2404 (let ((lines
2405 (if (= (buffer-size) 0)
2406 0
62ffcd76 2407 (count-screen-lines nil nil nil (minibuffer-window)))))
4f017185
RS
2408 (cond ((= lines 0))
2409 ((and (or (<= lines 1)
aab5d2c5
RS
2410 (<= lines
2411 (if resize-mini-windows
2412 (cond ((floatp max-mini-window-height)
2413 (* (frame-height)
2414 max-mini-window-height))
2415 ((integerp max-mini-window-height)
2416 max-mini-window-height)
2417 (t
2418 1))
2419 1)))
2420 ;; Don't use the echo area if the output buffer is
2421 ;; already dispayed in the selected frame.
61b80ebf 2422 (not (get-buffer-window (current-buffer))))
f69aad2b
MB
2423 ;; Echo area
2424 (goto-char (point-max))
2425 (when (bolp)
2426 (backward-char 1))
2427 (message "%s" (buffer-substring (point-min) (point))))
2428 (t
2429 ;; Buffer
2430 (goto-char (point-min))
31252c00
MB
2431 (display-buffer (current-buffer)
2432 not-this-window frame))))))))
f69aad2b
MB
2433
2434
2076c87c
JB
2435;; We have a sentinel to prevent insertion of a termination message
2436;; in the buffer itself.
2437(defun shell-command-sentinel (process signal)
bcad4985 2438 (if (memq (process-status process) '(exit signal))
1e722f9f 2439 (message "%s: %s."
bcad4985
KH
2440 (car (cdr (cdr (process-command process))))
2441 (substring signal 0 -1))))
2076c87c 2442
d0d74413 2443(defun shell-command-on-region (start end command
cce1c318 2444 &optional output-buffer replace
63619f42 2445 error-buffer display-error-buffer)
2076c87c
JB
2446 "Execute string COMMAND in inferior shell with region as input.
2447Normally display output (if any) in temp buffer `*Shell Command Output*';
a0184aeb
DL
2448Prefix arg means replace the region with it. Return the exit code of
2449COMMAND.
56c0450e 2450
07f458c1
RS
2451To specify a coding system for converting non-ASCII characters
2452in the input and output to the shell command, use \\[universal-coding-system-argument]
2453before this command. By default, the input (from the current buffer)
2454is encoded in the same coding system that will be used to save the file,
2455`buffer-file-coding-system'. If the output is going to replace the region,
2456then it is decoded from that same coding system.
2457
63619f42
RS
2458The noninteractive arguments are START, END, COMMAND,
2459OUTPUT-BUFFER, REPLACE, ERROR-BUFFER, and DISPLAY-ERROR-BUFFER.
2460Noninteractive callers can specify coding systems by binding
2461`coding-system-for-read' and `coding-system-for-write'.
2076c87c 2462
2e033693
RS
2463If the command generates output, the output may be displayed
2464in the echo area or in a buffer.
2465If the output is short enough to display in the echo area
2466\(determined by the variable `max-mini-window-height' if
2467`resize-mini-windows' is non-nil), it is shown there. Otherwise
2468it is displayed in the buffer `*Shell Command Output*'. The output
2469is available in that buffer in both cases.
2470
2471If there is output and an error, a message about the error
2472appears at the end of the output.
2473
2474If there is no output, or if output is inserted in the current buffer,
2475then `*Shell Command Output*' is deleted.
d0d74413 2476
56c0450e
RS
2477If the optional fourth argument OUTPUT-BUFFER is non-nil,
2478that says to put the output in some other buffer.
d0d74413
RS
2479If OUTPUT-BUFFER is a buffer or buffer name, put the output there.
2480If OUTPUT-BUFFER is not a buffer and not nil,
2481insert output in the current buffer.
cce1c318
RS
2482In either case, the output is inserted after point (leaving mark after it).
2483
8923a211
RS
2484If REPLACE, the optional fifth argument, is non-nil, that means insert
2485the output in place of text from START to END, putting point and mark
2486around it.
2487
b735c991 2488If optional sixth argument ERROR-BUFFER is non-nil, it is a buffer
cce1c318 2489or buffer name to which to direct the command's standard error output.
7fd47839 2490If it is nil, error output is mingled with regular output.
63619f42
RS
2491If DISPLAY-ERROR-BUFFER is non-nil, display the error buffer if there
2492were any errors. (This is always t, interactively.)
cc039f78
KH
2493In an interactive call, the variable `shell-command-default-error-buffer'
2494specifies the value of ERROR-BUFFER."
195ce311
RS
2495 (interactive (let (string)
2496 (unless (mark)
2497 (error "The mark is not set now, so there is no region"))
2498 ;; Do this before calling region-beginning
2499 ;; and region-end, in case subprocess output
2500 ;; relocates them while we are in the minibuffer.
e5c4079c 2501 (setq string (read-shell-command "Shell command on region: "))
2b03c506
RS
2502 ;; call-interactively recognizes region-beginning and
2503 ;; region-end specially, leaving them in the history.
2504 (list (region-beginning) (region-end)
cae49185
RS
2505 string
2506 current-prefix-arg
7fd47839 2507 current-prefix-arg
63619f42
RS
2508 shell-command-default-error-buffer
2509 t)))
cce1c318 2510 (let ((error-file
171a45d9 2511 (if error-buffer
b005abd5 2512 (make-temp-file
171a45d9
EZ
2513 (expand-file-name "scor"
2514 (or small-temporary-file-directory
2515 temporary-file-directory)))
a0184aeb
DL
2516 nil))
2517 exit-status)
7fd47839
RS
2518 (if (or replace
2519 (and output-buffer
748d6ca4 2520 (not (or (bufferp output-buffer) (stringp output-buffer)))))
7fd47839
RS
2521 ;; Replace specified region with output from command.
2522 (let ((swap (and replace (< start end))))
2523 ;; Don't muck with mark unless REPLACE says we should.
2524 (goto-char start)
30883773 2525 (and replace (push-mark (point) 'nomsg))
a0184aeb
DL
2526 (setq exit-status
2527 (call-process-region start end shell-file-name t
2528 (if error-file
2529 (list t error-file)
2530 t)
2531 nil shell-command-switch command))
e1e04350
SM
2532 ;; It is rude to delete a buffer which the command is not using.
2533 ;; (let ((shell-buffer (get-buffer "*Shell Command Output*")))
2534 ;; (and shell-buffer (not (eq shell-buffer (current-buffer)))
2535 ;; (kill-buffer shell-buffer)))
7fd47839
RS
2536 ;; Don't muck with mark unless REPLACE says we should.
2537 (and replace swap (exchange-point-and-mark)))
2538 ;; No prefix argument: put the output in a temp buffer,
2539 ;; replacing its entire contents.
2540 (let ((buffer (get-buffer-create
d4bbcbb4 2541 (or output-buffer "*Shell Command Output*"))))
7fd47839
RS
2542 (unwind-protect
2543 (if (eq buffer (current-buffer))
2544 ;; If the input is the same buffer as the output,
2545 ;; delete everything but the specified region,
2546 ;; then replace that region with the output.
2547 (progn (setq buffer-read-only nil)
2548 (delete-region (max start end) (point-max))
2549 (delete-region (point-min) (min start end))
2550 (setq exit-status
2551 (call-process-region (point-min) (point-max)
1e722f9f 2552 shell-file-name t
7fd47839
RS
2553 (if error-file
2554 (list t error-file)
2555 t)
a0184aeb
DL
2556 nil shell-command-switch
2557 command)))
2558 ;; Clear the output buffer, then run the command with
2559 ;; output there.
c2e303c8 2560 (let ((directory default-directory))
7fdbcd83 2561 (with-current-buffer buffer
c2e303c8
GM
2562 (setq buffer-read-only nil)
2563 (if (not output-buffer)
2564 (setq default-directory directory))
2565 (erase-buffer)))
7fd47839
RS
2566 (setq exit-status
2567 (call-process-region start end shell-file-name nil
2568 (if error-file
2569 (list buffer error-file)
2570 buffer)
a0184aeb 2571 nil shell-command-switch command)))
2e033693 2572 ;; Report the output.
9a98fa64 2573 (with-current-buffer buffer
f1180544 2574 (setq mode-line-process
d4bbcbb4
AS
2575 (cond ((null exit-status)
2576 " - Error")
2577 ((stringp exit-status)
2578 (format " - Signal [%s]" exit-status))
2579 ((not (equal 0 exit-status))
2580 (format " - Exit [%d]" exit-status)))))
f69aad2b
MB
2581 (if (with-current-buffer buffer (> (point-max) (point-min)))
2582 ;; There's some output, display it
9a98fa64 2583 (display-message-or-buffer buffer)
f69aad2b 2584 ;; No output; error?
94ddbe6d
RS
2585 (let ((output
2586 (if (and error-file
2587 (< 0 (nth 7 (file-attributes error-file))))
2588 "some error output"
2589 "no output")))
d4bbcbb4
AS
2590 (cond ((null exit-status)
2591 (message "(Shell command failed with error)"))
2592 ((equal 0 exit-status)
2593 (message "(Shell command succeeded with %s)"
2594 output))
2595 ((stringp exit-status)
2596 (message "(Shell command killed by signal %s)"
2597 exit-status))
2598 (t
2599 (message "(Shell command failed with code %d and %s)"
2600 exit-status output))))
e1e04350
SM
2601 ;; Don't kill: there might be useful info in the undo-log.
2602 ;; (kill-buffer buffer)
2603 ))))
f69aad2b 2604
cc039f78
KH
2605 (when (and error-file (file-exists-p error-file))
2606 (if (< 0 (nth 7 (file-attributes error-file)))
2607 (with-current-buffer (get-buffer-create error-buffer)
2608 (let ((pos-from-end (- (point-max) (point))))
2609 (or (bobp)
2610 (insert "\f\n"))
2611 ;; Do no formatting while reading error file,
2612 ;; because that can run a shell command, and we
2613 ;; don't want that to cause an infinite recursion.
2614 (format-insert-file error-file nil)
2615 ;; Put point after the inserted errors.
2616 (goto-char (- (point-max) pos-from-end)))
63619f42
RS
2617 (and display-error-buffer
2618 (display-buffer (current-buffer)))))
cc039f78 2619 (delete-file error-file))
a0184aeb 2620 exit-status))
1e722f9f 2621
d589bd99
RS
2622(defun shell-command-to-string (command)
2623 "Execute shell command COMMAND and return its output as a string."
2624 (with-output-to-string
17cc9013
RS
2625 (with-current-buffer
2626 standard-output
2627 (call-process shell-file-name nil t nil shell-command-switch command))))
0457dd55
KG
2628
2629(defun process-file (program &optional infile buffer display &rest args)
2630 "Process files synchronously in a separate process.
2631Similar to `call-process', but may invoke a file handler based on
2632`default-directory'. The current working directory of the
2633subprocess is `default-directory'.
2634
2635File names in INFILE and BUFFER are handled normally, but file
2636names in ARGS should be relative to `default-directory', as they
2637are passed to the process verbatim. \(This is a difference to
2638`call-process' which does not support file handlers for INFILE
2639and BUFFER.\)
2640
2641Some file handlers might not support all variants, for example
2642they might behave as if DISPLAY was nil, regardless of the actual
2643value passed."
2644 (let ((fh (find-file-name-handler default-directory 'process-file))
2645 lc stderr-file)
2646 (unwind-protect
2647 (if fh (apply fh 'process-file program infile buffer display args)
8de40f9f 2648 (when infile (setq lc (file-local-copy infile)))
0457dd55 2649 (setq stderr-file (when (and (consp buffer) (stringp (cadr buffer)))
85af630d
KG
2650 (make-temp-file "emacs")))
2651 (prog1
2652 (apply 'call-process program
2653 (or lc infile)
2654 (if stderr-file (list (car buffer) stderr-file) buffer)
2655 display args)
2656 (when stderr-file (copy-file stderr-file (cadr buffer)))))
0457dd55
KG
2657 (when stderr-file (delete-file stderr-file))
2658 (when lc (delete-file lc)))))
2659
2c4f2562
MA
2660(defvar process-file-side-effects t
2661 "Whether a call of `process-file' changes remote files.
2662
2663Per default, this variable is always set to `t', meaning that a
2664call of `process-file' could potentially change any file on a
2665remote host. When set to `nil', a file handler could optimize
2666its behaviour with respect to remote file attributes caching.
2667
2668This variable should never be changed by `setq'. Instead of, it
2669shall be set only by let-binding.")
2670
7cb76caa
MA
2671(defun start-file-process (name buffer program &rest program-args)
2672 "Start a program in a subprocess. Return the process object for it.
5a5abb2c 2673
7cb76caa 2674Similar to `start-process', but may invoke a file handler based on
5a5abb2c
MA
2675`default-directory'. See Info node `(elisp)Magic File Names'.
2676
2677This handler ought to run PROGRAM, perhaps on the local host,
2678perhaps on a remote host that corresponds to `default-directory'.
2679In the latter case, the local part of `default-directory' becomes
2680the working directory of the process.
7cb76caa
MA
2681
2682PROGRAM and PROGRAM-ARGS might be file names. They are not
91f11424
MA
2683objects of file handler invocation. File handlers might not
2684support pty association, if PROGRAM is nil."
7cb76caa
MA
2685 (let ((fh (find-file-name-handler default-directory 'start-file-process)))
2686 (if fh (apply fh 'start-file-process name buffer program program-args)
2687 (apply 'start-process name buffer program program-args))))
2688
2d88b556 2689\f
1b43f83f 2690(defvar universal-argument-map
69d4c3c4
KH
2691 (let ((map (make-sparse-keymap)))
2692 (define-key map [t] 'universal-argument-other-key)
b9ff190d 2693 (define-key map (vector meta-prefix-char t) 'universal-argument-other-key)
69d4c3c4
KH
2694 (define-key map [switch-frame] nil)
2695 (define-key map [?\C-u] 'universal-argument-more)
2696 (define-key map [?-] 'universal-argument-minus)
2697 (define-key map [?0] 'digit-argument)
2698 (define-key map [?1] 'digit-argument)
2699 (define-key map [?2] 'digit-argument)
2700 (define-key map [?3] 'digit-argument)
2701 (define-key map [?4] 'digit-argument)
2702 (define-key map [?5] 'digit-argument)
2703 (define-key map [?6] 'digit-argument)
2704 (define-key map [?7] 'digit-argument)
2705 (define-key map [?8] 'digit-argument)
2706 (define-key map [?9] 'digit-argument)
bd7acc8d
GM
2707 (define-key map [kp-0] 'digit-argument)
2708 (define-key map [kp-1] 'digit-argument)
2709 (define-key map [kp-2] 'digit-argument)
2710 (define-key map [kp-3] 'digit-argument)
2711 (define-key map [kp-4] 'digit-argument)
2712 (define-key map [kp-5] 'digit-argument)
2713 (define-key map [kp-6] 'digit-argument)
2714 (define-key map [kp-7] 'digit-argument)
2715 (define-key map [kp-8] 'digit-argument)
2716 (define-key map [kp-9] 'digit-argument)
2717 (define-key map [kp-subtract] 'universal-argument-minus)
69d4c3c4
KH
2718 map)
2719 "Keymap used while processing \\[universal-argument].")
2720
0de84e16
RS
2721(defvar universal-argument-num-events nil
2722 "Number of argument-specifying events read by `universal-argument'.
2723`universal-argument-other-key' uses this to discard those events
2724from (this-command-keys), and reread only the final command.")
2725
6b61353c
KH
2726(defvar overriding-map-is-bound nil
2727 "Non-nil when `overriding-terminal-local-map' is `universal-argument-map'.")
2728
2729(defvar saved-overriding-map nil
2730 "The saved value of `overriding-terminal-local-map'.
2731That variable gets restored to this value on exiting \"universal
2732argument mode\".")
2733
2734(defun ensure-overriding-map-is-bound ()
2735 "Check `overriding-terminal-local-map' is `universal-argument-map'."
2736 (unless overriding-map-is-bound
2737 (setq saved-overriding-map overriding-terminal-local-map)
2738 (setq overriding-terminal-local-map universal-argument-map)
2739 (setq overriding-map-is-bound t)))
2740
2741(defun restore-overriding-map ()
2742 "Restore `overriding-terminal-local-map' to its saved value."
2743 (setq overriding-terminal-local-map saved-overriding-map)
2744 (setq overriding-map-is-bound nil))
2745
e8d1a377
KH
2746(defun universal-argument ()
2747 "Begin a numeric argument for the following command.
2748Digits or minus sign following \\[universal-argument] make up the numeric argument.
2749\\[universal-argument] following the digits or minus sign ends the argument.
2750\\[universal-argument] without digits or minus sign provides 4 as argument.
2751Repeating \\[universal-argument] without digits or minus sign
0565d307
RS
2752 multiplies the argument by 4 each time.
2753For some commands, just \\[universal-argument] by itself serves as a flag
a697fc62
RS
2754which is different in effect from any particular numeric argument.
2755These commands include \\[set-mark-command] and \\[start-kbd-macro]."
69d4c3c4
KH
2756 (interactive)
2757 (setq prefix-arg (list 4))
0de84e16 2758 (setq universal-argument-num-events (length (this-command-keys)))
6b61353c 2759 (ensure-overriding-map-is-bound))
e8d1a377 2760
69d4c3c4
KH
2761;; A subsequent C-u means to multiply the factor by 4 if we've typed
2762;; nothing but C-u's; otherwise it means to terminate the prefix arg.
2763(defun universal-argument-more (arg)
e8d1a377 2764 (interactive "P")
69d4c3c4
KH
2765 (if (consp arg)
2766 (setq prefix-arg (list (* 4 (car arg))))
1cd24721
RS
2767 (if (eq arg '-)
2768 (setq prefix-arg (list -4))
2769 (setq prefix-arg arg)
6b61353c 2770 (restore-overriding-map)))
0de84e16 2771 (setq universal-argument-num-events (length (this-command-keys))))
e8d1a377
KH
2772
2773(defun negative-argument (arg)
2774 "Begin a negative numeric argument for the next command.
2775\\[universal-argument] following digits or minus sign ends the argument."
2776 (interactive "P")
69d4c3c4
KH
2777 (cond ((integerp arg)
2778 (setq prefix-arg (- arg)))
2779 ((eq arg '-)
2780 (setq prefix-arg nil))
2781 (t
b9ff190d 2782 (setq prefix-arg '-)))
0de84e16 2783 (setq universal-argument-num-events (length (this-command-keys)))
6b61353c 2784 (ensure-overriding-map-is-bound))
69d4c3c4
KH
2785
2786(defun digit-argument (arg)
2787 "Part of the numeric argument for the next command.
2788\\[universal-argument] following digits or minus sign ends the argument."
2789 (interactive "P")
8989a920
GM
2790 (let* ((char (if (integerp last-command-event)
2791 last-command-event
2792 (get last-command-event 'ascii-character)))
bd7acc8d 2793 (digit (- (logand char ?\177) ?0)))
69d4c3c4
KH
2794 (cond ((integerp arg)
2795 (setq prefix-arg (+ (* arg 10)
2796 (if (< arg 0) (- digit) digit))))
2797 ((eq arg '-)
2798 ;; Treat -0 as just -, so that -01 will work.
2799 (setq prefix-arg (if (zerop digit) '- (- digit))))
2800 (t
b9ff190d 2801 (setq prefix-arg digit))))
0de84e16 2802 (setq universal-argument-num-events (length (this-command-keys)))
6b61353c 2803 (ensure-overriding-map-is-bound))
69d4c3c4
KH
2804
2805;; For backward compatibility, minus with no modifiers is an ordinary
2806;; command if digits have already been entered.
2807(defun universal-argument-minus (arg)
2808 (interactive "P")
2809 (if (integerp arg)
2810 (universal-argument-other-key arg)
2811 (negative-argument arg)))
2812
2813;; Anything else terminates the argument and is left in the queue to be
2814;; executed as a command.
2815(defun universal-argument-other-key (arg)
2816 (interactive "P")
2817 (setq prefix-arg arg)
0de84e16
RS
2818 (let* ((key (this-command-keys))
2819 (keylist (listify-key-sequence key)))
2820 (setq unread-command-events
06697cdb
RS
2821 (append (nthcdr universal-argument-num-events keylist)
2822 unread-command-events)))
f0ef2555 2823 (reset-this-command-lengths)
6b61353c 2824 (restore-overriding-map))
2d88b556 2825\f
8f92b8ad
SM
2826;; This function is here rather than in subr.el because it uses CL.
2827(defmacro with-wrapper-hook (var args &rest body)
2828 "Run BODY wrapped with the VAR hook.
2829VAR is a special hook: its functions are called with a first argument
2830which is the \"original\" code (the BODY), so the hook function can wrap
2831the original function, or call it any number of times (including not calling
2832it at all). This is similar to an `around' advice.
2833VAR is normally a symbol (a variable) in which case it is treated like
2834a hook, with a buffer-local and a global part. But it can also be an
2835arbitrary expression.
2836ARGS is a list of variables which will be passed as additional arguments
2837to each function, after the initial argument, and which the first argument
2838expects to receive when called."
2839 (declare (indent 2) (debug t))
2840 ;; We need those two gensyms because CL's lexical scoping is not available
2841 ;; for function arguments :-(
2842 (let ((funs (make-symbol "funs"))
2843 (global (make-symbol "global"))
2844 (argssym (make-symbol "args")))
2845 ;; Since the hook is a wrapper, the loop has to be done via
2846 ;; recursion: a given hook function will call its parameter in order to
2847 ;; continue looping.
2848 `(labels ((runrestofhook (,funs ,global ,argssym)
2849 ;; `funs' holds the functions left on the hook and `global'
2850 ;; holds the functions left on the global part of the hook
2851 ;; (in case the hook is local).
2852 (lexical-let ((funs ,funs)
2853 (global ,global))
2854 (if (consp funs)
2855 (if (eq t (car funs))
2856 (runrestofhook
2857 (append global (cdr funs)) nil ,argssym)
2858 (apply (car funs)
2859 (lambda (&rest ,argssym)
2860 (runrestofhook (cdr funs) global ,argssym))
2861 ,argssym))
2862 ;; Once there are no more functions on the hook, run
2863 ;; the original body.
2864 (apply (lambda ,args ,@body) ,argssym)))))
2865 (runrestofhook ,var
2866 ;; The global part of the hook, if any.
2867 ,(if (symbolp var)
2868 `(if (local-variable-p ',var)
2869 (default-value ',var)))
2870 (list ,@args)))))
2871
2872(defvar filter-buffer-substring-functions nil
2873 "Wrapper hook around `filter-buffer-substring'.
2874The functions on this special hook are called with 4 arguments:
2875 NEXT-FUN BEG END DELETE
2876NEXT-FUN is a function of 3 arguments (BEG END DELETE)
2877that performs the default operation. The other 3 arguments are like
2878the ones passed to `filter-buffer-substring'.")
2879
7fcce20f
RS
2880(defvar buffer-substring-filters nil
2881 "List of filter functions for `filter-buffer-substring'.
2882Each function must accept a single argument, a string, and return
2883a string. The buffer substring is passed to the first function
2884in the list, and the return value of each function is passed to
2885the next. The return value of the last function is used as the
2886return value of `filter-buffer-substring'.
2887
2888If this variable is nil, no filtering is performed.")
8f92b8ad
SM
2889(make-obsolete-variable 'buffer-substring-filters
2890 'filter-buffer-substring-functions "24.1")
7fcce20f 2891
8f92b8ad 2892(defun filter-buffer-substring (beg end &optional delete)
7fcce20f 2893 "Return the buffer substring between BEG and END, after filtering.
8f92b8ad 2894The filtering is performed by `filter-buffer-substring-functions'.
7fcce20f
RS
2895
2896If DELETE is non-nil, the text between BEG and END is deleted
2897from the buffer.
2898
398c9ffb
KS
2899This function should be used instead of `buffer-substring',
2900`buffer-substring-no-properties', or `delete-and-extract-region'
2901when you want to allow filtering to take place. For example,
8f92b8ad 2902major or minor modes can use `filter-buffer-substring-functions' to
398c9ffb
KS
2903extract characters that are special to a buffer, and should not
2904be copied into other buffers."
8f92b8ad
SM
2905 (with-wrapper-hook filter-buffer-substring-functions (beg end delete)
2906 (cond
2907 ((or delete buffer-substring-filters)
2908 (save-excursion
2909 (goto-char beg)
2910 (let ((string (if delete (delete-and-extract-region beg end)
2911 (buffer-substring beg end))))
2912 (dolist (filter buffer-substring-filters)
2913 (setq string (funcall filter string)))
2914 string)))
2915 (t
2916 (buffer-substring beg end)))))
398c9ffb 2917
7fcce20f 2918
93be67de 2919;;;; Window system cut and paste hooks.
70e14c01
JB
2920
2921(defvar interprogram-cut-function nil
2922 "Function to call to make a killed region available to other programs.
2923
2924Most window systems provide some sort of facility for cutting and
9f112a3d
RS
2925pasting text between the windows of different programs.
2926This variable holds a function that Emacs calls whenever text
2927is put in the kill ring, to make the new kill available to other
70e14c01
JB
2928programs.
2929
9f112a3d
RS
2930The function takes one or two arguments.
2931The first argument, TEXT, is a string containing
2932the text which should be made available.
6b61353c
KH
2933The second, optional, argument PUSH, has the same meaning as the
2934similar argument to `x-set-cut-buffer', which see.")
70e14c01
JB
2935
2936(defvar interprogram-paste-function nil
2937 "Function to call to get text cut from other programs.
2938
2939Most window systems provide some sort of facility for cutting and
9f112a3d
RS
2940pasting text between the windows of different programs.
2941This variable holds a function that Emacs calls to obtain
70e14c01
JB
2942text that other programs have provided for pasting.
2943
2944The function should be called with no arguments. If the function
2945returns nil, then no other program has provided such text, and the top
2946of the Emacs kill ring should be used. If the function returns a
6b61353c
KH
2947string, then the caller of the function \(usually `current-kill')
2948should put this string in the kill ring as the latest kill.
daa37602 2949
d4cb4833 2950This function may also return a list of strings if the window
1d2b0303 2951system supports multiple selections. The first string will be
d4cb4833
GM
2952used as the pasted text, but the other will be placed in the
2953kill ring for easy access via `yank-pop'.
2954
daa37602
JB
2955Note that the function should return a string only if a program other
2956than Emacs has provided a string for pasting; if Emacs provided the
2957most recent string, the function should return nil. If it is
2958difficult to tell whether Emacs or some other program provided the
2959current string, it is probably good enough to return nil if the string
2960is equal (according to `string=') to the last text Emacs provided.")
2d88b556 2961\f
70e14c01 2962
eaae8106 2963
70e14c01 2964;;;; The kill ring data structure.
2076c87c
JB
2965
2966(defvar kill-ring nil
70e14c01
JB
2967 "List of killed text sequences.
2968Since the kill ring is supposed to interact nicely with cut-and-paste
2969facilities offered by window systems, use of this variable should
2970interact nicely with `interprogram-cut-function' and
2971`interprogram-paste-function'. The functions `kill-new',
2972`kill-append', and `current-kill' are supposed to implement this
2973interaction; you may want to use them instead of manipulating the kill
2974ring directly.")
2076c87c 2975
bffa4d92 2976(defcustom kill-ring-max 60
1d2b0303 2977 "Maximum length of kill ring before oldest elements are thrown away."
69c1dd37
RS
2978 :type 'integer
2979 :group 'killing)
2076c87c
JB
2980
2981(defvar kill-ring-yank-pointer nil
2982 "The tail of the kill ring whose car is the last thing yanked.")
2983
4ed8c7aa 2984(defcustom save-interprogram-paste-before-kill nil
e8ab3908 2985 "Save clipboard strings into kill ring before replacing them.
4ed8c7aa
SS
2986When one selects something in another program to paste it into Emacs,
2987but kills something in Emacs before actually pasting it,
2988this selection is gone unless this variable is non-nil,
2989in which case the other program's selection is saved in the `kill-ring'
2990before the Emacs kill and one can still paste it using \\[yank] \\[yank-pop]."
2991 :type 'boolean
2992 :group 'killing
2993 :version "23.2")
2994
ba83a64e
SS
2995(defcustom kill-do-not-save-duplicates nil
2996 "Do not add a new string to `kill-ring' when it is the same as the last one."
2997 :type 'boolean
2998 :group 'killing
2999 :version "23.2")
3000
be5936a7 3001(defun kill-new (string &optional replace yank-handler)
70e14c01 3002 "Make STRING the latest kill in the kill ring.
3e505153 3003Set `kill-ring-yank-pointer' to point to it.
f914dc91
KH
3004If `interprogram-cut-function' is non-nil, apply it to STRING.
3005Optional second argument REPLACE non-nil means that STRING will replace
be5936a7
KS
3006the front of the kill ring, rather than being added to the list.
3007
3008Optional third arguments YANK-HANDLER controls how the STRING is later
f1180544 3009inserted into a buffer; see `insert-for-yank' for details.
2a262563 3010When a yank handler is specified, STRING must be non-empty (the yank
6b61353c 3011handler, if non-nil, is stored as a `yank-handler' text property on STRING).
2a262563 3012
4ed8c7aa
SS
3013When `save-interprogram-paste-before-kill' and `interprogram-paste-function'
3014are non-nil, saves the interprogram paste string(s) into `kill-ring' before
3015STRING.
3016
2a262563
KS
3017When the yank handler has a non-nil PARAM element, the original STRING
3018argument is not used by `insert-for-yank'. However, since Lisp code
f33321ad 3019may access and use elements from the kill ring directly, the STRING
2a262563
KS
3020argument should still be a \"useful\" string for such uses."
3021 (if (> (length string) 0)
f1180544 3022 (if yank-handler
6b61353c
KH
3023 (put-text-property 0 (length string)
3024 'yank-handler yank-handler string))
2a262563 3025 (if yank-handler
f1180544 3026 (signal 'args-out-of-range
2a262563 3027 (list string "yank-handler specified for empty string"))))
0665f661
JL
3028 (unless (and kill-do-not-save-duplicates
3029 (equal string (car kill-ring)))
3030 (if (fboundp 'menu-bar-update-yank-menu)
3031 (menu-bar-update-yank-menu string (and replace (car kill-ring)))))
4ed8c7aa
SS
3032 (when save-interprogram-paste-before-kill
3033 (let ((interprogram-paste (and interprogram-paste-function
3034 (funcall interprogram-paste-function))))
3035 (when interprogram-paste
0665f661
JL
3036 (dolist (s (if (listp interprogram-paste)
3037 (nreverse interprogram-paste)
3038 (list interprogram-paste)))
3039 (unless (and kill-do-not-save-duplicates
3040 (equal s (car kill-ring)))
3041 (push s kill-ring))))))
3042 (unless (and kill-do-not-save-duplicates
3043 (equal string (car kill-ring)))
3044 (if (and replace kill-ring)
3045 (setcar kill-ring string)
3046 (push string kill-ring)
3047 (if (> (length kill-ring) kill-ring-max)
3048 (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))))
70e14c01
JB
3049 (setq kill-ring-yank-pointer kill-ring)
3050 (if interprogram-cut-function
657a33ab 3051 (funcall interprogram-cut-function string (not replace))))
70e14c01 3052
be5936a7 3053(defun kill-append (string before-p &optional yank-handler)
70e14c01
JB
3054 "Append STRING to the end of the latest kill in the kill ring.
3055If BEFORE-P is non-nil, prepend STRING to the kill.
6b61353c
KH
3056Optional third argument YANK-HANDLER, if non-nil, specifies the
3057yank-handler text property to be set on the combined kill ring
3058string. If the specified yank-handler arg differs from the
3059yank-handler property of the latest kill string, this function
3060adds the combined string to the kill ring as a new element,
3061instead of replacing the last kill with it.
be5936a7
KS
3062If `interprogram-cut-function' is set, pass the resulting kill to it."
3063 (let* ((cur (car kill-ring)))
3064 (kill-new (if before-p (concat string cur) (concat cur string))
3065 (or (= (length cur) 0)
3066 (equal yank-handler (get-text-property 0 'yank-handler cur)))
3067 yank-handler)))
70e14c01 3068
4496b02b
RS
3069(defcustom yank-pop-change-selection nil
3070 "If non-nil, rotating the kill ring changes the window system selection."
3071 :type 'boolean
3072 :group 'killing
3073 :version "23.1")
3074
70e14c01
JB
3075(defun current-kill (n &optional do-not-move)
3076 "Rotate the yanking point by N places, and then return that kill.
1d2b0303
JB
3077If N is zero, `interprogram-paste-function' is set, and calling
3078it returns a string or list of strings, then that string (or
3079list) is added to the front of the kill ring and the string (or
3080first string in the list) is returned as the latest kill.
4496b02b
RS
3081
3082If N is not zero, and if `yank-pop-change-selection' is
3083non-nil, use `interprogram-cut-function' to transfer the
3084kill at the new yank point into the window system selection.
3085
3086If optional arg DO-NOT-MOVE is non-nil, then don't actually
3087move the yanking point; just return the Nth kill forward."
3088
70e14c01
JB
3089 (let ((interprogram-paste (and (= n 0)
3090 interprogram-paste-function
3091 (funcall interprogram-paste-function))))
3092 (if interprogram-paste
3093 (progn
3094 ;; Disable the interprogram cut function when we add the new
3095 ;; text to the kill ring, so Emacs doesn't try to own the
3096 ;; selection, with identical text.
3097 (let ((interprogram-cut-function nil))
d4cb4833
GM
3098 (if (listp interprogram-paste)
3099 (mapc 'kill-new (nreverse interprogram-paste))
3100 (kill-new interprogram-paste)))
3101 (car kill-ring))
70e14c01 3102 (or kill-ring (error "Kill ring is empty"))
47096a67
PE
3103 (let ((ARGth-kill-element
3104 (nthcdr (mod (- n (length kill-ring-yank-pointer))
3105 (length kill-ring))
3106 kill-ring)))
4496b02b
RS
3107 (unless do-not-move
3108 (setq kill-ring-yank-pointer ARGth-kill-element)
3109 (when (and yank-pop-change-selection
3110 (> n 0)
3111 interprogram-cut-function)
3112 (funcall interprogram-cut-function (car ARGth-kill-element))))
70e14c01 3113 (car ARGth-kill-element)))))
c88ab9ce 3114
c88ab9ce 3115
eaae8106 3116
70e14c01 3117;;;; Commands for manipulating the kill ring.
c88ab9ce 3118
69c1dd37 3119(defcustom kill-read-only-ok nil
1d2b0303 3120 "Non-nil means don't signal an error for killing read-only text."
69c1dd37
RS
3121 :type 'boolean
3122 :group 'killing)
e6291fe1 3123
3a5da8a8
RS
3124(put 'text-read-only 'error-conditions
3125 '(text-read-only buffer-read-only error))
6d341a2a 3126(put 'text-read-only 'error-message (purecopy "Text is read-only"))
3a5da8a8 3127
be5936a7 3128(defun kill-region (beg end &optional yank-handler)
66e9b2b2
RS
3129 "Kill (\"cut\") text between point and mark.
3130This deletes the text from the buffer and saves it in the kill ring.
2076c87c 3131The command \\[yank] can retrieve it from there.
ba2b460a 3132\(If you want to save the region without killing it, use \\[kill-ring-save].)
81558867
EZ
3133
3134If you want to append the killed region to the last killed text,
3135use \\[append-next-kill] before \\[kill-region].
3136
2aa7a8bf
JB
3137If the buffer is read-only, Emacs will beep and refrain from deleting
3138the text, but put the text in the kill ring anyway. This means that
3139you can use the killing commands to copy text from a read-only buffer.
2076c87c 3140
a4aae1a5
CY
3141Lisp programs should use this function for killing text.
3142 (To delete text, use `delete-region'.)
c15dc81f 3143Supply two arguments, character positions indicating the stretch of text
2076c87c
JB
3144 to be killed.
3145Any command that calls this function is a \"kill command\".
3146If the previous command was also a kill command,
3147the text killed this time appends to the text killed last time
be5936a7
KS
3148to make one entry in the kill ring.
3149
6b61353c
KH
3150In Lisp code, optional third arg YANK-HANDLER, if non-nil,
3151specifies the yank-handler text property to be set on the killed
3152text. See `insert-for-yank'."
214a3db0
RS
3153 ;; Pass point first, then mark, because the order matters
3154 ;; when calling kill-append.
3155 (interactive (list (point) (mark)))
f39d6be0
RS
3156 (unless (and beg end)
3157 (error "The mark is not set now, so there is no region"))
ccd19b9f 3158 (condition-case nil
7fcce20f 3159 (let ((string (filter-buffer-substring beg end t)))
a1eb02bd
SM
3160 (when string ;STRING is nil if BEG = END
3161 ;; Add that string to the kill ring, one way or another.
3162 (if (eq last-command 'kill-region)
be5936a7
KS
3163 (kill-append string (< end beg) yank-handler)
3164 (kill-new string nil yank-handler)))
8a7cda9b 3165 (when (or string (eq last-command 'kill-region))
6b61353c
KH
3166 (setq this-command 'kill-region))
3167 nil)
ccd19b9f
KH
3168 ((buffer-read-only text-read-only)
3169 ;; The code above failed because the buffer, or some of the characters
3170 ;; in the region, are read-only.
3171 ;; We should beep, in case the user just isn't aware of this.
3172 ;; However, there's no harm in putting
3173 ;; the region's text in the kill ring, anyway.
3174 (copy-region-as-kill beg end)
cb3e1b4c
RS
3175 ;; Set this-command now, so it will be set even if we get an error.
3176 (setq this-command 'kill-region)
3177 ;; This should barf, if appropriate, and give us the correct error.
ccd19b9f 3178 (if kill-read-only-ok
6b61353c 3179 (progn (message "Read only text copied to kill ring") nil)
ccd19b9f
KH
3180 ;; Signal an error if the buffer is read-only.
3181 (barf-if-buffer-read-only)
3182 ;; If the buffer isn't read-only, the text is.
3183 (signal 'text-read-only (list (current-buffer)))))))
2076c87c 3184
a382890a
KH
3185;; copy-region-as-kill no longer sets this-command, because it's confusing
3186;; to get two copies of the text when the user accidentally types M-w and
3187;; then corrects it with the intended C-w.
2076c87c
JB
3188(defun copy-region-as-kill (beg end)
3189 "Save the region as if killed, but don't kill it.
0e264847 3190In Transient Mark mode, deactivate the mark.
46947372 3191If `interprogram-cut-function' is non-nil, also save the text for a window
b66eb11b
RS
3192system cut and paste.
3193
3194This command's old key binding has been given to `kill-ring-save'."
2076c87c
JB
3195 (interactive "r")
3196 (if (eq last-command 'kill-region)
7fcce20f
RS
3197 (kill-append (filter-buffer-substring beg end) (< end beg))
3198 (kill-new (filter-buffer-substring beg end)))
d34c311a 3199 (setq deactivate-mark t)
2076c87c
JB
3200 nil)
3201
3202(defun kill-ring-save (beg end)
0964e562 3203 "Save the region as if killed, but don't kill it.
0e264847 3204In Transient Mark mode, deactivate the mark.
0964e562 3205If `interprogram-cut-function' is non-nil, also save the text for a window
0e264847
RS
3206system cut and paste.
3207
81558867
EZ
3208If you want to append the killed line to the last killed text,
3209use \\[append-next-kill] before \\[kill-ring-save].
3210
0e264847
RS
3211This command is similar to `copy-region-as-kill', except that it gives
3212visual feedback indicating the extent of the region being copied."
2076c87c
JB
3213 (interactive "r")
3214 (copy-region-as-kill beg end)
32226619 3215 ;; This use of called-interactively-p is correct
bbf41690 3216 ;; because the code it controls just gives the user visual feedback.
32226619 3217 (if (called-interactively-p 'interactive)
66050f10
RS
3218 (let ((other-end (if (= (point) beg) end beg))
3219 (opoint (point))
3220 ;; Inhibit quitting so we can make a quit here
3221 ;; look like a C-g typed as a command.
3222 (inhibit-quit t))
3223 (if (pos-visible-in-window-p other-end (selected-window))
d34c311a
SM
3224 ;; Swap point-and-mark quickly so as to show the region that
3225 ;; was selected. Don't do it if the region is highlighted.
3226 (unless (and (region-active-p)
977e2654 3227 (face-background 'region))
66050f10
RS
3228 ;; Swap point and mark.
3229 (set-marker (mark-marker) (point) (current-buffer))
3230 (goto-char other-end)
e4ef3e92 3231 (sit-for blink-matching-delay)
66050f10
RS
3232 ;; Swap back.
3233 (set-marker (mark-marker) other-end (current-buffer))
3234 (goto-char opoint)
3235 ;; If user quit, deactivate the mark
3236 ;; as C-g would as a command.
e4e593ae 3237 (and quit-flag mark-active
fcadf1c7 3238 (deactivate-mark)))
66050f10
RS
3239 (let* ((killed-text (current-kill 0))
3240 (message-len (min (length killed-text) 40)))
3241 (if (= (point) beg)
3242 ;; Don't say "killed"; that is misleading.
3243 (message "Saved text until \"%s\""
3244 (substring killed-text (- message-len)))
3245 (message "Saved text from \"%s\""
3246 (substring killed-text 0 message-len))))))))
2076c87c 3247
c75d4986
KH
3248(defun append-next-kill (&optional interactive)
3249 "Cause following command, if it kills, to append to previous kill.
3250The argument is used for internal purposes; do not supply one."
3251 (interactive "p")
3252 ;; We don't use (interactive-p), since that breaks kbd macros.
3253 (if interactive
2076c87c
JB
3254 (progn
3255 (setq this-command 'kill-region)
3256 (message "If the next command is a kill, it will append"))
3257 (setq last-command 'kill-region)))
cfb4f123 3258\f
93be67de 3259;; Yanking.
2076c87c 3260
cfb4f123
RS
3261;; This is actually used in subr.el but defcustom does not work there.
3262(defcustom yank-excluded-properties
be5936a7 3263 '(read-only invisible intangible field mouse-face help-echo local-map keymap
7408ee97 3264 yank-handler follow-link fontified)
3137dda8 3265 "Text properties to discard when yanking.
c6ff5a4c
LT
3266The value should be a list of text properties to discard or t,
3267which means to discard all text properties."
cfb4f123 3268 :type '(choice (const :tag "All" t) (repeat symbol))
c9f0110e 3269 :group 'killing
bf247b6e 3270 :version "22.1")
cfb4f123 3271
120de5bd 3272(defvar yank-window-start nil)
be5936a7 3273(defvar yank-undo-function nil
44f5a7b2
KS
3274 "If non-nil, function used by `yank-pop' to delete last stretch of yanked text.
3275Function is called with two parameters, START and END corresponding to
3276the value of the mark and point; it is guaranteed that START <= END.
3277Normally set from the UNDO element of a yank-handler; see `insert-for-yank'.")
120de5bd 3278
6b61353c 3279(defun yank-pop (&optional arg)
ff1fbe3e
RS
3280 "Replace just-yanked stretch of killed text with a different stretch.
3281This command is allowed only immediately after a `yank' or a `yank-pop'.
2076c87c 3282At such a time, the region contains a stretch of reinserted
ff1fbe3e 3283previously-killed text. `yank-pop' deletes that text and inserts in its
2076c87c
JB
3284place a different stretch of killed text.
3285
3286With no argument, the previous kill is inserted.
ff1fbe3e
RS
3287With argument N, insert the Nth previous kill.
3288If N is negative, this is a more recent kill.
2076c87c
JB
3289
3290The sequence of kills wraps around, so that after the oldest one
a0e8eaa3
EZ
3291comes the newest one.
3292
3293When this command inserts killed text into the buffer, it honors
3294`yank-excluded-properties' and `yank-handler' as described in the
3295doc string for `insert-for-yank-1', which see."
2076c87c
JB
3296 (interactive "*p")
3297 (if (not (eq last-command 'yank))
3298 (error "Previous command was not a yank"))
3299 (setq this-command 'yank)
6b61353c 3300 (unless arg (setq arg 1))
3a5da8a8
RS
3301 (let ((inhibit-read-only t)
3302 (before (< (point) (mark t))))
8254897f
KS
3303 (if before
3304 (funcall (or yank-undo-function 'delete-region) (point) (mark t))
3305 (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
be5936a7 3306 (setq yank-undo-function nil)
fd0f4056 3307 (set-marker (mark-marker) (point) (current-buffer))
cfb4f123 3308 (insert-for-yank (current-kill arg))
120de5bd
RS
3309 ;; Set the window start back where it was in the yank command,
3310 ;; if possible.
3311 (set-window-start (selected-window) yank-window-start t)
fd0f4056
RS
3312 (if before
3313 ;; This is like exchange-point-and-mark, but doesn't activate the mark.
3314 ;; It is cleaner to avoid activation, even though the command
3315 ;; loop would deactivate the mark because we inserted text.
3316 (goto-char (prog1 (mark t)
3317 (set-marker (mark-marker) (point) (current-buffer))))))
0964e562 3318 nil)
2076c87c
JB
3319
3320(defun yank (&optional arg)
f894e671 3321 "Reinsert (\"paste\") the last stretch of killed text.
2076c87c 3322More precisely, reinsert the stretch of killed text most recently
ff1fbe3e 3323killed OR yanked. Put point at end, and set mark at beginning.
d99f8496 3324With just \\[universal-argument] as argument, same but put point at beginning (and mark at end).
ff1fbe3e 3325With argument N, reinsert the Nth most recently killed stretch of killed
2076c87c 3326text.
a0e8eaa3
EZ
3327
3328When this command inserts killed text into the buffer, it honors
3329`yank-excluded-properties' and `yank-handler' as described in the
3330doc string for `insert-for-yank-1', which see.
3331
a9b9303c 3332See also the command `yank-pop' (\\[yank-pop])."
2076c87c 3333 (interactive "*P")
120de5bd 3334 (setq yank-window-start (window-start))
456c617c
RS
3335 ;; If we don't get all the way thru, make last-command indicate that
3336 ;; for the following command.
3337 (setq this-command t)
2076c87c 3338 (push-mark (point))
cfb4f123
RS
3339 (insert-for-yank (current-kill (cond
3340 ((listp arg) 0)
6b61353c 3341 ((eq arg '-) -2)
cfb4f123 3342 (t (1- arg)))))
2076c87c 3343 (if (consp arg)
fd0f4056
RS
3344 ;; This is like exchange-point-and-mark, but doesn't activate the mark.
3345 ;; It is cleaner to avoid activation, even though the command
3346 ;; loop would deactivate the mark because we inserted text.
3347 (goto-char (prog1 (mark t)
3348 (set-marker (mark-marker) (point) (current-buffer)))))
456c617c 3349 ;; If we do get all the way thru, make this-command indicate that.
be5936a7
KS
3350 (if (eq this-command t)
3351 (setq this-command 'yank))
0964e562 3352 nil)
70e14c01
JB
3353
3354(defun rotate-yank-pointer (arg)
3355 "Rotate the yanking point in the kill ring.
5626c14e 3356With ARG, rotate that many kills forward (or backward, if negative)."
70e14c01
JB
3357 (interactive "p")
3358 (current-kill arg))
2d88b556 3359\f
93be67de
KH
3360;; Some kill commands.
3361
3362;; Internal subroutine of delete-char
3363(defun kill-forward-chars (arg)
3364 (if (listp arg) (setq arg (car arg)))
3365 (if (eq arg '-) (setq arg -1))
673e5169 3366 (kill-region (point) (+ (point) arg)))
93be67de
KH
3367
3368;; Internal subroutine of backward-delete-char
3369(defun kill-backward-chars (arg)
3370 (if (listp arg) (setq arg (car arg)))
3371 (if (eq arg '-) (setq arg -1))
673e5169 3372 (kill-region (point) (- (point) arg)))
93be67de
KH
3373
3374(defcustom backward-delete-char-untabify-method 'untabify
1d2b0303 3375 "The method for untabifying when deleting backward.
1e722f9f
SS
3376Can be `untabify' -- turn a tab to many spaces, then delete one space;
3377 `hungry' -- delete all whitespace, both tabs and spaces;
3378 `all' -- delete all whitespace, including tabs, spaces and newlines;
93be67de 3379 nil -- just delete one character."
1e722f9f 3380 :type '(choice (const untabify) (const hungry) (const all) (const nil))
03167a34 3381 :version "20.3"
93be67de
KH
3382 :group 'killing)
3383
3384(defun backward-delete-char-untabify (arg &optional killp)
3385 "Delete characters backward, changing tabs into spaces.
3386The exact behavior depends on `backward-delete-char-untabify-method'.
3387Delete ARG chars, and kill (save in kill ring) if KILLP is non-nil.
3388Interactively, ARG is the prefix arg (default 1)
3389and KILLP is t if a prefix arg was specified."
3390 (interactive "*p\nP")
3391 (when (eq backward-delete-char-untabify-method 'untabify)
3392 (let ((count arg))
3393 (save-excursion
3394 (while (and (> count 0) (not (bobp)))
3395 (if (= (preceding-char) ?\t)
3396 (let ((col (current-column)))
3397 (forward-char -1)
3398 (setq col (- col (current-column)))
f33321ad 3399 (insert-char ?\s col)
93be67de
KH
3400 (delete-char 1)))
3401 (forward-char -1)
3402 (setq count (1- count))))))
3403 (delete-backward-char
1e722f9f
SS
3404 (let ((skip (cond ((eq backward-delete-char-untabify-method 'hungry) " \t")
3405 ((eq backward-delete-char-untabify-method 'all)
3406 " \t\n\r"))))
3407 (if skip
3408 (let ((wh (- (point) (save-excursion (skip-chars-backward skip)
93be67de
KH
3409 (point)))))
3410 (+ arg (if (zerop wh) 0 (1- wh))))
1e722f9f 3411 arg))
93be67de
KH
3412 killp))
3413
3414(defun zap-to-char (arg char)
5626c14e 3415 "Kill up to and including ARGth occurrence of CHAR.
93be67de
KH
3416Case is ignored if `case-fold-search' is non-nil in the current buffer.
3417Goes backward if ARG is negative; error if CHAR not found."
e761e42c 3418 (interactive "p\ncZap to char: ")
a6c39c14
EZ
3419 ;; Avoid "obsolete" warnings for translation-table-for-input.
3420 (with-no-warnings
3421 (if (char-table-p translation-table-for-input)
3422 (setq char (or (aref translation-table-for-input char) char))))
93be67de
KH
3423 (kill-region (point) (progn
3424 (search-forward (char-to-string char) nil nil arg)
3425; (goto-char (if (> arg 0) (1- (point)) (1+ (point))))
3426 (point))))
eaae8106 3427
93be67de
KH
3428;; kill-line and its subroutines.
3429
3430(defcustom kill-whole-line nil
1d2b0303 3431 "If non-nil, `kill-line' with no arg at beg of line kills the whole line."
93be67de
KH
3432 :type 'boolean
3433 :group 'killing)
3434
3435(defun kill-line (&optional arg)
3436 "Kill the rest of the current line; if no nonblanks there, kill thru newline.
5626c14e 3437With prefix argument ARG, kill that many lines from point.
93be67de 3438Negative arguments kill lines backward.
8be7408c 3439With zero argument, kills the text before point on the current line.
93be67de
KH
3440
3441When calling from a program, nil means \"no arg\",
3442a number counts as a prefix arg.
3443
3444To kill a whole line, when point is not at the beginning, type \
602157ab 3445\\[move-beginning-of-line] \\[kill-line] \\[kill-line].
93be67de
KH
3446
3447If `kill-whole-line' is non-nil, then this command kills the whole line
3448including its terminating newline, when used at the beginning of a line
3449with no argument. As a consequence, you can always kill a whole line
602157ab 3450by typing \\[move-beginning-of-line] \\[kill-line].
d3f22784 3451
81558867
EZ
3452If you want to append the killed line to the last killed text,
3453use \\[append-next-kill] before \\[kill-line].
3454
d3f22784
EZ
3455If the buffer is read-only, Emacs will beep and refrain from deleting
3456the line, but put the line in the kill ring anyway. This means that
1a534b89
RS
3457you can use this command to copy text from a read-only buffer.
3458\(If the variable `kill-read-only-ok' is non-nil, then this won't
3459even beep.)"
e761e42c 3460 (interactive "P")
93be67de
KH
3461 (kill-region (point)
3462 ;; It is better to move point to the other end of the kill
3463 ;; before killing. That way, in a read-only buffer, point
3464 ;; moves across the text that is copied to the kill ring.
3465 ;; The choice has no effect on undo now that undo records
3466 ;; the value of point from before the command was run.
3467 (progn
3468 (if arg
3469 (forward-visible-line (prefix-numeric-value arg))
3470 (if (eobp)
3471 (signal 'end-of-buffer nil))
5560dc5d
RS
3472 (let ((end
3473 (save-excursion
3474 (end-of-visible-line) (point))))
3475 (if (or (save-excursion
6b61353c
KH
3476 ;; If trailing whitespace is visible,
3477 ;; don't treat it as nothing.
3478 (unless show-trailing-whitespace
3479 (skip-chars-forward " \t" end))
5560dc5d
RS
3480 (= (point) end))
3481 (and kill-whole-line (bolp)))
3482 (forward-visible-line 1)
3483 (goto-char end))))
93be67de
KH
3484 (point))))
3485
348de80b
KG
3486(defun kill-whole-line (&optional arg)
3487 "Kill current line.
5626c14e
JB
3488With prefix ARG, kill that many lines starting from the current line.
3489If ARG is negative, kill backward. Also kill the preceding newline.
01ba9662 3490\(This is meant to make \\[repeat] work well with negative arguments.\)
5626c14e 3491If ARG is zero, kill current line but exclude the trailing newline."
f8b0f284 3492 (interactive "p")
186133b4 3493 (or arg (setq arg 1))
6c770e38
LT
3494 (if (and (> arg 0) (eobp) (save-excursion (forward-visible-line 0) (eobp)))
3495 (signal 'end-of-buffer nil))
3496 (if (and (< arg 0) (bobp) (save-excursion (end-of-visible-line) (bobp)))
3497 (signal 'beginning-of-buffer nil))
3498 (unless (eq last-command 'kill-region)
3499 (kill-new "")
3500 (setq last-command 'kill-region))
348de80b 3501 (cond ((zerop arg)
6c770e38
LT
3502 ;; We need to kill in two steps, because the previous command
3503 ;; could have been a kill command, in which case the text
3504 ;; before point needs to be prepended to the current kill
3505 ;; ring entry and the text after point appended. Also, we
3506 ;; need to use save-excursion to avoid copying the same text
3507 ;; twice to the kill ring in read-only buffers.
3508 (save-excursion
3509 (kill-region (point) (progn (forward-visible-line 0) (point))))
348de80b
KG
3510 (kill-region (point) (progn (end-of-visible-line) (point))))
3511 ((< arg 0)
6c770e38
LT
3512 (save-excursion
3513 (kill-region (point) (progn (end-of-visible-line) (point))))
3514 (kill-region (point)
3515 (progn (forward-visible-line (1+ arg))
3516 (unless (bobp) (backward-char))
3517 (point))))
348de80b 3518 (t
6c770e38
LT
3519 (save-excursion
3520 (kill-region (point) (progn (forward-visible-line 0) (point))))
3521 (kill-region (point)
3522 (progn (forward-visible-line arg) (point))))))
12a93712 3523
93be67de
KH
3524(defun forward-visible-line (arg)
3525 "Move forward by ARG lines, ignoring currently invisible newlines only.
3526If ARG is negative, move backward -ARG lines.
3527If ARG is zero, move to the beginning of the current line."
3528 (condition-case nil
3529 (if (> arg 0)
12a93712
RS
3530 (progn
3531 (while (> arg 0)
93be67de 3532 (or (zerop (forward-line 1))
12a93712
RS
3533 (signal 'end-of-buffer nil))
3534 ;; If the newline we just skipped is invisible,
3535 ;; don't count it.
3536 (let ((prop
3537 (get-char-property (1- (point)) 'invisible)))
3538 (if (if (eq buffer-invisibility-spec t)
3539 prop
3540 (or (memq prop buffer-invisibility-spec)
3541 (assq prop buffer-invisibility-spec)))
3542 (setq arg (1+ arg))))
3543 (setq arg (1- arg)))
3544 ;; If invisible text follows, and it is a number of complete lines,
3545 ;; skip it.
3546 (let ((opoint (point)))
3547 (while (and (not (eobp))
3548 (let ((prop
3549 (get-char-property (point) 'invisible)))
3550 (if (eq buffer-invisibility-spec t)
3551 prop
3552 (or (memq prop buffer-invisibility-spec)
3553 (assq prop buffer-invisibility-spec)))))
3554 (goto-char
3555 (if (get-text-property (point) 'invisible)
3556 (or (next-single-property-change (point) 'invisible)
3557 (point-max))
3558 (next-overlay-change (point)))))
3559 (unless (bolp)
3560 (goto-char opoint))))
93be67de 3561 (let ((first t))
f5fd8833
JB
3562 (while (or first (<= arg 0))
3563 (if first
93be67de
KH
3564 (beginning-of-line)
3565 (or (zerop (forward-line -1))
3566 (signal 'beginning-of-buffer nil)))
12a93712
RS
3567 ;; If the newline we just moved to is invisible,
3568 ;; don't count it.
3569 (unless (bobp)
3570 (let ((prop
3571 (get-char-property (1- (point)) 'invisible)))
f5fd8833
JB
3572 (unless (if (eq buffer-invisibility-spec t)
3573 prop
3574 (or (memq prop buffer-invisibility-spec)
3575 (assq prop buffer-invisibility-spec)))
3576 (setq arg (1+ arg)))))
3577 (setq first nil))
12a93712
RS
3578 ;; If invisible text follows, and it is a number of complete lines,
3579 ;; skip it.
3580 (let ((opoint (point)))
93be67de
KH
3581 (while (and (not (bobp))
3582 (let ((prop
3583 (get-char-property (1- (point)) 'invisible)))
3584 (if (eq buffer-invisibility-spec t)
3585 prop
3586 (or (memq prop buffer-invisibility-spec)
3587 (assq prop buffer-invisibility-spec)))))
3588 (goto-char
3589 (if (get-text-property (1- (point)) 'invisible)
3590 (or (previous-single-property-change (point) 'invisible)
3591 (point-min))
12a93712
RS
3592 (previous-overlay-change (point)))))
3593 (unless (bolp)
3594 (goto-char opoint)))))
93be67de
KH
3595 ((beginning-of-buffer end-of-buffer)
3596 nil)))
70e14c01 3597
93be67de
KH
3598(defun end-of-visible-line ()
3599 "Move to end of current visible line."
3600 (end-of-line)
3601 ;; If the following character is currently invisible,
3602 ;; skip all characters with that same `invisible' property value,
3603 ;; then find the next newline.
3604 (while (and (not (eobp))
5560dc5d
RS
3605 (save-excursion
3606 (skip-chars-forward "^\n")
3607 (let ((prop
3608 (get-char-property (point) 'invisible)))
3609 (if (eq buffer-invisibility-spec t)
3610 prop
3611 (or (memq prop buffer-invisibility-spec)
3612 (assq prop buffer-invisibility-spec))))))
3613 (skip-chars-forward "^\n")
93be67de
KH
3614 (if (get-text-property (point) 'invisible)
3615 (goto-char (next-single-property-change (point) 'invisible))
3616 (goto-char (next-overlay-change (point))))
3617 (end-of-line)))
2d88b556 3618\f
2076c87c
JB
3619(defun insert-buffer (buffer)
3620 "Insert after point the contents of BUFFER.
3621Puts mark after the inserted text.
6cb6e7a2
GM
3622BUFFER may be a buffer or a buffer name.
3623
3624This function is meant for the user to run interactively.
1e96c007 3625Don't call it from programs: use `insert-buffer-substring' instead!"
c3d4f949 3626 (interactive
a3e7c391
FP
3627 (list
3628 (progn
3629 (barf-if-buffer-read-only)
3630 (read-buffer "Insert buffer: "
3631 (if (eq (selected-window) (next-window (selected-window)))
3632 (other-buffer (current-buffer))
3633 (window-buffer (next-window (selected-window))))
3634 t))))
1e96c007
SM
3635 (push-mark
3636 (save-excursion
3637 (insert-buffer-substring (get-buffer buffer))
3638 (point)))
1537a263 3639 nil)
2076c87c
JB
3640
3641(defun append-to-buffer (buffer start end)
3642 "Append to specified buffer the text of the region.
3643It is inserted into that buffer before its point.
3644
3645When calling from a program, give three arguments:
3646BUFFER (or buffer name), START and END.
3647START and END specify the portion of the current buffer to be copied."
70e14c01 3648 (interactive
5d771766 3649 (list (read-buffer "Append to buffer: " (other-buffer (current-buffer) t))
23efee2c 3650 (region-beginning) (region-end)))
85626eef
SM
3651 (let* ((oldbuf (current-buffer))
3652 (append-to (get-buffer-create buffer))
3653 (windows (get-buffer-window-list append-to t t))
3654 point)
3655 (save-excursion
3656 (with-current-buffer append-to
3657 (setq point (point))
3658 (barf-if-buffer-read-only)
3659 (insert-buffer-substring oldbuf start end)
3660 (dolist (window windows)
3661 (when (= (window-point window) point)
3662 (set-window-point window (point))))))))
2076c87c
JB
3663
3664(defun prepend-to-buffer (buffer start end)
3665 "Prepend to specified buffer the text of the region.
3666It is inserted into that buffer after its point.
3667
3668When calling from a program, give three arguments:
3669BUFFER (or buffer name), START and END.
3670START and END specify the portion of the current buffer to be copied."
3671 (interactive "BPrepend to buffer: \nr")
3672 (let ((oldbuf (current-buffer)))
7fdbcd83 3673 (with-current-buffer (get-buffer-create buffer)
74399eac 3674 (barf-if-buffer-read-only)
2076c87c
JB
3675 (save-excursion
3676 (insert-buffer-substring oldbuf start end)))))
3677
3678(defun copy-to-buffer (buffer start end)
3679 "Copy to specified buffer the text of the region.
3680It is inserted into that buffer, replacing existing text there.
3681
3682When calling from a program, give three arguments:
3683BUFFER (or buffer name), START and END.
3684START and END specify the portion of the current buffer to be copied."
3685 (interactive "BCopy to buffer: \nr")
3686 (let ((oldbuf (current-buffer)))
1b5fd09e 3687 (with-current-buffer (get-buffer-create buffer)
74399eac 3688 (barf-if-buffer-read-only)
2076c87c
JB
3689 (erase-buffer)
3690 (save-excursion
3691 (insert-buffer-substring oldbuf start end)))))
2d88b556 3692\f
62d1c1fc 3693(put 'mark-inactive 'error-conditions '(mark-inactive error))
8f43cbf3 3694(put 'mark-inactive 'error-message (purecopy "The mark is not active now"))
62d1c1fc 3695
0251bafb
RS
3696(defvar activate-mark-hook nil
3697 "Hook run when the mark becomes active.
3698It is also run at the end of a command, if the mark is active and
6cbb0bb0 3699it is possible that the region may have changed.")
0251bafb
RS
3700
3701(defvar deactivate-mark-hook nil
3702 "Hook run when the mark becomes inactive.")
3703
af39530e 3704(defun mark (&optional force)
f00239cf
RS
3705 "Return this buffer's mark value as integer, or nil if never set.
3706
3707In Transient Mark mode, this function signals an error if
3708the mark is not active. However, if `mark-even-if-inactive' is non-nil,
3709or the argument FORCE is non-nil, it disregards whether the mark
3710is active, and returns an integer or nil in the usual way.
af39530e 3711
2076c87c
JB
3712If you are using this in an editing command, you are most likely making
3713a mistake; see the documentation of `set-mark'."
0e3a7b14 3714 (if (or force (not transient-mark-mode) mark-active mark-even-if-inactive)
af39530e 3715 (marker-position (mark-marker))
62d1c1fc 3716 (signal 'mark-inactive nil)))
2076c87c 3717
f6714ede
GM
3718(declare-function x-selection-owner-p "xselect.c" (&optional selection))
3719
f9be2e35 3720(defsubst deactivate-mark (&optional force)
19d35374 3721 "Deactivate the mark by setting `mark-active' to nil.
f9be2e35
CY
3722Unless FORCE is non-nil, this function does nothing if Transient
3723Mark mode is disabled.
3724This function also runs `deactivate-mark-hook'."
3725 (when (or transient-mark-mode force)
7c23dd44
CY
3726 (when (and (if (eq select-active-regions 'only)
3727 (eq (car-safe transient-mark-mode) 'only)
3728 select-active-regions)
9852377f
CY
3729 (region-active-p)
3730 (display-selections-p))
3731 ;; The var `saved-region-selection', if non-nil, is the text in
3732 ;; the region prior to the last command modifying the buffer.
3733 ;; Set the selection to that, or to the current region.
3734 (cond (saved-region-selection
3735 (x-set-selection 'PRIMARY saved-region-selection)
3736 (setq saved-region-selection nil))
3737 ((/= (region-beginning) (region-end))
3738 (x-set-selection 'PRIMARY
3739 (buffer-substring-no-properties
1bcb9e65
CY
3740 (region-beginning)
3741 (region-end))))))
f9be2e35
CY
3742 (if (and (null force)
3743 (or (eq transient-mark-mode 'lambda)
3744 (and (eq (car-safe transient-mark-mode) 'only)
3745 (null (cdr transient-mark-mode)))))
3746 ;; When deactivating a temporary region, don't change
3747 ;; `mark-active' or run `deactivate-mark-hook'.
109cfe4e
CY
3748 (setq transient-mark-mode nil)
3749 (if (eq (car-safe transient-mark-mode) 'only)
3750 (setq transient-mark-mode (cdr transient-mark-mode)))
3751 (setq mark-active nil)
3752 (run-hooks 'deactivate-mark-hook))))
19d35374 3753
2977fc37
SM
3754(defun activate-mark ()
3755 "Activate the mark."
3756 (when (mark t)
3757 (setq mark-active t)
3758 (unless transient-mark-mode
9852377f 3759 (setq transient-mark-mode 'lambda))))
98b2fff4 3760
2076c87c
JB
3761(defun set-mark (pos)
3762 "Set this buffer's mark to POS. Don't use this function!
3763That is to say, don't use this function unless you want
3764the user to see that the mark has moved, and you want the previous
3765mark position to be lost.
3766
3767Normally, when a new mark is set, the old one should go on the stack.
f59006cb 3768This is why most applications should use `push-mark', not `set-mark'.
2076c87c 3769
ff1fbe3e 3770Novice Emacs Lisp programmers often try to use the mark for the wrong
2076c87c
JB
3771purposes. The mark saves a location for the user's convenience.
3772Most editing commands should not alter the mark.
3773To remember a location for internal use in the Lisp program,
3774store it in a Lisp variable. Example:
3775
3776 (let ((beg (point))) (forward-line 1) (delete-region beg (point)))."
3777
fcadf1c7
RS
3778 (if pos
3779 (progn
3780 (setq mark-active t)
3781 (run-hooks 'activate-mark-hook)
3782 (set-marker (mark-marker) pos (current-buffer)))
24c22852 3783 ;; Normally we never clear mark-active except in Transient Mark mode.
f9be2e35
CY
3784 ;; But when we actually clear out the mark value too, we must
3785 ;; clear mark-active in any mode.
3786 (deactivate-mark t)
24c22852 3787 (set-marker (mark-marker) nil)))
2076c87c 3788
d03b9b31 3789(defcustom use-empty-active-region nil
6a9127b6
CY
3790 "Whether \"region-aware\" commands should act on empty regions.
3791If nil, region-aware commands treat empty regions as inactive.
3792If non-nil, region-aware commands treat the region as active as
3793long as the mark is active, even if the region is empty.
3794
58b356e9
CY
3795Region-aware commands are those that act on the region if it is
3796active and Transient Mark mode is enabled, and on the text near
3797point otherwise."
d03b9b31
RS
3798 :type 'boolean
3799 :version "23.1"
3800 :group 'editing-basics)
3801
cb3a9d33 3802(defun use-region-p ()
6a9127b6
CY
3803 "Return t if the region is active and it is appropriate to act on it.
3804This is used by commands that act specially on the region under
16f2e9fc 3805Transient Mark mode.
6a9127b6 3806
c876b263 3807The return value is t if Transient Mark mode is enabled and the
e5b826ae
CY
3808mark is active; furthermore, if `use-empty-active-region' is nil,
3809the region must not be empty. Otherwise, the return value is nil.
16f2e9fc
CY
3810
3811For some commands, it may be appropriate to ignore the value of
3812`use-empty-active-region'; in that case, use `region-active-p'."
d34c311a 3813 (and (region-active-p)
d03b9b31
RS
3814 (or use-empty-active-region (> (region-end) (region-beginning)))))
3815
02d52519 3816(defun region-active-p ()
afa39f21 3817 "Return t if Transient Mark mode is enabled and the mark is active.
6a9127b6 3818
16f2e9fc
CY
3819Some commands act specially on the region when Transient Mark
3820mode is enabled. Usually, such commands should use
3821`use-region-p' instead of this function, because `use-region-p'
3822also checks the value of `use-empty-active-region'."
02d52519
RS
3823 (and transient-mark-mode mark-active))
3824
2076c87c 3825(defvar mark-ring nil
e55e2267 3826 "The list of former marks of the current buffer, most recent first.")
2076c87c 3827(make-variable-buffer-local 'mark-ring)
e55e2267 3828(put 'mark-ring 'permanent-local t)
2076c87c 3829
69c1dd37 3830(defcustom mark-ring-max 16
1d2b0303 3831 "Maximum size of mark ring. Start discarding off end if gets this big."
69c1dd37
RS
3832 :type 'integer
3833 :group 'editing-basics)
2076c87c 3834
dc029f0b
RM
3835(defvar global-mark-ring nil
3836 "The list of saved global marks, most recent first.")
3837
69c1dd37 3838(defcustom global-mark-ring-max 16
1d2b0303 3839 "Maximum size of global mark ring. \
69c1dd37
RS
3840Start discarding off end if gets this big."
3841 :type 'integer
3842 :group 'editing-basics)
dc029f0b 3843
868c2f49 3844(defun pop-to-mark-command ()
5626c14e
JB
3845 "Jump to mark, and pop a new position for mark off the ring.
3846\(Does not affect global mark ring\)."
868c2f49
KS
3847 (interactive)
3848 (if (null (mark t))
3849 (error "No mark set in this buffer")
fb2c06a3
RS
3850 (if (= (point) (mark t))
3851 (message "Mark popped"))
868c2f49
KS
3852 (goto-char (mark t))
3853 (pop-mark)))
3854
d00ffe21 3855(defun push-mark-command (arg &optional nomsg)
868c2f49 3856 "Set mark at where point is.
5626c14e 3857If no prefix ARG and mark is already set there, just activate it.
d00ffe21 3858Display `Mark set' unless the optional second arg NOMSG is non-nil."
868c2f49
KS
3859 (interactive "P")
3860 (let ((mark (marker-position (mark-marker))))
3861 (if (or arg (null mark) (/= mark (point)))
d00ffe21 3862 (push-mark nil nomsg t)
868c2f49 3863 (setq mark-active t)
0251bafb 3864 (run-hooks 'activate-mark-hook)
d00ffe21
KS
3865 (unless nomsg
3866 (message "Mark activated")))))
868c2f49 3867
6a936796 3868(defcustom set-mark-command-repeat-pop nil
1d2b0303 3869 "Non-nil means repeating \\[set-mark-command] after popping mark pops it again.
ebd2fc0d
RS
3870That means that C-u \\[set-mark-command] \\[set-mark-command]
3871will pop the mark twice, and
3872C-u \\[set-mark-command] \\[set-mark-command] \\[set-mark-command]
3873will pop the mark three times.
3874
7b17b503 3875A value of nil means \\[set-mark-command]'s behavior does not change
ebd2fc0d 3876after C-u \\[set-mark-command]."
6a936796 3877 :type 'boolean
034ce0ec 3878 :group 'editing-basics)
6a936796 3879
125f7951
SM
3880(defcustom set-mark-default-inactive nil
3881 "If non-nil, setting the mark does not activate it.
3882This causes \\[set-mark-command] and \\[exchange-point-and-mark] to
0fc10137
JL
3883behave the same whether or not `transient-mark-mode' is enabled."
3884 :type 'boolean
3885 :group 'editing-basics
3886 :version "23.1")
125f7951 3887
2076c87c 3888(defun set-mark-command (arg)
fb2c06a3
RS
3889 "Set the mark where point is, or jump to the mark.
3890Setting the mark also alters the region, which is the text
3891between point and mark; this is the closest equivalent in
3892Emacs to what some editors call the \"selection\".
146adea3 3893
fb2c06a3
RS
3894With no prefix argument, set the mark at point, and push the
3895old mark position on local mark ring. Also push the old mark on
3896global mark ring, if the previous mark was set in another buffer.
146adea3 3897
17923ef2
CY
3898When Transient Mark Mode is off, immediately repeating this
3899command activates `transient-mark-mode' temporarily.
66ef2df9 3900
146adea3 3901With prefix argument \(e.g., \\[universal-argument] \\[set-mark-command]\), \
fb2c06a3 3902jump to the mark, and set the mark from
146adea3
EZ
3903position popped off the local mark ring \(this does not affect the global
3904mark ring\). Use \\[pop-global-mark] to jump to a mark popped off the global
66ef2df9 3905mark ring \(see `pop-global-mark'\).
18c5df40 3906
2ef0a47e 3907If `set-mark-command-repeat-pop' is non-nil, repeating
146adea3 3908the \\[set-mark-command] command with no prefix argument pops the next position
2ef0a47e 3909off the local (or global) mark ring and jumps there.
66ef2df9 3910
fb2c06a3
RS
3911With \\[universal-argument] \\[universal-argument] as prefix
3912argument, unconditionally set mark where point is, even if
3913`set-mark-command-repeat-pop' is non-nil.
7cb42362 3914
ff1fbe3e 3915Novice Emacs Lisp programmers often try to use the mark for the wrong
2076c87c
JB
3916purposes. See the documentation of `set-mark' for more information."
3917 (interactive "P")
109cfe4e
CY
3918 (cond ((eq transient-mark-mode 'lambda)
3919 (setq transient-mark-mode nil))
3920 ((eq (car-safe transient-mark-mode) 'only)
3921 (deactivate-mark)))
868c2f49 3922 (cond
18c5df40
KS
3923 ((and (consp arg) (> (prefix-numeric-value arg) 4))
3924 (push-mark-command nil))
868c2f49 3925 ((not (eq this-command 'set-mark-command))
1841f9e3
KS
3926 (if arg
3927 (pop-to-mark-command)
3928 (push-mark-command t)))
6a936796
RS
3929 ((and set-mark-command-repeat-pop
3930 (eq last-command 'pop-to-mark-command))
66ef2df9
KS
3931 (setq this-command 'pop-to-mark-command)
3932 (pop-to-mark-command))
6a936796
RS
3933 ((and set-mark-command-repeat-pop
3934 (eq last-command 'pop-global-mark)
3935 (not arg))
66ef2df9
KS
3936 (setq this-command 'pop-global-mark)
3937 (pop-global-mark))
868c2f49 3938 (arg
1841f9e3 3939 (setq this-command 'pop-to-mark-command)
868c2f49 3940 (pop-to-mark-command))
2977fc37
SM
3941 ((eq last-command 'set-mark-command)
3942 (if (region-active-p)
3943 (progn
3944 (deactivate-mark)
3945 (message "Mark deactivated"))
3946 (activate-mark)
3947 (message "Mark activated")))
868c2f49 3948 (t
125f7951
SM
3949 (push-mark-command nil)
3950 (if set-mark-default-inactive (deactivate-mark)))))
2076c87c 3951
fd0f4056 3952(defun push-mark (&optional location nomsg activate)
2076c87c 3953 "Set mark at LOCATION (point, by default) and push old mark on mark ring.
f1382a3d
RM
3954If the last global mark pushed was not in the current buffer,
3955also push LOCATION on the global mark ring.
fd0f4056 3956Display `Mark set' unless the optional second arg NOMSG is non-nil.
2076c87c 3957
ff1fbe3e 3958Novice Emacs Lisp programmers often try to use the mark for the wrong
9a1277dd
RS
3959purposes. See the documentation of `set-mark' for more information.
3960
de9606f0 3961In Transient Mark mode, activate mark if optional third arg ACTIVATE non-nil."
1a0d0b6a 3962 (unless (null (mark t))
2076c87c 3963 (setq mark-ring (cons (copy-marker (mark-marker)) mark-ring))
1a0d0b6a
JPW
3964 (when (> (length mark-ring) mark-ring-max)
3965 (move-marker (car (nthcdr mark-ring-max mark-ring)) nil)
3966 (setcdr (nthcdr (1- mark-ring-max) mark-ring) nil)))
9a1277dd 3967 (set-marker (mark-marker) (or location (point)) (current-buffer))
dc029f0b 3968 ;; Now push the mark on the global mark ring.
f1382a3d 3969 (if (and global-mark-ring
e08d3f7c 3970 (eq (marker-buffer (car global-mark-ring)) (current-buffer)))
f1382a3d
RM
3971 ;; The last global mark pushed was in this same buffer.
3972 ;; Don't push another one.
3973 nil
3974 (setq global-mark-ring (cons (copy-marker (mark-marker)) global-mark-ring))
1a0d0b6a
JPW
3975 (when (> (length global-mark-ring) global-mark-ring-max)
3976 (move-marker (car (nthcdr global-mark-ring-max global-mark-ring)) nil)
3977 (setcdr (nthcdr (1- global-mark-ring-max) global-mark-ring) nil)))
efcf38c7 3978 (or nomsg executing-kbd-macro (> (minibuffer-depth) 0)
2076c87c 3979 (message "Mark set"))
8cdc660f
RS
3980 (if (or activate (not transient-mark-mode))
3981 (set-mark (mark t)))
2076c87c
JB
3982 nil)
3983
3984(defun pop-mark ()
3985 "Pop off mark ring into the buffer's actual mark.
3986Does not set point. Does nothing if mark ring is empty."
1a0d0b6a
JPW
3987 (when mark-ring
3988 (setq mark-ring (nconc mark-ring (list (copy-marker (mark-marker)))))
3989 (set-marker (mark-marker) (+ 0 (car mark-ring)) (current-buffer))
1a0d0b6a
JPW
3990 (move-marker (car mark-ring) nil)
3991 (if (null (mark t)) (ding))
0137bae6
JL
3992 (setq mark-ring (cdr mark-ring)))
3993 (deactivate-mark))
2076c87c 3994
c613687b
SM
3995(define-obsolete-function-alias
3996 'exchange-dot-and-mark 'exchange-point-and-mark "23.3")
868c2f49 3997(defun exchange-point-and-mark (&optional arg)
af39530e
RS
3998 "Put the mark where point is now, and point where the mark is now.
3999This command works even when the mark is not active,
868c2f49 4000and it reactivates the mark.
109cfe4e 4001
5626c14e 4002If Transient Mark mode is on, a prefix ARG deactivates the mark
109cfe4e 4003if it is active, and otherwise avoids reactivating it. If
5626c14e 4004Transient Mark mode is off, a prefix ARG enables Transient Mark
109cfe4e 4005mode temporarily."
868c2f49 4006 (interactive "P")
109cfe4e
CY
4007 (let ((omark (mark t))
4008 (temp-highlight (eq (car-safe transient-mark-mode) 'only)))
2977fc37
SM
4009 (if (null omark)
4010 (error "No mark set in this buffer"))
109cfe4e 4011 (deactivate-mark)
2977fc37
SM
4012 (set-mark (point))
4013 (goto-char omark)
125f7951 4014 (if set-mark-default-inactive (deactivate-mark))
109cfe4e
CY
4015 (cond (temp-highlight
4016 (setq transient-mark-mode (cons 'only transient-mark-mode)))
4017 ((or (and arg (region-active-p)) ; (xor arg (not (region-active-p)))
4018 (not (or arg (region-active-p))))
4019 (deactivate-mark))
4020 (t (activate-mark)))
2977fc37 4021 nil))
e23c2c21 4022
11ff3b67 4023(defcustom shift-select-mode t
84db11d6
SM
4024 "When non-nil, shifted motion keys activate the mark momentarily.
4025
4026While the mark is activated in this way, any shift-translated point
4027motion key extends the region, and if Transient Mark mode was off, it
4028is temporarily turned on. Furthermore, the mark will be deactivated
4029by any subsequent point motion key that was not shift-translated, or
4030by any action that normally deactivates the mark in Transient Mark mode.
4031
4032See `this-command-keys-shift-translated' for the meaning of
11ff3b67
AS
4033shift-translation."
4034 :type 'boolean
4035 :group 'editing-basics)
84db11d6
SM
4036
4037(defun handle-shift-selection ()
337c561c
CY
4038 "Activate/deactivate mark depending on invocation thru shift translation.
4039This function is called by `call-interactively' when a command
4040with a `^' character in its `interactive' spec is invoked, before
4041running the command itself.
4042
4043If `shift-select-mode' is enabled and the command was invoked
4044through shift translation, set the mark and activate the region
4045temporarily, unless it was already set in this way. See
4046`this-command-keys-shift-translated' for the meaning of shift
4047translation.
4048
4049Otherwise, if the region has been activated temporarily,
4050deactivate it, and restore the variable `transient-mark-mode' to
4051its earlier value."
84db11d6 4052 (cond ((and shift-select-mode this-command-keys-shift-translated)
9852377f
CY
4053 (unless (and mark-active
4054 (eq (car-safe transient-mark-mode) 'only))
91023c68 4055 (setq transient-mark-mode
84db11d6
SM
4056 (cons 'only
4057 (unless (eq transient-mark-mode 'lambda)
4058 transient-mark-mode)))
4059 (push-mark nil nil t)))
4060 ((eq (car-safe transient-mark-mode) 'only)
4061 (setq transient-mark-mode (cdr transient-mark-mode))
4062 (deactivate-mark))))
109cfe4e 4063
6710df48 4064(define-minor-mode transient-mark-mode
e23c2c21 4065 "Toggle Transient Mark mode.
1d2b0303 4066With ARG, turn Transient Mark mode on if ARG is positive, off otherwise.
e23c2c21 4067
5dd1220d
RS
4068In Transient Mark mode, when the mark is active, the region is highlighted.
4069Changing the buffer \"deactivates\" the mark.
4070So do certain other operations that set the mark
4071but whose main purpose is something else--for example,
cfa70244
EZ
4072incremental search, \\[beginning-of-buffer], and \\[end-of-buffer].
4073
8e843bc4
EZ
4074You can also deactivate the mark by typing \\[keyboard-quit] or
4075\\[keyboard-escape-quit].
1465c66b 4076
cfa70244
EZ
4077Many commands change their behavior when Transient Mark mode is in effect
4078and the mark is active, by acting on the region instead of their usual
4c5f7215 4079default part of the buffer's text. Examples of such commands include
705a5933
JL
4080\\[comment-dwim], \\[flush-lines], \\[keep-lines], \
4081\\[query-replace], \\[query-replace-regexp], \\[ispell], and \\[undo].
4082Invoke \\[apropos-documentation] and type \"transient\" or
4083\"mark.*active\" at the prompt, to see the documentation of
4084commands which are sensitive to the Transient Mark mode."
43d16385 4085 :global t
715043a5 4086 :init-value (not noninteractive)
adba8116 4087 :initialize 'custom-initialize-delay
a2b84f35 4088 :group 'editing-basics)
dc029f0b 4089
109cfe4e
CY
4090;; The variable transient-mark-mode is ugly: it can take on special
4091;; values. Document these here.
4092(defvar transient-mark-mode t
4093 "*Non-nil if Transient Mark mode is enabled.
4094See the command `transient-mark-mode' for a description of this minor mode.
4095
4096Non-nil also enables highlighting of the region whenever the mark is active.
4097The variable `highlight-nonselected-windows' controls whether to highlight
4098all windows or just the selected window.
4099
1d2b0303
JB
4100If the value is `lambda', that enables Transient Mark mode temporarily.
4101After any subsequent action that would normally deactivate the mark
4102\(such as buffer modification), Transient Mark mode is turned off.
109cfe4e
CY
4103
4104If the value is (only . OLDVAL), that enables Transient Mark mode
4105temporarily. After any subsequent point motion command that is not
4106shift-translated, or any other action that would normally deactivate
4107the mark (such as buffer modification), the value of
4108`transient-mark-mode' is set to OLDVAL.")
4109
d0c4882d
RS
4110(defvar widen-automatically t
4111 "Non-nil means it is ok for commands to call `widen' when they want to.
4112Some commands will do this in order to go to positions outside
4113the current accessible part of the buffer.
4114
4115If `widen-automatically' is nil, these commands will do something else
4116as a fallback, and won't change the buffer bounds.")
4117
38111a5a
SM
4118(defvar non-essential nil
4119 "Whether the currently executing code is performing an essential task.
4120This variable should be non-nil only when running code which should not
4121disturb the user. E.g. it can be used to prevent Tramp from prompting the
4122user for a password when we are simply scanning a set of files in the
4123background or displaying possible completions before the user even asked
4124for it.")
4125
dc029f0b
RM
4126(defun pop-global-mark ()
4127 "Pop off global mark ring and jump to the top location."
4128 (interactive)
52b6d445
RS
4129 ;; Pop entries which refer to non-existent buffers.
4130 (while (and global-mark-ring (not (marker-buffer (car global-mark-ring))))
4131 (setq global-mark-ring (cdr global-mark-ring)))
dc029f0b
RM
4132 (or global-mark-ring
4133 (error "No global mark set"))
4134 (let* ((marker (car global-mark-ring))
4135 (buffer (marker-buffer marker))
4136 (position (marker-position marker)))
34c31301
RS
4137 (setq global-mark-ring (nconc (cdr global-mark-ring)
4138 (list (car global-mark-ring))))
dc029f0b
RM
4139 (set-buffer buffer)
4140 (or (and (>= position (point-min))
4141 (<= position (point-max)))
d0c4882d 4142 (if widen-automatically
60aee8b2
RS
4143 (widen)
4144 (error "Global mark position is outside accessible part of buffer")))
dc029f0b
RM
4145 (goto-char position)
4146 (switch-to-buffer buffer)))
2d88b556 4147\f
95791033 4148(defcustom next-line-add-newlines nil
1d2b0303 4149 "If non-nil, `next-line' inserts newline to avoid `end of buffer' error."
69c1dd37 4150 :type 'boolean
e1d6e383 4151 :version "21.1"
69c1dd37 4152 :group 'editing-basics)
38ebcf29 4153
295f6616 4154(defun next-line (&optional arg try-vscroll)
2076c87c 4155 "Move cursor vertically down ARG lines.
295f6616 4156Interactively, vscroll tall lines if `auto-window-vscroll' is enabled.
2076c87c
JB
4157If there is no character in the target line exactly under the current column,
4158the cursor is positioned after the character in that line which spans this
4159column, or at the end of the line if it is not long enough.
38ebcf29 4160If there is no line in the buffer after this one, behavior depends on the
1a2c3941
RS
4161value of `next-line-add-newlines'. If non-nil, it inserts a newline character
4162to create a line, and moves the cursor to that line. Otherwise it moves the
e47d38f6 4163cursor to the end of the buffer.
2076c87c 4164
53a22af4
CY
4165If the variable `line-move-visual' is non-nil, this command moves
4166by display lines. Otherwise, it moves by buffer lines, without
4167taking variable-width characters or continued lines into account.
4168
2076c87c 4169The command \\[set-goal-column] can be used to create
85969cb1
RS
4170a semipermanent goal column for this command.
4171Then instead of trying to move exactly vertically (or as close as possible),
4172this command moves to the specified goal column (or as close as possible).
4173The goal column is stored in the variable `goal-column', which is nil
4174when there is no goal column.
2076c87c
JB
4175
4176If you are thinking of using this in a Lisp program, consider
4177using `forward-line' instead. It is usually easier to use
4178and more reliable (no dependence on goal column, etc.)."
109cfe4e 4179 (interactive "^p\np")
6b61353c 4180 (or arg (setq arg 1))
028922cf 4181 (if (and next-line-add-newlines (= arg 1))
207d7545
GM
4182 (if (save-excursion (end-of-line) (eobp))
4183 ;; When adding a newline, don't expand an abbrev.
4184 (let ((abbrev-mode nil))
24886813 4185 (end-of-line)
15575807 4186 (insert (if use-hard-newlines hard-newline "\n")))
295f6616 4187 (line-move arg nil nil try-vscroll))
32226619 4188 (if (called-interactively-p 'interactive)
1cd095c6 4189 (condition-case err
295f6616 4190 (line-move arg nil nil try-vscroll)
1cd095c6
JL
4191 ((beginning-of-buffer end-of-buffer)
4192 (signal (car err) (cdr err))))
295f6616 4193 (line-move arg nil nil try-vscroll)))
2076c87c
JB
4194 nil)
4195
295f6616 4196(defun previous-line (&optional arg try-vscroll)
2076c87c 4197 "Move cursor vertically up ARG lines.
295f6616 4198Interactively, vscroll tall lines if `auto-window-vscroll' is enabled.
2076c87c
JB
4199If there is no character in the target line exactly over the current column,
4200the cursor is positioned after the character in that line which spans this
4201column, or at the end of the line if it is not long enough.
4202
53a22af4
CY
4203If the variable `line-move-visual' is non-nil, this command moves
4204by display lines. Otherwise, it moves by buffer lines, without
4205taking variable-width characters or continued lines into account.
4206
2076c87c 4207The command \\[set-goal-column] can be used to create
85969cb1
RS
4208a semipermanent goal column for this command.
4209Then instead of trying to move exactly vertically (or as close as possible),
4210this command moves to the specified goal column (or as close as possible).
4211The goal column is stored in the variable `goal-column', which is nil
4212when there is no goal column.
2076c87c
JB
4213
4214If you are thinking of using this in a Lisp program, consider using
c2e8a012 4215`forward-line' with a negative argument instead. It is usually easier
2076c87c 4216to use and more reliable (no dependence on goal column, etc.)."
109cfe4e 4217 (interactive "^p\np")
6b61353c 4218 (or arg (setq arg 1))
32226619 4219 (if (called-interactively-p 'interactive)
1cd095c6 4220 (condition-case err
295f6616 4221 (line-move (- arg) nil nil try-vscroll)
1cd095c6
JL
4222 ((beginning-of-buffer end-of-buffer)
4223 (signal (car err) (cdr err))))
295f6616 4224 (line-move (- arg) nil nil try-vscroll))
2076c87c 4225 nil)
eaae8106 4226
69c1dd37 4227(defcustom track-eol nil
1d2b0303 4228 "Non-nil means vertical motion starting at end of line keeps to ends of lines.
2076c87c 4229This means moving to the end of each line moved onto.
4efebb82
CY
4230The beginning of a blank line does not count as the end of a line.
4231This has no effect when `line-move-visual' is non-nil."
69c1dd37
RS
4232 :type 'boolean
4233 :group 'editing-basics)
4234
4235(defcustom goal-column nil
1d2b0303 4236 "Semipermanent goal column for vertical motion, as set by \\[set-goal-column], or nil."
69c1dd37
RS
4237 :type '(choice integer
4238 (const :tag "None" nil))
4239 :group 'editing-basics)
912c6728 4240(make-variable-buffer-local 'goal-column)
2076c87c
JB
4241
4242(defvar temporary-goal-column 0
4243 "Current goal column for vertical motion.
4efebb82 4244It is the column where point was at the start of the current run
774409a1
CY
4245of vertical motion commands.
4246
4247When moving by visual lines via `line-move-visual', it is a cons
4248cell (COL . HSCROLL), where COL is the x-position, in pixels,
4249divided by the default column width, and HSCROLL is the number of
4250columns by which window is scrolled from left margin.
4251
4252When the `track-eol' feature is doing its job, the value is
4efebb82 4253`most-positive-fixnum'.")
2076c87c 4254
bbf41690 4255(defcustom line-move-ignore-invisible t
1d2b0303 4256 "Non-nil means \\[next-line] and \\[previous-line] ignore invisible lines.
69c1dd37
RS
4257Outline mode sets this."
4258 :type 'boolean
4259 :group 'editing-basics)
098fc1fb 4260
a2cf21a2 4261(defcustom line-move-visual t
4efebb82
CY
4262 "When non-nil, `line-move' moves point by visual lines.
4263This movement is based on where the cursor is displayed on the
4264screen, instead of relying on buffer contents alone. It takes
a2cf21a2
CY
4265into account variable-width characters and line continuation."
4266 :type 'boolean
4267 :group 'editing-basics)
4efebb82 4268
b704b1f0
KS
4269;; Returns non-nil if partial move was done.
4270(defun line-move-partial (arg noerror to-end)
4271 (if (< arg 0)
4272 ;; Move backward (up).
4273 ;; If already vscrolled, reduce vscroll
4274 (let ((vs (window-vscroll nil t)))
4275 (when (> vs (frame-char-height))
4276 (set-window-vscroll nil (- vs (frame-char-height)) t)))
4277
4278 ;; Move forward (down).
e437f99a
KS
4279 (let* ((lh (window-line-height -1))
4280 (vpos (nth 1 lh))
4281 (ypos (nth 2 lh))
4282 (rbot (nth 3 lh))
3137dda8 4283 py vs)
e437f99a
KS
4284 (when (or (null lh)
4285 (>= rbot (frame-char-height))
4286 (<= ypos (- (frame-char-height))))
4287 (unless lh
0e7a5039
KS
4288 (let ((wend (pos-visible-in-window-p t nil t)))
4289 (setq rbot (nth 3 wend)
4290 vpos (nth 5 wend))))
e437f99a
KS
4291 (cond
4292 ;; If last line of window is fully visible, move forward.
4293 ((or (null rbot) (= rbot 0))
4294 nil)
4295 ;; If cursor is not in the bottom scroll margin, move forward.
4296 ((and (> vpos 0)
95f5a37f
KS
4297 (< (setq py
4298 (or (nth 1 (window-line-height))
4299 (let ((ppos (posn-at-point)))
4300 (cdr (or (posn-actual-col-row ppos)
4301 (posn-col-row ppos))))))
e437f99a
KS
4302 (min (- (window-text-height) scroll-margin 1) (1- vpos))))
4303 nil)
4304 ;; When already vscrolled, we vscroll some more if we can,
4305 ;; or clear vscroll and move forward at end of tall image.
4306 ((> (setq vs (window-vscroll nil t)) 0)
4307 (when (> rbot 0)
4308 (set-window-vscroll nil (+ vs (min rbot (frame-char-height))) t)))
4309 ;; If cursor just entered the bottom scroll margin, move forward,
4310 ;; but also vscroll one line so redisplay wont recenter.
4311 ((and (> vpos 0)
4312 (= py (min (- (window-text-height) scroll-margin 1)
4313 (1- vpos))))
4314 (set-window-vscroll nil (frame-char-height) t)
4315 (line-move-1 arg noerror to-end)
4316 t)
4317 ;; If there are lines above the last line, scroll-up one line.
4318 ((> vpos 0)
4319 (scroll-up 1)
4320 t)
4321 ;; Finally, start vscroll.
4322 (t
4323 (set-window-vscroll nil (frame-char-height) t)))))))
b704b1f0
KS
4324
4325
03ceda9e
RS
4326;; This is like line-move-1 except that it also performs
4327;; vertical scrolling of tall images if appropriate.
4328;; That is not really a clean thing to do, since it mixes
4329;; scrolling with cursor motion. But so far we don't have
4330;; a cleaner solution to the problem of making C-n do something
4331;; useful given a tall image.
ed02c1db 4332(defun line-move (arg &optional noerror to-end try-vscroll)
b704b1f0
KS
4333 (unless (and auto-window-vscroll try-vscroll
4334 ;; Only vscroll for single line moves
4335 (= (abs arg) 1)
4336 ;; But don't vscroll in a keyboard macro.
4337 (not defining-kbd-macro)
4338 (not executing-kbd-macro)
4339 (line-move-partial arg noerror to-end))
4340 (set-window-vscroll nil 0 t)
4efebb82
CY
4341 (if line-move-visual
4342 (line-move-visual arg noerror)
4343 (line-move-1 arg noerror to-end))))
4344
4345;; Display-based alternative to line-move-1.
4346;; Arg says how many lines to move. The value is t if we can move the
4347;; specified number of lines.
4348(defun line-move-visual (arg &optional noerror)
34be836c 4349 (let ((opoint (point))
774409a1 4350 (hscroll (window-hscroll))
34be836c 4351 target-hscroll)
774409a1
CY
4352 ;; Check if the previous command was a line-motion command, or if
4353 ;; we were called from some other command.
34be836c
CY
4354 (if (and (consp temporary-goal-column)
4355 (memq last-command `(next-line previous-line ,this-command)))
4356 ;; If so, there's no need to reset `temporary-goal-column',
4357 ;; but we may need to hscroll.
4358 (if (or (/= (cdr temporary-goal-column) hscroll)
4359 (> (cdr temporary-goal-column) 0))
4360 (setq target-hscroll (cdr temporary-goal-column)))
4361 ;; Otherwise, we should reset `temporary-goal-column'.
4362 (let ((posn (posn-at-point)))
4363 (cond
4364 ;; Handle the `overflow-newline-into-fringe' case:
4365 ((eq (nth 1 posn) 'right-fringe)
4366 (setq temporary-goal-column (cons (- (window-width) 1) hscroll)))
4367 ((car (posn-x-y posn))
4368 (setq temporary-goal-column
4369 (cons (/ (float (car (posn-x-y posn)))
4370 (frame-char-width)) hscroll))))))
4371 (if target-hscroll
4372 (set-window-hscroll (selected-window) target-hscroll))
624a662f 4373 (or (and (= (vertical-motion
774409a1
CY
4374 (cons (or goal-column
4375 (if (consp temporary-goal-column)
4376 (truncate (car temporary-goal-column))
4377 temporary-goal-column))
4378 arg))
624a662f
CY
4379 arg)
4380 (or (>= arg 0)
4381 (/= (point) opoint)
4382 ;; If the goal column lies on a display string,
4383 ;; `vertical-motion' advances the cursor to the end
4384 ;; of the string. For arg < 0, this can cause the
4385 ;; cursor to get stuck. (Bug#3020).
4386 (= (vertical-motion arg) arg)))
4387 (unless noerror
4388 (signal (if (< arg 0) 'beginning-of-buffer 'end-of-buffer)
4389 nil)))))
16c2f92f 4390
8c745744
RS
4391;; This is the guts of next-line and previous-line.
4392;; Arg says how many lines to move.
bbf41690 4393;; The value is t if we can move the specified number of lines.
16c2f92f 4394(defun line-move-1 (arg &optional noerror to-end)
2596511d
RS
4395 ;; Don't run any point-motion hooks, and disregard intangibility,
4396 ;; for intermediate positions.
4397 (let ((inhibit-point-motion-hooks t)
4398 (opoint (point))
fef11f15 4399 (orig-arg arg))
774409a1
CY
4400 (if (consp temporary-goal-column)
4401 (setq temporary-goal-column (+ (car temporary-goal-column)
4402 (cdr temporary-goal-column))))
2596511d
RS
4403 (unwind-protect
4404 (progn
41d22ee0 4405 (if (not (memq last-command '(next-line previous-line)))
2596511d
RS
4406 (setq temporary-goal-column
4407 (if (and track-eol (eolp)
4408 ;; Don't count beg of empty line as end of line
4409 ;; unless we just did explicit end-of-line.
ab9623c2 4410 (or (not (bolp)) (eq last-command 'move-end-of-line)))
3137dda8 4411 most-positive-fixnum
2596511d 4412 (current-column))))
bbf41690 4413
3137dda8
SM
4414 (if (not (or (integerp selective-display)
4415 line-move-ignore-invisible))
2596511d 4416 ;; Use just newline characters.
e9cd25fe 4417 ;; Set ARG to 0 if we move as many lines as requested.
2596511d
RS
4418 (or (if (> arg 0)
4419 (progn (if (> arg 1) (forward-line (1- arg)))
4420 ;; This way of moving forward ARG lines
4421 ;; verifies that we have a newline after the last one.
4422 ;; It doesn't get confused by intangible text.
4423 (end-of-line)
e9cd25fe
RS
4424 (if (zerop (forward-line 1))
4425 (setq arg 0)))
2596511d 4426 (and (zerop (forward-line arg))
e9cd25fe
RS
4427 (bolp)
4428 (setq arg 0)))
bbf41690
RS
4429 (unless noerror
4430 (signal (if (< arg 0)
4431 'beginning-of-buffer
4432 'end-of-buffer)
4433 nil)))
2596511d 4434 ;; Move by arg lines, but ignore invisible ones.
07889873 4435 (let (done)
bbf41690
RS
4436 (while (and (> arg 0) (not done))
4437 ;; If the following character is currently invisible,
4438 ;; skip all characters with that same `invisible' property value.
c65e6942 4439 (while (and (not (eobp)) (invisible-p (point)))
bbf41690 4440 (goto-char (next-char-property-change (point))))
fef11f15
CY
4441 ;; Move a line.
4442 ;; We don't use `end-of-line', since we want to escape
4443 ;; from field boundaries ocurring exactly at point.
07889873
CY
4444 (goto-char (constrain-to-field
4445 (let ((inhibit-field-text-motion t))
4446 (line-end-position))
4447 (point) t t
4448 'inhibit-line-move-field-capture))
e9ab825f 4449 ;; If there's no invisibility here, move over the newline.
3e43ae87
KS
4450 (cond
4451 ((eobp)
4452 (if (not noerror)
4453 (signal 'end-of-buffer nil)
4454 (setq done t)))
4455 ((and (> arg 1) ;; Use vertical-motion for last move
4456 (not (integerp selective-display))
c65e6942 4457 (not (invisible-p (point))))
3e43ae87
KS
4458 ;; We avoid vertical-motion when possible
4459 ;; because that has to fontify.
4460 (forward-line 1))
4461 ;; Otherwise move a more sophisticated way.
4462 ((zerop (vertical-motion 1))
4463 (if (not noerror)
4464 (signal 'end-of-buffer nil)
4465 (setq done t))))
bbf41690
RS
4466 (unless done
4467 (setq arg (1- arg))))
22c8bff1 4468 ;; The logic of this is the same as the loop above,
e9ab825f 4469 ;; it just goes in the other direction.
bbf41690 4470 (while (and (< arg 0) (not done))
ac6701ea
CY
4471 ;; For completely consistency with the forward-motion
4472 ;; case, we should call beginning-of-line here.
4473 ;; However, if point is inside a field and on a
4474 ;; continued line, the call to (vertical-motion -1)
4475 ;; below won't move us back far enough; then we return
4476 ;; to the same column in line-move-finish, and point
4477 ;; gets stuck -- cyd
4478 (forward-line 0)
3e43ae87
KS
4479 (cond
4480 ((bobp)
4481 (if (not noerror)
4482 (signal 'beginning-of-buffer nil)
4483 (setq done t)))
4484 ((and (< arg -1) ;; Use vertical-motion for last move
4485 (not (integerp selective-display))
c65e6942 4486 (not (invisible-p (1- (point)))))
3e43ae87
KS
4487 (forward-line -1))
4488 ((zerop (vertical-motion -1))
4489 (if (not noerror)
4490 (signal 'beginning-of-buffer nil)
4491 (setq done t))))
bbf41690
RS
4492 (unless done
4493 (setq arg (1+ arg))
4494 (while (and ;; Don't move over previous invis lines
4495 ;; if our target is the middle of this line.
4496 (or (zerop (or goal-column temporary-goal-column))
4497 (< arg 0))
c65e6942 4498 (not (bobp)) (invisible-p (1- (point))))
bbf41690
RS
4499 (goto-char (previous-char-property-change (point))))))))
4500 ;; This is the value the function returns.
4501 (= arg 0))
af894fc9 4502
e9cd25fe 4503 (cond ((> arg 0)
2a1e0c92
CY
4504 ;; If we did not move down as far as desired, at least go
4505 ;; to end of line. Be sure to call point-entered and
4506 ;; point-left-hooks.
4507 (let* ((npoint (prog1 (line-end-position)
4508 (goto-char opoint)))
4509 (inhibit-point-motion-hooks nil))
4510 (goto-char npoint)))
e9cd25fe 4511 ((< arg 0)
f9872a6b
JL
4512 ;; If we did not move up as far as desired,
4513 ;; at least go to beginning of line.
2a1e0c92
CY
4514 (let* ((npoint (prog1 (line-beginning-position)
4515 (goto-char opoint)))
4516 (inhibit-point-motion-hooks nil))
4517 (goto-char npoint)))
e9cd25fe 4518 (t
20782abb 4519 (line-move-finish (or goal-column temporary-goal-column)
fef11f15 4520 opoint (> orig-arg 0)))))))
2076c87c 4521
20782abb 4522(defun line-move-finish (column opoint forward)
af894fc9
RS
4523 (let ((repeat t))
4524 (while repeat
4525 ;; Set REPEAT to t to repeat the whole thing.
4526 (setq repeat nil)
4527
1f980920 4528 (let (new
963355a4 4529 (old (point))
af894fc9 4530 (line-beg (save-excursion (beginning-of-line) (point)))
1f980920
RS
4531 (line-end
4532 ;; Compute the end of the line
20782abb 4533 ;; ignoring effectively invisible newlines.
bbf41690 4534 (save-excursion
a5b4a6a0
RS
4535 ;; Like end-of-line but ignores fields.
4536 (skip-chars-forward "^\n")
c65e6942 4537 (while (and (not (eobp)) (invisible-p (point)))
20782abb 4538 (goto-char (next-char-property-change (point)))
a5b4a6a0 4539 (skip-chars-forward "^\n"))
bbf41690 4540 (point))))
1f980920
RS
4541
4542 ;; Move to the desired column.
54b99340 4543 (line-move-to-column (truncate column))
963355a4
CY
4544
4545 ;; Corner case: suppose we start out in a field boundary in
4546 ;; the middle of a continued line. When we get to
4547 ;; line-move-finish, point is at the start of a new *screen*
4548 ;; line but the same text line; then line-move-to-column would
4549 ;; move us backwards. Test using C-n with point on the "x" in
4550 ;; (insert "a" (propertize "x" 'field t) (make-string 89 ?y))
4551 (and forward
4552 (< (point) old)
4553 (goto-char old))
4554
1f980920 4555 (setq new (point))
af894fc9
RS
4556
4557 ;; Process intangibility within a line.
594a1605
CY
4558 ;; With inhibit-point-motion-hooks bound to nil, a call to
4559 ;; goto-char moves point past intangible text.
4560
4561 ;; However, inhibit-point-motion-hooks controls both the
4562 ;; intangibility and the point-entered/point-left hooks. The
4563 ;; following hack avoids calling the point-* hooks
4564 ;; unnecessarily. Note that we move *forward* past intangible
4565 ;; text when the initial and final points are the same.
d584e29d 4566 (goto-char new)
af894fc9
RS
4567 (let ((inhibit-point-motion-hooks nil))
4568 (goto-char new)
4569
4570 ;; If intangibility moves us to a different (later) place
4571 ;; in the same line, use that as the destination.
4572 (if (<= (point) line-end)
1f980920
RS
4573 (setq new (point))
4574 ;; If that position is "too late",
4575 ;; try the previous allowable position.
4576 ;; See if it is ok.
4577 (backward-char)
20782abb
RS
4578 (if (if forward
4579 ;; If going forward, don't accept the previous
4580 ;; allowable position if it is before the target line.
f1e2a033 4581 (< line-beg (point))
20782abb
RS
4582 ;; If going backward, don't accept the previous
4583 ;; allowable position if it is still after the target line.
4584 (<= (point) line-end))
1f980920
RS
4585 (setq new (point))
4586 ;; As a last resort, use the end of the line.
4587 (setq new line-end))))
af894fc9
RS
4588
4589 ;; Now move to the updated destination, processing fields
4590 ;; as well as intangibility.
4591 (goto-char opoint)
4592 (let ((inhibit-point-motion-hooks nil))
4593 (goto-char
e94e78cc
CY
4594 ;; Ignore field boundaries if the initial and final
4595 ;; positions have the same `field' property, even if the
4596 ;; fields are non-contiguous. This seems to be "nicer"
4597 ;; behavior in many situations.
4598 (if (eq (get-char-property new 'field)
4599 (get-char-property opoint 'field))
4600 new
4601 (constrain-to-field new opoint t t
4602 'inhibit-line-move-field-capture))))
af894fc9 4603
1f980920 4604 ;; If all this moved us to a different line,
af894fc9
RS
4605 ;; retry everything within that new line.
4606 (when (or (< (point) line-beg) (> (point) line-end))
4607 ;; Repeat the intangibility and field processing.
4608 (setq repeat t))))))
4609
4610(defun line-move-to-column (col)
4611 "Try to find column COL, considering invisibility.
4612This function works only in certain cases,
4613because what we really need is for `move-to-column'
4614and `current-column' to be able to ignore invisible text."
a615252b
RS
4615 (if (zerop col)
4616 (beginning-of-line)
095f9ae4 4617 (move-to-column col))
af894fc9
RS
4618
4619 (when (and line-move-ignore-invisible
c65e6942 4620 (not (bolp)) (invisible-p (1- (point))))
af894fc9
RS
4621 (let ((normal-location (point))
4622 (normal-column (current-column)))
4623 ;; If the following character is currently invisible,
4624 ;; skip all characters with that same `invisible' property value.
4625 (while (and (not (eobp))
c65e6942 4626 (invisible-p (point)))
af894fc9
RS
4627 (goto-char (next-char-property-change (point))))
4628 ;; Have we advanced to a larger column position?
4629 (if (> (current-column) normal-column)
4630 ;; We have made some progress towards the desired column.
4631 ;; See if we can make any further progress.
4632 (line-move-to-column (+ (current-column) (- col normal-column)))
4633 ;; Otherwise, go to the place we originally found
4634 ;; and move back over invisible text.
4635 ;; that will get us to the same place on the screen
4636 ;; but with a more reasonable buffer position.
4637 (goto-char normal-location)
4638 (let ((line-beg (save-excursion (beginning-of-line) (point))))
c65e6942 4639 (while (and (not (bolp)) (invisible-p (1- (point))))
af894fc9
RS
4640 (goto-char (previous-char-property-change (point) line-beg))))))))
4641
bbf41690 4642(defun move-end-of-line (arg)
f00239cf 4643 "Move point to end of current line as displayed.
bbf41690
RS
4644With argument ARG not nil or 1, move forward ARG - 1 lines first.
4645If point reaches the beginning or end of buffer, it stops there.
fdb77e6f
CY
4646
4647To ignore the effects of the `intangible' text or overlay
4648property, bind `inhibit-point-motion-hooks' to t.
4649If there is an image in the current line, this function
4650disregards newlines that are part of the text on which the image
4651rests."
109cfe4e 4652 (interactive "^p")
bbf41690
RS
4653 (or arg (setq arg 1))
4654 (let (done)
4655 (while (not done)
4656 (let ((newpos
4657 (save-excursion
4efebb82
CY
4658 (let ((goal-column 0)
4659 (line-move-visual nil))
bbf41690 4660 (and (line-move arg t)
3f2e7735
EZ
4661 ;; With bidi reordering, we may not be at bol,
4662 ;; so make sure we are.
4663 (skip-chars-backward "^\n")
bbf41690
RS
4664 (not (bobp))
4665 (progn
c65e6942 4666 (while (and (not (bobp)) (invisible-p (1- (point))))
3137dda8
SM
4667 (goto-char (previous-single-char-property-change
4668 (point) 'invisible)))
bbf41690
RS
4669 (backward-char 1)))
4670 (point)))))
4671 (goto-char newpos)
4672 (if (and (> (point) newpos)
4673 (eq (preceding-char) ?\n))
4674 (backward-char 1)
4675 (if (and (> (point) newpos) (not (eobp))
4676 (not (eq (following-char) ?\n)))
4efebb82
CY
4677 ;; If we skipped something intangible and now we're not
4678 ;; really at eol, keep going.
bbf41690
RS
4679 (setq arg 1)
4680 (setq done t)))))))
4681
0cbb497c 4682(defun move-beginning-of-line (arg)
f00239cf
RS
4683 "Move point to beginning of current line as displayed.
4684\(If there's an image in the line, this disregards newlines
4685which are part of the text that the image rests on.)
4686
0cbb497c
KS
4687With argument ARG not nil or 1, move forward ARG - 1 lines first.
4688If point reaches the beginning or end of buffer, it stops there.
f00239cf 4689To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
109cfe4e 4690 (interactive "^p")
0cbb497c 4691 (or arg (setq arg 1))
398c9ffb 4692
ad47c4a0 4693 (let ((orig (point))
3137dda8 4694 first-vis first-vis-field-value)
1fffd65f
RS
4695
4696 ;; Move by lines, if ARG is not 1 (the default).
4697 (if (/= arg 1)
4efebb82
CY
4698 (let ((line-move-visual nil))
4699 (line-move (1- arg) t)))
1fffd65f
RS
4700
4701 ;; Move to beginning-of-line, ignoring fields and invisibles.
4702 (skip-chars-backward "^\n")
c65e6942 4703 (while (and (not (bobp)) (invisible-p (1- (point))))
621a4cc8 4704 (goto-char (previous-char-property-change (point)))
1fffd65f 4705 (skip-chars-backward "^\n"))
ad47c4a0
RS
4706
4707 ;; Now find first visible char in the line
c65e6942 4708 (while (and (not (eobp)) (invisible-p (point)))
ad47c4a0
RS
4709 (goto-char (next-char-property-change (point))))
4710 (setq first-vis (point))
4711
4712 ;; See if fields would stop us from reaching FIRST-VIS.
4713 (setq first-vis-field-value
4714 (constrain-to-field first-vis orig (/= arg 1) t nil))
4715
4716 (goto-char (if (/= first-vis-field-value first-vis)
4717 ;; If yes, obey them.
4718 first-vis-field-value
4719 ;; Otherwise, move to START with attention to fields.
4720 ;; (It is possible that fields never matter in this case.)
4721 (constrain-to-field (point) orig
4722 (/= arg 1) t nil)))))
0cbb497c
KS
4723
4724
85be9ec4
SM
4725;; Many people have said they rarely use this feature, and often type
4726;; it by accident. Maybe it shouldn't even be on a key.
d5ab2033 4727(put 'set-goal-column 'disabled t)
2076c87c
JB
4728
4729(defun set-goal-column (arg)
4730 "Set the current horizontal position as a goal for \\[next-line] and \\[previous-line].
4731Those commands will move to this position in the line moved to
4732rather than trying to keep the same horizontal position.
5626c14e 4733With a non-nil argument ARG, clears out the goal column
912c6728
RS
4734so that \\[next-line] and \\[previous-line] resume vertical motion.
4735The goal column is stored in the variable `goal-column'."
2076c87c
JB
4736 (interactive "P")
4737 (if arg
4738 (progn
4739 (setq goal-column nil)
4740 (message "No goal column"))
4741 (setq goal-column (current-column))
8a26c165
DG
4742 ;; The older method below can be erroneous if `set-goal-column' is bound
4743 ;; to a sequence containing %
4744 ;;(message (substitute-command-keys
4745 ;;"Goal column %d (use \\[set-goal-column] with an arg to unset it)")
4746 ;;goal-column)
4747 (message "%s"
63219d53 4748 (concat
8a26c165
DG
4749 (format "Goal column %d " goal-column)
4750 (substitute-command-keys
4751 "(use \\[set-goal-column] with an arg to unset it)")))
63219d53 4752
8a26c165 4753 )
2076c87c 4754 nil)
2d88b556 4755\f
a2cf21a2
CY
4756;;; Editing based on visual lines, as opposed to logical lines.
4757
4758(defun end-of-visual-line (&optional n)
4759 "Move point to end of current visual line.
4760With argument N not nil or 1, move forward N - 1 visual lines first.
4761If point reaches the beginning or end of buffer, it stops there.
4762To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
4763 (interactive "^p")
4764 (or n (setq n 1))
4765 (if (/= n 1)
4766 (let ((line-move-visual t))
4767 (line-move (1- n) t)))
ef187c24
CY
4768 ;; Unlike `move-beginning-of-line', `move-end-of-line' doesn't
4769 ;; constrain to field boundaries, so we don't either.
a2cf21a2
CY
4770 (vertical-motion (cons (window-width) 0)))
4771
4772(defun beginning-of-visual-line (&optional n)
4773 "Move point to beginning of current visual line.
4774With argument N not nil or 1, move forward N - 1 visual lines first.
4775If point reaches the beginning or end of buffer, it stops there.
4776To ignore intangibility, bind `inhibit-point-motion-hooks' to t."
4777 (interactive "^p")
4778 (or n (setq n 1))
ef187c24
CY
4779 (let ((opoint (point)))
4780 (if (/= n 1)
4781 (let ((line-move-visual t))
4782 (line-move (1- n) t)))
4783 (vertical-motion 0)
4784 ;; Constrain to field boundaries, like `move-beginning-of-line'.
4785 (goto-char (constrain-to-field (point) opoint (/= n 1)))))
a2cf21a2
CY
4786
4787(defun kill-visual-line (&optional arg)
4788 "Kill the rest of the visual line.
ad4c1f62
CY
4789With prefix argument ARG, kill that many visual lines from point.
4790If ARG is negative, kill visual lines backward.
4791If ARG is zero, kill the text before point on the current visual
4792line.
a2cf21a2
CY
4793
4794If you want to append the killed line to the last killed text,
4795use \\[append-next-kill] before \\[kill-line].
4796
4797If the buffer is read-only, Emacs will beep and refrain from deleting
4798the line, but put the line in the kill ring anyway. This means that
4799you can use this command to copy text from a read-only buffer.
4800\(If the variable `kill-read-only-ok' is non-nil, then this won't
4801even beep.)"
4802 (interactive "P")
ad4c1f62
CY
4803 ;; Like in `kill-line', it's better to move point to the other end
4804 ;; of the kill before killing.
2066b4fe
CY
4805 (let ((opoint (point))
4806 (kill-whole-line (and kill-whole-line (bolp))))
a2cf21a2
CY
4807 (if arg
4808 (vertical-motion (prefix-numeric-value arg))
ad4c1f62
CY
4809 (end-of-visual-line 1)
4810 (if (= (point) opoint)
4811 (vertical-motion 1)
4812 ;; Skip any trailing whitespace at the end of the visual line.
4813 ;; We used to do this only if `show-trailing-whitespace' is
4814 ;; nil, but that's wrong; the correct thing would be to check
4815 ;; whether the trailing whitespace is highlighted. But, it's
4816 ;; OK to just do this unconditionally.
4817 (skip-chars-forward " \t")))
2066b4fe
CY
4818 (kill-region opoint (if (and kill-whole-line (looking-at "\n"))
4819 (1+ (point))
4820 (point)))))
a2cf21a2
CY
4821
4822(defun next-logical-line (&optional arg try-vscroll)
4823 "Move cursor vertically down ARG lines.
1d2b0303 4824This is identical to `next-line', except that it always moves
a2cf21a2
CY
4825by logical lines instead of visual lines, ignoring the value of
4826the variable `line-move-visual'."
4827 (interactive "^p\np")
4828 (let ((line-move-visual nil))
4829 (with-no-warnings
4830 (next-line arg try-vscroll))))
4831
4832(defun previous-logical-line (&optional arg try-vscroll)
4833 "Move cursor vertically up ARG lines.
4834This is identical to `previous-line', except that it always moves
4835by logical lines instead of visual lines, ignoring the value of
4836the variable `line-move-visual'."
4837 (interactive "^p\np")
4838 (let ((line-move-visual nil))
4839 (with-no-warnings
4840 (previous-line arg try-vscroll))))
4841
4dec5cff
CY
4842(defgroup visual-line nil
4843 "Editing based on visual lines."
4844 :group 'convenience
4845 :version "23.1")
4846
a2cf21a2
CY
4847(defvar visual-line-mode-map
4848 (let ((map (make-sparse-keymap)))
4849 (define-key map [remap kill-line] 'kill-visual-line)
4850 (define-key map [remap move-beginning-of-line] 'beginning-of-visual-line)
4851 (define-key map [remap move-end-of-line] 'end-of-visual-line)
b316b2b8
CY
4852 ;; These keybindings interfere with xterm function keys. Are
4853 ;; there any other suitable bindings?
4854 ;; (define-key map "\M-[" 'previous-logical-line)
4855 ;; (define-key map "\M-]" 'next-logical-line)
a2cf21a2
CY
4856 map))
4857
4dec5cff
CY
4858(defcustom visual-line-fringe-indicators '(nil nil)
4859 "How fringe indicators are shown for wrapped lines in `visual-line-mode'.
4860The value should be a list of the form (LEFT RIGHT), where LEFT
4861and RIGHT are symbols representing the bitmaps to display, to
4862indicate wrapped lines, in the left and right fringes respectively.
4863See also `fringe-indicator-alist'.
4864The default is not to display fringe indicators for wrapped lines.
4865This variable does not affect fringe indicators displayed for
4866other purposes."
4867 :type '(list (choice (const :tag "Hide left indicator" nil)
4868 (const :tag "Left curly arrow" left-curly-arrow)
4869 (symbol :tag "Other bitmap"))
4870 (choice (const :tag "Hide right indicator" nil)
4871 (const :tag "Right curly arrow" right-curly-arrow)
4872 (symbol :tag "Other bitmap")))
4873 :set (lambda (symbol value)
4874 (dolist (buf (buffer-list))
4875 (with-current-buffer buf
4876 (when (and (boundp 'visual-line-mode)
4877 (symbol-value 'visual-line-mode))
4878 (setq fringe-indicator-alist
4879 (cons (cons 'continuation value)
4880 (assq-delete-all
4881 'continuation
4882 (copy-tree fringe-indicator-alist)))))))
4883 (set-default symbol value)))
4884
748e001a
CY
4885(defvar visual-line--saved-state nil)
4886
a2cf21a2 4887(define-minor-mode visual-line-mode
b677cb96
CY
4888 "Redefine simple editing commands to act on visual lines, not logical lines.
4889This also turns on `word-wrap' in the buffer."
a2cf21a2 4890 :keymap visual-line-mode-map
4dec5cff 4891 :group 'visual-line
ea92f9f3 4892 :lighter " Wrap"
a2cf21a2
CY
4893 (if visual-line-mode
4894 (progn
748e001a
CY
4895 (set (make-local-variable 'visual-line--saved-state) nil)
4896 ;; Save the local values of some variables, to be restored if
4897 ;; visual-line-mode is turned off.
4898 (dolist (var '(line-move-visual truncate-lines
4899 truncate-partial-width-windows
4900 word-wrap fringe-indicator-alist))
4901 (if (local-variable-p var)
37820ea9 4902 (push (cons var (symbol-value var))
748e001a 4903 visual-line--saved-state)))
a2cf21a2 4904 (set (make-local-variable 'line-move-visual) t)
c58140f4
CY
4905 (set (make-local-variable 'truncate-partial-width-windows) nil)
4906 (setq truncate-lines nil
4907 word-wrap t
4908 fringe-indicator-alist
4dec5cff
CY
4909 (cons (cons 'continuation visual-line-fringe-indicators)
4910 fringe-indicator-alist)))
a2cf21a2 4911 (kill-local-variable 'line-move-visual)
4dec5cff 4912 (kill-local-variable 'word-wrap)
c58140f4
CY
4913 (kill-local-variable 'truncate-lines)
4914 (kill-local-variable 'truncate-partial-width-windows)
748e001a
CY
4915 (kill-local-variable 'fringe-indicator-alist)
4916 (dolist (saved visual-line--saved-state)
4917 (set (make-local-variable (car saved)) (cdr saved)))
4918 (kill-local-variable 'visual-line--saved-state)))
a2cf21a2
CY
4919
4920(defun turn-on-visual-line-mode ()
4921 (visual-line-mode 1))
4922
4923(define-globalized-minor-mode global-visual-line-mode
4924 visual-line-mode turn-on-visual-line-mode
4925 :lighter " vl")
5a97d2da 4926
2d88b556 4927\f
2076c87c
JB
4928(defun transpose-chars (arg)
4929 "Interchange characters around point, moving forward one character.
4930With prefix arg ARG, effect is to take character before point
4931and drag it forward past ARG other characters (backward if ARG negative).
4932If no argument and at end of line, the previous two chars are exchanged."
4933 (interactive "*P")
4934 (and (null arg) (eolp) (forward-char -1))
4935 (transpose-subr 'forward-char (prefix-numeric-value arg)))
4936
4937(defun transpose-words (arg)
4938 "Interchange words around point, leaving point at end of them.
4939With prefix arg ARG, effect is to take word before or around point
4940and drag it forward past ARG other words (backward if ARG negative).
4941If ARG is zero, the words around or after point and around or after mark
4942are interchanged."
41d22ee0 4943 ;; FIXME: `foo a!nd bar' should transpose into `bar and foo'.
2076c87c
JB
4944 (interactive "*p")
4945 (transpose-subr 'forward-word arg))
4946
4947(defun transpose-sexps (arg)
4948 "Like \\[transpose-words] but applies to sexps.
4949Does not work on a sexp that point is in the middle of
4950if it is a list or string."
4951 (interactive "*p")
41d22ee0
SM
4952 (transpose-subr
4953 (lambda (arg)
4954 ;; Here we should try to simulate the behavior of
4955 ;; (cons (progn (forward-sexp x) (point))
4956 ;; (progn (forward-sexp (- x)) (point)))
4957 ;; Except that we don't want to rely on the second forward-sexp
4958 ;; putting us back to where we want to be, since forward-sexp-function
4959 ;; might do funny things like infix-precedence.
4960 (if (if (> arg 0)
4961 (looking-at "\\sw\\|\\s_")
4962 (and (not (bobp))
4963 (save-excursion (forward-char -1) (looking-at "\\sw\\|\\s_"))))
4964 ;; Jumping over a symbol. We might be inside it, mind you.
4965 (progn (funcall (if (> arg 0)
4966 'skip-syntax-backward 'skip-syntax-forward)
4967 "w_")
4968 (cons (save-excursion (forward-sexp arg) (point)) (point)))
4969 ;; Otherwise, we're between sexps. Take a step back before jumping
4970 ;; to make sure we'll obey the same precedence no matter which direction
4971 ;; we're going.
4972 (funcall (if (> arg 0) 'skip-syntax-backward 'skip-syntax-forward) " .")
4973 (cons (save-excursion (forward-sexp arg) (point))
4974 (progn (while (or (forward-comment (if (> arg 0) 1 -1))
4975 (not (zerop (funcall (if (> arg 0)
4976 'skip-syntax-forward
4977 'skip-syntax-backward)
4978 ".")))))
4979 (point)))))
4980 arg 'special))
2076c87c
JB
4981
4982(defun transpose-lines (arg)
4983 "Exchange current line and previous line, leaving point after both.
4984With argument ARG, takes previous line and moves it past ARG lines.
4985With argument 0, interchanges line point is in with line mark is in."
4986 (interactive "*p")
4987 (transpose-subr (function
4988 (lambda (arg)
d3f4ef3f 4989 (if (> arg 0)
2076c87c 4990 (progn
d3f4ef3f
AS
4991 ;; Move forward over ARG lines,
4992 ;; but create newlines if necessary.
4993 (setq arg (forward-line arg))
4994 (if (/= (preceding-char) ?\n)
4995 (setq arg (1+ arg)))
4996 (if (> arg 0)
4997 (newline arg)))
2076c87c
JB
4998 (forward-line arg))))
4999 arg))
5000
36020642
GM
5001;; FIXME seems to leave point BEFORE the current object when ARG = 0,
5002;; which seems inconsistent with the ARG /= 0 case.
5003;; FIXME document SPECIAL.
e1e04350 5004(defun transpose-subr (mover arg &optional special)
36020642
GM
5005 "Subroutine to do the work of transposing objects.
5006Works for lines, sentences, paragraphs, etc. MOVER is a function that
5007moves forward by units of the given object (e.g. forward-sentence,
5008forward-paragraph). If ARG is zero, exchanges the current object
5009with the one containing mark. If ARG is an integer, moves the
5010current object past ARG following (if ARG is positive) or
5011preceding (if ARG is negative) objects, leaving point after the
5012current object."
e1e04350
SM
5013 (let ((aux (if special mover
5014 (lambda (x)
5015 (cons (progn (funcall mover x) (point))
5016 (progn (funcall mover (- x)) (point))))))
5017 pos1 pos2)
5018 (cond
5019 ((= arg 0)
5020 (save-excursion
5021 (setq pos1 (funcall aux 1))
41849bf9 5022 (goto-char (or (mark) (error "No mark set in this buffer")))
e1e04350
SM
5023 (setq pos2 (funcall aux 1))
5024 (transpose-subr-1 pos1 pos2))
5025 (exchange-point-and-mark))
5026 ((> arg 0)
5027 (setq pos1 (funcall aux -1))
5028 (setq pos2 (funcall aux arg))
5029 (transpose-subr-1 pos1 pos2)
5030 (goto-char (car pos2)))
5031 (t
5032 (setq pos1 (funcall aux -1))
5033 (goto-char (car pos1))
5034 (setq pos2 (funcall aux arg))
5035 (transpose-subr-1 pos1 pos2)))))
5036
5037(defun transpose-subr-1 (pos1 pos2)
5038 (when (> (car pos1) (cdr pos1)) (setq pos1 (cons (cdr pos1) (car pos1))))
5039 (when (> (car pos2) (cdr pos2)) (setq pos2 (cons (cdr pos2) (car pos2))))
5040 (when (> (car pos1) (car pos2))
5041 (let ((swap pos1))
5042 (setq pos1 pos2 pos2 swap)))
5043 (if (> (cdr pos1) (car pos2)) (error "Don't have two things to transpose"))
dc7d7552
RS
5044 (atomic-change-group
5045 (let (word2)
1e96c007
SM
5046 ;; FIXME: We first delete the two pieces of text, so markers that
5047 ;; used to point to after the text end up pointing to before it :-(
dc7d7552
RS
5048 (setq word2 (delete-and-extract-region (car pos2) (cdr pos2)))
5049 (goto-char (car pos2))
5050 (insert (delete-and-extract-region (car pos1) (cdr pos1)))
5051 (goto-char (car pos1))
5052 (insert word2))))
2d88b556 5053\f
6b61353c 5054(defun backward-word (&optional arg)
b7e91b0c 5055 "Move backward until encountering the beginning of a word.
5626c14e 5056With argument ARG, do this that many times."
109cfe4e 5057 (interactive "^p")
6b61353c 5058 (forward-word (- (or arg 1))))
2076c87c 5059
a1a801de 5060(defun mark-word (&optional arg allow-extend)
705a5933
JL
5061 "Set mark ARG words away from point.
5062The place mark goes is the same place \\[forward-word] would
5063move to with the same argument.
a1a801de 5064Interactively, if this command is repeated
771069f8 5065or (in Transient Mark mode) if the mark is active,
705a5933 5066it marks the next ARG words after the ones already marked."
a1a801de
RS
5067 (interactive "P\np")
5068 (cond ((and allow-extend
5069 (or (and (eq last-command this-command) (mark t))
d34c311a 5070 (region-active-p)))
705a5933
JL
5071 (setq arg (if arg (prefix-numeric-value arg)
5072 (if (< (mark) (point)) -1 1)))
cad113ae
KG
5073 (set-mark
5074 (save-excursion
5075 (goto-char (mark))
5076 (forward-word arg)
5077 (point))))
5078 (t
5079 (push-mark
5080 (save-excursion
705a5933 5081 (forward-word (prefix-numeric-value arg))
cad113ae
KG
5082 (point))
5083 nil t))))
2076c87c
JB
5084
5085(defun kill-word (arg)
5086 "Kill characters forward until encountering the end of a word.
5626c14e 5087With argument ARG, do this that many times."
e761e42c 5088 (interactive "p")
89ee2bf6 5089 (kill-region (point) (progn (forward-word arg) (point))))
2076c87c
JB
5090
5091(defun backward-kill-word (arg)
654ec269 5092 "Kill characters backward until encountering the beginning of a word.
5626c14e 5093With argument ARG, do this that many times."
e761e42c 5094 (interactive "p")
2076c87c 5095 (kill-word (- arg)))
d7c64071 5096
0f7df535
RS
5097(defun current-word (&optional strict really-word)
5098 "Return the symbol or word that point is on (or a nearby one) as a string.
5099The return value includes no text properties.
1e8c5ac4 5100If optional arg STRICT is non-nil, return nil unless point is within
0fa19a57
RS
5101or adjacent to a symbol or word. In all cases the value can be nil
5102if there is no word nearby.
0f7df535
RS
5103The function, belying its name, normally finds a symbol.
5104If optional arg REALLY-WORD is non-nil, it finds just a word."
d7c64071 5105 (save-excursion
0f7df535 5106 (let* ((oldpoint (point)) (start (point)) (end (point))
81d17173 5107 (syntaxes (if really-word "w" "w_"))
0f7df535
RS
5108 (not-syntaxes (concat "^" syntaxes)))
5109 (skip-syntax-backward syntaxes) (setq start (point))
d7c64071 5110 (goto-char oldpoint)
0f7df535
RS
5111 (skip-syntax-forward syntaxes) (setq end (point))
5112 (when (and (eq start oldpoint) (eq end oldpoint)
5113 ;; Point is neither within nor adjacent to a word.
5114 (not strict))
5115 ;; Look for preceding word in same line.
5116 (skip-syntax-backward not-syntaxes
5117 (save-excursion (beginning-of-line)
5118 (point)))
5119 (if (bolp)
5120 ;; No preceding word in same line.
5121 ;; Look for following word in same line.
5122 (progn
5123 (skip-syntax-forward not-syntaxes
5124 (save-excursion (end-of-line)
5125 (point)))
5126 (setq start (point))
5127 (skip-syntax-forward syntaxes)
5128 (setq end (point)))
5129 (setq end (point))
5130 (skip-syntax-backward syntaxes)
5131 (setq start (point))))
5132 ;; If we found something nonempty, return it as a string.
5133 (unless (= start end)
020db25f 5134 (buffer-substring-no-properties start end)))))
2d88b556 5135\f
69c1dd37 5136(defcustom fill-prefix nil
1d2b0303 5137 "String for filling to insert at front of new line, or nil for none."
69c1dd37
RS
5138 :type '(choice (const :tag "None" nil)
5139 string)
5140 :group 'fill)
2076c87c 5141(make-variable-buffer-local 'fill-prefix)
f31b1257 5142(put 'fill-prefix 'safe-local-variable 'string-or-null-p)
2076c87c 5143
69c1dd37 5144(defcustom auto-fill-inhibit-regexp nil
1d2b0303 5145 "Regexp to match lines which should not be auto-filled."
69c1dd37
RS
5146 :type '(choice (const :tag "None" nil)
5147 regexp)
5148 :group 'fill)
2076c87c 5149
dbe524b6 5150;; This function is used as the auto-fill-function of a buffer
e2504204
KH
5151;; when Auto-Fill mode is enabled.
5152;; It returns t if it really did any work.
dbe524b6
RS
5153;; (Actually some major modes use a different auto-fill function,
5154;; but this one is the default one.)
2076c87c 5155(defun do-auto-fill ()
621a3f62 5156 (let (fc justify give-up
a0170800 5157 (fill-prefix fill-prefix))
c18465c4 5158 (if (or (not (setq justify (current-justification)))
8f066a20
RS
5159 (null (setq fc (current-fill-column)))
5160 (and (eq justify 'left)
5161 (<= (current-column) fc))
621a3f62
SM
5162 (and auto-fill-inhibit-regexp
5163 (save-excursion (beginning-of-line)
eed5698b
RS
5164 (looking-at auto-fill-inhibit-regexp))))
5165 nil ;; Auto-filling not required
3db1e3b5
BG
5166 (if (memq justify '(full center right))
5167 (save-excursion (unjustify-current-line)))
a0170800
RS
5168
5169 ;; Choose a fill-prefix automatically.
e1e04350
SM
5170 (when (and adaptive-fill-mode
5171 (or (null fill-prefix) (string= fill-prefix "")))
5172 (let ((prefix
5173 (fill-context-prefix
5174 (save-excursion (backward-paragraph 1) (point))
5175 (save-excursion (forward-paragraph 1) (point)))))
5176 (and prefix (not (equal prefix ""))
5177 ;; Use auto-indentation rather than a guessed empty prefix.
0e53a373 5178 (not (and fill-indent-according-to-mode
d99f8496 5179 (string-match "\\`[ \t]*\\'" prefix)))
e1e04350 5180 (setq fill-prefix prefix))))
f1180544 5181
eed5698b 5182 (while (and (not give-up) (> (current-column) fc))
e47d38f6 5183 ;; Determine where to split the line.
db893d00
RS
5184 (let* (after-prefix
5185 (fill-point
621a3f62
SM
5186 (save-excursion
5187 (beginning-of-line)
5188 (setq after-prefix (point))
5189 (and fill-prefix
5190 (looking-at (regexp-quote fill-prefix))
5191 (setq after-prefix (match-end 0)))
5192 (move-to-column (1+ fc))
5193 (fill-move-to-break-point after-prefix)
5194 (point))))
db893d00
RS
5195
5196 ;; See whether the place we found is any good.
e47d38f6
RS
5197 (if (save-excursion
5198 (goto-char fill-point)
41d22ee0
SM
5199 (or (bolp)
5200 ;; There is no use breaking at end of line.
5201 (save-excursion (skip-chars-forward " ") (eolp))
5202 ;; It is futile to split at the end of the prefix
5203 ;; since we would just insert the prefix again.
5204 (and after-prefix (<= (point) after-prefix))
5205 ;; Don't split right after a comment starter
5206 ;; since we would just make another comment starter.
5207 (and comment-start-skip
5208 (let ((limit (point)))
5209 (beginning-of-line)
5210 (and (re-search-forward comment-start-skip
5211 limit t)
5212 (eq (point) limit))))))
5213 ;; No good place to break => stop trying.
5214 (setq give-up t)
5215 ;; Ok, we have a useful place to break the line. Do it.
5216 (let ((prev-column (current-column)))
5217 ;; If point is at the fill-point, do not `save-excursion'.
5218 ;; Otherwise, if a comment prefix or fill-prefix is inserted,
5219 ;; point will end up before it rather than after it.
5220 (if (save-excursion
5221 (skip-chars-backward " \t")
5222 (= (point) fill-point))
0b727f9d 5223 (default-indent-new-line t)
41d22ee0
SM
5224 (save-excursion
5225 (goto-char fill-point)
0b727f9d 5226 (default-indent-new-line t)))
41d22ee0
SM
5227 ;; Now do justification, if required
5228 (if (not (eq justify 'left))
e47d38f6 5229 (save-excursion
e1e04350
SM
5230 (end-of-line 0)
5231 (justify-current-line justify nil t)))
41d22ee0
SM
5232 ;; If making the new line didn't reduce the hpos of
5233 ;; the end of the line, then give up now;
5234 ;; trying again will not help.
5235 (if (>= (current-column) prev-column)
5236 (setq give-up t))))))
24ebf92e 5237 ;; Justify last line.
e2504204 5238 (justify-current-line justify t t)
1e722f9f 5239 t)))
2076c87c 5240
0b727f9d
RS
5241(defvar comment-line-break-function 'comment-indent-new-line
5242 "*Mode-specific function which line breaks and continues a comment.
5243This function is called during auto-filling when a comment syntax
5244is defined.
5245The function should take a single optional argument, which is a flag
5246indicating whether it should use soft newlines.")
5247
5248(defun default-indent-new-line (&optional soft)
5249 "Break line at point and indent.
5250If a comment syntax is defined, call `comment-indent-new-line'.
5251
5252The inserted newline is marked hard if variable `use-hard-newlines' is true,
5253unless optional argument SOFT is non-nil."
5254 (interactive)
5255 (if comment-start
5256 (funcall comment-line-break-function soft)
5257 ;; Insert the newline before removing empty space so that markers
5258 ;; get preserved better.
5259 (if soft (insert-and-inherit ?\n) (newline 1))
5260 (save-excursion (forward-char -1) (delete-horizontal-space))
5261 (delete-horizontal-space)
5262
5263 (if (and fill-prefix (not adaptive-fill-mode))
5264 ;; Blindly trust a non-adaptive fill-prefix.
5265 (progn
5266 (indent-to-left-margin)
5267 (insert-before-markers-and-inherit fill-prefix))
5268
5269 (cond
5270 ;; If there's an adaptive prefix, use it unless we're inside
5271 ;; a comment and the prefix is not a comment starter.
5272 (fill-prefix
5273 (indent-to-left-margin)
5274 (insert-and-inherit fill-prefix))
5275 ;; If we're not inside a comment, just try to indent.
5276 (t (indent-according-to-mode))))))
5277
24ebf92e
RS
5278(defvar normal-auto-fill-function 'do-auto-fill
5279 "The function to use for `auto-fill-function' if Auto Fill mode is turned on.
5280Some major modes set this.")
5281
c75505b4 5282(put 'auto-fill-function :minor-mode-function 'auto-fill-mode)
74ab01ff
SM
5283;; `functions' and `hooks' are usually unsafe to set, but setting
5284;; auto-fill-function to nil in a file-local setting is safe and
5285;; can be useful to prevent auto-filling.
5286(put 'auto-fill-function 'safe-local-variable 'null)
d99f8496
SM
5287;; FIXME: turn into a proper minor mode.
5288;; Add a global minor mode version of it.
80ac5d4d 5289(define-minor-mode auto-fill-mode
24ebf92e 5290 "Toggle Auto Fill mode.
1d2b0303 5291With ARG, turn Auto Fill mode on if and only if ARG is positive.
24ebf92e
RS
5292In Auto Fill mode, inserting a space at a column beyond `current-fill-column'
5293automatically breaks the line at a previous space.
5294
5295The value of `normal-auto-fill-function' specifies the function to use
5296for `auto-fill-function' when turning Auto Fill mode on."
80ac5d4d 5297 :variable (eq auto-fill-function normal-auto-fill-function))
d7465b15
RS
5298
5299;; This holds a document string used to document auto-fill-mode.
5300(defun auto-fill-function ()
5301 "Automatically break line at a previous space, in insertion of text."
5302 nil)
5303
5304(defun turn-on-auto-fill ()
5305 "Unconditionally turn on Auto Fill mode."
5306 (auto-fill-mode 1))
3a99c819
GM
5307
5308(defun turn-off-auto-fill ()
5309 "Unconditionally turn off Auto Fill mode."
5310 (auto-fill-mode -1))
5311
7cbf1dc1 5312(custom-add-option 'text-mode-hook 'turn-on-auto-fill)
d7465b15
RS
5313
5314(defun set-fill-column (arg)
4cc0ea11 5315 "Set `fill-column' to specified argument.
923efb99 5316Use \\[universal-argument] followed by a number to specify a column.
4cc0ea11 5317Just \\[universal-argument] as argument means to use the current column."
7c373357
SM
5318 (interactive
5319 (list (or current-prefix-arg
5320 ;; We used to use current-column silently, but C-x f is too easily
5321 ;; typed as a typo for C-x C-f, so we turned it into an error and
5322 ;; now an interactive prompt.
5323 (read-number "Set fill-column to: " (current-column)))))
f4520363
RS
5324 (if (consp arg)
5325 (setq arg (current-column)))
5326 (if (not (integerp arg))
5327 ;; Disallow missing argument; it's probably a typo for C-x C-f.
f33321ad 5328 (error "set-fill-column requires an explicit argument")
f4520363
RS
5329 (message "Fill column set to %d (was %d)" arg fill-column)
5330 (setq fill-column arg)))
2d88b556 5331\f
2076c87c 5332(defun set-selective-display (arg)
ff1fbe3e
RS
5333 "Set `selective-display' to ARG; clear it if no arg.
5334When the value of `selective-display' is a number > 0,
5335lines whose indentation is >= that value are not displayed.
5336The variable `selective-display' has a separate value for each buffer."
2076c87c
JB
5337 (interactive "P")
5338 (if (eq selective-display t)
5339 (error "selective-display already in use for marked lines"))
c88ab9ce
ER
5340 (let ((current-vpos
5341 (save-restriction
5342 (narrow-to-region (point-min) (point))
5343 (goto-char (window-start))
5344 (vertical-motion (window-height)))))
5345 (setq selective-display
5346 (and arg (prefix-numeric-value arg)))
5347 (recenter current-vpos))
2076c87c
JB
5348 (set-window-start (selected-window) (window-start (selected-window)))
5349 (princ "selective-display set to " t)
5350 (prin1 selective-display t)
5351 (princ "." t))
5352
40a64816 5353(defvaralias 'indicate-unused-lines 'indicate-empty-lines)
40a64816 5354
b3228584 5355(defun toggle-truncate-lines (&optional arg)
215f50ce 5356 "Toggle whether to fold or truncate long lines for the current buffer.
4837b516 5357With prefix argument ARG, truncate long lines if ARG is positive,
1d2b0303
JB
5358otherwise don't truncate them. Note that in side-by-side windows,
5359this command has no effect if `truncate-partial-width-windows'
627bb5dc 5360is non-nil."
0bb64d76
PA
5361 (interactive "P")
5362 (setq truncate-lines
5363 (if (null arg)
5364 (not truncate-lines)
46cdfe8f
RS
5365 (> (prefix-numeric-value arg) 0)))
5366 (force-mode-line-update)
4f017185
RS
5367 (unless truncate-lines
5368 (let ((buffer (current-buffer)))
5369 (walk-windows (lambda (window)
5370 (if (eq buffer (window-buffer window))
5371 (set-window-hscroll window 0)))
5372 nil t)))
46cdfe8f
RS
5373 (message "Truncate long lines %s"
5374 (if truncate-lines "enabled" "disabled")))
0bb64d76 5375
c899b3db
JL
5376(defun toggle-word-wrap (&optional arg)
5377 "Toggle whether to use word-wrapping for continuation lines.
5378With prefix argument ARG, wrap continuation lines at word boundaries
5379if ARG is positive, otherwise wrap them at the right screen edge.
5380This command toggles the value of `word-wrap'. It has no effect
5381if long lines are truncated."
5382 (interactive "P")
5383 (setq word-wrap
5384 (if (null arg)
5385 (not word-wrap)
5386 (> (prefix-numeric-value arg) 0)))
5387 (force-mode-line-update)
5388 (message "Word wrapping %s"
5389 (if word-wrap "enabled" "disabled")))
5390
ca0a881a 5391(defvar overwrite-mode-textual (purecopy " Ovwrt")
b6a22db0 5392 "The string displayed in the mode line when in overwrite mode.")
ca0a881a 5393(defvar overwrite-mode-binary (purecopy " Bin Ovwrt")
b6a22db0
JB
5394 "The string displayed in the mode line when in binary overwrite mode.")
5395
80ac5d4d 5396(define-minor-mode overwrite-mode
2076c87c 5397 "Toggle overwrite mode.
4837b516
GM
5398With prefix argument ARG, turn overwrite mode on if ARG is positive,
5399otherwise turn it off. In overwrite mode, printing characters typed
5400in replace existing text on a one-for-one basis, rather than pushing
5401it to the right. At the end of a line, such characters extend the line.
5402Before a tab, such characters insert until the tab is filled in.
b6a22db0
JB
5403\\[quoted-insert] still inserts characters in overwrite mode; this
5404is supposed to make it easier to insert characters when necessary."
80ac5d4d 5405 :variable (eq overwrite-mode 'overwrite-mode-textual))
b6a22db0 5406
80ac5d4d 5407(define-minor-mode binary-overwrite-mode
b6a22db0 5408 "Toggle binary overwrite mode.
4837b516
GM
5409With prefix argument ARG, turn binary overwrite mode on if ARG is
5410positive, otherwise turn it off. In binary overwrite mode, printing
5411characters typed in replace existing text. Newlines are not treated
5412specially, so typing at the end of a line joins the line to the next,
5413with the typed character between them. Typing before a tab character
5414simply replaces the tab with the character typed. \\[quoted-insert]
5415replaces the text at the cursor, just as ordinary typing characters do.
b6a22db0
JB
5416
5417Note that binary overwrite mode is not its own minor mode; it is a
f33321ad 5418specialization of overwrite mode, entered by setting the
b6a22db0 5419`overwrite-mode' variable to `overwrite-mode-binary'."
80ac5d4d 5420 :variable (eq overwrite-mode 'overwrite-mode-binary))
eaae8106 5421
6710df48 5422(define-minor-mode line-number-mode
a61099dd 5423 "Toggle Line Number mode.
1d2b0303 5424With ARG, turn Line Number mode on if ARG is positive, otherwise
4837b516
GM
5425turn it off. When Line Number mode is enabled, the line number
5426appears in the mode line.
8dc9e2ef 5427
32f2f98e
EZ
5428Line numbers do not appear for very large buffers and buffers
5429with very long lines; see variables `line-number-display-limit'
5430and `line-number-display-limit-width'."
efeb22bf 5431 :init-value t :global t :group 'mode-line)
bcad4985 5432
6710df48 5433(define-minor-mode column-number-mode
bcad4985 5434 "Toggle Column Number mode.
1d2b0303 5435With ARG, turn Column Number mode on if ARG is positive,
4837b516
GM
5436otherwise turn it off. When Column Number mode is enabled, the
5437column number appears in the mode line."
efeb22bf 5438 :global t :group 'mode-line)
6b61353c
KH
5439
5440(define-minor-mode size-indication-mode
5441 "Toggle Size Indication mode.
1d2b0303 5442With ARG, turn Size Indication mode on if ARG is positive,
4837b516
GM
5443otherwise turn it off. When Size Indication mode is enabled, the
5444size of the accessible part of the buffer appears in the mode line."
efeb22bf 5445 :global t :group 'mode-line)
f3ee9200
SM
5446
5447(define-minor-mode auto-save-mode
5448 "Toggle auto-saving of contents of current buffer.
5449With prefix argument ARG, turn auto-saving on if positive, else off."
5450 :variable ((and buffer-auto-save-file-name
5451 ;; If auto-save is off because buffer has shrunk,
5452 ;; then toggling should turn it on.
5453 (>= buffer-saved-size 0))
5454 . (lambda (val)
5455 (setq buffer-auto-save-file-name
5456 (cond
5457 ((null val) nil)
5458 ((and buffer-file-name auto-save-visited-file-name
5459 (not buffer-read-only))
5460 buffer-file-name)
5461 (t (make-auto-save-file-name))))))
5462 ;; If -1 was stored here, to temporarily turn off saving,
5463 ;; turn it back on.
5464 (and (< buffer-saved-size 0)
5465 (setq buffer-saved-size 0)))
2d88b556 5466\f
4b384a8f 5467(defgroup paren-blinking nil
020db25f 5468 "Blinking matching of parens and expressions."
4b384a8f
SM
5469 :prefix "blink-matching-"
5470 :group 'paren-matching)
5471
69c1dd37 5472(defcustom blink-matching-paren t
1d2b0303 5473 "Non-nil means show matching open-paren when close-paren is inserted."
69c1dd37 5474 :type 'boolean
4b384a8f 5475 :group 'paren-blinking)
2076c87c 5476
69c1dd37 5477(defcustom blink-matching-paren-on-screen t
1d2b0303 5478 "Non-nil means show matching open-paren when it is on screen.
1c2ba4e7 5479If nil, don't show it (but the open-paren can still be shown
92aa8a33
LT
5480when it is off screen).
5481
9cb370a9 5482This variable has no effect if `blink-matching-paren' is nil.
a9f72e5f 5483\(In that case, the open-paren is never shown.)
9cb370a9 5484It is also ignored if `show-paren-mode' is enabled."
69c1dd37 5485 :type 'boolean
4b384a8f 5486 :group 'paren-blinking)
29fc44dd 5487
fd413a37 5488(defcustom blink-matching-paren-distance (* 100 1024)
1d2b0303 5489 "If non-nil, maximum distance to search backwards for matching open-paren.
66d44a36 5490If nil, search stops at the beginning of the accessible portion of the buffer."
fd413a37 5491 :version "23.2" ; 25->100k
66d44a36 5492 :type '(choice (const nil) integer)
4b384a8f 5493 :group 'paren-blinking)
2076c87c 5494
69c1dd37 5495(defcustom blink-matching-delay 1
1d2b0303 5496 "Time in seconds to delay after showing a matching paren."
4b384a8f
SM
5497 :type 'number
5498 :group 'paren-blinking)
72dddf8b 5499
69c1dd37 5500(defcustom blink-matching-paren-dont-ignore-comments nil
1d2b0303 5501 "If nil, `blink-matching-paren' ignores comments.
ab6b3b16
RS
5502More precisely, when looking for the matching parenthesis,
5503it skips the contents of comments that end before point."
69c1dd37 5504 :type 'boolean
4b384a8f 5505 :group 'paren-blinking)
903b7f65 5506
2076c87c
JB
5507(defun blink-matching-open ()
5508 "Move cursor momentarily to the beginning of the sexp before point."
5509 (interactive)
c448d316 5510 (when (and (> (point) (point-min))
1d0e3fc8
RS
5511 blink-matching-paren
5512 ;; Verify an even number of quoting characters precede the close.
5513 (= 1 (logand 1 (- (point)
5514 (save-excursion
5515 (forward-char -1)
5516 (skip-syntax-backward "/\\")
5517 (point))))))
5518 (let* ((oldpos (point))
3137dda8 5519 (message-log-max nil) ; Don't log messages about paren matching.
bf825c62
GM
5520 (atdollar (eq (syntax-class (syntax-after (1- oldpos))) 8))
5521 (isdollar)
3137dda8
SM
5522 (blinkpos
5523 (save-excursion
5524 (save-restriction
5525 (if blink-matching-paren-distance
5526 (narrow-to-region
5527 (max (minibuffer-prompt-end) ;(point-min) unless minibuf.
5528 (- (point) blink-matching-paren-distance))
5529 oldpos))
5530 (let ((parse-sexp-ignore-comments
5531 (and parse-sexp-ignore-comments
5532 (not blink-matching-paren-dont-ignore-comments))))
5533 (condition-case ()
4b9c0a49
SM
5534 (progn
5535 (forward-sexp -1)
5536 (point))
3137dda8
SM
5537 (error nil))))))
5538 (matching-paren
5539 (and blinkpos
5540 ;; Not syntax '$'.
bf825c62
GM
5541 (not (setq isdollar
5542 (eq (syntax-class (syntax-after blinkpos)) 8)))
3137dda8
SM
5543 (let ((syntax (syntax-after blinkpos)))
5544 (and (consp syntax)
5545 (eq (syntax-class syntax) 4)
5546 (cdr syntax))))))
5547 (cond
bf825c62
GM
5548 ;; isdollar is for:
5549 ;; http://lists.gnu.org/archive/html/emacs-devel/2007-10/msg00871.html
5550 ((not (or (and isdollar blinkpos)
5551 (and atdollar (not blinkpos)) ; see below
5552 (eq matching-paren (char-before oldpos))
3137dda8
SM
5553 ;; The cdr might hold a new paren-class info rather than
5554 ;; a matching-char info, in which case the two CDRs
5555 ;; should match.
5556 (eq matching-paren (cdr (syntax-after (1- oldpos))))))
28e271f0
JL
5557 (if (minibufferp)
5558 (minibuffer-message " [Mismatched parentheses]")
5559 (message "Mismatched parentheses")))
3137dda8 5560 ((not blinkpos)
bf825c62
GM
5561 (or blink-matching-paren-distance
5562 ;; Don't complain when `$' with no blinkpos, because it
5563 ;; could just be the first one typed in the buffer.
5564 atdollar
28e271f0
JL
5565 (if (minibufferp)
5566 (minibuffer-message " [Unmatched parenthesis]")
5567 (message "Unmatched parenthesis"))))
3137dda8
SM
5568 ((pos-visible-in-window-p blinkpos)
5569 ;; Matching open within window, temporarily move to blinkpos but only
5570 ;; if `blink-matching-paren-on-screen' is non-nil.
5571 (and blink-matching-paren-on-screen
5572 (not show-paren-mode)
5573 (save-excursion
5574 (goto-char blinkpos)
5575 (sit-for blink-matching-delay))))
5576 (t
5577 (save-excursion
5578 (goto-char blinkpos)
5579 (let ((open-paren-line-string
5580 ;; Show what precedes the open in its line, if anything.
5581 (cond
5582 ((save-excursion (skip-chars-backward " \t") (not (bolp)))
5583 (buffer-substring (line-beginning-position)
5584 (1+ blinkpos)))
5585 ;; Show what follows the open in its line, if anything.
5586 ((save-excursion
5587 (forward-char 1)
5588 (skip-chars-forward " \t")
5589 (not (eolp)))
5590 (buffer-substring blinkpos
5591 (line-end-position)))
5592 ;; Otherwise show the previous nonblank line,
5593 ;; if there is one.
5594 ((save-excursion (skip-chars-backward "\n \t") (not (bobp)))
5595 (concat
5596 (buffer-substring (progn
5597 (skip-chars-backward "\n \t")
5598 (line-beginning-position))
5599 (progn (end-of-line)
5600 (skip-chars-backward " \t")
5601 (point)))
5602 ;; Replace the newline and other whitespace with `...'.
5603 "..."
5604 (buffer-substring blinkpos (1+ blinkpos))))
5605 ;; There is nothing to show except the char itself.
5606 (t (buffer-substring blinkpos (1+ blinkpos))))))
5607 (message "Matches %s"
5608 (substring-no-properties open-paren-line-string)))))))))
5609
2076c87c 5610(setq blink-paren-function 'blink-matching-open)
2d88b556 5611\f
9a1277dd
RS
5612;; This executes C-g typed while Emacs is waiting for a command.
5613;; Quitting out of a program does not go through here;
5614;; that happens in the QUIT macro at the C code level.
2076c87c 5615(defun keyboard-quit ()
d5dae4e1 5616 "Signal a `quit' condition.
af39530e
RS
5617During execution of Lisp code, this character causes a quit directly.
5618At top-level, as an editor command, this simply beeps."
2076c87c 5619 (interactive)
9852377f
CY
5620 ;; Avoid adding the region to the window selection.
5621 (setq saved-region-selection nil)
5622 (let (select-active-regions)
5623 (deactivate-mark))
8a7644e9
KS
5624 (if (fboundp 'kmacro-keyboard-quit)
5625 (kmacro-keyboard-quit))
f5e13057 5626 (setq defining-kbd-macro nil)
2076c87c
JB
5627 (signal 'quit nil))
5628
1c6c6fde
RS
5629(defvar buffer-quit-function nil
5630 "Function to call to \"quit\" the current buffer, or nil if none.
5631\\[keyboard-escape-quit] calls this function when its more local actions
5632\(such as cancelling a prefix argument, minibuffer or region) do not apply.")
5633
c66587fe
RS
5634(defun keyboard-escape-quit ()
5635 "Exit the current \"mode\" (in a generalized sense of the word).
5636This command can exit an interactive command such as `query-replace',
5637can clear out a prefix argument or a region,
5638can get out of the minibuffer or other recursive edit,
1c6c6fde
RS
5639cancel the use of the current buffer (for special-purpose buffers),
5640or go back to just one window (by deleting all but the selected window)."
c66587fe
RS
5641 (interactive)
5642 (cond ((eq last-command 'mode-exited) nil)
67189e62
JL
5643 ((region-active-p)
5644 (deactivate-mark))
c66587fe
RS
5645 ((> (minibuffer-depth) 0)
5646 (abort-recursive-edit))
5647 (current-prefix-arg
5648 nil)
1b657835
RS
5649 ((> (recursion-depth) 0)
5650 (exit-recursive-edit))
1c6c6fde
RS
5651 (buffer-quit-function
5652 (funcall buffer-quit-function))
c66587fe 5653 ((not (one-window-p t))
1b657835
RS
5654 (delete-other-windows))
5655 ((string-match "^ \\*" (buffer-name (current-buffer)))
5656 (bury-buffer))))
c66587fe 5657
2d88b556
RS
5658(defun play-sound-file (file &optional volume device)
5659 "Play sound stored in FILE.
5660VOLUME and DEVICE correspond to the keywords of the sound
5661specification for `play-sound'."
5662 (interactive "fPlay sound file: ")
5663 (let ((sound (list :file file)))
5664 (if volume
5665 (plist-put sound :volume volume))
5666 (if device
5667 (plist-put sound :device device))
5668 (push 'sound sound)
5669 (play-sound sound)))
5670
56abefac 5671\f
7683b5c2 5672(defcustom read-mail-command 'rmail
1d2b0303 5673 "Your preference for a mail reading package.
9023837e
DL
5674This is used by some keybindings which support reading mail.
5675See also `mail-user-agent' concerning sending mail."
f6714ede
GM
5676 :type '(radio (function-item :tag "Rmail" :format "%t\n" rmail)
5677 (function-item :tag "Gnus" :format "%t\n" gnus)
5678 (function-item :tag "Emacs interface to MH"
5679 :format "%t\n" mh-rmail)
5680 (function :tag "Other"))
7683b5c2
DL
5681 :version "21.1"
5682 :group 'mail)
5683
cbd61418 5684(defcustom mail-user-agent 'message-user-agent
1d2b0303 5685 "Your preference for a mail composition package.
9023837e 5686Various Emacs Lisp packages (e.g. Reporter) require you to compose an
a31ca314
RS
5687outgoing email message. This variable lets you specify which
5688mail-sending package you prefer.
5689
5690Valid values include:
5691
cfc47664
GM
5692 `message-user-agent' -- use the Message package.
5693 See Info node `(message)'.
5694 `sendmail-user-agent' -- use the Mail package.
9023837e
DL
5695 See Info node `(emacs)Sending Mail'.
5696 `mh-e-user-agent' -- use the Emacs interface to the MH mail system.
5697 See Info node `(mh-e)'.
9023837e
DL
5698 `gnus-user-agent' -- like `message-user-agent', but with Gnus
5699 paraphernalia, particularly the Gcc: header for
5700 archiving.
a31ca314
RS
5701
5702Additional valid symbols may be available; check with the author of
15d0c9b1
DL
5703your package for details. The function should return non-nil if it
5704succeeds.
9023837e
DL
5705
5706See also `read-mail-command' concerning reading mail."
cfc47664
GM
5707 :type '(radio (function-item :tag "Message package"
5708 :format "%t\n"
5709 message-user-agent)
5710 (function-item :tag "Mail package"
69c1dd37
RS
5711 :format "%t\n"
5712 sendmail-user-agent)
5713 (function-item :tag "Emacs interface to MH"
5714 :format "%t\n"
5715 mh-e-user-agent)
cfc47664 5716 (function-item :tag "Message with full Gnus features"
9023837e
DL
5717 :format "%t\n"
5718 gnus-user-agent)
69c1dd37 5719 (function :tag "Other"))
cfc47664 5720 :version "23.2" ; sendmail->message
69c1dd37 5721 :group 'mail)
a31ca314 5722
3d68fa99
CY
5723(defcustom compose-mail-user-agent-warnings t
5724 "If non-nil, `compose-mail' warns about changes in `mail-user-agent'.
5725If the value of `mail-user-agent' is the default, and the user
5726appears to have customizations applying to the old default,
5727`compose-mail' issues a warning."
5728 :type 'boolean
5729 :version "23.2"
5730 :group 'mail)
5731
a31ca314 5732(define-mail-user-agent 'sendmail-user-agent
34fbcdf3 5733 'sendmail-user-agent-compose
a31ca314
RS
5734 'mail-send-and-exit)
5735
360b5483
RS
5736(defun rfc822-goto-eoh ()
5737 ;; Go to header delimiter line in a mail message, following RFC822 rules
5738 (goto-char (point-min))
e1e04350
SM
5739 (when (re-search-forward
5740 "^\\([:\n]\\|[^: \t\n]+[ \t\n]\\)" nil 'move)
5741 (goto-char (match-beginning 0))))
360b5483 5742
34fbcdf3
RS
5743(defun sendmail-user-agent-compose (&optional to subject other-headers continue
5744 switch-function yank-action
5745 send-actions)
5746 (if switch-function
5747 (let ((special-display-buffer-names nil)
5748 (special-display-regexps nil)
5749 (same-window-buffer-names nil)
5750 (same-window-regexps nil))
5751 (funcall switch-function "*mail*")))
6b61353c
KH
5752 (let ((cc (cdr (assoc-string "cc" other-headers t)))
5753 (in-reply-to (cdr (assoc-string "in-reply-to" other-headers t)))
5754 (body (cdr (assoc-string "body" other-headers t))))
34fbcdf3
RS
5755 (or (mail continue to subject in-reply-to cc yank-action send-actions)
5756 continue
5757 (error "Message aborted"))
5758 (save-excursion
360b5483 5759 (rfc822-goto-eoh)
34fbcdf3 5760 (while other-headers
0740c738
GM
5761 (unless (member-ignore-case (car (car other-headers))
5762 '("in-reply-to" "cc" "body"))
34fbcdf3 5763 (insert (car (car other-headers)) ": "
15575807
CY
5764 (cdr (car other-headers))
5765 (if use-hard-newlines hard-newline "\n")))
34fbcdf3 5766 (setq other-headers (cdr other-headers)))
0740c738
GM
5767 (when body
5768 (forward-line 1)
5769 (insert body))
34fbcdf3
RS
5770 t)))
5771
d0008a00
RS
5772(defun compose-mail (&optional to subject other-headers continue
5773 switch-function yank-action send-actions)
5774 "Start composing a mail message to send.
5775This uses the user's chosen mail composition package
5776as selected with the variable `mail-user-agent'.
5777The optional arguments TO and SUBJECT specify recipients
5778and the initial Subject field, respectively.
5779
5780OTHER-HEADERS is an alist specifying additional
5781header fields. Elements look like (HEADER . VALUE) where both
5782HEADER and VALUE are strings.
5783
5784CONTINUE, if non-nil, says to continue editing a message already
9dda5b0e 5785being composed. Interactively, CONTINUE is the prefix argument.
d0008a00
RS
5786
5787SWITCH-FUNCTION, if non-nil, is a function to use to
5788switch to and display the buffer used for mail composition.
5789
5790YANK-ACTION, if non-nil, is an action to perform, if and when necessary,
06720de2
RS
5791to insert the raw text of the message being replied to.
5792It has the form (FUNCTION . ARGS). The user agent will apply
5793FUNCTION to ARGS, to insert the raw text of the original message.
5794\(The user agent will also run `mail-citation-hook', *after* the
5795original text has been inserted in this way.)
d0008a00
RS
5796
5797SEND-ACTIONS is a list of actions to call when the message is sent.
5798Each action has the form (FUNCTION . ARGS)."
b5f019be
RS
5799 (interactive
5800 (list nil nil nil current-prefix-arg))
3d68fa99
CY
5801
5802 ;; In Emacs 23.2, the default value of `mail-user-agent' changed
5803 ;; from sendmail-user-agent to message-user-agent. Some users may
5804 ;; encounter incompatibilities. This hack tries to detect problems
5805 ;; and warn about them.
5806 (and compose-mail-user-agent-warnings
5807 (eq mail-user-agent 'message-user-agent)
5808 (let (warn-vars)
5809 (dolist (var '(mail-mode-hook mail-send-hook mail-setup-hook
5810 mail-yank-hooks mail-archive-file-name
5811 mail-default-reply-to mail-mailing-lists
5e1d4968 5812 mail-self-blind))
3d68fa99
CY
5813 (and (boundp var)
5814 (symbol-value var)
5815 (push var warn-vars)))
5816 (when warn-vars
5817 (display-warning 'mail
5818 (format "\
5819The default mail mode is now Message mode.
5820You have the following Mail mode variable%s customized:
5821\n %s\n\nTo use Mail mode, set `mail-user-agent' to sendmail-user-agent.
7f0b7b3e 5822To disable this warning, set `compose-mail-user-agent-warnings' to nil."
3d68fa99
CY
5823 (if (> (length warn-vars) 1) "s" "")
5824 (mapconcat 'symbol-name
5825 warn-vars " "))))))
5826
676b1a74
CY
5827 (let ((function (get mail-user-agent 'composefunc)))
5828 (funcall function to subject other-headers continue
5829 switch-function yank-action send-actions)))
b5f019be
RS
5830
5831(defun compose-mail-other-window (&optional to subject other-headers continue
5832 yank-action send-actions)
5833 "Like \\[compose-mail], but edit the outgoing message in another window."
5834 (interactive
5835 (list nil nil nil current-prefix-arg))
5836 (compose-mail to subject other-headers continue
5837 'switch-to-buffer-other-window yank-action send-actions))
5838
5839
5840(defun compose-mail-other-frame (&optional to subject other-headers continue
5841 yank-action send-actions)
5842 "Like \\[compose-mail], but edit the outgoing message in another frame."
5843 (interactive
5844 (list nil nil nil current-prefix-arg))
5845 (compose-mail to subject other-headers continue
5846 'switch-to-buffer-other-frame yank-action send-actions))
56abefac 5847\f
610c1c68 5848(defvar set-variable-value-history nil
987ec16d
EZ
5849 "History of values entered with `set-variable'.
5850
5851Maximum length of the history list is determined by the value
5852of `history-length', which see.")
610c1c68 5853
d6281b4e 5854(defun set-variable (variable value &optional make-local)
610c1c68 5855 "Set VARIABLE to VALUE. VALUE is a Lisp object.
d6281b4e
RS
5856VARIABLE should be a user option variable name, a Lisp variable
5857meant to be customized by users. You should enter VALUE in Lisp syntax,
5858so if you want VALUE to be a string, you must surround it with doublequotes.
610c1c68
RS
5859VALUE is used literally, not evaluated.
5860
5861If VARIABLE has a `variable-interactive' property, that is used as if
5862it were the arg to `interactive' (which see) to interactively read VALUE.
5863
5864If VARIABLE has been defined with `defcustom', then the type information
16236388
RS
5865in the definition is used to check that VALUE is valid.
5866
5867With a prefix argument, set VARIABLE to VALUE buffer-locally."
e9dfb72e
RS
5868 (interactive
5869 (let* ((default-var (variable-at-point))
7fd0ef0d
JL
5870 (var (if (user-variable-p default-var)
5871 (read-variable (format "Set variable (default %s): " default-var)
5872 default-var)
5873 (read-variable "Set variable: ")))
6b61353c
KH
5874 (minibuffer-help-form '(describe-variable var))
5875 (prop (get var 'variable-interactive))
0684376b
JB
5876 (obsolete (car (get var 'byte-obsolete-variable)))
5877 (prompt (format "Set %s %s to value: " var
6b61353c 5878 (cond ((local-variable-p var)
0684376b 5879 "(buffer-local)")
6b61353c
KH
5880 ((or current-prefix-arg
5881 (local-variable-if-set-p var))
0684376b
JB
5882 "buffer-locally")
5883 (t "globally"))))
5884 (val (progn
5885 (when obsolete
5886 (message (concat "`%S' is obsolete; "
5887 (if (symbolp obsolete) "use `%S' instead" "%s"))
5888 var obsolete)
5889 (sit-for 3))
5890 (if prop
5891 ;; Use VAR's `variable-interactive' property
5892 ;; as an interactive spec for prompting.
5893 (call-interactively `(lambda (arg)
5894 (interactive ,prop)
5895 arg))
5896 (read
5897 (read-string prompt nil
7fd0ef0d
JL
5898 'set-variable-value-history
5899 (format "%S" (symbol-value var))))))))
6b61353c 5900 (list var val current-prefix-arg)))
610c1c68 5901
d6281b4e
RS
5902 (and (custom-variable-p variable)
5903 (not (get variable 'custom-type))
5904 (custom-load-symbol variable))
5905 (let ((type (get variable 'custom-type)))
610c1c68
RS
5906 (when type
5907 ;; Match with custom type.
36755dd9 5908 (require 'cus-edit)
610c1c68 5909 (setq type (widget-convert type))
d6281b4e 5910 (unless (widget-apply type :match value)
1e722f9f 5911 (error "Value `%S' does not match type %S of %S"
d6281b4e 5912 value (car type) variable))))
16236388
RS
5913
5914 (if make-local
d6281b4e 5915 (make-local-variable variable))
f1180544 5916
d6281b4e 5917 (set variable value)
a2aef080
GM
5918
5919 ;; Force a thorough redisplay for the case that the variable
5920 ;; has an effect on the display, like `tab-width' has.
5921 (force-mode-line-update))
56abefac 5922\f
e8a700bf
RS
5923;; Define the major mode for lists of completions.
5924
e2947429
SM
5925(defvar completion-list-mode-map
5926 (let ((map (make-sparse-keymap)))
5927 (define-key map [mouse-2] 'mouse-choose-completion)
5928 (define-key map [follow-link] 'mouse-face)
5929 (define-key map [down-mouse-2] nil)
5930 (define-key map "\C-m" 'choose-completion)
5931 (define-key map "\e\e\e" 'delete-completion-window)
5932 (define-key map [left] 'previous-completion)
5933 (define-key map [right] 'next-completion)
45f8cb0c 5934 (define-key map "q" 'quit-window)
e2947429 5935 map)
98b45886 5936 "Local map for completion list buffers.")
e8a700bf
RS
5937
5938;; Completion mode is suitable only for specially formatted data.
ac29eb79 5939(put 'completion-list-mode 'mode-class 'special)
e8a700bf 5940
98b45886
RS
5941(defvar completion-reference-buffer nil
5942 "Record the buffer that was current when the completion list was requested.
5943This is a local variable in the completion list buffer.
ec39964e 5944Initial value is nil to avoid some compiler warnings.")
3819736b 5945
83434bda
RS
5946(defvar completion-no-auto-exit nil
5947 "Non-nil means `choose-completion-string' should never exit the minibuffer.
f6714ede 5948This also applies to other functions such as `choose-completion'.")
83434bda 5949
d5e63715
SM
5950(defvar completion-base-position nil
5951 "Position of the base of the text corresponding to the shown completions.
5952This variable is used in the *Completions* buffers.
5953Its value is a list of the form (START END) where START is the place
5954where the completion should be inserted and END (if non-nil) is the end
5955of the text to replace. If END is nil, point is used instead.")
5956
98b45886 5957(defvar completion-base-size nil
3c59150d
CY
5958 "Number of chars before point not involved in completion.
5959This is a local variable in the completion list buffer.
5960It refers to the chars in the minibuffer if completing in the
5961minibuffer, or in `completion-reference-buffer' otherwise.
5962Only characters in the field at point are included.
5963
5964If nil, Emacs determines which part of the tail end of the
5965buffer's text is involved in completion by comparing the text
5966directly.")
d5e63715 5967(make-obsolete-variable 'completion-base-size 'completion-base-position "23.2")
f6b293e3 5968
1c6c6fde
RS
5969(defun delete-completion-window ()
5970 "Delete the completion list window.
5971Go to the window from which completion was requested."
5972 (interactive)
5973 (let ((buf completion-reference-buffer))
ddb2b181
RS
5974 (if (one-window-p t)
5975 (if (window-dedicated-p (selected-window))
5976 (delete-frame (selected-frame)))
5977 (delete-window (selected-window))
5978 (if (get-buffer-window buf)
5979 (select-window (get-buffer-window buf))))))
1c6c6fde 5980
dde69dbe
RS
5981(defun previous-completion (n)
5982 "Move to the previous item in the completion list."
5983 (interactive "p")
5984 (next-completion (- n)))
5985
5986(defun next-completion (n)
5987 "Move to the next item in the completion list.
1f238ac2 5988With prefix argument N, move N items (negative N means move backward)."
dde69dbe 5989 (interactive "p")
58dd38f1
SM
5990 (let ((beg (point-min)) (end (point-max)))
5991 (while (and (> n 0) (not (eobp)))
dde69dbe 5992 ;; If in a completion, move to the end of it.
58dd38f1
SM
5993 (when (get-text-property (point) 'mouse-face)
5994 (goto-char (next-single-property-change (point) 'mouse-face nil end)))
dde69dbe 5995 ;; Move to start of next one.
58dd38f1
SM
5996 (unless (get-text-property (point) 'mouse-face)
5997 (goto-char (next-single-property-change (point) 'mouse-face nil end)))
5998 (setq n (1- n)))
5999 (while (and (< n 0) (not (bobp)))
6000 (let ((prop (get-text-property (1- (point)) 'mouse-face)))
6001 ;; If in a completion, move to the start of it.
6002 (when (and prop (eq prop (get-text-property (point) 'mouse-face)))
b61a81c2 6003 (goto-char (previous-single-property-change
58dd38f1
SM
6004 (point) 'mouse-face nil beg)))
6005 ;; Move to end of the previous completion.
6006 (unless (or (bobp) (get-text-property (1- (point)) 'mouse-face))
6007 (goto-char (previous-single-property-change
6008 (point) 'mouse-face nil beg)))
6009 ;; Move to the start of that one.
6010 (goto-char (previous-single-property-change
6011 (point) 'mouse-face nil beg))
6012 (setq n (1+ n))))))
dde69dbe 6013
d5e63715
SM
6014(defun choose-completion (&optional event)
6015 "Choose the completion at point."
6016 (interactive (list last-nonmenu-event))
6017 ;; In case this is run via the mouse, give temporary modes such as
6018 ;; isearch a chance to turn off.
6019 (run-hooks 'mouse-leave-buffer-hook)
6020 (let (buffer base-size base-position choice)
6021 (with-current-buffer (window-buffer (posn-window (event-start event)))
6022 (setq buffer completion-reference-buffer)
6023 (setq base-size completion-base-size)
6024 (setq base-position completion-base-position)
6025 (save-excursion
6026 (goto-char (posn-point (event-start event)))
6027 (let (beg end)
6028 (if (and (not (eobp)) (get-text-property (point) 'mouse-face))
6029 (setq end (point) beg (1+ (point))))
6030 (if (and (not (bobp)) (get-text-property (1- (point)) 'mouse-face))
6031 (setq end (1- (point)) beg (point)))
6032 (if (null beg)
6033 (error "No completion here"))
6034 (setq beg (previous-single-property-change beg 'mouse-face))
6035 (setq end (or (next-single-property-change end 'mouse-face)
6036 (point-max)))
6037 (setq choice (buffer-substring-no-properties beg end)))))
6038
ab63960f 6039 (let ((owindow (selected-window)))
d5e63715 6040 (select-window (posn-window (event-start event)))
ab63960f 6041 (if (and (one-window-p t 'selected-frame)
d5e63715 6042 (window-dedicated-p (selected-window)))
ab63960f
RS
6043 ;; This is a special buffer's frame
6044 (iconify-frame (selected-frame))
6045 (or (window-dedicated-p (selected-window))
6046 (bury-buffer)))
8a7daef5
CY
6047 (select-window
6048 (or (and (buffer-live-p buffer)
d5e63715 6049 (get-buffer-window buffer 0))
8a7daef5 6050 owindow)))
f6714ede 6051
d5e63715
SM
6052 (choose-completion-string
6053 choice buffer
6054 (or base-position
6055 (when base-size
6056 ;; Someone's using old completion code that doesn't know
6057 ;; about base-position yet.
6058 (list (+ base-size (with-current-buffer buffer (field-beginning)))))
6059 ;; If all else fails, just guess.
6060 (with-current-buffer buffer
6061 (list (choose-completion-guess-base-position choice)))))))
80298193
RS
6062
6063;; Delete the longest partial match for STRING
6064;; that can be found before POINT.
d5e63715
SM
6065(defun choose-completion-guess-base-position (string)
6066 (save-excursion
6067 (let ((opoint (point))
6068 len)
6069 ;; Try moving back by the length of the string.
6070 (goto-char (max (- (point) (length string))
6071 (minibuffer-prompt-end)))
6072 ;; See how far back we were actually able to move. That is the
6073 ;; upper bound on how much we can match and delete.
6074 (setq len (- opoint (point)))
6075 (if completion-ignore-case
6076 (setq string (downcase string)))
6077 (while (and (> len 0)
6078 (let ((tail (buffer-substring (point) opoint)))
6079 (if completion-ignore-case
6080 (setq tail (downcase tail)))
6081 (not (string= tail (substring string 0 len)))))
6082 (setq len (1- len))
6083 (forward-char 1))
6084 (point))))
6085
80298193 6086(defun choose-completion-delete-max-match (string)
d5e63715
SM
6087 (delete-region (choose-completion-guess-base-position string) (point)))
6088(make-obsolete 'choose-completion-delete-max-match
6089 'choose-completion-guess-base-position "23.2")
80298193 6090
ba36181b 6091(defvar choose-completion-string-functions nil
bbbbb15b
KS
6092 "Functions that may override the normal insertion of a completion choice.
6093These functions are called in order with four arguments:
6094CHOICE - the string to insert in the buffer,
6095BUFFER - the buffer in which the choice should be inserted,
4837b516 6096MINI-P - non-nil if BUFFER is a minibuffer, and
12829a07
RS
6097BASE-SIZE - the number of characters in BUFFER before
6098the string being completed.
6099
bbbbb15b
KS
6100If a function in the list returns non-nil, that function is supposed
6101to have inserted the CHOICE in the BUFFER, and possibly exited
12829a07 6102the minibuffer; no further functions will be called.
ba36181b 6103
12829a07
RS
6104If all functions in the list return nil, that means to use
6105the default method of inserting the completion in BUFFER.")
74d0290b 6106
d5e63715 6107(defun choose-completion-string (choice &optional buffer base-position)
12829a07 6108 "Switch to BUFFER and insert the completion choice CHOICE.
d5e63715 6109BASE-POSITION, says where to insert the completion."
12829a07
RS
6110
6111 ;; If BUFFER is the minibuffer, exit the minibuffer
6112 ;; unless it is reading a file name and CHOICE is a directory,
6113 ;; or completion-no-auto-exit is non-nil.
6114
d5e63715
SM
6115 ;; Some older code may call us passing `base-size' instead of
6116 ;; `base-position'. It's difficult to make any use of `base-size',
6117 ;; so we just ignore it.
6118 (unless (consp base-position)
6119 (message "Obsolete `base-size' passed to choose-completion-string")
6120 (setq base-position nil))
6121
1a0d0b6a
JPW
6122 (let* ((buffer (or buffer completion-reference-buffer))
6123 (mini-p (minibufferp buffer)))
cf52ad58
RS
6124 ;; If BUFFER is a minibuffer, barf unless it's the currently
6125 ;; active minibuffer.
f436a90a 6126 (if (and mini-p
45486731
RS
6127 (or (not (active-minibuffer-window))
6128 (not (equal buffer
6129 (window-buffer (active-minibuffer-window))))))
cf52ad58 6130 (error "Minibuffer is not active for completion")
17aa3385
KS
6131 ;; Set buffer so buffer-local choose-completion-string-functions works.
6132 (set-buffer buffer)
f1180544 6133 (unless (run-hook-with-args-until-success
d99f8496 6134 'choose-completion-string-functions
d5e63715
SM
6135 ;; The fourth arg used to be `mini-p' but was useless
6136 ;; (since minibufferp can be used on the `buffer' arg)
6137 ;; and indeed unused. The last used to be `base-size', so we
6138 ;; keep it to try and avoid breaking old code.
6139 choice buffer base-position nil)
d99f8496 6140 ;; Insert the completion into the buffer where it was requested.
d5e63715
SM
6141 (delete-region (or (car base-position) (point))
6142 (or (cadr base-position) (point)))
bbbbb15b
KS
6143 (insert choice)
6144 (remove-text-properties (- (point) (length choice)) (point)
6145 '(mouse-face nil))
6146 ;; Update point in the window that BUFFER is showing in.
6147 (let ((window (get-buffer-window buffer t)))
6148 (set-window-point window (point)))
6149 ;; If completing for the minibuffer, exit it with this choice.
6150 (and (not completion-no-auto-exit)
6138158d 6151 (minibufferp buffer)
bbbbb15b
KS
6152 minibuffer-completion-table
6153 ;; If this is reading a file name, and the file name chosen
6154 ;; is a directory, don't exit the minibuffer.
85be9ec4
SM
6155 (let* ((result (buffer-substring (field-beginning) (point)))
6156 (bounds
6157 (completion-boundaries result minibuffer-completion-table
6158 minibuffer-completion-predicate
6159 "")))
6160 (if (eq (car bounds) (length result))
6161 ;; The completion chosen leads to a new set of completions
6162 ;; (e.g. it's a directory): don't exit the minibuffer yet.
6163 (let ((mini (active-minibuffer-window)))
6164 (select-window mini)
6165 (when minibuffer-auto-raise
6166 (raise-frame (window-frame mini))))
6167 (exit-minibuffer))))))))
80298193 6168
e2947429 6169(define-derived-mode completion-list-mode nil "Completion List"
e8a700bf 6170 "Major mode for buffers showing lists of possible completions.
80298193
RS
6171Type \\<completion-list-mode-map>\\[choose-completion] in the completion list\
6172 to select the completion near point.
6173Use \\<completion-list-mode-map>\\[mouse-choose-completion] to select one\
3a77346c
GM
6174 with the mouse.
6175
6176\\{completion-list-mode-map}"
e2947429 6177 (set (make-local-variable 'completion-base-size) nil))
e8a700bf 6178
c8d6d636
GM
6179(defun completion-list-mode-finish ()
6180 "Finish setup of the completions buffer.
6181Called from `temp-buffer-show-hook'."
6182 (when (eq major-mode 'completion-list-mode)
6183 (toggle-read-only 1)))
6184
6185(add-hook 'temp-buffer-show-hook 'completion-list-mode-finish)
6186
f5fab556
MY
6187
6188;; Variables and faces used in `completion-setup-function'.
747a0e2f 6189
d0fd0916
JPW
6190(defcustom completion-show-help t
6191 "Non-nil means show help message in *Completions* buffer."
6192 :type 'boolean
6193 :version "22.1"
6194 :group 'completion)
6195
f5fab556
MY
6196;; This function goes in completion-setup-hook, so that it is called
6197;; after the text of the completion list buffer is written.
e8a700bf 6198(defun completion-setup-function ()
1b5fd09e 6199 (let* ((mainbuf (current-buffer))
a9e3ff69
SM
6200 (base-dir
6201 ;; When reading a file name in the minibuffer,
6202 ;; try and find the right default-directory to set in the
6203 ;; completion list buffer.
6204 ;; FIXME: Why do we do that, actually? --Stef
6205 (if minibuffer-completing-file-name
6206 (file-name-as-directory
6207 (expand-file-name
6208 (substring (minibuffer-completion-contents)
6209 0 (or completion-base-size 0)))))))
621a3f62 6210 (with-current-buffer standard-output
d5e63715
SM
6211 (let ((base-size completion-base-size) ;Read before killing localvars.
6212 (base-position completion-base-position))
e2947429 6213 (completion-list-mode)
d5e63715
SM
6214 (set (make-local-variable 'completion-base-size) base-size)
6215 (set (make-local-variable 'completion-base-position) base-position))
1b5fd09e 6216 (set (make-local-variable 'completion-reference-buffer) mainbuf)
a9e3ff69 6217 (if base-dir (setq default-directory base-dir))
d0fd0916
JPW
6218 ;; Maybe insert help string.
6219 (when completion-show-help
6220 (goto-char (point-min))
6221 (if (display-mouse-p)
6222 (insert (substitute-command-keys
6223 "Click \\[mouse-choose-completion] on a completion to select it.\n")))
6224 (insert (substitute-command-keys
6225 "In this buffer, type \\[choose-completion] to \
6226select the completion near point.\n\n"))))))
c88ab9ce 6227
e8a700bf 6228(add-hook 'completion-setup-hook 'completion-setup-function)
dde69dbe 6229
1b5fd09e
SM
6230(define-key minibuffer-local-completion-map [prior] 'switch-to-completions)
6231(define-key minibuffer-local-completion-map "\M-v" 'switch-to-completions)
dde69dbe
RS
6232
6233(defun switch-to-completions ()
6234 "Select the completion list window."
6235 (interactive)
ab14d7d5 6236 (let ((window (or (get-buffer-window "*Completions*" 0)
042b7cc6 6237 ;; Make sure we have a completions window.
ab14d7d5
SM
6238 (progn (minibuffer-completion-help)
6239 (get-buffer-window "*Completions*" 0)))))
fdbd7c4d
KH
6240 (when window
6241 (select-window window)
042b7cc6
JL
6242 ;; In the new buffer, go to the first completion.
6243 ;; FIXME: Perhaps this should be done in `minibuffer-completion-help'.
6244 (when (bobp)
6245 (next-completion 1)))))
f6039de6
JL
6246\f
6247;;; Support keyboard commands to turn on various modifiers.
82072f33
RS
6248
6249;; These functions -- which are not commands -- each add one modifier
6250;; to the following event.
6251
6252(defun event-apply-alt-modifier (ignore-prompt)
1e96c007 6253 "\\<function-key-map>Add the Alt modifier to the following event.
70cf9f08 6254For example, type \\[event-apply-alt-modifier] & to enter Alt-&."
82072f33
RS
6255 (vector (event-apply-modifier (read-event) 'alt 22 "A-")))
6256(defun event-apply-super-modifier (ignore-prompt)
1e96c007 6257 "\\<function-key-map>Add the Super modifier to the following event.
70cf9f08 6258For example, type \\[event-apply-super-modifier] & to enter Super-&."
82072f33
RS
6259 (vector (event-apply-modifier (read-event) 'super 23 "s-")))
6260(defun event-apply-hyper-modifier (ignore-prompt)
1e96c007 6261 "\\<function-key-map>Add the Hyper modifier to the following event.
70cf9f08 6262For example, type \\[event-apply-hyper-modifier] & to enter Hyper-&."
82072f33
RS
6263 (vector (event-apply-modifier (read-event) 'hyper 24 "H-")))
6264(defun event-apply-shift-modifier (ignore-prompt)
1e96c007 6265 "\\<function-key-map>Add the Shift modifier to the following event.
70cf9f08 6266For example, type \\[event-apply-shift-modifier] & to enter Shift-&."
82072f33
RS
6267 (vector (event-apply-modifier (read-event) 'shift 25 "S-")))
6268(defun event-apply-control-modifier (ignore-prompt)
1e96c007 6269 "\\<function-key-map>Add the Ctrl modifier to the following event.
70cf9f08 6270For example, type \\[event-apply-control-modifier] & to enter Ctrl-&."
82072f33
RS
6271 (vector (event-apply-modifier (read-event) 'control 26 "C-")))
6272(defun event-apply-meta-modifier (ignore-prompt)
1e96c007 6273 "\\<function-key-map>Add the Meta modifier to the following event.
70cf9f08 6274For example, type \\[event-apply-meta-modifier] & to enter Meta-&."
82072f33
RS
6275 (vector (event-apply-modifier (read-event) 'meta 27 "M-")))
6276
6277(defun event-apply-modifier (event symbol lshiftby prefix)
6278 "Apply a modifier flag to event EVENT.
6279SYMBOL is the name of this modifier, as a symbol.
6280LSHIFTBY is the numeric value of this modifier, in keyboard events.
6281PREFIX is the string that represents this modifier in an event type symbol."
6282 (if (numberp event)
6283 (cond ((eq symbol 'control)
90bebcb0
KH
6284 (if (and (<= (downcase event) ?z)
6285 (>= (downcase event) ?a))
82072f33 6286 (- (downcase event) ?a -1)
90bebcb0
KH
6287 (if (and (<= (downcase event) ?Z)
6288 (>= (downcase event) ?A))
82072f33
RS
6289 (- (downcase event) ?A -1)
6290 (logior (lsh 1 lshiftby) event))))
6291 ((eq symbol 'shift)
6292 (if (and (<= (downcase event) ?z)
6293 (>= (downcase event) ?a))
6294 (upcase event)
6295 (logior (lsh 1 lshiftby) event)))
6296 (t
6297 (logior (lsh 1 lshiftby) event)))
6298 (if (memq symbol (event-modifiers event))
6299 event
6300 (let ((event-type (if (symbolp event) event (car event))))
6301 (setq event-type (intern (concat prefix (symbol-name event-type))))
6302 (if (symbolp event)
6303 event-type
6304 (cons event-type (cdr event)))))))
6305
e5fff738
KH
6306(define-key function-key-map [?\C-x ?@ ?h] 'event-apply-hyper-modifier)
6307(define-key function-key-map [?\C-x ?@ ?s] 'event-apply-super-modifier)
6308(define-key function-key-map [?\C-x ?@ ?m] 'event-apply-meta-modifier)
6309(define-key function-key-map [?\C-x ?@ ?a] 'event-apply-alt-modifier)
6310(define-key function-key-map [?\C-x ?@ ?S] 'event-apply-shift-modifier)
6311(define-key function-key-map [?\C-x ?@ ?c] 'event-apply-control-modifier)
f6039de6 6312\f
a3d1480b
JB
6313;;;; Keypad support.
6314
9b77469a
SM
6315;; Make the keypad keys act like ordinary typing keys. If people add
6316;; bindings for the function key symbols, then those bindings will
6317;; override these, so this shouldn't interfere with any existing
6318;; bindings.
a3d1480b 6319
0d173134 6320;; Also tell read-char how to handle these keys.
e1e04350 6321(mapc
a3d1480b
JB
6322 (lambda (keypad-normal)
6323 (let ((keypad (nth 0 keypad-normal))
6324 (normal (nth 1 keypad-normal)))
0d173134 6325 (put keypad 'ascii-character normal)
a3d1480b
JB
6326 (define-key function-key-map (vector keypad) (vector normal))))
6327 '((kp-0 ?0) (kp-1 ?1) (kp-2 ?2) (kp-3 ?3) (kp-4 ?4)
6328 (kp-5 ?5) (kp-6 ?6) (kp-7 ?7) (kp-8 ?8) (kp-9 ?9)
f33321ad 6329 (kp-space ?\s)
a3d1480b
JB
6330 (kp-tab ?\t)
6331 (kp-enter ?\r)
6332 (kp-multiply ?*)
6333 (kp-add ?+)
6334 (kp-separator ?,)
6335 (kp-subtract ?-)
6336 (kp-decimal ?.)
6337 (kp-divide ?/)
31cd2dd4
SM
6338 (kp-equal ?=)
6339 ;; Do the same for various keys that are represented as symbols under
6340 ;; GUIs but naturally correspond to characters.
6341 (backspace 127)
6342 (delete 127)
6343 (tab ?\t)
6344 (linefeed ?\n)
6345 (clear ?\C-l)
6346 (return ?\C-m)
6347 (escape ?\e)
6348 ))
f54b0d85 6349\f
1e722f9f 6350;;;;
b005abd5 6351;;;; forking a twin copy of a buffer.
1e722f9f 6352;;;;
b005abd5
SM
6353
6354(defvar clone-buffer-hook nil
6355 "Normal hook to run in the new buffer at the end of `clone-buffer'.")
6356
64663f06
SM
6357(defvar clone-indirect-buffer-hook nil
6358 "Normal hook to run in the new buffer at the end of `clone-indirect-buffer'.")
6359
b005abd5
SM
6360(defun clone-process (process &optional newname)
6361 "Create a twin copy of PROCESS.
6362If NEWNAME is nil, it defaults to PROCESS' name;
6363NEWNAME is modified by adding or incrementing <N> at the end as necessary.
6364If PROCESS is associated with a buffer, the new process will be associated
6365 with the current buffer instead.
6366Returns nil if PROCESS has already terminated."
6367 (setq newname (or newname (process-name process)))
6368 (if (string-match "<[0-9]+>\\'" newname)
6369 (setq newname (substring newname 0 (match-beginning 0))))
6370 (when (memq (process-status process) '(run stop open))
6371 (let* ((process-connection-type (process-tty-name process))
b005abd5
SM
6372 (new-process
6373 (if (memq (process-status process) '(open))
ed7069af
KS
6374 (let ((args (process-contact process t)))
6375 (setq args (plist-put args :name newname))
6376 (setq args (plist-put args :buffer
403ca8d9
KS
6377 (if (process-buffer process)
6378 (current-buffer))))
ed7069af 6379 (apply 'make-network-process args))
b005abd5
SM
6380 (apply 'start-process newname
6381 (if (process-buffer process) (current-buffer))
6382 (process-command process)))))
ed7069af
KS
6383 (set-process-query-on-exit-flag
6384 new-process (process-query-on-exit-flag process))
b005abd5
SM
6385 (set-process-inherit-coding-system-flag
6386 new-process (process-inherit-coding-system-flag process))
6387 (set-process-filter new-process (process-filter process))
6388 (set-process-sentinel new-process (process-sentinel process))
403ca8d9 6389 (set-process-plist new-process (copy-sequence (process-plist process)))
b005abd5
SM
6390 new-process)))
6391
b75b82ab 6392;; things to maybe add (currently partly covered by `funcall mode'):
b005abd5
SM
6393;; - syntax-table
6394;; - overlays
6395(defun clone-buffer (&optional newname display-flag)
6b61353c
KH
6396 "Create and return a twin copy of the current buffer.
6397Unlike an indirect buffer, the new buffer can be edited
6398independently of the old one (if it is not read-only).
6399NEWNAME is the name of the new buffer. It may be modified by
6400adding or incrementing <N> at the end as necessary to create a
6401unique buffer name. If nil, it defaults to the name of the
6402current buffer, with the proper suffix. If DISPLAY-FLAG is
6403non-nil, the new buffer is shown with `pop-to-buffer'. Trying to
6404clone a file-visiting buffer, or a buffer whose major mode symbol
6405has a non-nil `no-clone' property, results in an error.
6406
6407Interactively, DISPLAY-FLAG is t and NEWNAME is the name of the
6408current buffer with appropriate suffix. However, if a prefix
6409argument is given, then the command prompts for NEWNAME in the
6410minibuffer.
b005abd5 6411
b005abd5
SM
6412This runs the normal hook `clone-buffer-hook' in the new buffer
6413after it has been set up properly in other respects."
61acfe7f
RS
6414 (interactive
6415 (progn
6416 (if buffer-file-name
6417 (error "Cannot clone a file-visiting buffer"))
6418 (if (get major-mode 'no-clone)
6419 (error "Cannot clone a buffer in %s mode" mode-name))
f6039de6
JL
6420 (list (if current-prefix-arg
6421 (read-buffer "Name of new cloned buffer: " (current-buffer)))
61acfe7f 6422 t)))
b005abd5
SM
6423 (if buffer-file-name
6424 (error "Cannot clone a file-visiting buffer"))
6425 (if (get major-mode 'no-clone)
6426 (error "Cannot clone a buffer in %s mode" mode-name))
6427 (setq newname (or newname (buffer-name)))
6428 (if (string-match "<[0-9]+>\\'" newname)
6429 (setq newname (substring newname 0 (match-beginning 0))))
6430 (let ((buf (current-buffer))
6431 (ptmin (point-min))
6432 (ptmax (point-max))
6433 (pt (point))
6434 (mk (if mark-active (mark t)))
6435 (modified (buffer-modified-p))
6436 (mode major-mode)
6437 (lvars (buffer-local-variables))
6438 (process (get-buffer-process (current-buffer)))
6439 (new (generate-new-buffer (or newname (buffer-name)))))
6440 (save-restriction
6441 (widen)
6442 (with-current-buffer new
6443 (insert-buffer-substring buf)))
6444 (with-current-buffer new
6445 (narrow-to-region ptmin ptmax)
6446 (goto-char pt)
6447 (if mk (set-mark mk))
6448 (set-buffer-modified-p modified)
6449
6450 ;; Clone the old buffer's process, if any.
6451 (when process (clone-process process))
6452
6453 ;; Now set up the major mode.
6454 (funcall mode)
6455
6456 ;; Set up other local variables.
9ca2204b
JB
6457 (mapc (lambda (v)
6458 (condition-case () ;in case var is read-only
6459 (if (symbolp v)
6460 (makunbound v)
6461 (set (make-local-variable (car v)) (cdr v)))
6462 (error nil)))
6463 lvars)
b005abd5
SM
6464
6465 ;; Run any hooks (typically set up by the major mode
6466 ;; for cloning to work properly).
6467 (run-hooks 'clone-buffer-hook))
0a487199
SM
6468 (if display-flag
6469 ;; Presumably the current buffer is shown in the selected frame, so
6470 ;; we want to display the clone elsewhere.
6471 (let ((same-window-regexps nil)
6472 (same-window-buffer-names))
6473 (pop-to-buffer new)))
b005abd5
SM
6474 new))
6475
fa65f20b 6476
7e3afb04 6477(defun clone-indirect-buffer (newname display-flag &optional norecord)
fa65f20b
GM
6478 "Create an indirect buffer that is a twin copy of the current buffer.
6479
01ba9662 6480Give the indirect buffer name NEWNAME. Interactively, read NEWNAME
fa65f20b
GM
6481from the minibuffer when invoked with a prefix arg. If NEWNAME is nil
6482or if not called with a prefix arg, NEWNAME defaults to the current
6483buffer's name. The name is modified by adding a `<N>' suffix to it
1d2b0303
JB
6484or by incrementing the N in an existing suffix. Trying to clone a
6485buffer whose major mode symbol has a non-nil `no-clone-indirect'
6486property results in an error.
fa65f20b
GM
6487
6488DISPLAY-FLAG non-nil means show the new buffer with `pop-to-buffer'.
7e3afb04
GM
6489This is always done when called interactively.
6490
f33321ad 6491Optional third arg NORECORD non-nil means do not put this buffer at the
7e3afb04 6492front of the list of recently selected ones."
61acfe7f
RS
6493 (interactive
6494 (progn
6495 (if (get major-mode 'no-clone-indirect)
6496 (error "Cannot indirectly clone a buffer in %s mode" mode-name))
6497 (list (if current-prefix-arg
f6039de6 6498 (read-buffer "Name of indirect buffer: " (current-buffer)))
61acfe7f
RS
6499 t)))
6500 (if (get major-mode 'no-clone-indirect)
6501 (error "Cannot indirectly clone a buffer in %s mode" mode-name))
fa65f20b
GM
6502 (setq newname (or newname (buffer-name)))
6503 (if (string-match "<[0-9]+>\\'" newname)
6504 (setq newname (substring newname 0 (match-beginning 0))))
6505 (let* ((name (generate-new-buffer-name newname))
6506 (buffer (make-indirect-buffer (current-buffer) name t)))
64663f06
SM
6507 (with-current-buffer buffer
6508 (run-hooks 'clone-indirect-buffer-hook))
fa65f20b 6509 (when display-flag
58dd38f1 6510 (pop-to-buffer buffer norecord))
fa65f20b
GM
6511 buffer))
6512
6513
1fffd65f
RS
6514(defun clone-indirect-buffer-other-window (newname display-flag &optional norecord)
6515 "Like `clone-indirect-buffer' but display in another window."
2ef0a47e
RS
6516 (interactive
6517 (progn
6518 (if (get major-mode 'no-clone-indirect)
6519 (error "Cannot indirectly clone a buffer in %s mode" mode-name))
6520 (list (if current-prefix-arg
f6039de6 6521 (read-buffer "Name of indirect buffer: " (current-buffer)))
2ef0a47e 6522 t)))
acd39eb6 6523 (let ((pop-up-windows t))
1fffd65f 6524 (clone-indirect-buffer newname display-flag norecord)))
7e3afb04 6525
f54b0d85 6526\f
1d4b11bf
GM
6527;;; Handling of Backspace and Delete keys.
6528
30a2fded 6529(defcustom normal-erase-is-backspace 'maybe
3784ec80 6530 "Set the default behavior of the Delete and Backspace keys.
30a2fded
KL
6531
6532If set to t, Delete key deletes forward and Backspace key deletes
6533backward.
6534
6535If set to nil, both Delete and Backspace keys delete backward.
6536
6537If set to 'maybe (which is the default), Emacs automatically
3784ec80 6538selects a behavior. On window systems, the behavior depends on
30a2fded
KL
6539the keyboard used. If the keyboard has both a Backspace key and
6540a Delete key, and both are mapped to their usual meanings, the
6541option's default value is set to t, so that Backspace can be used
6542to delete backward, and Delete can be used to delete forward.
6543
6544If not running under a window system, customizing this option
6545accomplishes a similar effect by mapping C-h, which is usually
6546generated by the Backspace key, to DEL, and by mapping DEL to C-d
6547via `keyboard-translate'. The former functionality of C-h is
6548available on the F1 key. You should probably not use this
6549setting if you don't have both Backspace, Delete and F1 keys.
f060b834
GM
6550
6551Setting this variable with setq doesn't take effect. Programmatically,
7f62656b 6552call `normal-erase-is-backspace-mode' (which see) instead."
30a2fded
KL
6553 :type '(choice (const :tag "Off" nil)
6554 (const :tag "Maybe" maybe)
6555 (other :tag "On" t))
1d4b11bf
GM
6556 :group 'editing-basics
6557 :version "21.1"
6558 :set (lambda (symbol value)
6559 ;; The fboundp is because of a problem with :set when
6560 ;; dumping Emacs. It doesn't really matter.
7f62656b
EZ
6561 (if (fboundp 'normal-erase-is-backspace-mode)
6562 (normal-erase-is-backspace-mode (or value 0))
1d4b11bf
GM
6563 (set-default symbol value))))
6564
30a2fded
KL
6565(defun normal-erase-is-backspace-setup-frame (&optional frame)
6566 "Set up `normal-erase-is-backspace-mode' on FRAME, if necessary."
6567 (unless frame (setq frame (selected-frame)))
6568 (with-selected-frame frame
ed8dad6b 6569 (unless (terminal-parameter nil 'normal-erase-is-backspace)
08ea6d2f
SM
6570 (normal-erase-is-backspace-mode
6571 (if (if (eq normal-erase-is-backspace 'maybe)
6572 (and (not noninteractive)
6573 (or (memq system-type '(ms-dos windows-nt))
79cb9c05 6574 (memq window-system '(ns))
08ea6d2f
SM
6575 (and (memq window-system '(x))
6576 (fboundp 'x-backspace-delete-keys-p)
6577 (x-backspace-delete-keys-p))
6578 ;; If the terminal Emacs is running on has erase char
6579 ;; set to ^H, use the Backspace key for deleting
6580 ;; backward, and the Delete key for deleting forward.
6581 (and (null window-system)
6582 (eq tty-erase-char ?\^H))))
6583 normal-erase-is-backspace)
6584 1 0)))))
1d4b11bf 6585
80ac5d4d 6586(define-minor-mode normal-erase-is-backspace-mode
7f62656b
EZ
6587 "Toggle the Erase and Delete mode of the Backspace and Delete keys.
6588
1d2b0303 6589With numeric ARG, turn the mode on if and only if ARG is positive.
7f62656b 6590
30a2fded
KL
6591On window systems, when this mode is on, Delete is mapped to C-d
6592and Backspace is mapped to DEL; when this mode is off, both
6593Delete and Backspace are mapped to DEL. (The remapping goes via
6594`local-function-key-map', so binding Delete or Backspace in the
6595global or local keymap will override that.)
7f62656b
EZ
6596
6597In addition, on window systems, the bindings of C-Delete, M-Delete,
6598C-M-Delete, C-Backspace, M-Backspace, and C-M-Backspace are changed in
6599the global keymap in accordance with the functionality of Delete and
6600Backspace. For example, if Delete is remapped to C-d, which deletes
6601forward, C-Delete is bound to `kill-word', but if Delete is remapped
6602to DEL, which deletes backward, C-Delete is bound to
6603`backward-kill-word'.
6604
6605If not running on a window system, a similar effect is accomplished by
6606remapping C-h (normally produced by the Backspace key) and DEL via
6607`keyboard-translate': if this mode is on, C-h is mapped to DEL and DEL
6608to C-d; if it's off, the keys are not remapped.
6609
6610When not running on a window system, and this mode is turned on, the
6611former functionality of C-h is available on the F1 key. You should
6612probably not turn on this mode on a text-only terminal if you don't
6613have both Backspace, Delete and F1 keys.
6614
6615See also `normal-erase-is-backspace'."
80ac5d4d
SM
6616 :variable (eq (terminal-parameter
6617 nil 'normal-erase-is-backspace) 1)
6618 (let ((enabled (eq 1 (terminal-parameter
6619 nil 'normal-erase-is-backspace))))
0103b7c9 6620
9e2a2647 6621 (cond ((or (memq window-system '(x w32 ns pc))
0103b7c9
KL
6622 (memq system-type '(ms-dos windows-nt)))
6623 (let* ((bindings
411c0104 6624 `(([M-delete] [M-backspace])
0103b7c9 6625 ([C-M-delete] [C-M-backspace])
28a90c44 6626 ([?\e C-delete] [?\e C-backspace])))
0103b7c9
KL
6627 (old-state (lookup-key local-function-key-map [delete])))
6628
6629 (if enabled
6630 (progn
6631 (define-key local-function-key-map [delete] [?\C-d])
6632 (define-key local-function-key-map [kp-delete] [?\C-d])
28a90c44
SM
6633 (define-key local-function-key-map [backspace] [?\C-?])
6634 (dolist (b bindings)
6635 ;; Not sure if input-decode-map is really right, but
6636 ;; keyboard-translate-table (used below) only works
6637 ;; for integer events, and key-translation-table is
6638 ;; global (like the global-map, used earlier).
6639 (define-key input-decode-map (car b) nil)
6640 (define-key input-decode-map (cadr b) nil)))
0103b7c9
KL
6641 (define-key local-function-key-map [delete] [?\C-?])
6642 (define-key local-function-key-map [kp-delete] [?\C-?])
28a90c44
SM
6643 (define-key local-function-key-map [backspace] [?\C-?])
6644 (dolist (b bindings)
6645 (define-key input-decode-map (car b) (cadr b))
6646 (define-key input-decode-map (cadr b) (car b))))))
0103b7c9
KL
6647 (t
6648 (if enabled
ec9f4754 6649 (progn
0103b7c9
KL
6650 (keyboard-translate ?\C-h ?\C-?)
6651 (keyboard-translate ?\C-? ?\C-d))
6652 (keyboard-translate ?\C-h ?\C-h)
6653 (keyboard-translate ?\C-? ?\C-?))))
6654
32226619 6655 (if (called-interactively-p 'interactive)
0103b7c9 6656 (message "Delete key deletes %s"
b08016f2 6657 (if (eq 1 (terminal-parameter nil 'normal-erase-is-backspace))
0103b7c9 6658 "forward" "backward")))))
ea82f0df 6659\f
aca8bee5 6660(defvar vis-mode-saved-buffer-invisibility-spec nil
0f7df535 6661 "Saved value of `buffer-invisibility-spec' when Visible mode is on.")
7f62656b 6662
0f7df535
RS
6663(define-minor-mode visible-mode
6664 "Toggle Visible mode.
4837b516
GM
6665With argument ARG turn Visible mode on if ARG is positive, otherwise
6666turn it off.
1d4b11bf 6667
0f7df535 6668Enabling Visible mode makes all invisible text temporarily visible.
1d2b0303
JB
6669Disabling Visible mode turns off that effect. Visible mode works by
6670saving the value of `buffer-invisibility-spec' and setting it to nil."
4e57881d 6671 :lighter " Vis"
ab77efd0 6672 :group 'editing-basics
aca8bee5
SM
6673 (when (local-variable-p 'vis-mode-saved-buffer-invisibility-spec)
6674 (setq buffer-invisibility-spec vis-mode-saved-buffer-invisibility-spec)
6675 (kill-local-variable 'vis-mode-saved-buffer-invisibility-spec))
0f7df535 6676 (when visible-mode
aca8bee5
SM
6677 (set (make-local-variable 'vis-mode-saved-buffer-invisibility-spec)
6678 buffer-invisibility-spec)
6679 (setq buffer-invisibility-spec nil)))
4e57881d 6680\f
30ee26a9 6681;; Partial application of functions (similar to "currying").
a185548b 6682;; This function is here rather than in subr.el because it uses CL.
30ee26a9
EZ
6683(defun apply-partially (fun &rest args)
6684 "Return a function that is a partial application of FUN to ARGS.
6685ARGS is a list of the first N arguments to pass to FUN.
6686The result is a new function which does the same as FUN, except that
6687the first N arguments are fixed at the values with which this function
6688was called."
6689 (lexical-let ((fun fun) (args1 args))
6690 (lambda (&rest args2) (apply fun (append args1 args2)))))
6691\f
e1e04350 6692;; Minibuffer prompt stuff.
9b350152 6693
49c14a05
GM
6694;(defun minibuffer-prompt-modification (start end)
6695; (error "You cannot modify the prompt"))
6696;
6697;
6698;(defun minibuffer-prompt-insertion (start end)
6699; (let ((inhibit-modification-hooks t))
6700; (delete-region start end)
6701; ;; Discard undo information for the text insertion itself
6702; ;; and for the text deletion.above.
6703; (when (consp buffer-undo-list)
6704; (setq buffer-undo-list (cddr buffer-undo-list)))
6705; (message "You cannot modify the prompt")))
6706;
6707;
f1180544 6708;(setq minibuffer-prompt-properties
49c14a05
GM
6709; (list 'modification-hooks '(minibuffer-prompt-modification)
6710; 'insert-in-front-hooks '(minibuffer-prompt-insertion)))
f1180544 6711;
9b350152 6712
a2603048
GM
6713\f
6714;;;; Problematic external packages.
6715
6716;; rms says this should be done by specifying symbols that define
6717;; versions together with bad values. This is therefore not as
6718;; flexible as it could be. See the thread:
6719;; http://lists.gnu.org/archive/html/emacs-devel/2007-08/msg00300.html
6720(defconst bad-packages-alist
6721 ;; Not sure exactly which semantic versions have problems.
6722 ;; Definitely 2.0pre3, probably all 2.0pre's before this.
7796ee61 6723 '((semantic semantic-version "\\`2\\.0pre[1-3]\\'"
a2603048 6724 "The version of `semantic' loaded does not work in Emacs 22.
72d595b5
GM
6725It can cause constant high CPU load.
6726Upgrade to at least Semantic 2.0pre4 (distributed with CEDET 1.0pre4).")
a2603048
GM
6727 ;; CUA-mode does not work with GNU Emacs version 22.1 and newer.
6728 ;; Except for version 1.2, all of the 1.x and 2.x version of cua-mode
6729 ;; provided the `CUA-mode' feature. Since this is no longer true,
6730 ;; we can warn the user if the `CUA-mode' feature is ever provided.
6731 (CUA-mode t nil
6732"CUA-mode is now part of the standard GNU Emacs distribution,
6733so you can now enable CUA via the Options menu or by customizing `cua-mode'.
6734
6735You have loaded an older version of CUA-mode which does not work
6736correctly with this version of Emacs. You should remove the old
6737version and use the one distributed with Emacs."))
6738 "Alist of packages known to cause problems in this version of Emacs.
6739Each element has the form (PACKAGE SYMBOL REGEXP STRING).
6740PACKAGE is either a regular expression to match file names, or a
6741symbol (a feature name); see the documentation of
6742`after-load-alist', to which this variable adds functions.
6743SYMBOL is either the name of a string variable, or `t'. Upon
6744loading PACKAGE, if SYMBOL is t or matches REGEXP, display a
6745warning using STRING as the message.")
6746
6747(defun bad-package-check (package)
6748 "Run a check using the element from `bad-packages-alist' matching PACKAGE."
6749 (condition-case nil
6750 (let* ((list (assoc package bad-packages-alist))
6751 (symbol (nth 1 list)))
6752 (and list
6753 (boundp symbol)
6754 (or (eq symbol t)
6755 (and (stringp (setq symbol (eval symbol)))
9bc505ab
JB
6756 (string-match-p (nth 2 list) symbol)))
6757 (display-warning package (nth 3 list) :warning)))
a2603048
GM
6758 (error nil)))
6759
6760(mapc (lambda (elem)
6761 (eval-after-load (car elem) `(bad-package-check ',(car elem))))
6762 bad-packages-alist)
6763
6764
00398e3b 6765(provide 'simple)
6b61353c 6766
621a3f62 6767;; arch-tag: 24af67c0-2a49-44f6-b3b1-312d8b570dfd
c88ab9ce 6768;;; simple.el ends here