summaryrefslogtreecommitdiff
path: root/lisp/simple.el
diff options
context:
space:
mode:
Diffstat (limited to 'lisp/simple.el')
-rw-r--r--lisp/simple.el163
1 files changed, 109 insertions, 54 deletions
diff --git a/lisp/simple.el b/lisp/simple.el
index b7ad6ebd799..60a00286f89 100644
--- a/lisp/simple.el
+++ b/lisp/simple.el
@@ -37,28 +37,6 @@
(defvar compilation-current-error)
(defvar compilation-context-lines)
-(defcustom shell-command-dont-erase-buffer nil
- "If non-nil, output buffer is not erased between shell commands.
-Also, a non-nil value sets the point in the output buffer
-once the command completes.
-The value `beg-last-out' sets point at the beginning of the output,
-`end-last-out' sets point at the end of the buffer, `save-point'
-restores the buffer position before the command."
- :type '(choice
- (const :tag "Erase buffer" nil)
- (const :tag "Set point to beginning of last output" beg-last-out)
- (const :tag "Set point to end of last output" end-last-out)
- (const :tag "Save point" save-point))
- :group 'shell
- :version "26.1")
-
-(defvar shell-command-saved-pos nil
- "Record of point positions in output buffers after command completion.
-The value is an alist whose elements are of the form (BUFFER . POS),
-where BUFFER is the output buffer, and POS is the point position
-in BUFFER once the command finishes.
-This variable is used when `shell-command-dont-erase-buffer' is non-nil.")
-
(defcustom idle-update-delay 0.5
"Idle time delay before updating various things on the screen.
Various Emacs features that update auxiliary information when point moves
@@ -144,6 +122,12 @@ A buffer becomes most recent when its compilation, grep, or
similar mode is started, or when it is used with \\[next-error]
or \\[compile-goto-error].")
+;; next-error-last-buffer is made buffer-local to keep the reference
+;; to the parent buffer used to navigate to the current buffer, so the
+;; next call of next-buffer will use the same parent buffer to
+;; continue navigation from it.
+(make-variable-buffer-local 'next-error-last-buffer)
+
(defvar next-error-function nil
"Function to use to find the next error in the current buffer.
The function is called with 2 parameters:
@@ -191,6 +175,31 @@ rejected, and the function returns nil."
(and extra-test-inclusive
(funcall extra-test-inclusive))))))
+(defcustom next-error-find-buffer-function #'ignore
+ "Function called to find a `next-error' capable buffer."
+ :type '(choice (const :tag "Single next-error capable buffer on selected frame"
+ next-error-buffer-on-selected-frame)
+ (const :tag "No default" ignore)
+ (function :tag "Other function"))
+ :group 'next-error
+ :version "27.1")
+
+(defun next-error-buffer-on-selected-frame (&optional avoid-current
+ extra-test-inclusive
+ extra-test-exclusive)
+ "Return a single visible next-error buffer on the selected frame."
+ (let ((window-buffers
+ (delete-dups
+ (delq nil (mapcar (lambda (w)
+ (if (next-error-buffer-p
+ (window-buffer w)
+ avoid-current
+ extra-test-inclusive extra-test-exclusive)
+ (window-buffer w)))
+ (window-list))))))
+ (if (eq (length window-buffers) 1)
+ (car window-buffers))))
+
(defun next-error-find-buffer (&optional avoid-current
extra-test-inclusive
extra-test-exclusive)
@@ -207,18 +216,10 @@ The function EXTRA-TEST-EXCLUSIVE, if non-nil, is called in each buffer
that would normally be considered usable. If it returns nil,
that buffer is rejected."
(or
- ;; 1. If one window on the selected frame displays such buffer, return it.
- (let ((window-buffers
- (delete-dups
- (delq nil (mapcar (lambda (w)
- (if (next-error-buffer-p
- (window-buffer w)
- avoid-current
- extra-test-inclusive extra-test-exclusive)
- (window-buffer w)))
- (window-list))))))
- (if (eq (length window-buffers) 1)
- (car window-buffers)))
+ ;; 1. If a customizable function returns a buffer, use it.
+ (funcall next-error-find-buffer-function avoid-current
+ extra-test-inclusive
+ extra-test-exclusive)
;; 2. If next-error-last-buffer is an acceptable buffer, use that.
(if (and next-error-last-buffer
(next-error-buffer-p next-error-last-buffer avoid-current
@@ -279,23 +280,50 @@ To control which errors are matched, customize the variable
`compilation-error-regexp-alist'."
(interactive "P")
(if (consp arg) (setq reset t arg nil))
- (when (setq next-error-last-buffer (next-error-find-buffer))
- ;; we know here that next-error-function is a valid symbol we can funcall
- (with-current-buffer next-error-last-buffer
- (funcall next-error-function (prefix-numeric-value arg) reset)
+ (let ((buffer (next-error-find-buffer)))
+ (when buffer
+ ;; We know here that next-error-function is a valid symbol we can funcall
+ (with-current-buffer buffer
+ ;; Allow next-error to be used from the next-error capable buffer.
+ (setq next-error-last-buffer buffer)
+ (funcall next-error-function (prefix-numeric-value arg) reset)
+ ;; Override possible change of next-error-last-buffer in next-error-function
+ (setq next-error-last-buffer buffer)
+ (setq-default next-error-last-buffer buffer)
+ (when next-error-recenter
+ (recenter next-error-recenter))
+ (message "%s error from %s"
+ (cond (reset "First")
+ ((eq (prefix-numeric-value arg) 0) "Current")
+ ((< (prefix-numeric-value arg) 0) "Previous")
+ (t "Next"))
+ next-error-last-buffer)
+ (run-hooks 'next-error-hook)))))
+
+(defun next-error-internal ()
+ "Visit the source code corresponding to the `next-error' message at point."
+ (let ((buffer (current-buffer)))
+ ;; We know here that next-error-function is a valid symbol we can funcall
+ (with-current-buffer buffer
+ ;; Allow next-error to be used from the next-error capable buffer.
+ (setq next-error-last-buffer buffer)
+ (funcall next-error-function 0 nil)
+ ;; Override possible change of next-error-last-buffer in next-error-function
+ (setq next-error-last-buffer buffer)
+ (setq-default next-error-last-buffer buffer)
(when next-error-recenter
(recenter next-error-recenter))
+ (message "Current error from %s" next-error-last-buffer)
(run-hooks 'next-error-hook))))
-(defun next-error-internal ()
- "Visit the source code corresponding to the `next-error' message at point."
- (setq next-error-last-buffer (current-buffer))
- ;; we know here that next-error-function is a valid symbol we can funcall
- (with-current-buffer next-error-last-buffer
- (funcall next-error-function 0 nil)
- (when next-error-recenter
- (recenter next-error-recenter))
- (run-hooks 'next-error-hook)))
+(defun next-error-select-buffer (buffer)
+ "Select a `next-error' capable buffer and set it as the last used."
+ (interactive
+ (list (get-buffer
+ (read-buffer "Select next-error buffer: " nil nil
+ (lambda (b) (next-error-buffer-p (cdr b)))))))
+ (setq next-error-last-buffer buffer)
+ (setq-default next-error-last-buffer buffer))
(defalias 'goto-next-locus 'next-error)
(defalias 'next-match 'next-error)
@@ -3295,6 +3323,28 @@ is output."
:group 'shell
:version "26.1")
+(defcustom shell-command-dont-erase-buffer nil
+ "If non-nil, output buffer is not erased between shell commands.
+Also, a non-nil value sets the point in the output buffer
+once the command completes.
+The value `beg-last-out' sets point at the beginning of the output,
+`end-last-out' sets point at the end of the buffer, `save-point'
+restores the buffer position before the command."
+ :type '(choice
+ (const :tag "Erase buffer" nil)
+ (const :tag "Set point to beginning of last output" beg-last-out)
+ (const :tag "Set point to end of last output" end-last-out)
+ (const :tag "Save point" save-point))
+ :group 'shell
+ :version "26.1")
+
+(defvar shell-command-saved-pos nil
+ "Record of point positions in output buffers after command completion.
+The value is an alist whose elements are of the form (BUFFER . POS),
+where BUFFER is the output buffer, and POS is the point position
+in BUFFER once the command finishes.
+This variable is used when `shell-command-dont-erase-buffer' is non-nil.")
+
(defun shell-command--save-pos-or-erase ()
"Store a buffer position or erase the buffer.
See `shell-command-dont-erase-buffer'."
@@ -3845,7 +3895,7 @@ interactively, this is t."
(with-output-to-string
(with-current-buffer
standard-output
- (process-file shell-file-name nil t nil shell-command-switch command))))
+ (shell-command command t))))
(defun process-file (program &optional infile buffer display &rest args)
"Process files synchronously in a separate process.
@@ -3928,7 +3978,9 @@ support pty association, if PROGRAM is nil."
(setq tabulated-list-format [("Process" 15 t)
("PID" 7 t)
("Status" 7 t)
- ("Buffer" 15 t)
+ ;; 25 is the length of the long standard buffer
+ ;; name "*Async Shell Command*<10>" (bug#30016)
+ ("Buffer" 25 t)
("TTY" 12 t)
("Command" 0 t)])
(make-local-variable 'process-menu-query-only)
@@ -7867,7 +7919,7 @@ buffer buried."
(eq mail-user-agent 'message-user-agent)
(let (warn-vars)
(dolist (var '(mail-mode-hook mail-send-hook mail-setup-hook
- mail-yank-hooks mail-archive-file-name
+ mail-citation-hook mail-archive-file-name
mail-default-reply-to mail-mailing-lists
mail-self-blind))
(and (boundp var)
@@ -8528,13 +8580,16 @@ after it has been set up properly in other respects."
;; Set up other local variables.
(mapc (lambda (v)
- (condition-case () ;in case var is read-only
+ (condition-case ()
(if (symbolp v)
(makunbound v)
(set (make-local-variable (car v)) (cdr v)))
- (error nil)))
+ (setting-constant nil))) ;E.g. for enable-multibyte-characters.
lvars)
+ (setq mark-ring (mapcar (lambda (mk) (copy-marker (marker-position mk)))
+ mark-ring))
+
;; Run any hooks (typically set up by the major mode
;; for cloning to work properly).
(run-hooks 'clone-buffer-hook))
@@ -8959,7 +9014,7 @@ Otherwise, it calls `upcase-word', with prefix argument passed to it
to upcase ARG words."
(interactive "*p")
(if (use-region-p)
- (upcase-region (region-beginning) (region-end))
+ (upcase-region (region-beginning) (region-end) (region-noncontiguous-p))
(upcase-word arg)))
(defun downcase-dwim (arg)
@@ -8969,7 +9024,7 @@ Otherwise, it calls `downcase-word', with prefix argument passed to it
to downcase ARG words."
(interactive "*p")
(if (use-region-p)
- (downcase-region (region-beginning) (region-end))
+ (downcase-region (region-beginning) (region-end) (region-noncontiguous-p))
(downcase-word arg)))
(defun capitalize-dwim (arg)