anchor.diff:            (merge-pathnames "swank-extras.lisp"
                              (asdf:system-source-directory :lem-lisp-mode))))
       (lisp-eval `(swank:load-file ,filename)))
  -  (let ((srcbuffer (current-buffer)))
  -    (add-hook (variable-value 'load-file-functions :buffer srcbuffer)
  +  (let ((source-buffer (current-buffer)))
  +    (add-hook (variable-value 'load-file-functions :buffer source-buffer)
                 'lisp-definitions-load-file-hook)
  -    (add-hook (variable-value 'before-compile-functions :buffer srcbuffer)
  +    (add-hook (variable-value 'before-compile-functions :buffer source-buffer)
                 'lisp-definitions-before-compile-hook)
  -    (let ((cache-table
  -            (let ((buffer (lisp-definitions-buffer)))
  -              (or (and buffer
  -                       (buffer-value buffer 'cache-table))
  -                  (make-hash-table :test 'equal))))
  -          (definitions (request-walk (points-to-string (buffer-start-point srcbuffer)
  -                                                       (buffer-end-point srcbuffer))
  -                                     (buffer-package srcbuffer))))
  -      (let ((menu (make-instance 'lem.menu-mode:menu
  -                                 :buffer-name "*lisp-definitions*"
  -                                 :columns '("MOD" "Name  " ""))))
  -        (dolist (def definitions)
  -          (destructuring-bind (type name _name-id form pos) def
  -            (declare (ignore _name-id))
  -            (let* ((item (make-instance 'lem.menu-mode:menu-item
  -                                        :plist (list 'pos pos)))
  -                   (changed (multiple-value-bind (old win)
  -                                (gethash (cache-key def) cache-table)
  -                              (when win
  -                                (not (equal old form))))))
  -              (lem.menu-mode:append-menu-item item (if changed " * " ""))
  -              (lem.menu-mode:append-menu-item item name)
  -              (lem.menu-mode:append-menu-item item type)
  -              (lem.menu-mode:append-menu menu item)
  -              (unless changed
  -                (setf (gethash (cache-key def) cache-table) form)))))
  -        (lem.menu-mode:display-menu menu 'lisp-definitions-mode)
  -        (let ((buffer (lisp-definitions-buffer)))
  -          (setf (buffer-value buffer 'buffer-name) (buffer-name srcbuffer))
  -          (setf (buffer-value buffer 'cache-table) cache-table))))))
  +    (lisp-definitions-list-1 source-buffer)))
  +
  +(define-command lisp-definitions-update () ()
  +  (let ((line-number
  +          (if (eq (current-buffer) (lisp-definitions-buffer))
  +              (line-number-at-point (current-point)))))
  +    (alexandria:when-let ((source-buffer (lisp-definitions-source-buffer)))
  +      (lisp-definitions-list-1 source-buffer)
  +      (when line-number
  +        (move-to-line (current-point) line-number)))))
   
   (define-command lisp-definitions-show-source () ()
     (when (eq (current-buffer) (lisp-definitions-buffer))
  
positive.code:      (lambda (cache-table)
         (loop :for def :in (request-walk text package)
               :for (type name name-id form pos) := def
               :do (setf (gethash (cache-key def) cache-table) form))))))
  
  (define-command lisp-definitions-list () ()
    (require-swank-extras)
  
negative.code:       (alexandria:when-let ((cache-table (lisp-definitions-cache-table)))
          (funcall function cache-table)))))
  
  (defun lisp-definitions-cache-key (def)
    (destructuring-bind (type name name-id form pos) def
      (declare (ignore form pos))
      (list type name name-id)))
  