X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/681ce5d2510a90d537129cea42af86cf1cc11186..34cba8e885f2ed1c0e9c805ad89b9464e0b5766a:/lisp/simple.el diff --git a/lisp/simple.el b/lisp/simple.el index 62941d01a9..36d2d0b3a1 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -2,7 +2,7 @@ ;; Copyright (C) 1985-1987, 1993-2014 Free Software Foundation, Inc. -;; Maintainer: FSF +;; Maintainer: emacs-devel@gnu.org ;; Keywords: internal ;; Package: emacs @@ -383,8 +383,9 @@ If option `use-hard-newlines' is non-nil, the newline is marked with the text-property `hard'. With ARG, insert that many newlines. -To turn off indentation by this command, disable Electric Indent mode -\(see \\[electric-indent-mode]). +If `electric-indent-mode' is enabled, this indents the final new line +that it adds, and reindents the preceding line. To just insert +a newline, use \\[electric-indent-just-newline]. Calls `auto-fill-function' if the current column number is greater than the value of `fill-column' and ARG is nil. @@ -610,7 +611,7 @@ In some text modes, where TAB inserts a tab, this command indents to the column specified by the function `current-left-margin'." (interactive "*") (delete-horizontal-space t) - (newline 1 t) + (newline nil t) (indent-according-to-mode)) (defun reindent-then-newline-and-indent () @@ -641,7 +642,7 @@ column specified by the function `current-left-margin'." (indent-according-to-mode))) (defcustom read-quoted-char-radix 8 - "*Radix for \\[quoted-insert] and other uses of `read-quoted-char'. + "Radix for \\[quoted-insert] and other uses of `read-quoted-char'. Legitimate radix values are 8, 10 and 16." :type '(choice (const 8) (const 10) (const 16)) :group 'editing-basics) @@ -738,6 +739,9 @@ useful for editing binary files." ;; (>= char ?\240) ;; (<= char ?\377)) ;; (setq char (unibyte-char-to-multibyte char))) + (unless (characterp char) + (user-error "%s is not a valid character" + (key-description (vector char)))) (if (> arg 0) (if (eq overwrite-mode 'overwrite-mode-binary) (delete-char arg))) @@ -794,7 +798,8 @@ If BACKWARD-ONLY is non-nil, only delete them before point." (defun just-one-space (&optional n) "Delete all spaces and tabs around point, leaving one space (or N spaces). -If N is negative, delete newlines as well, leaving -N spaces." +If N is negative, delete newlines as well, leaving -N spaces. +See also `cycle-spacing'." (interactive "*p") (cycle-spacing n nil t)) @@ -805,31 +810,22 @@ position and original spacing around the point in this variable.") (defun cycle-spacing (&optional n preserve-nl-back single-shot) - "Manipulate spaces around the point in a smart way. + "Manipulate whitespace around point in a smart way. +In interactive use, this function behaves differently in successive +consecutive calls. -When run as an interactive command, the first time it's called -in a sequence, deletes all spaces and tabs around point leaving -one (or N spaces). If this does not change content of the -buffer, skips to the second step: +The first call in a sequence acts like `just-one-space'. +It deletes all spaces and tabs around point, leaving one space +\(or N spaces). N is the prefix argument. If N is negative, +it deletes newlines as well, leaving -N spaces. +\(If PRESERVE-NL-BACK is non-nil, it does not delete newlines before point.) -When run for the second time in a sequence, deletes all the -spaces it has previously inserted. +The second call in a sequence (or the first call if the above does +not result in any changes) deletes all spaces. -When run for the third time, returns the whitespace and point in -a state encountered when it had been run for the first time. +The third call in a sequence restores the original whitespace (and point). -For example, if buffer contains \"foo ^ bar\" with \"^\" denoting the -point, calling `cycle-spacing' command will replace two spaces with -a single space, calling it again immediately after, will remove all -spaces, and calling it for the third time will bring two spaces back -together. - -If N is negative, delete newlines as well. However, if -PRESERVE-NL-BACK is t new line characters prior to the point -won't be removed. - -If SINGLE-SHOT is non-nil, will only perform the first step. In -other words, it will work just like `just-one-space' command." +If SINGLE-SHOT is non-nil, it only performs the first step in the sequence." (interactive "*p") (let ((orig-pos (point)) (skip-characters (if (and n (< n 0)) " \t\n\r" " \t")) @@ -1013,6 +1009,7 @@ KILLFLAG is set if N was explicitly specified." ;; Otherwise, do simple deletion. (t (delete-char n killflag)))) +(put 'delete-forward-char 'interactive-only 'delete-char) (defun mark-whole-buffer () "Put point at beginning and mark at end of buffer. @@ -1387,7 +1384,6 @@ display the result of expression evaluation." (lambda () (add-hook 'completion-at-point-functions #'lisp-completion-at-point nil t) - (eldoc-mode 1) (run-hooks 'eval-expression-minibuffer-setup-hook)) (read-from-minibuffer prompt initial-contents read-expression-map t @@ -1397,17 +1393,21 @@ display the result of expression evaluation." ;; for the sake of completion of names like eval-region, eval-buffer. (defun eval-expression (exp &optional insert-value) "Evaluate EXP and print value in the echo area. -When called interactively, read an Emacs Lisp expression and -evaluate it. +When called interactively, read an Emacs Lisp expression and evaluate it. Value is also consed on to front of the variable `values'. -Optional argument INSERT-VALUE non-nil (interactively, -with prefix argument) means insert the result into the current buffer -instead of printing it in the echo area. With a zero prefix arg, -insert the result with no limit on the length and level of lists, -and include additional formats for integers (octal, hexadecimal, -and character). Truncates long output according to the value -of the variables `eval-expression-print-length' -and `eval-expression-print-level'. +Optional argument INSERT-VALUE non-nil (interactively, with prefix +argument) means insert the result into the current buffer instead of +printing it in the echo area. + +Normally, this function truncates long output according to the value +of the variables `eval-expression-print-length' and +`eval-expression-print-level'. With a prefix argument of zero, +however, there is no such truncation. Such a prefix argument +also causes integers to be printed in several additional formats +\(octal, hexadecimal, and character). + +Runs the hook `eval-expression-minibuffer-setup-hook' on entering the +minibuffer. If `eval-expression-debug-on-error' is non-nil, which is the default, this command arranges for all errors to enter the debugger." @@ -1569,13 +1569,11 @@ If the value is non-nil and not a number, we wait 2 seconds." (defun execute-extended-command (prefixarg &optional command-name) ;; Based on Fexecute_extended_command in keyboard.c of Emacs. ;; Aaron S. Hawley 2009-08-24 - "Read function name, then read its arguments and call it. - -To pass a numeric argument to the command you are invoking, specify -the numeric argument to this command. - + "Read a command name, then read the arguments and call the command. +Interactively, to pass a prefix argument to the command you are +invoking, give a prefix argument to `execute-extended-command'. Noninteractively, the argument PREFIXARG is the prefix argument to -give to the command you invoke, if it asks for an argument." +give to the command you invoke." (interactive (list current-prefix-arg (read-extended-command))) ;; Emacs<24 calling-convention was with a single `prefixarg' argument. (if (null command-name) @@ -1630,36 +1628,37 @@ a special event, so ignore the prefix argument and don't clear it." (prog1 prefix-arg (setq current-prefix-arg prefix-arg) (setq prefix-arg nil))))) - (and (symbolp cmd) - (get cmd 'disabled) - ;; FIXME: Weird calling convention! - (run-hooks 'disabled-command-function)) - (let ((final cmd)) - (while - (progn - (setq final (indirect-function final)) - (if (autoloadp final) - (setq final (autoload-do-load final cmd))))) - (cond - ((arrayp final) - ;; If requested, place the macro in the command history. For - ;; other sorts of commands, call-interactively takes care of this. - (when record-flag - (push `(execute-kbd-macro ,final ,prefixarg) command-history) - ;; Don't keep command history around forever. - (when (and (numberp history-length) (> history-length 0)) - (let ((cell (nthcdr history-length command-history))) - (if (consp cell) (setcdr cell nil))))) - (execute-kbd-macro final prefixarg)) - (t - ;; Pass `cmd' rather than `final', for the backtrace's sake. - (prog1 (call-interactively cmd record-flag keys) - (when (and (symbolp cmd) - (get cmd 'byte-obsolete-info) - (not (get cmd 'command-execute-obsolete-warned))) - (put cmd 'command-execute-obsolete-warned t) - (message "%s" (macroexp--obsolete-warning - cmd (get cmd 'byte-obsolete-info) "command"))))))))) + (if (and (symbolp cmd) + (get cmd 'disabled) + disabled-command-function) + ;; FIXME: Weird calling convention! + (run-hooks 'disabled-command-function) + (let ((final cmd)) + (while + (progn + (setq final (indirect-function final)) + (if (autoloadp final) + (setq final (autoload-do-load final cmd))))) + (cond + ((arrayp final) + ;; If requested, place the macro in the command history. For + ;; other sorts of commands, call-interactively takes care of this. + (when record-flag + (push `(execute-kbd-macro ,final ,prefixarg) command-history) + ;; Don't keep command history around forever. + (when (and (numberp history-length) (> history-length 0)) + (let ((cell (nthcdr history-length command-history))) + (if (consp cell) (setcdr cell nil))))) + (execute-kbd-macro final prefixarg)) + (t + ;; Pass `cmd' rather than `final', for the backtrace's sake. + (prog1 (call-interactively cmd record-flag keys) + (when (and (symbolp cmd) + (get cmd 'byte-obsolete-info) + (not (get cmd 'command-execute-obsolete-warned))) + (put cmd 'command-execute-obsolete-warned t) + (message "%s" (macroexp--obsolete-warning + cmd (get cmd 'byte-obsolete-info) "command")))))))))) (defvar minibuffer-history nil "Default minibuffer history list. @@ -2144,7 +2143,12 @@ as an argument limits undo to changes within the current region." ;; above when checking. (while (eq (car list) nil) (setq list (cdr list))) - (puthash list (if undo-in-region t pending-undo-list) + (puthash list + ;; Prevent identity mapping. This can happen if + ;; consecutive nils are erroneously in undo list. + (if (or undo-in-region (eq list pending-undo-list)) + t + pending-undo-list) undo-equiv-table)) ;; Don't specify a position in the undo record for the undo command. ;; Instead, undoing this should move point to where the change is. @@ -2291,20 +2295,38 @@ Return what remains of the list." (when (let ((apos (abs pos))) (or (< apos (point-min)) (> apos (point-max)))) (error "Changes to be undone are outside visible portion of buffer")) - (if (< pos 0) - (progn - (goto-char (- pos)) - (insert string)) - (goto-char pos) - ;; Now that we record marker adjustments - ;; (caused by deletion) for undo, - ;; we should always insert after markers, - ;; so that undoing the marker adjustments - ;; put the markers back in the right place. - (insert string) - (goto-char pos))) + (let (valid-marker-adjustments) + ;; Check that marker adjustments which were recorded + ;; with the (STRING . POS) record are still valid, ie + ;; the markers haven't moved. We check their validity + ;; before reinserting the string so as we don't need to + ;; mind marker insertion-type. + (while (and (markerp (car-safe (car list))) + (integerp (cdr-safe (car list)))) + (let* ((marker-adj (pop list)) + (m (car marker-adj))) + (and (eq (marker-buffer m) (current-buffer)) + (= pos m) + (push marker-adj valid-marker-adjustments)))) + ;; Insert string and adjust point + (if (< pos 0) + (progn + (goto-char (- pos)) + (insert string)) + (goto-char pos) + (insert string) + (goto-char pos)) + ;; Adjust the valid marker adjustments + (dolist (adj valid-marker-adjustments) + (set-marker (car adj) + (- (car adj) (cdr adj)))))) ;; (MARKER . OFFSET) means a marker MARKER was adjusted by OFFSET. (`(,(and marker (pred markerp)) . ,(and offset (pred integerp))) + (warn "Encountered %S entry in undo list with no matching (TEXT . POS) entry" + next) + ;; Even though these elements are not expected in the undo + ;; list, adjust them to be conservative for the 24.4 + ;; release. (Bug#16818) (when (marker-buffer marker) (set-marker marker (- marker offset) @@ -2343,8 +2365,6 @@ are ignored. If BEG and END are nil, all undo elements are used." (undo-make-selective-list (min beg end) (max beg end)) buffer-undo-list))) -(defvar undo-adjusted-markers) - (defun undo-make-selective-list (start end) "Return a list of undo elements for the region START to END. The elements come from `buffer-undo-list', but we keep only @@ -2353,7 +2373,6 @@ If we find an element that crosses an edge of this region, we stop and ignore all further elements." (let ((undo-list-copy (undo-copy-list buffer-undo-list)) (undo-list (list nil)) - undo-adjusted-markers some-rejected undo-elt temp-undo-list delta) (while undo-list-copy @@ -2363,15 +2382,30 @@ we stop and ignore all further elements." ;; This is a "was unmodified" element. ;; Keep it if we have kept everything thus far. (not some-rejected)) + ;; Skip over marker adjustments, instead relying on + ;; finding them after (TEXT . POS) elements + ((markerp (car-safe undo-elt)) + nil) (t (undo-elt-in-region undo-elt start end))))) (if keep-this (progn (setq end (+ end (cdr (undo-delta undo-elt)))) ;; Don't put two nils together in the list - (if (not (and (eq (car undo-list) nil) - (eq undo-elt nil))) - (setq undo-list (cons undo-elt undo-list)))) + (when (not (and (eq (car undo-list) nil) + (eq undo-elt nil))) + (setq undo-list (cons undo-elt undo-list)) + ;; If (TEXT . POS), "keep" its subsequent (MARKER + ;; . ADJUSTMENT) whose markers haven't moved. + (when (and (stringp (car-safe undo-elt)) + (integerp (cdr-safe undo-elt))) + (let ((list-i (cdr undo-list-copy))) + (while (markerp (car-safe (car list-i))) + (let* ((adj-elt (pop list-i)) + (m (car adj-elt))) + (and (eq (marker-buffer m) (current-buffer)) + (= (cdr undo-elt) m) + (push adj-elt undo-list)))))))) (if (undo-elt-crosses-region undo-elt start end) (setq undo-list-copy nil) (setq some-rejected t) @@ -2419,7 +2453,12 @@ we stop and ignore all further elements." (defun undo-elt-in-region (undo-elt start end) "Determine whether UNDO-ELT falls inside the region START ... END. -If it crosses the edge, we return nil." +If it crosses the edge, we return nil. + +Generally this function is not useful for determining +whether (MARKER . ADJUSTMENT) undo elements are in the region, +because markers can be arbitrarily relocated. Instead, pass the +marker adjustment's corresponding (TEXT . POS) element." (cond ((integerp undo-elt) (and (>= undo-elt start) (<= undo-elt end))) @@ -2430,19 +2469,10 @@ If it crosses the edge, we return nil." ((stringp (car undo-elt)) ;; (TEXT . POSITION) (and (>= (abs (cdr undo-elt)) start) - (< (abs (cdr undo-elt)) end))) + (<= (abs (cdr undo-elt)) end))) ((and (consp undo-elt) (markerp (car undo-elt))) - ;; This is a marker-adjustment element (MARKER . ADJUSTMENT). - ;; See if MARKER is inside the region. - (let ((alist-elt (assq (car undo-elt) undo-adjusted-markers))) - (unless alist-elt - (setq alist-elt (cons (car undo-elt) - (marker-position (car undo-elt)))) - (setq undo-adjusted-markers - (cons alist-elt undo-adjusted-markers))) - (and (cdr alist-elt) - (>= (cdr alist-elt) start) - (<= (cdr alist-elt) end)))) + ;; (MARKER . ADJUSTMENT) + (<= start (car undo-elt) end)) ((null (car undo-elt)) ;; (nil PROPERTY VALUE BEG . END) (let ((tail (nthcdr 3 undo-elt))) @@ -2557,52 +2587,49 @@ which is defined in the `warnings' library.\n") (defcustom password-word-equivalents '("password" "passphrase" "pass phrase" - "كلمة السر" ; ar - "গুপ্তশব্দ" ; as - "পাসওয়ার্ড" ; bn_IN - "contrasenya" ; ca - "heslo" ; cs - "adgangskode" ; da - "passwort" ; de - "pasvorto" ; eo - "contraseña" ; es - "pasahitza" ; eu - "salasana" ; fi - "mot de passe" ; fr - "પાસવર્ડ" ; gu - "ססמה" ; he - "शब्दकूट" ; hi - "lozinka" ; hr - "Jelszó: " ; hu - "パスワード" ; ja - "Пароль" ; kk - "ಗುಪ್ತಪದ" ; kn - "암호" ; ko - "ពាក្យសម្ងាត់" ; km - "slaptažodis" ; lt - "അടയാളവാക്ക്" ; ml - "गुप्तशब्द" ; mr - "passord" ; nb - "wachtwoord" ; nl - "ପ୍ରବେଶ ସଙ୍କେତ" ; or - "ਪਾਸਵਰਡ" ; pa - "hasło" ; pl - "senha" ; pt - "Пароль" ; ru - "රහස්පදය" ; si - "Heslo" ; sk - "geslo" ; sl - "lozinka" ; sr - "Лозинка" ; sr - "lösenord" ; sv - "கடவுச்சொல்" ; ta - "సంకేతపదము" ; te - "parola" ; tr - "Пароль" ; uk - "Mật khẩu" ; vi - "密码" ; zh_CN - "密碼" ; zh_TW - "iphasiwedi" ; zu + ; These are sorted according to the GNU en_US locale. + "암호" ; ko + "パスワード" ; ja + "ପ୍ରବେଶ ସଙ୍କେତ" ; or + "ពាក្យសម្ងាត់" ; km + "adgangskode" ; da + "contraseña" ; es + "contrasenya" ; ca + "geslo" ; sl + "hasło" ; pl + "heslo" ; cs, sk + "iphasiwedi" ; zu + "jelszó" ; hu + "lösenord" ; sv + "lozinka" ; hr, sr + "mật khẩu" ; vi + "mot de passe" ; fr + "parola" ; tr + "pasahitza" ; eu + "passord" ; nb + "passwort" ; de + "pasvorto" ; eo + "salasana" ; fi + "senha" ; pt + "slaptažodis" ; lt + "wachtwoord" ; nl + "كلمة السر" ; ar + "ססמה" ; he + "лозинка" ; sr + "пароль" ; kk, ru, uk + "गुप्तशब्द" ; mr + "शब्दकूट" ; hi + "પાસવર્ડ" ; gu + "సంకేతపదము" ; te + "ਪਾਸਵਰਡ" ; pa + "ಗುಪ್ತಪದ" ; kn + "கடவுச்சொல்" ; ta + "അടയാളവാക്ക്" ; ml + "গুপ্তশব্দ" ; as + "পাসওয়ার্ড" ; bn_IN + "රහස්පදය" ; si + "密码" ; zh_CN + "密碼" ; zh_TW ) "List of words equivalent to \"password\". This is used by Shell mode and other parts of Emacs to recognize @@ -3191,9 +3218,9 @@ subprocess is `default-directory'. File names in INFILE and BUFFER are handled normally, but file names in ARGS should be relative to `default-directory', as they -are passed to the process verbatim. \(This is a difference to +are passed to the process verbatim. (This is a difference to `call-process' which does not support file handlers for INFILE -and BUFFER.\) +and BUFFER.) Some file handlers might not support all variants, for example they might behave as if DISPLAY was nil, regardless of the actual @@ -3475,7 +3502,6 @@ extract characters that are special to a buffer, and should not be copied into other buffers." (funcall filter-buffer-substring-function beg end delete)) -;; FIXME: `with-wrapper-hook' is obsolete (defun buffer-substring--filter (beg end &optional delete) (with-wrapper-hook filter-buffer-substring-functions (beg end delete) (cond @@ -4114,7 +4140,7 @@ even beep.)" "Kill current line. With prefix ARG, kill that many lines starting from the current line. If ARG is negative, kill backward. Also kill the preceding newline. -\(This is meant to make \\[repeat] work well with negative arguments.\) +\(This is meant to make \\[repeat] work well with negative arguments.) If ARG is zero, kill current line but exclude the trailing newline." (interactive "p") (or arg (setq arg 1)) @@ -4392,18 +4418,19 @@ run `deactivate-mark-hook'." (if (eq (car-safe transient-mark-mode) 'only) (setq transient-mark-mode (cdr transient-mark-mode))) (setq mark-active nil) - (run-hooks 'deactivate-mark-hook)))) + (run-hooks 'deactivate-mark-hook)) + (redisplay--update-region-highlight (selected-window)))) (defun activate-mark (&optional no-tmm) "Activate the mark. If NO-TMM is non-nil, leave `transient-mark-mode' alone." (when (mark t) - (unless (and mark-active transient-mark-mode) - (force-mode-line-update)) ;Refresh toolbar (bug#16382). - (setq mark-active t) - (unless (or transient-mark-mode no-tmm) - (setq transient-mark-mode 'lambda)) - (run-hooks 'activate-mark-hook))) + (unless (region-active-p) + (force-mode-line-update) ;Refresh toolbar (bug#16382). + (setq mark-active t) + (unless (or transient-mark-mode no-tmm) + (setq transient-mark-mode 'lambda)) + (run-hooks 'activate-mark-hook)))) (defun set-mark (pos) "Set this buffer's mark to POS. Don't use this function! @@ -4421,14 +4448,18 @@ To remember a location for internal use in the Lisp program, store it in a Lisp variable. Example: (let ((beg (point))) (forward-line 1) (delete-region beg (point)))." - - (set-marker (mark-marker) pos (current-buffer)) (if pos - (activate-mark 'no-tmm) + (progn + (set-marker (mark-marker) pos (current-buffer)) + (activate-mark 'no-tmm)) ;; Normally we never clear mark-active except in Transient Mark mode. ;; But when we actually clear out the mark value too, we must ;; clear mark-active in any mode. - (deactivate-mark t))) + (deactivate-mark t) + ;; `deactivate-mark' sometimes leaves mark-active non-nil, but + ;; it should never be nil if the mark is nil. + (setq mark-active nil) + (set-marker (mark-marker) nil))) (defcustom use-empty-active-region nil "Whether \"region-aware\" commands should act on empty regions. @@ -4464,7 +4495,12 @@ Some commands act specially on the region when Transient Mark mode is enabled. Usually, such commands should use `use-region-p' instead of this function, because `use-region-p' also checks the value of `use-empty-active-region'." - (and transient-mark-mode mark-active)) + (and transient-mark-mode mark-active + ;; FIXME: Somehow we sometimes end up with mark-active non-nil but + ;; without the mark being set (e.g. bug#17324). We really should fix + ;; that problem, but in the mean time, let's make sure we don't say the + ;; region is active when there's no mark. + (mark))) (defvar redisplay-unhighlight-region-function @@ -4477,6 +4513,11 @@ also checks the value of `use-empty-active-region'." (funcall redisplay-unhighlight-region-function rol) (overlay-put nrol 'window window) (overlay-put nrol 'face 'region) + ;; Normal priority so that a large region doesn't hide all the + ;; overlays within it, but high secondary priority so that if it + ;; ends/starts in the middle of a small overlay, that small overlay + ;; won't hide the region's boundaries. + (overlay-put nrol 'priority '(nil . 100)) nrol) (unless (and (eq (overlay-buffer rol) (current-buffer)) (eq (overlay-start rol) start) @@ -4538,7 +4579,7 @@ Start discarding off end if gets this big." (defun pop-to-mark-command () "Jump to mark, and pop a new position for mark off the ring. -\(Does not affect global mark ring\)." +\(Does not affect global mark ring)." (interactive) (if (null (mark t)) (error "No mark set in this buffer") @@ -4584,11 +4625,11 @@ global mark ring, if the previous mark was set in another buffer. When Transient Mark Mode is off, immediately repeating this command activates `transient-mark-mode' temporarily. -With prefix argument \(e.g., \\[universal-argument] \\[set-mark-command]\), \ +With prefix argument (e.g., \\[universal-argument] \\[set-mark-command]), \ jump to the mark, and set the mark from -position popped off the local mark ring \(this does not affect the global -mark ring\). Use \\[pop-global-mark] to jump to a mark popped off the global -mark ring \(see `pop-global-mark'\). +position popped off the local mark ring (this does not affect the global +mark ring). Use \\[pop-global-mark] to jump to a mark popped off the global +mark ring (see `pop-global-mark'). If `set-mark-command-repeat-pop' is non-nil, repeating the \\[set-mark-command] command with no prefix argument pops the next position @@ -5118,6 +5159,12 @@ The value is a floating-point number." ;; a cleaner solution to the problem of making C-n do something ;; useful given a tall image. (defun line-move (arg &optional noerror to-end try-vscroll) + "Move forward ARG lines. +If NOERROR, don't signal an error if we can't move ARG lines. +TO-END is unused. +TRY-VSCROLL controls whether to vscroll tall lines: if either +`auto-window-vscroll' or TRY-VSCROLL is nil, this function will +not vscroll." (if noninteractive (forward-line arg) (unless (and auto-window-vscroll try-vscroll @@ -5167,6 +5214,8 @@ The value is a floating-point number." ;; Arg says how many lines to move. The value is t if we can move the ;; specified number of lines. (defun line-move-visual (arg &optional noerror) + "Move ARG lines forward. +If NOERROR, don't signal an error if we can't move that many lines." (let ((opoint (point)) (hscroll (window-hscroll)) target-hscroll) @@ -5379,7 +5428,7 @@ The value is a floating-point number." ;; the middle of a continued line. When we get to ;; line-move-finish, point is at the start of a new *screen* ;; line but the same text line; then line-move-to-column would - ;; move us backwards. Test using C-n with point on the "x" in + ;; move us backwards. Test using C-n with point on the "x" in ;; (insert "a" (propertize "x" 'field t) (make-string 89 ?y)) (and forward (< (point) old) @@ -5537,9 +5586,9 @@ To ignore intangibility, bind `inhibit-point-motion-hooks' to t." (goto-char (previous-char-property-change (point))) (skip-chars-backward "^\n")) - ;; Now find first visible char in the line - (while (and (not (eobp)) (invisible-p (point))) - (goto-char (next-char-property-change (point)))) + ;; Now find first visible char in the line. + (while (and (< (point) orig) (invisible-p (point))) + (goto-char (next-char-property-change (point) orig))) (setq first-vis (point)) ;; See if fields would stop us from reaching FIRST-VIS. @@ -6335,8 +6384,12 @@ If called from Lisp, enable the mode if ARG is omitted or nil." :group 'paren-matching) (defcustom blink-matching-paren t - "Non-nil means show matching open-paren when close-paren is inserted." - :type 'boolean + "Non-nil means show matching open-paren when close-paren is inserted. +If t, highlight the paren. If `jump', move cursor to its position." + :type '(choice + (const :tag "Disable" nil) + (const :tag "Highlight" t) + (const :tag "Move cursor" jump)) :group 'paren-blinking) (defcustom blink-matching-paren-on-screen t @@ -6446,17 +6499,21 @@ The function should return non-nil if the two tokens do not match.") (message "No matching parenthesis found")))) ((not blinkpos) nil) ((pos-visible-in-window-p blinkpos) - ;; Matching open within window, temporarily highlight char - ;; after blinkpos but only if `blink-matching-paren-on-screen' + ;; Matching open within window, temporarily move to or highlight + ;; char after blinkpos but only if `blink-matching-paren-on-screen' ;; is non-nil. (and blink-matching-paren-on-screen (not show-paren-mode) - (unwind-protect - (progn - (move-overlay blink-matching--overlay blinkpos (1+ blinkpos) - (current-buffer)) + (if (eq blink-matching-paren 'jump) + (save-excursion + (goto-char blinkpos) (sit-for blink-matching-delay)) - (delete-overlay blink-matching--overlay)))) + (unwind-protect + (progn + (move-overlay blink-matching--overlay blinkpos (1+ blinkpos) + (current-buffer)) + (sit-for blink-matching-delay)) + (delete-overlay blink-matching--overlay))))) (t (save-excursion (goto-char blinkpos) @@ -6818,7 +6875,7 @@ With a prefix argument, set VARIABLE to VALUE buffer-locally." (defvar completion-list-mode-map (let ((map (make-sparse-keymap))) - (define-key map [mouse-2] 'mouse-choose-completion) + (define-key map [mouse-2] 'choose-completion) (define-key map [follow-link] 'mouse-face) (define-key map [down-mouse-2] nil) (define-key map "\C-m" 'choose-completion) @@ -6912,7 +6969,8 @@ With prefix argument N, move N items (negative N means move backward)." (setq n (1+ n)))))) (defun choose-completion (&optional event) - "Choose the completion at point." + "Choose the completion at point. +If EVENT, use EVENT's position to determine the starting position." (interactive (list last-nonmenu-event)) ;; In case this is run via the mouse, give temporary modes such as ;; isearch a chance to turn off. @@ -6983,12 +7041,10 @@ With prefix argument N, move N items (negative N means move backward)." (defvar choose-completion-string-functions nil "Functions that may override the normal insertion of a completion choice. -These functions are called in order with four arguments: +These functions are called in order with three arguments: CHOICE - the string to insert in the buffer, BUFFER - the buffer in which the choice should be inserted, -MINI-P - non-nil if BUFFER is a minibuffer, and -BASE-SIZE - the number of characters in BUFFER before -the string being completed. +BASE-POSITION - where to insert the completion. If a function in the list returns non-nil, that function is supposed to have inserted the CHOICE in the BUFFER, and possibly exited @@ -7068,8 +7124,7 @@ back on `completion-list-insert-choice-function' when nil." "Major mode for buffers showing lists of possible completions. Type \\\\[choose-completion] in the completion list\ to select the completion near point. -Use \\\\[mouse-choose-completion] to select one\ - with the mouse. +Or click to select one with the mouse. \\{completion-list-mode-map}" (set (make-local-variable 'completion-base-size) nil)) @@ -7127,7 +7182,7 @@ Called from `temp-buffer-show-hook'." (goto-char (point-min)) (if (display-mouse-p) (insert (substitute-command-keys - "Click \\[mouse-choose-completion] on a completion to select it.\n"))) + "Click on a completion to select it.\n"))) (insert (substitute-command-keys "In this buffer, type \\[choose-completion] to \ select the completion near point.\n\n")))))) @@ -7774,6 +7829,33 @@ contains the list of implementations currently supported for this command." (message ,(format "No implementation selected for command `%s'" command-name))))))) + +;; This is here because files in obsolete/ are not scanned for autoloads. + +(defvar iswitchb-mode nil "\ +Non-nil if Iswitchb mode is enabled. +See the command `iswitchb-mode' for a description of this minor mode. +Setting this variable directly does not take effect; +either customize it (see the info node `Easy Customization') +or call the function `iswitchb-mode'.") + +(custom-autoload 'iswitchb-mode "iswitchb" nil) + +(autoload 'iswitchb-mode "iswitchb" "\ +Toggle Iswitchb mode. +With a prefix argument ARG, enable Iswitchb mode if ARG is +positive, and disable it otherwise. If called from Lisp, enable +the mode if ARG is omitted or nil. + +Iswitchb mode is a global minor mode that enables switching +between buffers using substrings. See `iswitchb' for details. + +\(fn &optional ARG)" t nil) + +(make-obsolete 'iswitchb-mode + "use `icomplete-mode' or `ido-mode' instead." "24.4") + + (provide 'simple) ;;; simple.el ends here