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