anchor.diff:                             (mapcar (lambda (engine) (apply 'make-search-engine engine))
                                      *my-search-engines*)))))"))
   
  -   (:h3 "URL-dispatchers")
  -   (:p "You can configure which actions to take depending on the URL to be
  +    (:h3 "URL-dispatchers")
  +    (:p "You can configure which actions to take depending on the URL to be
   loaded.  For instance, you can configure which Torrent program to start to load
   magnet links.  See the" (:code "url-dispatching-handler") " function
   documentation.")
   
  -   (:h3 "Downloads")
  -   (:p "See the " (command-markup 'nyxt/download-mode:list-downloads) " command and the "
  -       (:code "download-path") " buffer slot documentation.")
  -
  -   (:h3 "Proxy and Tor")
  -   (:p "See the " (:code "proxy-mode") " documentation.")
  -
  -   (:h3 "Blocker mode")
  -   (:p "This mode blocks access to websites related to especific hosts. To see
  +    (:h3 "Downloads")
  +    (:p "See the " (command-markup 'nyxt/download-mode:list-downloads) " command and the "
  +        (:code "download-path") " buffer slot documentation.")
  +
  +    (:h3 "Proxy and Tor")
  +    (:p "See the " (:code "proxy-mode") " documentation.")
  +
  +    (:h3 "Blocker mode")
  +    (:p "This mode blocks access to websites related to especific hosts. To see
   all hosts being blocked, execute command " (:code "describe-variable") ", choose variable "
   (:code "NYXT/BLOCKER-MODE:*DEFAULT-HOSTLIST*") ", and read data on "
   (:code "nyxt/blocker-mode:url-body") " slot." " To customize host blocking, read the "
   (:code "blocker-mode") " documentation.")
   
  -   (:h3 "Custom commands")
  -   (:p "Creating your own invocable commands is similar to creating a Common
  +    (:h3 "Custom commands")
  +    (:p "Creating your own invocable commands is similar to creating a Common
   Lisp function, except the form is " (:code "define-command") " instead of "
   (:code "defun") ". If you want this command to be invocable outside of
           the context of a mode, use " (:code "define-command-global") ".")
  -   (:p "Example:")
  -   (:pre (:code
  -          "(define-command-global bookmark-url ()
  +    (:p "Example:")
  +    (:pre (:code
  +           "(define-command-global bookmark-url ()
     \"Query the user which URL to bookmark.\"
     (let ((url (prompt
                 :prompt \"Bookmark URL\"
                 :sources (make-instance 'prompter:raw-source))))
       (bookmark-add url)))"))
  -   (:p "See the " (:code "prompt-buffer") " class documentation for how to write
  +    (:p "See the " (:code "prompt-buffer") " class documentation for how to write
   write custom prompt-buffers.")
   
  -   (:h3 "Hooks")
  -   (:p "Hooks provide a powerful mechanism to tweak the behaviour of various
  +    (:h3 "Hooks")
  +    (:p "Hooks provide a powerful mechanism to tweak the behaviour of various
   events that occur in the context of windows, buffers, modes, etc.")
  -   (:p "A hook holds a list of " (:i "handlers") ".  Handlers are named and
  +    (:p "A hook holds a list of " (:i "handlers") ".  Handlers are named and
   typed functions.  Each hook has a dedicated handler constructor.")
  -   (:p
  -    "Hooks can be 'run', that is, their handlers are run according to
  +    (:p
  +     "Hooks can be 'run', that is, their handlers are run according to
   the " (:code "combination") " slot of the hook.  This combination is a function
   of the handlers.  Depending on the combination, a hook can run the handlers
   either in parallel, or in order until one fails, or even " (:i "compose")
  -    " them (pass the result of one as the input of the next).  The handler types
  +     " them (pass the result of one as the input of the next).  The handler types
   specify which input and output values are expected.")
  -   (:p "Many hooks are executed at different points in Nyxt, among others:
  +    (:p "Many hooks are executed at different points in Nyxt, among others:
   ")
  -   (:ul
  -    (:li "Global hooks, such as " (:code "*after-init-hook*") ".")
  -    (:li "Window- or buffer-related hooks.")
  -    (:li "Commands 'before' and 'after' hooks.")
  -    (:li "Modes 'enable' and 'disable' hooks."))
  -   (:p "For instance, if you want to force 'old.reddit.com' over 'www.reddit.com', you
  +    (:ul
  +     (:li "Global hooks, such as " (:code "*after-init-hook*") ".")
  +     (:li "Window- or buffer-related hooks.")
  +     (:li "Commands 'before' and 'after' hooks.")
  +     (:li "Modes 'enable' and 'disable' hooks."))
  +    (:p "For instance, if you want to force 'old.reddit.com' over 'www.reddit.com', you
   can set a hook like the following in your configuration file:")
  -   (:pre (:code "
  +    (:pre (:code "
   \(defun old-reddit-handler (request-data)
     (let ((url (url request-data)))
       (setf (url request-data)
  
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: ;; 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
  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
  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
  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
  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 "
  \(defmethod customize-instance ((buffer buffer) &key)
    (echo \"Buffer ~a created.\" buffer))")))
      (: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+' \
    --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
  executed in the order they appear.")
      (: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
  \(format t \"~a~&\" +version+)"))
      (: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
  instance must be non-nil.")
      (: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
  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\")"))))
  