anchor.diff:        (echo message)
         (buffer-load url-or-node)))
   
  +(defmacro with-history ((history-sym buffer) &body body)
  +  "Run body if BUFFER has history entries, that is, if it owns some nodes."
  +  `(with-data-access (,history-sym (history-path ,buffer))
  +     (if (htree:owner history (id (current-buffer)))
  +         (progn ,@body)
  +         (echo "Buffer ~a has no history." (id ,buffer)))))
  +
   (define-command history-backwards (&optional (buffer (current-buffer)))
     "Go to parent URL in history."
     (let ((new-node
  
positive.code:    (buffer :initarg :buffer :accessor buffer :initform nil)
     (prompter:constructor
      (lambda (source)
        (with-data-unsafe (history (history-path (buffer source)))
          (funcall (if (conservative-history-movement-p (find-mode (buffer source) 'web-mode))
                       (alex:compose #'htree:owned-children #'htree:current-owner)
                       (alex:compose #'htree:children #'htree:current-owner-node))
  
negative.code:   (add-url-to-history url (buffer mode) mode)
    (reset-page-zoom :buffer (buffer mode)
                     :ratio (current-zoom-ratio (buffer mode)))
    (with-history (history (buffer mode))
      (sera:and-let* ((owner (htree:owner history (id (buffer mode))))
                      (node (htree:current owner))
                      (data (htree:data node))
  