Function: package--autosuggest-prompt

package--autosuggest-prompt is a byte-compiled function defined in package.el.gz.

Signature

(package--autosuggest-prompt PACKAGES)

Documentation

Query the user whether to install PACKAGES or not.

PACKAGES is a list of package suggestions in the form described in package--suggestion-applies-p. The function returns a non-nil value if the user confirms installation, otherwise nil.

Source Code

;; Defined in /usr/src/emacs/lisp/emacs-lisp/package.el.gz
(defun package--autosuggest-prompt (packages)
  "Query the user whether to install PACKAGES or not.
PACKAGES is a list of package suggestions in the form described in
`package--suggestion-applies-p'.  The function returns a non-nil value
if the user confirms installation, otherwise nil."
  (let* ((inhibit-read-only t) (use-hard-newlines t)
         (nl (propertize "\n" 'hard t)) (nlnl (concat nl nl))
         (buf (current-buffer)))
    (with-current-buffer (get-buffer-create
                          (format "*package suggestion: %s*"
                                  (buffer-name buf)))
      (erase-buffer)
      (insert
       "The buffer \""
       (buffer-name buf)
       "\" currently lacks any language-specific support.
The package manager can provide the editor support for these kinds of
files by downloading a package from Emacs's package archive:" nl)

      (when (length> packages 1)
        (insert nl "(Note that there are multiple candidate packages,
so you have to select which to install!)" nl))

      (pcase-dolist (`(,pkg . ,sugs) (seq-group-by #'car packages))
        (insert nl "* "
                (buttonize (concat "Install " (symbol-name pkg))
                           (lambda (_)
                             (package--autosuggest-install-and-enable
                              (car sugs))
                             (quit-window)))
                " ("
                (buttonize "about"
                           (lambda (_)
                             (unless (assq pkg package-archive-contents)
                               (package-read-all-archive-contents))
                             (describe-package pkg)))
                ", matches ")
        (dolist (sug sugs)
          (unless (eq (char-before) ?\s)
            (insert ", "))
          (pcase sug
            (`(,_ auto-mode-alist . ,_)
             (insert "file extension "))
            (`(,_ magic-mode-alist . ,_)
             (insert "magic bytes"))
            (`(,_ interpreter-mode-alist . ,_)
             (insert "interpreter "))))
        (delete-horizontal-space) (insert ").")

        (add-to-list 'package--autosuggest-suggested pkg))

      (insert nl "* " (buttonize "Do not install anything" (lambda (_) (quit-window))) "."
              nl "* " (buttonize "Permanently disable package suggestions"
                            (lambda (_)
                              (customize-save-variable
                               'package-autosuggest-mode nil
                               "Disabled at user's request")
                              (quit-window)))
              "."

              nlnl "To learn more about package management, read "
              (buttonize "(emacs) Packages" (lambda (_) (info "(emacs) Packages")))
              ", and to learn more about how Emacs supports specific languages, read "
              (buttonize "(emacs) Major modes" (lambda (_) (info "(emacs) Major modes")))
              ".")

      (fill-region (point-min) (point-max))
      (special-mode)
      (button-mode t)

      (let ((win (display-buffer-below-selected (current-buffer) '())))
        (fit-window-to-buffer win)
        (select-window win)
        (set-window-dedicated-p win t)
        (set-window-point win (point-min))))))