anchor.diff:    (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))
   
  -(defun start (language buffer)
  +(defun start (client buffer)
     (let* ((root-path *root-path*)
            (workspace (find-workspace root-path)))
       (cond
  
positive.code:        (let* ((connection (jsonrpc:make-client))
                (workspace (make-workspace :connection connection
                                           :root root-path
                                           :language-id (get-language-id language))))
           (push workspace *workspaces*)
           (setf (buffer-workspace buffer) workspace)
           (dolist (response-method *response-methods*)
             (jsonrpc:expose connection (string response-method) response-method))
           (jsonrpc:client-connect (workspace-connection workspace)
                                   :mode :tcp
                                   :port 2089)
           (initialize workspace)
           (initialized workspace)
           workspace))))
  
negative.code: (lem:define-command lsp-hover () ()
    (alexandria:when-let ((message (hover (lem:current-point))))
      (lem:display-popup-message (wrap-text message 80))))
  
  (defmacro define-tcp-client (mode-name &rest args)
    `(setf (get ',mode-name 'client)
           (make-instance 'tcp-client ,@args)))
  
  (define-tcp-client lem-js-mode:js-mode
    :program "node ~/opt/javascript-typescript-langserver/lib/language-server"
    :language-id "javascript"
    :port 2089)
  