anchor.diff:  ;; Make new profile the default:
   \(define-configuration buffer
     ((profile (make-instance (or (find-profile-class (getf *options* :profile)) 'dev-profile)))))"))
  -   (:p "Then you can start a separate instance of Nyxt using this profile
  +    (:p "Then you can start a separate instance of Nyxt using this profile
   with " (:code "nyxt --profile dev --socket /tmp/nyxt.socket") ".")
   
  -   (:h3 "Password management")
  -   (:p "Nyxt provides a uniform interface to some password managers including "
  -       (:a :href "https://keepassxc.org/" "KeepassXC")
  -       " and " (:a :href "https://www.passwordstore.org/" "Password Store") ". "
  -       "The supported installed password manager is automatically detected."
  -       "See the " (:code "password-interface") " buffer slot for customization.")
  -   (:p "You may use the " (:code "define-configuration") " macro with
  +    (:h3 "Password management")
  +    (:p "Nyxt provides a uniform interface to some password managers including "
  +        (:a :href "https://keepassxc.org/" "KeepassXC")
  +        " and " (:a :href "https://www.passwordstore.org/" "Password Store") ". "
  +        "The supported installed password manager is automatically detected."
  +        "See the " (:code "password-interface") " buffer slot for customization.")
  +    (:p "You may use the " (:code "define-configuration") " macro with
   any of the password interfaces to configure them. Please make sure to
   use the package prefixed class name/slot designators within
   the " (:code "define-configuration") " macro.")
  -   (:ul
  -    (:li (command-markup 'nyxt/password-mode:save-new-password) ": Query for name and new password to persist in the database.")
  -    (:li (command-markup 'nyxt/password-mode:copy-password) ": " (command-docstring-first-sentence 'nyxt/password-mode:copy-password)))
  -
  -   (:h3 "Appearance")
  -   (:p "Much of the visual style can be configured by the user.  Search the
  +    (:ul
  +     (:li (command-markup 'nyxt/password-mode:save-new-password) ": Query for name and new password to persist in the database.")
  +     (:li (command-markup 'nyxt/password-mode:copy-password) ": " (command-docstring-first-sentence 'nyxt/password-mode:copy-password)))
  +
  +    (:h3 "Appearance")
  +    (:p "Much of the visual style can be configured by the user.  Search the
   class slots for 'style'.  To customize the status buffer, see
   the " (:code "status-formatter") " window slot.")
   
  -   (:h3 "Advanced configuration")
  -   (:p "While " (:code "define-configuration") " is convenient, it is mostly
  +    (:h3 "Advanced configuration")
  +    (:p "While " (:code "define-configuration") " is convenient, it is mostly
   restricted to class slot configuration.  If you want to do anything else on
   class instantiation, you'll have to specialize the
   lower-level " (:code "customize-instance") " generic function.  Example:"
  -        (:pre (:code "
  +(:pre (:code "
   \(defmethod customize-instance ((buffer buffer) &key)
     (echo \"Buffer ~a created.\" buffer))")))
  -   (:p "All classes with metaclass " (:code "user-class") " call "
  +    (:p "All classes with metaclass " (:code "user-class") " call "
           (:code "customize-instance") " on instantiation,
   after " (:code "initialize-instance :after") ".  The primary method is reserved
   to the user, however the " (:code ":after") " method is reserved to the Nyxt
   core to finalize the instance.")
   
  -   (:h3 "Scripting")
  -   (:p "You can evaluate code from the command line with "
  -       (:code "--eval") " and " (:code "--load") ".  From a shell:")
  -   (:pre (:code "$ nyxt --no-config --eval '+version+' \
  +    (:h3 "Scripting")
  +    (:p "You can evaluate code from the command line with "
  +        (:code "--eval") " and " (:code "--load") ".  From a shell:")
  +    (:pre (:code "$ nyxt --no-config --eval '+version+' \
     --load my-lib.lisp --eval '(format t \"Hello ~a!~&\" (my-lib:my-world))'"))
  -   (:p "You can evaluate multiple --eval and --load in a row, they are
  +    (:p "You can evaluate multiple --eval and --load in a row, they are
   executed in the order they appear.")
  -   (:p "You can also evaluate a Lisp file from the Nyxt interface with
  +    (:p "You can also evaluate a Lisp file from the Nyxt interface with
   the " (command-markup 'load-file) " command.  For
   convenience, " (command-markup 'load-config-file) " (re)loads your initialization file.")
  -   (:p "You can even make scripts.  Here is an example foo.lisp:")
  -   (:pre (:code "#!nyxt --script
  +    (:p "You can even make scripts.  Here is an example foo.lisp:")
  +    (:pre (:code "#!nyxt --script
   \(format t \"~a~&\" +version+)"))
  -   (:p "--eval and --load can be commanded to operate over an
  +    (:p "--eval and --load can be commanded to operate over an
   existing instance instead of a separate instance that exits immediately.")
  -   (:p "The `remote-execution-p' slot of the `browser' class of the remote
  +    (:p "The `remote-execution-p' slot of the `browser' class of the remote
   instance must be non-nil.")
  -   (:p "To let know a private instance of Nyxt to load a foo.lisp script and run its
  +    (:p "To let know a private instance of Nyxt to load a foo.lisp script and run its
   `foo' function:")
  -   (:pre (:code "nyxt --profile nosave --remote --load foo.lisp --eval '(foo)'"))
  -
  -   (:h2 "Extensions")
  -   (:p "To install an extension, copy inside the "
  -       (:code "*extensions-path*") " (default to "
  -       (:code "~/.local/share/nyxt/extensions")").")
  -   (:p "Extensions are regular Common Lisp systems.")
  -   (:p "A catalogue of extensions is available in the "
  -       (:code "document/EXTENSIONS.org") " file in the source repository.")
  -
  -   (:h2 "Troubleshooting")
  -   (:h3 "Playing videos")
  -   (:p "Nyxt delegates video support to third-party plugins.")
  -   (:p "When using the WebKitGTK backends, GStreamer and its plugins are
  +    (:pre (:code "nyxt --profile nosave --remote --load foo.lisp --eval '(foo)'"))
  +
  +    (:h2 "Extensions")
  +    (:p "To install an extension, copy inside the "
  +        (:code "*extensions-path*") " (default to "
  +        (:code "~/.local/share/nyxt/extensions")").")
  +    (:p "Extensions are regular Common Lisp systems.")
  +    (:p "A catalogue of extensions is available in the "
  +        (:code "document/EXTENSIONS.org") " file in the source repository.")
  +
  +    (:h2 "Troubleshooting")
  +    (:h3 "Playing videos")
  +    (:p "Nyxt delegates video support to third-party plugins.")
  +    (:p "When using the WebKitGTK backends, GStreamer and its plugins are
   leveraged.  Depending on the video, you will need to install some of the
   following packages:")
  -   (:ul
  -    (:li "gst-libav")
  -    (:li "gst-plugins-bad")
  -    (:li "gst-plugins-base")
  -    (:li "gst-plugins-good")
  -    (:li "gst-plugins-ugly"))
  -   (:p "On Debian-based systems, you might be looking for (adapt the version numbers):")
  -   (:ul
  -    (:li "libgstreamer1.0-0")
  -    (:li "gir1.2-gst-plugins-base-1.0"))
  -   (:p "For systems from the Fedora family:")
  -   (:ul
  -    (:li "gstreamer1-devel")
  -    (:li "gstreamer1-plugins-base-devel"))
  -   (:p "After the desired plugins have been installed, clear the GStreamer cache at "
  -       (:code "~/.cache/gstreamer-1.0") " and restart Nyxt.")
  -   (:h3 "Website crashes")
  -   (:p "If some websites systematically crash, try to install all the required Gstreamer plugins
  +    (:ul
  +     (:li "gst-libav")
  +     (:li "gst-plugins-bad")
  +     (:li "gst-plugins-base")
  +     (:li "gst-plugins-good")
  +     (:li "gst-plugins-ugly"))
  +    (:p "On Debian-based systems, you might be looking for (adapt the version numbers):")
  +    (:ul
  +     (:li "libgstreamer1.0-0")
  +     (:li "gir1.2-gst-plugins-base-1.0"))
  +    (:p "For systems from the Fedora family:")
  +    (:ul
  +     (:li "gstreamer1-devel")
  +     (:li "gstreamer1-plugins-base-devel"))
  +    (:p "After the desired plugins have been installed, clear the GStreamer cache at "
  +        (:code "~/.cache/gstreamer-1.0") " and restart Nyxt.")
  +    (:h3 "Website crashes")
  +    (:p "If some websites systematically crash, try to install all the required Gstreamer plugins
   as mentioned in the 'Playing videos' section.")
  -   (:h3 "Input method support (CJK, etc.)")
  -   (:p "Depending on your setup, you might have to set some environment
  +    (:h3 "Input method support (CJK, etc.)")
  +    (:p "Depending on your setup, you might have to set some environment
   variables or run some commands before starting Nyxt, for instance")
  -   (:pre (:code "
  +    (:pre (:code "
   GTK_IM_MODULE=xim
   XMODIFIERS=@im=ibus
   ibus --daemonize --replace --xim"))
  -   (:p "You can persist this change by saving the commands in
  +    (:p "You can persist this change by saving the commands in
   your " (:code ".xprofile") " or similar.")
  -   (:h3 "Font size on HiDPI displays")
  -   (:p "On HiDPI displays, the font size used for displaying web and Nyxt's
  +    (:h3 "Font size on HiDPI displays")
  +    (:p "On HiDPI displays, the font size used for displaying web and Nyxt's
   prompt-buffer content might be too tiny.")
  -   (:p "To fix this issue when using the WebKitGTK render, export the following
  +    (:p "To fix this issue when using the WebKitGTK render, export the following
   environment variable before starting Nyxt:")
  -   (:pre (:code "
  +    (:pre (:code "
   export GDK_SCALE=2
   export GDK_DPI_SCALE=0.5
   nyxt
   "))
  -   (:h3 "StumpWM mouse scroll")
  -   (:p "If the mouse scroll does not work for you, see the "
  -       (:a
  -        :href "https://github.com/stumpwm/stumpwm/wiki/FAQ#my-mouse-wheel-doesnt-work-with-gtk3-applications-add-the-following-to"
  -        "StumpWM FAQ")
  -       " for a fix.")
  -   (:h3 "Blank WebKit web-views")
  -   (:p "If you are experiencing problems with blank web-views on some sites you
  +    (:h3 "StumpWM mouse scroll")
  +    (:p "If the mouse scroll does not work for you, see the "
  +        (:a
  +         :href "https://github.com/stumpwm/stumpwm/wiki/FAQ#my-mouse-wheel-doesnt-work-with-gtk3-applications-add-the-following-to"
  +         "StumpWM FAQ")
  +        " for a fix.")
  +    (:h3 "Blank WebKit web-views")
  +    (:p "If you are experiencing problems with blank web-views on some sites you
       can try to disable compositing. To disable compositing from your
       initialization file, you can do the following: ")
  -   (:pre (:code "(setf (uiop:getenv \"WEBKIT_DISABLE_COMPOSITING_MODE\") \"1\")"))))
  +    (:pre (:code "(setf (uiop:getenv \"WEBKIT_DISABLE_COMPOSITING_MODE\") \"1\")"))))
  
positive.code: For instance if you configure the `override-map' slot in `input-buffer', both
  `panel-buffer' and `web-buffer' classes will inherit from the new value.")
  
     (:h3 "Keybinding configuration")
     (:p "Nyxt supports multiple " (:i "bindings schemes") " such as CUA (the
      default), Emacs or vi.  Changing scheme is as simple as running the
      corresponding mode, e.g. "
         (:code "emacs-mode") ".  To make the change persistent across sessions,
  add the following to your configuration:")
     (:ul
      (:li "vi bindings:"
           (:pre (:code "
  \(define-configuration buffer
    ((default-modes (append '(vi-normal-mode) %slot-default%))))")))
      (:li "Emacs bindings:"
           (:pre (:code "
  \(define-configuration buffer
    ((default-modes (append '(emacs-mode) %slot-default%))))"))))
     (:p "You can create new scheme names with " (:code "keymap:make-scheme-name")
         ".  Also see the " (:code "scheme-name") " class and the "
         (:code "define-scheme") " macro.")
     (:p "To extend the bindings of a specific mode, you can extend the mode with "
         (:code "define-configuration") " and extend its binding scheme with "
         (:code "define-scheme") ". For example:")
     (:pre (:code "
  \(define-configuration base-mode
    ((keymap-scheme
      (define-scheme (:name-prefix \"my-base\" :import %slot-default%)
        scheme:vi-normal
        (list \"g b\" (make-command switch-buffer* ()
                      (switch-buffer :current-is-last-p t)))))))"))
     (:p "The " (:code "override-map") " is a keymap that has priority over
  all other keymaps.  By default, it has few bindings like the one
  for " (command-markup 'execute-command) ".  You can use it to set keys globally:")
     (:pre (:code "
  \(define-configuration buffer
    ((override-map (let ((map (make-keymap \"override-map\")))
                     (define-key map
                       \"M-x\" 'execute-command
                       \"C-space\" 'nothing)))))"))
     (:p "The " (:code "nothing") " command is useful to override bindings to do
  nothing. Note that it's possible to bind any command, including those of
  disabled modes that are not listed in " (command-markup 'execute-command) ".")
     (:p "In addition, a more flexible approach is to create your own mode with
  your custom keybindings.  When this mode is added first to the buffer mode list,
  its keybindings have priorities over the other modes.
  Note that this kind of global keymaps also have priority over regular character
  insertion, so you should probably not bind anything without modifiers in such a
  keymap.")
     (:pre (:code "
  \(defvar *my-keymap* (make-keymap \"my-map\"))
  \(define-key *my-keymap*
    \"C-f\" 'nyxt/history-mode:history-forwards
  
negative.code: \(define-configuration (buffer web-buffer)
    ((default-modes (append '(my-mode) %slot-default%))))"))
  
      (:p "Bindings are subject to various translations as per "
          (:code "keymap:*translator*") ". "
          "By default if it fails to find a binding it tries again with inverted
  shifts.  For instance if " (:code "C-x C-F") " fails to match anything " (:code "C-x C-f")
          " is tried."
          "See the default value of " (:code "keymap:*translator*") " to learn how to
           custsomize it or set it to " (:code "nil") " to disable all forms of
           translation.")
  
      (:h3 "Search engines")
      (:p "See the " (:code "search-engines") " buffer slot documentation.
  Bookmarks can also be used as search engines, see the corresponding section.")
      (:p "Nyxt comes with some default search engines for "
          (:code (format nil "~{~a~^, ~}"
                         (mapcar (lambda (engine)
                                   (quri:uri-host (quri:uri (getf engine :search-url))))
                                 (rest (getf (mopu:slot-properties 'context-buffer 'search-engines)
                                             :initform)))))
          ". "
          "The following example shows one way to add new search engines.")
      (:pre (:code "
  \(defvar *my-search-engines*
    (list
     '(\"python3\" \"https://docs.python.org/3/search.html?q=~a\" \"https://docs.python.org/3\")\
  