说是较为复杂,实际环境在人看来反而是听简单的,多俩个版本切换工具。 MacOS系统环境: 使用pyenv管理python版本,通过pipx在隔离环境中安装python工具,或者通过pip安装。 使用volta(类似于nvm)管理node版本,使用volta安装lsp服务器,大致上也和npm或yarn之类的安装差不多。 无论通过volta、pipx还是pip安装的工具都是全局可用的。
问题:我无论使用使用volta、pipx、pip安装ruff-lsp或pyright或pylsp,通过exec-path-from-shell获取环境变量。皆产生类似如下报错:
LSP :: Connected to [ruff-lsp:53461/starting /Users/yifeng/Documents/Python/test].
Error processing message (wrong-type-argument hash-table-p (:params (:type 4 :message "Workspace settings: {
\"args\": [],
\"logLevel\": \"error\",
\"path\": [
\"ruff\"
],
\"interpreter\": [
\"python3\"
],
\"showNotifications\": \"off\",
\"organizeImports\": true,
\"fixAll\": true,
\"importStrategy\": \"fromEnvironment\"
}") :method "window/logMessage" :jsonrpc "2.0")).
Error processing message (wrong-type-argument hash-table-p (:params (:type 4 :message "Global settings: {}") :method "window/logMessage" :jsonrpc "2.0")).
Error processing message (wrong-type-argument hash-table-p (:id 1 :jsonrpc "2.0" :result (:capabilities (:positionEncoding "utf-16" :textDocumentSync (:openClose t :change 2 :willSave nil :willSaveWaitUntil nil :save t) :hoverProvider t :codeActionProvider (:codeActionKinds ["quickfix" "source.fixAll" "source.organizeImports" "source.fixAll.ruff" "source.organizeImports.ruff" "notebook.source.fixAll" "notebook.source.organizeImports" "notebook.source.fixAll.ruff" "notebook.source.organizeImports.ruff"] :resolveProvider t) :documentFormattingProvider t :executeCommandProvider (:commands ["ruff.applyAutofix" "ruff.applyOrganizeImports" "ruff.applyFormat"]) :workspace (:workspaceFolders (:supported t :changeNotifications t) :fileOperations nil)) :serverInfo (:name "Ruff" :version "0.0.49")))).
Mark set
GPT给出的信息:这几个错误似乎与 LSP 消息的处理有关。这些错误可能是由于 LSP 服务器发送的消息格式不正确或您的 Emacs LSP 客户端无法正确解析这些消息。这通常涉及到 LSP 客户端和服务器之间的兼容性问题。
有关环境变量的细节
# pyenv
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
export PATH="$PYENV_ROOT/shims:$PATH" # 这一条是我手动添上的,因为在终端中输出PATH存在这条,但emacs中没用,但添加上后依旧报错。
# volta
export VOLTA_HOME="$HOME/.volta"
export PATH="$VOLTA_HOME/bin:$PATH"
相关配置
;; exec-path-from-shell 部分
(leaf exec-path-from-shell
:ensure t
;; :custom (exec-path-from-shell-arguments . '("-l"))
:config
(when (memq window-system '(mac ns x))
(exec-path-from-shell-initialize)))
;; lsp部分
(leaf lsp-mode
:ensure t
;; :diminish (lsp-mode)
:hook (python-mode-hook . lsp-deferred)
;; :bind (:lsp-mode-map
;; ("C-c C-d" . lsp-describe-thing-at-point)
;; ([remap xref-find-definitions] . lsp-find-definition)
;; ([remap xref-find-references] . lsp-find-references))
:config
(setq lsp-enable-sinppet nil))