diff --git a/lspce-core.el b/lspce-core.el index aae41c5..65212fe 100644 --- a/lspce-core.el +++ b/lspce-core.el @@ -132,8 +132,8 @@ be set to `lspce-move-to-lsp-abiding-column', and (cl-defstruct lspce-documentChange (kind) ;; change, documentChange, create, rename or delete - (change) ;; - ) + (change)) ;; + (cl-defstruct lspce-completionCache (prefix-start) @@ -190,6 +190,7 @@ be set to `lspce-move-to-lsp-abiding-column', and :synchronization (list :dynamicRegistration :json-false :willSave t + :willSaveWaitUntil t :didSave t) :completion (list :dynamicRegistration :json-false @@ -205,8 +206,7 @@ be set to `lspce-move-to-lsp-abiding-column', and :tagSupport (list :valueSet [1]) :preselectSupoort :json-false :insertReplaceSupport :json-false - :resolveSupport (list :properties (vector "documentation" "details" "additionalTextEdits")) - ) + :resolveSupport (list :properties (vector "documentation" "details" "additionalTextEdits"))) :contextSupport t) :hover (list :dynamicRegistration :json-false @@ -274,8 +274,8 @@ be set to `lspce-move-to-lsp-abiding-column', and :tagSupport (list :valueSet [1 2])) :callHierarchy (list :dynamicRegistration :json-false)) - :experimental lspce--{}) - ) + :experimental lspce--{})) + (defun lspce--initializeParams (rootUri &optional initializationOptions trace workspaceFolders) "初始化参数" @@ -701,13 +701,22 @@ Return value of `body', or nil if interrupted." (lspce--notify "textDocument/didClose" (lspce--make-didCloseTextDocumentParams)))) +(defun lspce--make-willSaveTextDocumentParams () + (list :textDocument (lspce--textDocumentIdenfitier (lspce--uri)) + :reason 1)) + (defun lspce--notify-textDocument/willSave () "Send textDocument/willSave to server." (when (lspce--server-capable-chain "textDocumentSync" "willSave") (lspce--notify "textDocument/willSave" - (list :textDocument - (lspce--textDocumentIdenfitier (lspce--uri)) :reason 1)))) + (lspce--make-willSaveTextDocumentParams)))) + +(defun lspce--request-textDocument/willSaveWaitUntil () + "Request textDocument/willSaveWaitUntil." + (when (lspce--server-capable-chain "textDocumentSync" "willSaveWaitUntil") + (let ((response (lspce--request "textDocument/willSaveWaitUntil" (lspce--make-willSaveTextDocumentParams) 1))) + (when response (lspce--apply-text-edits response))))) (defun lspce--notify-textDocument/didSave () "Send textDocument/willSave to server." @@ -892,8 +901,8 @@ Return value of `body', or nil if interrupted." (lspce--info "Server message: %s" message)) ((eq message-type 4) (lspce--debug "Server message: %s" message)))) - (t - ))))))) + (t))))))) + (provide 'lspce-core) diff --git a/lspce.el b/lspce.el index 5da4136..1b8a3e0 100644 --- a/lspce.el +++ b/lspce.el @@ -1757,6 +1757,7 @@ Records BEG, END and PRE-CHANGE-LENGTH locally." (add-hook 'pre-command-hook 'lspce--pre-command-hook nil t) (add-hook 'post-self-insert-hook 'lspce--post-self-insert-hook nil t) (add-hook 'before-save-hook 'lspce--notify-textDocument/willSave nil t) + (add-hook 'before-save-hook 'lspce--request-textDocument/willSaveWaitUntil nil t) (add-hook 'after-save-hook 'lspce--notify-textDocument/didSave nil t) (when lspce-enable-eldoc (when eldoc-mode @@ -1794,6 +1795,7 @@ Records BEG, END and PRE-CHANGE-LENGTH locally." (remove-hook 'pre-command-hook 'lspce--pre-command-hook t) (remove-hook 'post-self-insert-hook 'lspce--post-self-insert-hook t) (remove-hook 'before-save-hook 'lspce--notify-textDocument/willSave t) + (remove-hook 'before-save-hook 'lspce--request-textDocument/willSaveWaitUntil t) (remove-hook 'after-save-hook 'lspce--notify-textDocument/didSave t) (remove-hook 'flymake-diagnostic-functions 'lspce-flymake-backend t) (remove-hook 'eldoc-documentation-functions #'lspce-eldoc-function t) diff --git a/src/lib.rs b/src/lib.rs index 06fc01e..040a7d8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -150,6 +150,7 @@ impl LspServer { Logger::info(&format!("emacs_envs: {}", &emacs_envs)); let mut child; + let root_dir = root_uri.strip_prefix("file://").unwrap_or(&root_uri); if !emacs_envs.is_empty() { let envs = serde_json::from_str::>(&emacs_envs); match envs { @@ -160,7 +161,8 @@ impl LspServer { .stdout(Stdio::piped()) .stderr(Stdio::piped()) .envs(envs) - .spawn(); + .current_dir(root_dir) + .spawn(); } Err(e) => { Logger::error(&format!( @@ -168,13 +170,14 @@ impl LspServer { )); return None; } - } + } } else { child = Command::new(cmd) .args(args) .stdin(Stdio::piped()) .stdout(Stdio::piped()) .stderr(Stdio::piped()) + .current_dir(root_dir) .spawn(); }