anchor.diff:           (packages (prompt-minibuffer
                       :suggestion-function (os-installed-package-suggestion-filter profile)
                       :input-prompt "Uninstall OS package(s)"
  -                    :multi-selection-p t))
  -         ;; TODO: Check for running process.
  -         (buffer (or (find-buffer 'os-package-manager-mode)
  -                     (nyxt/os-package-manager-mode:os-package-manager-mode
  -                      :activate t
  -                      :buffer (make-internal-buffer :title "*OS packages*"))))
  -         (content
  -          (markup:markup
  -           (:style (style buffer))
  -           (:h1 "Uninstalling packages...")))
  -         (insert-content (ps:ps (setf (ps:@ document body |innerHTML|)
  -                                      (ps:lisp content)))))
  -    (ffi-buffer-evaluate-javascript-async buffer insert-content)
  -    (chanl:pexec ()
  -      (let ((process-info (ospama:uninstall packages profile)))
  -        (format-command-stream process-info
  -                               (lambda (s)
  -                                 (ffi-buffer-evaluate-javascript-async
  -                                  buffer
  -                                  (ps:ps (ps:chain document
  -                                                   ;; TODO: Make shell formating
  -                                                   ;; function and add support
  -                                                   ;; for special characters,
  -                                                   ;; e.g. progress bars.
  -                                                   (write (ps:lisp (markup:markup
  -                                                                    (:code (str:replace-all " " " " s))
  -                                                                    (:br)))))))))))
  -    (set-current-buffer buffer)
  -    buffer))
  +                    :multi-selection-p t)))
  +    (operate-os-package "Uninstalling packages..." #'ospama:uninstall profile packages)))
   
   ;; TODO: Parse Texinfo for Guix descriptions.
   ;; TODO: Add commands:
  -;; - uninstall
   ;; - find-files (open in editor, with select program) -- leverage file-manager
   ;; - show-deps, show-reverse-deps (when minibuffer has actions)
  
positive.code:          (content
            (markup:markup
             (:style (style buffer))
             (:h1 "Installing packages...")))
           (insert-content (ps:ps (setf (ps:@ document body |innerHTML|)
                                        (ps:lisp content)))))
      (ffi-buffer-evaluate-javascript-async buffer insert-content)
      (chanl:pexec ()
        (let ((process-info (ospama:install packages profile)))
          (format-command-stream process-info
                                 (lambda (s)
                                   (ffi-buffer-evaluate-javascript-async
  
negative.code:     (set-current-buffer buffer)
      buffer))
  
  (define-command install-os-package ()
    "Install select packages."
    ;; TODO: Allow profile creation.  Need multi-source support for that?
    (let* ((profile (prompt-minibuffer
                     :suggestion-function (os-profile-suggestion-filter)
                     :input-prompt "Target profile"))
           (packages (prompt-minibuffer
                      :suggestion-function (os-package-suggestion-filter)
                      :input-prompt "Install OS package(s)"
                      :multi-selection-p t)))
      (operate-os-package "Installing packages..." #'ospama:install profile packages)))
  
  (define-command uninstall-os-package ()
    "Uninstall select packages."
    (let* ((profile (prompt-minibuffer
  