求助:较复杂环境下的lsp-mode配置(也可能只是我配置问题,和环境无关hhh

说是较为复杂,实际环境在人看来反而是听简单的,多俩个版本切换工具。 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))

也许和 lsp-use-plists有关,涉及反序列化,我加上(setq lsp-use-plists t)试试

把elpa包全删了,重新编译了下,可以了 :sweat_smile: