lsp-mode两个语言冲突了

python跟typescript都配置了相应的lsp-mode,但是只要打开一个*.py接着打开一个*.ts,那么ts的解析就会挂掉,因为lsp拿着python的后端去解析*.ts。反之亦然。截图、配置分别如下:

截图:右边的ts代码坏掉了,到处都是报错。报错信息里带有pycodestyle等字眼,应该是把ts当python来解析了

配置如下:

;; flycheck语法检查器
(require-package 'flycheck)

;; lsp mode
(require-package 'lsp-mode)
(lsp-mode t)

(require-package 'lsp-ui)
(add-hook 'lsp-mode-hook 'lsp-ui-mode)
(define-key lsp-ui-mode-map [remap xref-find-definitions] #'lsp-ui-peek-find-definitions)
(define-key lsp-ui-mode-map [remap xref-find-references] #'lsp-ui-peek-find-references)
(add-hook 'typescript-mode-hook 'flycheck-mode)
(add-hook 'web-mode-hook 'flycheck-mode)


;; ts的配置
(require-package 'lsp-javascript-typescript)
(require 'lsp-typescript)
(add-hook 'typescript-mode-hook #'lsp-typescript-enable) ;; for typescript support
(add-hook 'js-mode-hook #'lsp-typescript-enable)
(add-hook 'web-mode-hook #'lsp-typescript-enable) ;; *.tsx
(add-hook 'js2-mode-hook #'lsp-typescript-enable) ;; for js2-mode support
(add-hook 'rjsx-mode #'lsp-typescript-enable) ;; for rjsx-mode support

;; python的配置
(lsp-define-stdio-client lsp-python "python"
			 (lsp-make-traverser #'(lambda (dir)
						 (when (directory-files dir nil ".git") ;hardcode,只有项目root目录才可以是python root
						   (directory-files
						    dir
						    nil
						    "\\(__init__\\|setup\\)\\.py"))))
			 '("pyls"))
(add-hook 'python-mode-hook #'lsp-python-enable)

如果两个mode在一个project (相同的:rootUri)应该会出问题

1 个赞

果然!

这个算是bug吧,目前很难逾越过去吗?

我先自己写stdio-client定义吧,我们的项目是一个后端,“多个” ts。我自己先hardcode绕过去。

谢啦~

顺手提了issue https://github.com/emacs-lsp/lsp-mode/issues/335

回复了,目前很难逾越,lsp--workspace-client到处都在用。如果支持多个clients,可能要引入major-mode等机制关联client?

我也回复了https://github.com/emacs-lsp/lsp-mode/issues/287