anchor.diff:                       (hooks:run-hook ,after-hook)))
                  (nyxt-condition (c)
                    (format t "~s" c)))))
  -         ;; Overwrite previous command:
  -         (setf *command-list* (delete ',name *command-list* :key #'name))
  -         (push (make-instance 'command
  -                              :name ',name
  -                              :docstring ,documentation
  -                              :fn (symbol-function ',name)
  -                              :sexp '(define-command (,@arglist) ,@body))
  -               *command-list*)))))
  +         (let ((new-command (make-instance 'command
  +                                           :name ',name
  +                                           :docstring ,documentation
  +                                           :fn (symbol-function ',name)
  +                                           :sexp '(define-command (,@arglist) ,@body)
  +                                           :global-p ,global-p)))
  +           (unless ,deprecated-p
  +             ;; Overwrite previous command:
  +             (setf *command-list* (delete ',name *command-list* :key #'name))
  +             (push new-command
  +                   *command-list*))
  +           new-command)))))
  +
  +(export-always 'define-command)
  +(defmacro define-command (name (&rest arglist) &body body)
  +  `(%define-command ,name () (,@arglist) ,@body))
   
   (export-always 'define-command-global)
   (defmacro define-command-global (name (&rest arglist) &body body)
  
positive.code:   "Define NAME, a deprecated command.
  This is just like a command.  It's recommended to explain why the function is
  deprecated and by what in the docstring."
    (multiple-value-bind (forms declarations documentation)
        (alex:parse-body body :documentation t)
  
      (unless documentation
        (warn (make-condition
               'command-documentation-style-warning
               :name name)))
      `(progn
         (define-command ,name ,arglist
           ,@(sera:unsplice documentation)
           ,@declarations
           (progn
             ;; TODO: Implement `warn'.
             (echo-warning "~a is deprecated." ',name)
             ,@forms)))))
  
  (defun nyxt-packages ()                 ; TODO: Export a customizable *nyxt-packages* instead?
    "Return all package designators that start with 'nyxt' plus Nyxt own libraries."
  
negative.code:        ,(documentation function-symbol 'function)
         (,function-symbol (first arg-list)))))
  
  (defmacro %define-command (name (&key deprecated-p
                                     pre-form
                                     global-p)
                             (&rest arglist) &body body)
    "Define new command NAME.
  `define-command' has a syntax similar to `defun'.
  ARGLIST must be a list of optional arguments or key arguments.
  