diff options
Diffstat (limited to 'lisp')
| -rw-r--r-- | lisp/emacs-lisp/package.el | 12 | ||||
| -rw-r--r-- | lisp/menu-bar.el | 12 | ||||
| -rw-r--r-- | lisp/simple.el | 57 | ||||
| -rw-r--r-- | lisp/tab-line.el | 28 |
4 files changed, 78 insertions, 31 deletions
diff --git a/lisp/emacs-lisp/package.el b/lisp/emacs-lisp/package.el index 7935e761b6a..4f182fd5227 100644 --- a/lisp/emacs-lisp/package.el +++ b/lisp/emacs-lisp/package.el @@ -606,8 +606,10 @@ EXP should be a form read from a foo-pkg.el file. Convert EXP into a `package-desc' object using the `package-desc-from-define' constructor before pushing it to `package-alist'. -If there already exists a package by that name in -`package-alist', replace that definition with the new one." + +If there already exists a package by the same name in +`package-alist', insert this object there such that the packages +are sorted with the highest version first." (when (eq (car-safe exp) 'define-package) (let* ((new-pkg-desc (apply #'package-desc-from-define (cdr exp))) (name (package-desc-name new-pkg-desc)) @@ -952,7 +954,7 @@ untar into a directory named DIR; otherwise, signal an error." pkg-dir)) (defun package-generate-description-file (pkg-desc pkg-file) - "Create the foo-pkg.el file for single-file packages." + "Create the foo-pkg.el file PKG-FILE for single-file package PKG-DESC." (let* ((name (package-desc-name pkg-desc))) (let ((print-level nil) (print-quoted t) @@ -996,6 +998,7 @@ untar into a directory named DIR; otherwise, signal an error." (defvar version-control) (defun package-generate-autoloads (name pkg-dir) + "Generate autoloads in PKG-DIR for package named NAME." (let* ((auto-name (format "%s-autoloads.el" name)) ;;(ignore-name (concat name "-pkg.el")) (generated-autoload-file (expand-file-name auto-name pkg-dir)) @@ -1176,12 +1179,14 @@ The return result is a `package-desc'." ;; signature checking. (defun package--write-file-no-coding (file-name) + "Write file FILE-NAME without encoding using coding system." (let ((buffer-file-coding-system 'no-conversion)) (write-region (point-min) (point-max) file-name nil 'silent))) (declare-function url-http-file-exists-p "url-http" (url)) (defun package--archive-file-exists-p (location file) + "Return t if FILE exists in remote LOCATION." (let ((http (string-match "\\`https?:" location))) (if http (progn @@ -2819,6 +2824,7 @@ of these dependencies, similar to the list returned by (push dep out))))))))))) (defun package-desc-status (pkg-desc) + "Return the status of `package-desc' object PKG-DESC." (let* ((name (package-desc-name pkg-desc)) (dir (package-desc-dir pkg-desc)) (lle (assq name package-load-list)) diff --git a/lisp/menu-bar.el b/lisp/menu-bar.el index 8f825a19adc..731da193ef1 100644 --- a/lisp/menu-bar.el +++ b/lisp/menu-bar.el @@ -1476,6 +1476,18 @@ mail status in mode line")) (bindings--define-key menu [cursor-separator] menu-bar-separator) + (bindings--define-key menu [save-desktop] + (menu-bar-make-toggle + toggle-save-desktop-globally desktop-save-mode + "Save State between Sessions" + "Saving desktop state %s" + "Visit desktop of previous session when restarting Emacs" + (require 'desktop) + ;; Do it by name, to avoid a free-variable + ;; warning during byte compilation. + (set-default + 'desktop-save-mode (not (symbol-value 'desktop-save-mode))))) + (bindings--define-key menu [save-place] (menu-bar-make-toggle toggle-save-place-globally save-place-mode diff --git a/lisp/simple.el b/lisp/simple.el index f28198cd81f..f022b8495be 100644 --- a/lisp/simple.el +++ b/lisp/simple.el @@ -3436,19 +3436,28 @@ This affects `shell-command' and `async-shell-command'." :version "27.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. + "Control if the output buffer is erased before the command. + +A nil value erases the output buffer before execution of the +shell command, except when the output buffer is the current one. + +The value `erase' ensures the output buffer is erased before +execution of the shell command. + +Other non-nil values prevent the output buffer from being erased and +set the point after execution of the shell command. + 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 "Erase output buffer if not the current one" nil) + (const :tag "Always erase output buffer" erase) (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") + :version "27.1") (defvar shell-command-saved-pos nil "Record of point positions in output buffers after command completion. @@ -3457,8 +3466,11 @@ 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 () +(defun shell-command-save-pos-or-erase (&optional output-to-current-buffer) "Store a buffer position or erase the buffer. +Optional argument OUTPUT-TO-CURRENT-BUFFER, if non-nil, means that the output +of the shell command goes to the caller current buffer. + See `shell-command-dont-erase-buffer'." (let ((sym shell-command-dont-erase-buffer) pos) @@ -3469,7 +3481,9 @@ See `shell-command-dont-erase-buffer'." (setq pos (cond ((eq sym 'save-point) (point)) ((eq sym 'beg-last-out) (point-max)) - ((not sym) + ;;((not sym) + ((or (eq sym 'erase) + (and (null sym) (not output-to-current-buffer))) (let ((inhibit-read-only t)) (erase-buffer) nil)))) (when pos @@ -3477,7 +3491,7 @@ See `shell-command-dont-erase-buffer'." (push (cons (current-buffer) pos) shell-command-saved-pos)))) -(defun shell-command--set-point-after-cmd (&optional buffer) +(defun shell-command-set-point-after-cmd (&optional buffer) "Set point in BUFFER after command complete. BUFFER is the output buffer of the command; if nil, then defaults to the current BUFFER. @@ -3492,12 +3506,19 @@ whose `car' is BUFFER." (when (buffer-live-p buf) (let ((win (car (get-buffer-window-list buf))) (pmax (with-current-buffer buf (point-max)))) - (unless (and pos (memq sym '(save-point beg-last-out))) + + ;; The first time we run a command in a fresh created buffer + ;; we have not saved positions yet; advance to `point-max', so that + ;; succesive commands knows the position where the new comman start. + ;; (unless (and pos (memq sym '(save-point beg-last-out))) + (unless (and pos (memq sym '(save-point beg-last-out end-last-out))) (setq pos pmax)) ;; Set point in the window displaying buf, if any; otherwise ;; display buf temporary in selected frame and set the point. (if win (set-window-point win pos) + (when pos + (with-current-buffer buf (goto-char pos))) (save-window-excursion (let ((win (display-buffer buf @@ -3625,7 +3646,9 @@ impose the use of a shell (with its need to quote arguments)." (if handler (funcall handler 'shell-command command output-buffer error-buffer) (if (and output-buffer - (not (or (bufferp output-buffer) (stringp output-buffer)))) + (or (eq output-buffer (current-buffer)) + (and (stringp output-buffer) (eq (get-buffer output-buffer) (current-buffer))) + (not (or (bufferp output-buffer) (stringp output-buffer))))) ; Bug#39067 ;; Output goes in current buffer. (let ((error-file (and error-buffer @@ -3635,6 +3658,7 @@ impose the use of a shell (with its need to quote arguments)." temporary-file-directory)))))) (barf-if-buffer-read-only) (push-mark nil t) + (shell-command-save-pos-or-erase 'output-to-current-buffer) ;; We do not use -f for csh; we will not support broken use of ;; .cshrcs. Even the BSD csh manual says to use ;; "if ($?prompt) exit" before things that are not useful @@ -3663,7 +3687,8 @@ impose the use of a shell (with its need to quote arguments)." ;; because we inserted text. (goto-char (prog1 (mark t) (set-marker (mark-marker) (point) - (current-buffer))))) + (current-buffer)))) + (shell-command-set-point-after-cmd)) ;; Output goes in a separate buffer. ;; Preserve the match data in case called from a program. ;; FIXME: It'd be ridiculous for an Elisp function to call @@ -3708,7 +3733,7 @@ impose the use of a shell (with its need to quote arguments)." (rename-uniquely)) (setq buffer (get-buffer-create bname))))) (with-current-buffer buffer - (shell-command--save-pos-or-erase) + (shell-command-save-pos-or-erase) (setq default-directory directory) (let ((process-environment (if (natnump async-shell-command-width) @@ -3814,7 +3839,7 @@ and are used only if a pop-up buffer is displayed." ;; `shell-command-dont-erase-buffer' is non-nil. (defun shell-command-sentinel (process signal) (when (memq (process-status process) '(exit signal)) - (shell-command--set-point-after-cmd (process-buffer process)) + (shell-command-set-point-after-cmd (process-buffer process)) (message "%s: %s." (car (cdr (cdr (process-command process)))) (substring signal 0 -1)))) @@ -3933,7 +3958,7 @@ interactively, this is t." (set-buffer-major-mode buffer) ; Enable globalized modes (bug#38111) (unwind-protect (if (and (eq buffer (current-buffer)) - (or (not shell-command-dont-erase-buffer) + (or (memq shell-command-dont-erase-buffer '(nil erase)) (and (not (eq buffer (get-buffer "*Shell Command Output*"))) (not (region-active-p))))) ;; If the input is the same buffer as the output, @@ -3956,7 +3981,7 @@ interactively, this is t." (with-current-buffer buffer (if (not output-buffer) (setq default-directory directory)) - (shell-command--save-pos-or-erase))) + (shell-command-save-pos-or-erase))) (setq exit-status (call-shell-region start end command nil (if error-file @@ -3975,7 +4000,7 @@ interactively, this is t." ;; There's some output, display it (progn (display-message-or-buffer buffer) - (shell-command--set-point-after-cmd buffer)) + (shell-command-set-point-after-cmd buffer)) ;; No output; error? (let ((output (if (and error-file diff --git a/lisp/tab-line.el b/lisp/tab-line.el index ef530d43dec..5bbc45b0aae 100644 --- a/lisp/tab-line.el +++ b/lisp/tab-line.el @@ -520,12 +520,14 @@ the selected tab visible." (add-face-text-property (point-min) (point-max) 'tab-line) (if (> (vertical-motion 1) 0) (let* ((point (previous-single-property-change (point) 'tab)) - (tab-prop (or (get-pos-property point 'tab) - (get-pos-property - (previous-single-property-change point 'tab) 'tab))) - (new-hscroll (seq-position strings tab-prop - (lambda (str tab) - (eq (get-pos-property 1 'tab str) tab))))) + (tab-prop (when point + (or (get-pos-property point 'tab) + (and (setq point (previous-single-property-change point 'tab)) + (get-pos-property point 'tab))))) + (new-hscroll (when tab-prop + (seq-position strings tab-prop + (lambda (str tab) + (eq (get-pos-property 1 'tab str) tab)))))) (when new-hscroll (setq hscroll (- new-hscroll)) (set-window-parameter nil 'tab-line-hscroll hscroll))) @@ -545,12 +547,14 @@ the selected tab visible." (add-face-text-property (point-min) (point-max) 'tab-line) (when (> (vertical-motion 1) 0) (let* ((point (previous-single-property-change (point) 'tab)) - (tab-prop (or (get-pos-property point 'tab) - (get-pos-property - (previous-single-property-change point 'tab) 'tab))) - (new-hscroll (seq-position strings tab-prop - (lambda (str tab) - (eq (get-pos-property 1 'tab str) tab))))) + (tab-prop (when point + (or (get-pos-property point 'tab) + (and (setq point (previous-single-property-change point 'tab)) + (get-pos-property point 'tab))))) + (new-hscroll (when tab-prop + (seq-position strings tab-prop + (lambda (str tab) + (eq (get-pos-property 1 'tab str) tab)))))) (when new-hscroll (setq hscroll (- new-hscroll)) (set-window-parameter nil 'tab-line-hscroll hscroll))))))))) |
