anchor.diff:  \(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
  +   (: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
  +       " 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.
  +   (: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 'buffer 'search-engines)
  -                                           :initform)))))
  -        ". "
  -        "The following example shows one way to add new search engines.")
  -    (:pre (:code "
  +   (: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 '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\")\
  
positive.code:                            (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
  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 '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 invokable 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 invokable outside of
          the context of a mode, use " (:code "define-command-global") ".")
      (: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
  write custom prompt-buffers.")
  
      (: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
  typed functions.  Each hook has a dedicated handler constructor.")
      (: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
  specify which input and output values are expected.")
      (: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
  can set a hook like the following in your configuration file:")
      (:pre (:code "
  \(defun old-reddit-handler (request-data)
    (let ((url (url request-data)))
      (setf (url request-data)
  
negative.code: \(define-configuration buffer
    ((profile (make-instance (or (find-profile-class (getf *options* :profile)) 'dev-profile)))
     (bookmarks-file (make-instance 'bookmarks-file
                                    :base-path \"~/personal/bookmarks/bookmarks.lisp.gpg\"))))"))
     (: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 'save-new-password) ": Query for name and new password to persist in the database.")
      (:li (command-markup 'copy-password) ": " (command-docstring-first-sentence '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 area, see
  the " (:code "status-formatter") " window slot.")
  
     (:h3 "Scripting")
     (:p "You can evaluate code from the command line with "
         (:code "--eval") " and " (:code "--load") ".  From a shell:")
     (:pre (:code "$ nyxt --no-init --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-init-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\")"))))
  