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