anchor.diff:          (let* ((url (quri:uri url))
                  (tags (prompt
                         :prompt "Tag(s)"
  -                      ;; :default-modes '(set-tag-mode minibuffer-mode) ; TODO: Replace completion.
  -                      :input (url-bookmark-tags url)
                         :sources (list
                                   (make-instance 'prompter:word-source
                                                  :name "New tags"
                                                  :multi-selection-p t)
  -                                (make-instance 'tag-source)))))
  +                                (make-instance 'tag-source
  +                                               :marks (url-bookmark-tags url))))))
             (bookmark-add url :tags tags)))))
   
   (define-command bookmark-delete ()
  
positive.code:    (prompter:filter (lambda (input suggestion)
                        (prompter:fuzzy-match (last-word input) suggestion)))
     (prompter:multi-selection-p t)
     (prompter:constructor (lambda (source)
                             (tag-suggestions :extra-tags (extra-tags source)))))
    (:accessor-name-transformer (hu.dwim.defclass-star:make-name-transformer name)))
  
  (define-command list-bookmarks ()
  
negative.code:                                        :href (lisp-url `(nyxt::delete-bookmark ,url-href)) "Delete"))
                                 (:hr ""))))))))))
  
  (export-always 'url-bookmark-tags)
  (defun url-bookmark-tags (url)
    "Return the list of tags of the bookmark corresponding to URL."
    (with-data-unsafe (bookmarks (bookmarks-path (current-buffer)))
      (alex:when-let ((existing (find url bookmarks :key #'url :test #'equal-url)))
        (tags existing))))
  
  (define-command bookmark-current-page (&optional (buffer (current-buffer)))
    "Bookmark the URL of BUFFER."
    ;; TODO: Re-use extract-keywords to implement tag suggestion source.
    ;; (flet ((extract-keywords (html limit)
    ;;          (sera:take limit (delete "" (mapcar #'first
    ;;                                              (analysis:keywords
    ;;                                               (make-instance
    ;;                                                'analysis:document
    ;;                                                :string-contents (plump:text (plump:parse html)))))
    ;;                                   :test #'string=)))))
    (if (url-empty-p (url buffer))
        (echo "Buffer has no URL.")
        (let* (;; (body (with-current-buffer buffer
               ;;         (ffi-buffer-get-document buffer)))
               (tags (prompt
                      :prompt "Tag(s)"
                      :sources (list
                                (make-instance 'prompter:word-source
                                               :name "New tags"
                                               :multi-selection-p t)
                                (make-instance 'tag-source
                                               ;; TODO: This seems to rarely work, why?
                                               :marks (url-bookmark-tags (url buffer))
                                               ;; TODO: Move extra-tags to a separate source.
                                               ;; :extra-tags (extract-keywords body 5)
                                               )))))
          (bookmark-add (url buffer)
                        :title (title buffer)
                        :tags tags)
          (echo "Bookmarked ~a." (object-display (url buffer))))))
  
  (define-command bookmark-page ()
    "Bookmark the currently opened page(s) in the active buffer."
  