anchor.diff:  
   (defun config-content ()
     (spinneret:with-html-string
  -    (:h2 "Configuration")
  -    (:p "Nyxt is written in the Common Lisp programming language which offers a
  +    (:section
  +     :id "configuration"
  +     (:h2 "Configuration")
  +     (:p "Nyxt is written in the Common Lisp programming language which offers a
   great perk: everything in the browser can be customized by the user, even while
   it's running!")
  -    (:p "To get started with Common Lisp, we recommend checking out
  +     (:p "To get started with Common Lisp, we recommend checking out
       our web page: "
  -        (:a :href "https://nyxt.atlas.engineer/learn-lisp" "Learn Lisp")
  -        ". It contains numerous pointers to other resources, including
  +         (:a :href "https://nyxt.atlas.engineer/learn-lisp" "Learn Lisp")
  +         ". It contains numerous pointers to other resources, including
           free books both for beginners and seasoned programmers.")
  -    (:p "Nyxt provides a mechanism for new users unfamiliar with Lisp to
  +     (:p "Nyxt provides a mechanism for new users unfamiliar with Lisp to
   customize Nyxt. Start by invoking the commands " (command-markup 'describe-class) "
   or " (command-markup 'describe-slot) ".  You can press the button marked 'Configure' to
   change the value of a setting. The settings will be applied immediately and
   saved for future sessions. Please note that these settings will not alter
   existing object instances.")
  -    (:p "Settings created by Nyxt are stored in "
  -        (:code (files:expand *auto-config-file*)) ".")
  -    (:p "Any settings can be overridden manually by "
  -        (:code (files:expand *config-file*)) ".")
  -    (:p "The following section assumes knowledge of basic Common Lisp or a
  +     (:p "Settings created by Nyxt are stored in "
  +         (:code (files:expand *auto-config-file*)) ".")
  +     (:p "Any settings can be overridden manually by "
  +         (:code (files:expand *config-file*)) ".")
  +     (:p "The following section assumes knowledge of basic Common Lisp or a
   similar programming language.")
  -    (:p "The user needs to manually create the Nyxt configuration file, and the parent folders if necessary."
  -        (when (and (current-buffer)     ; In case manual is dumped.
  -                   (not (files:nil-pathname-p (files:expand *config-file*))))
  -          (:p
  -           "You can also press the button below to create said file, if it's not
  +     (:p "The user needs to manually create the Nyxt configuration file, and the parent folders if necessary."
  +         (when (and (current-buffer)     ; In case manual is dumped.
  +                    (not (files:nil-pathname-p (files:expand *config-file*))))
  +           (:p
  +            "You can also press the button below to create said file, if it's not
   created yet."
  -           (let ((config-file-path (files:expand *config-file*)))
  -             (:p (:a :class "button"
  -                     :href (ps:ps (nyxt/ps:lisp-eval
  -                                   (:title "maybe-create-config-file")
  -                                   (if (uiop:file-exists-p config-file-path)
  -                                       (echo "Configuration file exists")
  -                                       (progn (ensure-directories-exist config-file-path)
  -                                              (ensure-file-exists config-file-path)
  -                                              (echo "Configuration file created at ~s."
  -                                                    config-file-path)))))
  -                     "Create configuration file"))))))
  -
  -    (:p "Example:")
  -    (:pre (:code "(define-configuration buffer
  +            (let ((config-file-path (files:expand *config-file*)))
  +              (:p (:a :class "button"
  +                      :href (ps:ps (nyxt/ps:lisp-eval
  +                                    (:title "maybe-create-config-file")
  +                                    (if (uiop:file-exists-p config-file-path)
  +                                        (echo "Configuration file exists")
  +                                        (progn (ensure-directories-exist config-file-path)
  +                                               (ensure-file-exists config-file-path)
  +                                               (echo "Configuration file created at ~s."
  +                                                     config-file-path)))))
  +                      "Create configuration file"))))))
  +
  +     (:p "Example:")
  +     (:pre (:code "(define-configuration buffer
     ((default-modes (append '(no-script-mode) %slot-default%))))"))
  -    (:p "The above turns on the 'no-script-mode' (disables JavaScript) by default for
  +     (:p "The above turns on the 'no-script-mode' (disables JavaScript) by default for
   every buffer.")
  -    (:p "The " (:code "define-configuration") " macro can be used to customize
  +     (:p "The " (:code "define-configuration") " macro can be used to customize
   the slots of classes like the browser, buffers, windows, etc.  Refer to the
   class and slot documentation for the individual details.")
  -    (:p "To find out about all modes known to Nyxt,
  +     (:p "To find out about all modes known to Nyxt,
   run " (command-markup 'describe-command) " and type 'mode'.")
   
  -    (:h3 "Slot configuration")
  -    (:p "Slots store values that can be either accessed (get) or changed
  +     (:section
  +      :id "slot-configuration"
  +      (:h3 "Slot configuration")
  +      (:p "Slots store values that can be either accessed (get) or changed
   (set). Setting new values for slots allows many possibilities of customization.
   For instance, keyboard layouts vary across the world. The slot "
  -        (:nxref :slot 'nyxt/hint-mode:hints-alphabet :class-name 'nyxt/hint-mode:hint-mode)
  -        " has the default value of "
  -        (:code "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  -        ". If the user has an American keyboard, they can do:")
  -    (:ol
  -     (:li "Execute command " (command-markup 'describe-slot) ";")
  -     (:li "Type " (:code "hints-alphabet")";")
  -     (:li "Select " (:code "hints-alphabet") " (" (:code "hint-mode") " class option);")
  -     (:li "Press the button " (:code "Configure") ", and;")
  -     (:li "Insert the string \"asfdghjkl\"") ".")
  -    (:p "This will make link-hinting more comfortable for this user. In
  +          (:nxref :slot 'nyxt/hint-mode:hints-alphabet :class-name 'nyxt/hint-mode:hint-mode)
  +          " has the default value of "
  +          (:code "ABCDEFGHIJKLMNOPQRSTUVWXYZ")
  +          ". If the user has an American keyboard, they can do:")
  +      (:ol
  +       (:li "Execute command " (command-markup 'describe-slot) ";")
  +       (:li "Type " (:code "hints-alphabet")";")
  +       (:li "Select " (:code "hints-alphabet") " (" (:code "hint-mode") " class option);")
  +       (:li "Press the button " (:code "Configure") ", and;")
  +       (:li "Insert the string \"asfdghjkl\"") ".")
  +      (:p "This will make link-hinting more comfortable for this user. In
   addition, other similar approaches of customization can be applied to slots
   such as " (:nxref :slot 'nyxt/spell-check-mode:spell-check-language :class-name 'nyxt/spell-check-mode:spell-check-mode)
  -", which can be expanded to do the spelling-check of other languages besides English.")
  -    (:h3 "Different types of buffers")
  -    (:p "There are multiple buffer classes, such as "
  -        (:nxref :class-name 'document-buffer) " (for structured documents) and "
  -        (:nxref :class-name 'input-buffer) " (for buffers that can receive user input).  A "
  -        (:nxref :class-name 'web-buffer) " class is used for web pages," (:nxref :class-name 'prompt-buffer)
  -        " for, well,the prompt buffer.  Some buffer classes may inherit from multiple other classes.
  +", which can be expanded to do the spelling-check of other languages besides English."))
  +
  +     (:section
  +      :id "buffers-types"
  +      (:h3 "Different types of buffers")
  +      (:p "There are multiple buffer classes, such as "
  +          (:nxref :class-name 'document-buffer) " (for structured documents) and "
  +          (:nxref :class-name 'input-buffer) " (for buffers that can receive user input).  A "
  +          (:nxref :class-name 'web-buffer) " class is used for web pages," (:nxref :class-name 'prompt-buffer)
  +          " for, well,the prompt buffer.  Some buffer classes may inherit from multiple other classes.
   For instance " (:nxref :class-name 'web-buffer) " and " (:nxref :class-name 'prompt-buffer)
  -        " both inherit from" (:nxref :class-name 'input-buffer) ".")
  -    (:p "You can configure one of the parent " (:nxref :class-name 'buffer) " classes slots and the new
  +          " both inherit from" (:nxref :class-name 'input-buffer) ".")
  +      (:p "You can configure one of the parent " (:nxref :class-name 'buffer) " classes slots and the new
   values will automatically cascade down as a new default for all child classes-
   unless this slot is specialized by these child classes.
   For instance if you configure the " (:nxref :slot 'override-map :class-name 'input-buffer)
   " slot in " (:nxref :class-name 'input-buffer) ", both " (:nxref :class-name 'panel-buffer) " and "
  -(:nxref :class-name 'web-buffer) " classes will inherit from the new value.")
  -
  -    (:h3 "Keybinding configuration")
  -    (:p "Nyxt supports multiple " (:i "bindings schemes") " such as CUA (the
  +(:nxref :class-name 'web-buffer) " classes will inherit from the new value."))
  +
  +     (:section
  +      :id "keybinding"
  +      (:h3 "Keybinding configuration")
  +      (:p "Nyxt supports multiple " (:i "bindings schemes") " such as CUA (the
       default), Emacs or vi.  Changing scheme is as simple as setting the
       corresponding mode as default, e.g. "
  -        (:nxref :class-name 'nyxt/emacs-mode:emacs-mode) ".  To make the change persistent across sessions,
  +          (:nxref :class-name 'nyxt/emacs-mode:emacs-mode) ".  To make the change persistent across sessions,
   add the following to your configuration:")
  -    (:ul
  -     (:li "vi bindings:"
  -          (:pre (:code "(define-configuration buffer
  +      (: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
  +       (:li "Emacs bindings:"
  +            (:pre (:code "(define-configuration buffer
     ((default-modes (append '(emacs-mode) %slot-default%))))"))))
  -    (:p "You can create new scheme names with " (:code "keymaps:make-scheme-name")
  -        ".  Also see the " (:code "scheme-name") " class and the "
  -        (:code "define-keyscheme-map") " 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-keyscheme-map") ". For example:")
  -    (:pre (:code "(define-configuration base-mode
  +      (:p "You can create new scheme names with " (:code "keymaps:make-scheme-name")
  +          ".  Also see the " (:code "scheme-name") " class and the "
  +          (:code "define-keyscheme-map") " 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-keyscheme-map") ". For example:")
  +      (:pre (:code "(define-configuration base-mode
     ((keyscheme-map
       (define-keyscheme-map \"my-base\" (list :import %slot-default%)
         keyscheme:vi-normal
         (list \"g b\" (make-command switch-buffer* ()
                       (switch-buffer :current-is-last-p t)))))))"))
  -    (:p "The " (:nxref :slot 'override-map :class-name 'input-buffer) " is a keymap that has priority over
  +      (:p "The " (:nxref :slot 'override-map :class-name 'input-buffer) " 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
  +      (: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 " (:nxref  :command 'nothing) " command is useful to override bindings to do
  +      (:p "The " (:nxref  :command '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
  +      (: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\"))
  +      (:pre (:code "(defvar *my-keymap* (make-keymap \"my-map\"))
   \(define-key *my-keymap*
     \"C-f\" 'nyxt/history-mode:history-forwards
     \"C-b\" 'nyxt/history-mode:history-backwards)
  
positive.code:     ;; It's good tone to `nyxt:quit' after you're done, but if you use nyxt
      ;; --no-socket, you don't have to. Just be ready for some RAM eating :)
      (nyxt:quit)))"))
      (:p "The contents of headless-config.lisp feature configuration forms that
  make Nyxt perform some actions to the opened pages and/or on certain
  hooks. Things you'd most probably want to put there are: ")
      (:ul
       (:li "Hook bindings, using the " (:nxref :package 'nhooks)
            " library and hooks provided by Nyxt.")
       (:li "Operations on the page. Check the " (:nxref :package 'nyxt/dom) "
            library and the " (:nxref :function 'document-model) "method.")
       (:ul
        (:li "The " (:nxref :function 'document-model)
             " method has a reasonably fresh copy of the page DOM (Document Object Model,
  reflecting the dynamic structure of the page). It is a " (:nxref :package 'plump "Plump")
  " DOM, which means that all " (:nxref :package 'plump "Plump") " (and "
  (:nxref :package 'clss "CLSS") ") functions can be used on it.")
        (:li (:nxref :function 'update-document-model)
             " is a function to force DOM re-parsing for the cases when you consider the
  current " (:nxref :function 'document-model) " too outdated.")
        (:li (:nxref :function 'clss:select)
             " is a CLSS function to find elements using CSS selectors (a terse
             notation for web page element description).")
        ;; FIXME: Make a nxref once we update CLSS submodule.
        (:li (:code"clss:ordered-select") " is the same as "
             (:nxref :function 'clss:select)
             ", except it guarantees that all the elements are returned in a
             depth-first traversal order.")
        (:li (:nxref :function 'nyxt/dom:click-element)
             " to programmatically click a certain element (including the ones returned by "
             (:nxref :function 'clss:select) ".)")
        (:li (:nxref :function 'nyxt/dom:focus-select-element) " to focus an input
             field, for example.")
        (:li (:nxref :function 'nyxt/dom:check-element) " to check a checkbox or a radio button.")
        (:li (:nxref :function 'nyxt/dom:select-option-element) " to select an option from the "
             (:code "<select>") " element options.")))
      (:p "Additionally, headless mode gracefully interacts with other CLI toggles the
  Nyxt has:")
      (:ul
       (:li (:code "--headless") " itself! Notice that you can debug your script
  by omitting this CLI flag.  When you're confident enough about it, put it back
  in. A good debugging tip, isn't it?")
       (:li (:code "--no-socket")
            " flag allows starting as many Nyxt instances as your machine can
  handle. Useful to parallelize computations.")
       (:li (:code "--profile nosave")
            " to not pollute your history and cache with the script-accessed pages."))
  
      (:h2 "Extensions")
      (:p "To install an extension, copy inside the "
          (:nxref :variable '*extensions-directory*) " (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
  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
  variables or run some commands before starting Nyxt, for instance")
      (:pre (:code "GTK_IM_MODULE=xim
  XMODIFIERS=@im=ibus
  ibus --daemonize --replace --xim"))
      (: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
  prompt-buffer content might be too tiny.")
      (:p "To fix this issue when using the WebKitGTK render, export the following
  environment variable before starting Nyxt:")
      (: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
      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\")"))))
  
negative.code:   ((search-engines (append (mapcar (lambda (engine) (apply 'make-search-engine engine))
                                     *my-search-engines*)
                             %slot-default%))))"))
        (:p "Note that the last search engine is the default one. For example, in
  order to make python3 the default, the above code can be slightly modified as
  follows.")
        (:pre (:code "(defvar *my-search-engines*
    (list
     '(\"doi\" \"https://dx.doi.org/~a\" \"https://dx.doi.org/\")
     '(\"python3\" \"https://docs.python.org/3/search.html?q=~a\" \"https://docs.python.org/3\")))
  