lsp-bridge -- 速度最快的语法补全插件

跑个题想问一下图里的是什么字体?多谢

霞鹜文楷

1 个赞

请教个问题, 如何手动开启 python 的语法补全? 事情是这样的, 我有多个后缀名不是 .py 的 python 文件, 例如 test.a, test.b, 打开文件后无法使用语法补全. 如何手动开启?

直接进入python-mode就好了

test.a, test.b 没有问题. 但如果是没有后缀, 比如说 test, 进入 python-mode 就会报错了.

[LSP-Bridge] handle_register_capability_message {’jsonrpc’: ’2.0’, ’id’: ’5’, ’method’: ’client/registerCapability’, ’params’: {’registrations’: [{’id’: ’5f29f398-d260-4ea1-b9e6-14be39d57694’, ’method’: ’textDocument/formatting’}]}}

我发现一个jdtls格式化代码的bug

@@ -892,7 +892,7 @@ class LspServer:
                         workspace_watch_files = self.parse_workspace_watch_files(message["params"])
                         self.monitor_workspace_files(workspace_watch_files)
                         log_time("Add workspace watch files: {}".format(workspace_watch_files))
-                    elif registration["id"] == "textDocument/formatting":
+                    elif registration["method"] == "textDocument/formatting":
                         self.code_format_provider = True
                     elif registration["id"] == "textDocument/rangeFormatting":
                         self.range_format_provider = True

已经修复了, 感谢反馈

1 个赞

报什么错?

提示说是 Wrong type argument: number-or-marker-p, nil.

toggle-debug-on-error

Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p nil)
  +(nil 1)
  (substring filename (+ (cl-position 46 filename) 1) (length filename))
  (and t (substring filename (+ (cl-position 46 filename) 1) (length filename)))
  (let* ((file-extension (and t (substring filename (+ (cl-position 46 filename) 1) (length filename)))) (langserver-info (and file-extension (cl-find-$
  lsp-bridge-get-lang-server-by-extension("/home/eric/documents/test" ((("vue") . "volar_emmet") (("ts") . "typescript_eslint") (("tsx") . "typescriptr$
  lsp-bridge-get-multi-lang-server-by-extension("/home/eric/documents/test")
  (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))
  (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))$
  (if filename (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mo$
  (let* ((filename (and t (or (condition-case nil (progn (file-truename ...)) (error nil)) (if (lsp-bridge-is-remote-file) (progn lsp-bridge-remote-fil$
  (cond ((and lsp-bridge-enable-org-babel (eq major-mode 'org-mode)) (set (make-local-variable 'acm-is-elisp-mode-in-org) nil) (lsp-bridge-org-babel-ch$
  lsp-bridge-has-lsp-server-p()
  (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode 'org-mode) (not (lsp-bridge-is-org-temp-buffer-p))))
  (if (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode 'org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (progn (if$
  (if (or (equal (buffer-name (current-buffer)) acm-buffer) (equal (buffer-name (current-buffer)) acm-doc-buffer)) nil (if lsp-bridge-disable-backup (p$
  lsp-bridge--enable()
  (if lsp-bridge-mode (lsp-bridge--enable) (lsp-bridge--disable))
  (let ((last-message (current-message))) (setq lsp-bridge-mode (cond ((eq arg 'toggle) (not lsp-bridge-mode)) ((and (numberp arg) (< arg 1)) nil) (t t$
  lsp-bridge-mode(1)
  (progn (lsp-bridge-mode 1))
  (if (cl-every #'(lambda (pred) (lsp-bridge-check-predicate pred "global-lsp-bridge-mode")) lsp-bridge-enable-predicates) (progn (lsp-bridge-mode 1)))
  #f(lambda () [t] (if (cl-every #'(lambda (pred) (lsp-bridge-check-predicate pred "global-lsp-bridge-mode")) lsp-bridge-enable-predicates) (progn (lsp$
  run-hooks(change-major-mode-after-body-hook prog-mode-hook python-base-mode-hook python-mode-hook)
  apply(run-hooks change-major-mode-after-body-hook (prog-mode-hook python-base-mode-hook python-mode-hook))
  run-mode-hooks(python-mode-hook)
  python-mode()
  funcall-interactively(python-mode)
  call-interactively(python-mode record nil)
  command-execute(python-mode record)
  counsel-M-x-action("python-mode")
  ivy-call()
  ivy-read("M-x " #<obarray n=36191> :predicate #f(compiled-function (sym) #<bytecode 0x1b96d1dc257f7be1>) :require-match t :history counsel-M-x-histor$
  counsel-M-x()
  funcall-interactively(counsel-M-x)
  call-interactively(counsel-M-x nil nil)
  command-execute(counsel-M-x)

你这个是文件名没有扩展名导致的, 你为啥要打开一些内容是python但是没有.py扩展名的文件?

lsp-bridge根据扩展名来推测你应该用什么 lsp server,没有扩展名, lsp-bridge 也不知道怎么判断。

有些时候还是会遇到像 testtest.a 这种文件的, 不能自动识别所以需要手动开启 python-mode.

我今天试了一下, 没有扩展名的文件, 直接用 python-mode 进入, lsp-bridge 可以正常工作。

你是用 emacs -Q 测试的吗?

现在是 emacs -Q 的测试结果, 貌似一样.

Debugger entered–Lisp error: (wrong-type-argument number-or-marker-p nil) +(nil 1) (substring filename (+ (cl-position 46 filename) 1) (length filename)) (and t (substring filename (+ (cl-position 46 filename) 1) (length filename))) (let* ((file-extension (and t (substring filename (+ (cl-position 46 filename) 1) (length filename)))) (langserver-info (and file-extension (cl-find-if #'(lambda (pair) (let … …)) extension-list)))) (if langserver-info (cdr langserver-info))) lsp-bridge-get-lang-server-by-extension(“/home/eric/a” (((“vue”) . “volar_emmet”) ((“ts”) . “typescript_eslint”) ((“tsx”) . “typescriptreact_eslint”) ((“component.html”) . “angular_template_html”) ((“component.ts”) . “angular_template_typescript”))) lsp-bridge-get-multi-lang-server-by-extension(“/home/eric/a”) (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename)) (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)) (if filename (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name))) (let* ((filename (and t (or (condition-case nil (progn (file-truename …)) (error nil)) (if (lsp-bridge-is-remote-file) (progn lsp-bridge-remote-file-path)))))) (if filename (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)))) (cond ((and lsp-bridge-enable-org-babel (eq major-mode 'org-mode)) (set (make-local-variable 'acm-is-elisp-mode-in-org) nil) (lsp-bridge-org-babel-check-lsp-server)) ((and (boundp 'acm-backend-lsp-server-names) acm-backend-lsp-server-names) acm-backend-lsp-server-names) (t (let* ((filename (and t (or (condition-case nil … …) (if … …))))) (if filename (let* ((multi-lang-server-name (or … …)) (lang-server-by-name (or … …))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)))))) lsp-bridge-has-lsp-server-p() (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode ‘org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (if (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode ‘org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (progn (if (not (lsp-bridge-is-remote-file)) (progn (if (and (buffer-file-name) (not (file-exists-p …))) (progn (save-buffer))))) (acm-backend-lsp-init) (acm-backend-lsp-workspace-symbol-init) (if lsp-bridge-enable-signature-help (progn (if lsp-bridge-signature-help-timer nil (setq lsp-bridge-signature-help-timer (run-with-idle-timer lsp-bridge-signature-help-fetch-idle t #’…))))) (if lsp-bridge-enable-auto-format-code (progn (if lsp-bridge-auto-format-code-timer nil (setq lsp-bridge-auto-format-code-timer (run-with-idle-timer lsp-bridge-auto-format-code-idle t #’…))))))) (if (or (equal (buffer-name (current-buffer)) acm-buffer) (equal (buffer-name (current-buffer)) acm-doc-buffer)) nil (if lsp-bridge-disable-backup (progn (setq make-backup-files nil) (setq auto-save-default nil) (setq create-lockfiles nil))) (if (and lsp-bridge-symbols-enable-which-func (featurep 'which-func) which-function-mode) (set (make-local-variable 'which-func-functions) (if (member #'lsp-bridge-symbols–current-defun which-func-functions) which-func-functions (setq which-func-functions (cons #'lsp-bridge-symbols–current-defun which-func-functions))))) (set (make-local-variable ‘lsp-bridge-revert-buffer-flag) nil) (if acm-backend-elisp-symbols-update-timer nil (setq acm-backend-elisp-symbols-update-timer (run-with-idle-timer lsp-bridge-elisp-symbols-update-idle t #’(lambda nil (funcall 'lsp-bridge-elisp-symbols-update))))) (if (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode 'org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (progn (if (not (lsp-bridge-is-remote-file)) (progn (if (and (buffer-file-name) (not …)) (progn (save-buffer))))) (acm-backend-lsp-init) (acm-backend-lsp-workspace-symbol-init) (if lsp-bridge-enable-signature-help (progn (if lsp-bridge-signature-help-timer nil (setq lsp-bridge-signature-help-timer (run-with-idle-timer lsp-bridge-signature-help-fetch-idle t …))))) (if lsp-bridge-enable-auto-format-code (progn (if lsp-bridge-auto-format-code-timer nil (setq lsp-bridge-auto-format-code-timer (run-with-idle-timer lsp-bridge-auto-format-code-idle t …))))))) (let ((tail lsp-bridge–internal-hooks)) (while tail (let ((hook (car tail))) (apply #'add-hook hook) (setq tail (cdr tail))))) (advice-add #'acm-hide :after #'lsp-bridge–completion-hide-advisor)) lsp-bridge–enable() (if lsp-bridge-mode (lsp-bridge–enable) (lsp-bridge–disable)) (let ((last-message (current-message))) (setq lsp-bridge-mode (cond ((eq arg 'toggle) (not lsp-bridge-mode)) ((and (numberp arg) (< arg 1)) nil) (t t))) (if (boundp 'local-minor-modes) (progn (setq local-minor-modes (delq 'lsp-bridge-mode local-minor-modes)) (if lsp-bridge-mode (progn (setq local-minor-modes (cons 'lsp-bridge-mode local-minor-modes)))))) (if lsp-bridge-mode (lsp-bridge–enable) (lsp-bridge–disable)) (run-hooks 'lsp-bridge-mode-hook (if lsp-bridge-mode 'lsp-bridge-mode-on-hook ‘lsp-bridge-mode-off-hook)) (if (called-interactively-p ‘any) (progn nil (if (and (current-message) (not (equal last-message (current-message)))) nil (let ((local " in current buffer")) (message “%s %sabled%s” “Lsp-Bridge mode” (if lsp-bridge-mode “en” “dis”) local)))))) lsp-bridge-mode(1) (progn (lsp-bridge-mode 1)) (if (cl-every #’(lambda (pred) (lsp-bridge-check-predicate pred “global-lsp-bridge-mode”)) lsp-bridge-enable-predicates) (progn (lsp-bridge-mode 1))) #f(lambda () [t] (if (cl-every #’(lambda (pred) (lsp-bridge-check-predicate pred “global-lsp-bridge-mode”)) lsp-bridge-enable-predicates) (progn (lsp-bridge-mode 1))))() run-hooks(change-major-mode-after-body-hook prog-mode-hook python-base-mode-hook python-mode-hook) apply(run-hooks change-major-mode-after-body-hook (prog-mode-hook python-base-mode-hook python-mode-hook)) run-mode-hooks(python-mode-hook) python-mode() funcall-interactively(python-mode) call-interactively(python-mode record nil) command-execute(python-mode record) execute-extended-command(nil “python-mode” “python-mod”) funcall-interactively(execute-extended-command nil “python-mode” “python-mod”) call-interactively(execute-extended-command nil nil) command-execute(execute-extended-command)

我尝试写了一个补丁 Try to fix 1+ nil error. · manateelazycat/lsp-bridge@015000f · GitHub

你更新测试看

我把 lsp-bridge 重新下载安装了, 但貌似不起作用.

Debugger entered–Lisp error: (wrong-type-argument number-or-marker-p nil) +(nil 1) (substring filename (+ (cl-position 46 filename) 1) (length filename)) (and t (substring filename (+ (cl-position 46 filename) 1) (length filename))) (let* ((file-extension (and t (substring filename (+ (cl-position 46 filename) 1) (length filename)))) (langserver-info (and file-extension (cl-find-if #'(lambda (pair) (let … …)) extension-list)))) (if langserver-info (cdr langserver-info))) lsp-bridge-get-lang-server-by-extension(“/home/eric/aa” (((“vue”) . “volar_emmet”) ((“ts”) . “typescript_eslint”) ((“tsx”) . “typescriptreact_eslint”) ((“component.html”) . “angular_template_html”) ((“component.ts”) . “angular_template_typescript”))) lsp-bridge-get-multi-lang-server-by-extension(“/home/eric/aa”) (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename)) (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)) (if filename (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name))) (let* ((filename (and t (or (condition-case nil (progn (file-truename …)) (error nil)) (if (lsp-bridge-is-remote-file) (progn lsp-bridge-remote-file-path)))))) (if filename (let* ((multi-lang-server-name (or (lsp-bridge-get-multi-lang-server-by-extension filename) (lsp-bridge-get-multi-lang-server-by-file-mode filename))) (lang-server-by-name (or (lsp-bridge-get-single-lang-server-by-extension filename) (lsp-bridge-get-single-lang-server-by-file-mode filename)))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)))) (cond ((and lsp-bridge-enable-org-babel (eq major-mode 'org-mode)) (set (make-local-variable 'acm-is-elisp-mode-in-org) nil) (lsp-bridge-org-babel-check-lsp-server)) ((and (boundp 'acm-backend-lsp-server-names) acm-backend-lsp-server-names) acm-backend-lsp-server-names) (t (let* ((filename (and t (or (condition-case nil … …) (if … …))))) (if filename (let* ((multi-lang-server-name (or … …)) (lang-server-by-name (or … …))) (if multi-lang-server-name multi-lang-server-name lang-server-by-name)))))) lsp-bridge-has-lsp-server-p() (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode ‘org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (if (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode ‘org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (progn (if (not (lsp-bridge-is-remote-file)) (progn (if (and (buffer-file-name) (not (file-exists-p …))) (progn (save-buffer))))) (acm-backend-lsp-init) (acm-backend-lsp-workspace-symbol-init) (if lsp-bridge-enable-signature-help (progn (if lsp-bridge-signature-help-timer nil (setq lsp-bridge-signature-help-timer (run-with-idle-timer lsp-bridge-signature-help-fetch-idle t #’…))))) (if lsp-bridge-enable-auto-format-code (progn (if lsp-bridge-auto-format-code-timer nil (setq lsp-bridge-auto-format-code-timer (run-with-idle-timer lsp-bridge-auto-format-code-idle t #’…))))))) (if (or (equal (buffer-name (current-buffer)) acm-buffer) (equal (buffer-name (current-buffer)) acm-doc-buffer)) nil (if lsp-bridge-disable-backup (progn (setq make-backup-files nil) (setq auto-save-default nil) (setq create-lockfiles nil))) (if (and lsp-bridge-symbols-enable-which-func (featurep 'which-func) which-function-mode) (set (make-local-variable 'which-func-functions) (if (member #'lsp-bridge-symbols–current-defun which-func-functions) which-func-functions (setq which-func-functions (cons #'lsp-bridge-symbols–current-defun which-func-functions))))) (set (make-local-variable ‘lsp-bridge-revert-buffer-flag) nil) (if acm-backend-elisp-symbols-update-timer nil (setq acm-backend-elisp-symbols-update-timer (run-with-idle-timer lsp-bridge-elisp-symbols-update-idle t #’(lambda nil (funcall 'lsp-bridge-elisp-symbols-update))))) (if (or (lsp-bridge-has-lsp-server-p) (and lsp-bridge-enable-org-babel (eq major-mode 'org-mode) (not (lsp-bridge-is-org-temp-buffer-p)))) (progn (if (not (lsp-bridge-is-remote-file)) (progn (if (and (buffer-file-name) (not …)) (progn (save-buffer))))) (acm-backend-lsp-init) (acm-backend-lsp-workspace-symbol-init) (if lsp-bridge-enable-signature-help (progn (if lsp-bridge-signature-help-timer nil (setq lsp-bridge-signature-help-timer (run-with-idle-timer lsp-bridge-signature-help-fetch-idle t …))))) (if lsp-bridge-enable-auto-format-code (progn (if lsp-bridge-auto-format-code-timer nil (setq lsp-bridge-auto-format-code-timer (run-with-idle-timer lsp-bridge-auto-format-code-idle t …))))))) (let ((tail lsp-bridge–internal-hooks)) (while tail (let ((hook (car tail))) (apply #'add-hook hook) (setq tail (cdr tail))))) (advice-add #'acm-hide :after #'lsp-bridge–completion-hide-advisor)) lsp-bridge–enable() (if lsp-bridge-mode (lsp-bridge–enable) (lsp-bridge–disable)) (let ((last-message (current-message))) (setq lsp-bridge-mode (cond ((eq arg 'toggle) (not lsp-bridge-mode)) ((and (numberp arg) (< arg 1)) nil) (t t))) (if (boundp 'local-minor-modes) (progn (setq local-minor-modes (delq 'lsp-bridge-mode local-minor-modes)) (if lsp-bridge-mode (progn (setq local-minor-modes (cons 'lsp-bridge-mode local-minor-modes)))))) (if lsp-bridge-mode (lsp-bridge–enable) (lsp-bridge–disable)) (run-hooks 'lsp-bridge-mode-hook (if lsp-bridge-mode 'lsp-bridge-mode-on-hook ‘lsp-bridge-mode-off-hook)) (if (called-interactively-p ‘any) (progn nil (if (and (current-message) (not (equal last-message (current-message)))) nil (let ((local " in current buffer")) (message “%s %sabled%s” “Lsp-Bridge mode” (if lsp-bridge-mode “en” “dis”) local)))))) lsp-bridge-mode(1) (progn (lsp-bridge-mode 1)) (if (cl-every #’(lambda (pred) (lsp-bridge-check-predicate pred “global-lsp-bridge-mode”)) lsp-bridge-enable-predicates) (progn (lsp-bridge-mode 1))) #f(lambda () [t] (if (cl-every #’(lambda (pred) (lsp-bridge-check-predicate pred “global-lsp-bridge-mode”)) lsp-bridge-enable-predicates) (progn (lsp-bridge-mode 1))))() run-hooks(change-major-mode-after-body-hook prog-mode-hook python-base-mode-hook python-mode-hook) apply(run-hooks change-major-mode-after-body-hook (prog-mode-hook python-base-mode-hook python-mode-hook)) run-mode-hooks(python-mode-hook) python-mode() funcall-interactively(python-mode) call-interactively(python-mode record nil) command-execute(python-mode record) counsel-M-x-action(“python-mode”) ivy-call() ivy-read("M-x " # :predicate #f(compiled-function (sym) #<bytecode -0xe6714d8827e84d2>) :require-match t :history counsel-M-x-history :action counsel-M-x-action :keymap (keymap (67108908 . counsel–info-lookup-symbol) (67108910 . counsel-find-symbol)) :initial-input nil :caller counsel-M-x) counsel-M-x() funcall-interactively(counsel-M-x) call-interactively(counsel-M-x nil nil) command-execute(counsel-M-x)

github 上传实例文件和重新步骤吧

想问下各位大佬,lsp-bridge编辑远程的时候补全python超级卡顿,但是像C这种就没问题,请问该怎么排查?或者大佬们有远程python开发的配置可以分享么,谢谢~

  (setq lsp-bridge-python-lsp-server 'pylsp
        lsp-bridge-c-lsp-server 'clangd
        lsp-bridge-python-command "python"
        lsp-bridge-python-multi-lsp-server "pylsp_ruff"
        acm-enable-capf t
        acm-enable-icon t
        acm-enable-tabnine nil
        acm-candidate-match-function #'orderless-flex
        acm-enable-copilot t)

关掉 lsp-bridge 还会卡吗 ? 一般 tramp

更可能是其他 package 没对 remote file 优化 卡 例如 eldoc

(add-hook 'python-mode-hook
          (defun leo/python-tramp-turn-off-eldoc ()
            (when (file-remote-p default-directory)
              (eldoc-mode -1))))