anchor.diff:                                             (string arg)
                                              arg)))))))
   
  -(defun initialize-hooks (buffer)
  +(defun self-insert-hook (c)
  +  (alexandria:when-let* ((workspace (buffer-workspace (lem:current-buffer)))
  +                         (fn (gethash c (workspace-triggers workspace))))
  +    (funcall fn)))
  +
  +(defun initialize-buffer (buffer workspace)
     (lem:add-hook (lem:variable-value 'lem:before-change-functions :buffer buffer) 'on-change)
     ;(lem:add-hook (lem:variable-value 'lem:before-save-hook :buffer buffer) 'text-document-will-save)
     (lem:add-hook (lem:variable-value 'lem:after-save-hook :buffer buffer) 'text-document-did-save)
  -  (lem:add-hook (lem:variable-value 'lem:kill-buffer-hook :buffer buffer) 'text-document-did-close))
  +  (lem:add-hook (lem:variable-value 'lem:kill-buffer-hook :buffer buffer) 'text-document-did-close)
  +  (lem:add-hook (lem:variable-value 'lem:self-insert-after-hook :buffer buffer)
  +                'self-insert-hook)
  +  (dolist (c (get-completion-trigger-characters workspace))
  +    (setf (gethash c (workspace-triggers workspace)) 'lem.language-mode::complete-symbol)))
   
   (defun start (client buffer)
     (let* ((root-path *root-path*)
  
positive.code:   text-document-sync
    root
    language-id
    (file-version-table (make-hash-table)))
  
  (defstruct text-document-sync
  
negative.code:                    (list :mode :stdio))))
           (initialize workspace)
           (initialized workspace)
           workspace)))
      (text-document-did-open buffer)
      (initialize-buffer buffer workspace)
      (values)))
  
  (lem:define-command lsp-hover () ()
    (alexandria:when-let ((message (hover (lem:current-point))))
  