First cut on lsp-mode restructoring 後繼,https://github.com/emacs-lsp/lsp-mode/pull/469 被合併了。
這是重大的改動
- 原來的簡單client如lsp-{css,bash,groovy,html,…}被整合進
lsp-clients.el。對於這類語言(require 'lsp-clients)後M-x lsp。複雜的仍保留各自的包:lsp-ccls lsp-java … - 支援每個workspace多個language servers,標識爲
lsp--buffer-workspaces - 簡單的session管理,見
M-x lsp-describe-session(用widget.el畫樹)M-x lsp-restart-workspace - 原先,project最後一個buffer close時關閉language server,現在需要用
M-x lsp-shutdown-workspace(或者(setq lsp-keep-workspace-alive nil)) - 預設
lsp-auto-configure爲t,自動配置lsp-ui company-lsp(及yas-minor-mode) flymake/flycheck - 爲了簡化mutual dependency處理,之前的各個
lsp-*.el被合併成lsp.el,接下來要做的是把各個包遷移到lsp.el的新接口。現在是引入breaking changes的絕佳機會。詳見lsp-mode#479 Port existing packages to lsp.el - 原來用
lsp--cur-workspace標識當前workspace (哪個language,哪個project);現在用lsp--buffer-workspaces(複數是因爲可以多language servers),當lsp--cur-workspace設置時則處理單一language server - 若language server支援workspace folders,client可以使用
(lsp-register-client (make-lsp-client ... :multi-root t))。新開的buffer所屬的project也會註冊到現有的language server上,除非lsp的參數ignore-multi-folder爲t
我做了一些測試,12月8日舊的接口刪除了,lsp.el和lsp-*.el定義了很多同名函數,有些有行爲差異,如果部分插件依賴前者、部分插件依賴後者就會導致一些插件運行錯誤。lsp-mode.el重定向到lsp.el
spacemacs +tools/lsp用戶參見https://github.com/syl20bnr/spacemacs/issues/11161#issuecomment-443483225討論
配置
(use-package lsp-mode
:commands lsp
:init
(setq lsp-auto-guess-root t) ; 我習慣自動選project root
;; (setq lsp-prefer-flymake t) ; 預設t。flymake替代flycheck
:config
(require 'lsp-clients) ; ocaml,css,python,bash,...
)
lsp-java
(use-package lsp-java
:hook (java-mode . (lambda () (require 'lsp-java) (lsp))))
ccls
(use-package ccls
:hook ((c-mode c++-mode objc-mode) . (lambda () (require 'ccls) (lsp))))
另外參見 lsp mode · MaskRay/ccls Wiki · GitHub 注意原來的M-x lsp-ccls-enable不存在了
clangd (lsp-clients.el predefined server)
(use-package lsp-mode
:commands lsp
:hook ((c-mode c++-mode objc-mode) . lsp))
作爲predefined server, priority爲-1會被priority 0的external package覆蓋
pyls
(add-hook 'python-mode-hook #'lsp)
其他
另外emacs-cquery我也改好了。
project root用lsp--suggest-project-root查詢,(projectile-project-root)或(project-current)。如果(setq lsp-auto-guess-root t)可以避免進入新project時的menu

