anchor.diff:  
   (defun prompt-render-skeleton (prompt-buffer)
     (erase-document prompt-buffer)
  -  (ffi-buffer-evaluate-javascript-async
  -   prompt-buffer
  -   (ps:ps (ps:chain document
  -                    (write
  -                     (ps:lisp (markup:markup
  -                               (:head (:style (style prompt-buffer)))
  -                               (:body
  -                                (:div :id "prompt-area"
  -                                      (:div :id "prompt" (prompter:prompt prompt-buffer))
  -                                      (:div :id "prompt-extra" "[?/?]")
  -                                      (:div (:input :type (if (invisible-input-p prompt-buffer)
  -                                                              "password"
  -                                                              "text")
  -                                                    :id "input"
  -                                                    :value (prompter:input prompt-buffer)))
  -                                      (:div :id "prompt-modes" ""))
  -                                (markup:raw
  -                                 (markup:markup*
  -                                  `(:div :id "suggestions"
  -                                         ,@(when (invisible-input-p prompt-buffer)
  -                                             '(:hidden "true")))))))))))))
  +  (let ((vi-mode? (or (find-submode prompt-buffer 'vi-normal-mode)
  +                      (find-submode prompt-buffer 'vi-insert-mode))))
  +    (ffi-buffer-evaluate-javascript-async
  +     prompt-buffer
  +     (ps:ps (ps:chain document
  +                      (write
  +                       (ps:lisp (markup:markup
  +                                 (:head (:style (style prompt-buffer)))
  +                                 (:body
  +                                  (:div :id (if vi-mode? "prompt-area-vi" "prompt-area")
  +                                        (:div :id "prompt" (prompter:prompt prompt-buffer))
  +                                        (:div :id "prompt-extra" "[?/?]")
  +                                        (markup:raw
  +                                         (when vi-mode?
  +                                           (markup:markup
  +                                            (:div :id "vi-mode" ""))))
  +                                        (:div (:input :type (if (invisible-input-p prompt-buffer)
  +                                                                "password"
  +                                                                "text")
  +                                                      :id "input"
  +                                                      :value (prompter:input prompt-buffer)))
  +                                        (:div :id "prompt-modes" ""))
  +                                  (markup:raw
  +                                   (markup:markup*
  +                                    `(:div :id "suggestions"
  +                                           ,@(when (invisible-input-p prompt-buffer)
  +                                               '(:hidden "true"))))))))))))))
   
   (defun prompt-render-focus (prompt-buffer)
     (ffi-buffer-evaluate-javascript-async
  
positive.code: 
  (defun prompt-render-prompt (prompt-buffer)
    (let* ((suggestions (prompter:all-suggestions prompt-buffer))
           (marks (prompter:all-marks prompt-buffer)))
      (ffi-buffer-evaluate-javascript-async
       prompt-buffer
       (ps:ps
  
negative.code:                prompt-buffer suggestions marks
                 :multi-selection-p (some #'prompter:multi-selection-p
                                          (prompter:sources prompt-buffer)))))
         (when (ps:lisp vi-class)
           (let ((vi-indicator (ps:chain document (get-element-by-id "vi-mode"))))
             (setf (ps:chain vi-indicator |innerHTML|) (ps:lisp vi-letter))
             (setf (ps:chain vi-indicator class-name) (ps:lisp vi-class))))
         (setf (ps:chain document (get-element-by-id "prompt-modes") |innerHTML|)
               (ps:lisp
                (format nil "~{~a~^ ~}" (delete "prompt-buffer"
  