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

windows, emacs 29, 我这边不感觉卡;等有时间,我看看能否做成选项提个PR

不是选项,而是要解决性能问题,我这边 yas–get-snippet-tables 太卡了,所以我才直接从 yas 的目录读取,效果一样的。

请问你说的是哪个svg,melpa上的还是软件包的?

在 org-mode 中是不是没有办法使用 english-helper?

org-mode 好像还没有 language server,lsp-bridge 都起不来吧。

可以把org-mode加到这里试一下 lsp-bridge/acm.el at 1e487376d6ba792637642edf0eb18d124d405c49 · manateelazycat/lsp-bridge · GitHub

win10系统下,pyright无法检测到同级目录下的其他文件和模块。

例如以下目录:

./test/src/
   |--- __init__.py
   |--- a.py
   |--- b.py
   |--- mode
      |--- __init__.py
      |--- c.py

a.py 文件中,调用 b.pyc.py ,我尝试了两种方法

方法一:报错。

a.py
import b             # pyright提示 :Import “b” could not be resolved
from mode import c   # pyright提示 :Import “mode” could not be resolved

方法二:不报错,但运行时容易引起Import Error,对脚本启动路径要求严格,所以我希望使用方法一。

a.py
from . import b      # pyright不报错
from .mode import c  # pyright不报错

同向对比 vscode 的 pyright 插件,以上两种写法都是不报错的,我感觉应该是pyright工作目录配置问题,但不知道该怎样解决,还请大佬指点。

如果多文件开发的话,项目目录得是一个 git 仓库;否则会按照单文件处理

1 个赞

已经参照格式加进去了。

尝试多次开关 lsp-bridge-toggle-english-helper 并不起作用。可以确认在 elisp 底下是可以工作的。

lsp-bridge-enable-debug 已经打开,*lsp-bridge* buffer 是空的。

如果 lsp-bridge/acm/icons at master · manateelazycat/lsp-bridge · GitHub 这里面的文件图标你打开不能显示图标的话,就是你的emacs 不支持svg.

因为我的emacs是自己从源代码编译的,就会检测 系统 有没有 安装librsvg,如果没有安装,那编译出来的 emacs 就是不支持 svg的。

如果你是ubuntu用户,安装 librsvg可以执行 apt-get install librsvg2-dev。

可以自己判断下

(if (image-type-available-p 'svg)
    (setq acm-enable-icon t)
  (setq acm-enable-icon nil))
1 个赞

我在测试文件 a.py 同级目录与上级目录分别创建git仓库进行测试,依然提示 import “mode” could not be resolved ,也尝试创建 .projectile 文件指定项目路径,同样会有提示。

刚才参考 pyright/configuration.md ,在项目路径下添加 pyrightconfig.json 文件进行项目路径配置,不知道是不是文件格式有问题,配置同样没生效 :sob:

lsp-bridge-enable-log 打开,看下 initialize 请求里面的 rootUri/rootPath 相关参数是什么。我怀疑你这个 path 是 “test”, 所以你可能要 import src.mode.xxx 才不报错。

日志显示 rootUrlrootPath 都指向当前打开的文件。

git仓库并未被识别,.projectile 文件也未识别,实际工程结构如下:

你这是识别成单文件了。 projectile 就别纠结了,lsp-bridge 探测工程不用这个,只看 git。 你 .git 是真的还是假的? 不是建立目录就完了,要 git --init . 这样建立。

可以到 Script 目录打开 cmd 手工执行下,看看是不是有报错。 git rev-parse --is-inside-work-tree

确定是真的git仓库…

lsp-bridge 判断工程根目录是这个方式,你看手工操作下是不是可以。你这个看起来是这个操作没成功,所以发了单文件。

1 个赞

找到问题原因了,是我的cmd配置问题。

之前为了修改cmd编码格式为UTF-8,所以根据网上教程,修改了注册表:

路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 
新建:autorun 值为 chcp 65001

之后每次启动 cmd 会先执行 “chcp 65001”,导致 get_command_result 结果执行失败。 现在删除了该键值,一切正常。感谢~ :handshake:

2 个赞

lsp-bridge能不能增加用tab和S-tab进行候选列表移动的键位绑定啊,这一套键位用习惯了; 另外,lsp-bridge可以增加orderless separator吗?类似corfu做的那样,在比较多的候选项中,可以很快定位到候选项,不用上下移动好多次;

按键自己自定义哈,每个人用tab习惯不一样,有些喜欢补全,有些喜欢下一个,很难兼顾。

目前改变文件内容,lsp就会刷新数据,所以暂时没法实现corfu那种模式。

今天腾出时间,在不破坏原代码的前提下,尝试加入了自定义语种的 backend。基本实现了!!!感觉 acm 比之前的 company 快得太多了!!!

;;;
;;; blove-lang-helper.el
;;;
(defalias 'lsp-bridge-toggle-korean-helper #'acm-toggle-korean-helper)

(defvar-local acm-enable-korean-helper nil)

(defcustom acm-backend-kor-min-length 1
  "Minimum length of korean word."
  :type 'integer)

(add-to-list 'acm-icon-alist '("korean" . ("material" "korean" "#ed6856")))
(defun acm-backend-korean-candidates (keyword dict)
  (let* ((candidates (list)))
    (when (>= (length keyword) acm-backend-kor-min-length)
      (dolist (candidate dict)
        (when (string-prefix-p keyword candidate)
          (add-to-list 'candidates (list :key candidate
                                         :icon "translate"
                                         ;; :icon "korean"
                                         :label candidate
                                         :display-label candidate
                                         :annotation (get-text-property 0 :initials candidate)
                                         :backend "korean")
                       t))))

    candidates))

(defun acm-toggle-korean-helper ()
  (interactive)
  (if acm-enable-korean-helper
      (message "Turn off korean helper.")
    (message "Turn on korean helper."))
  (setq-local acm-enable-korean-helper (not acm-enable-korean-helper))
  )

(add-to-list 'load-path (concat user-emacs-directory "lisp/blove-extra/blove-lang-helper/blove-lang-zh"))
(defun acm-update-candiates-advice ()
  (let* ((keyword (acm-get-input-prefix))
         (candidates (list))
         path-candidates
         yas-candidates
         tempel-candidates
         mode-candidates)

	(if acm-enable-korean-helper
		(progn
		  (require 'blove-backends-kor-zh-15000)
		  (setq candidates (acm-backend-korean-candidates keyword blove-kor-zh-15000))
		  )
	  (progn

		(if acm-enable-english-helper
			;; Completion english if option `acm-enable-english-helper' is enable.
			(progn
			  (require 'acm-backend-english-data)
			  (require 'acm-backend-english)
			  (setq candidates (acm-backend-english-candidates keyword))
			  )
		  (setq path-candidates (acm-backend-path-candidates keyword))
		  (if (> (length path-candidates) 0)
			  ;; Only show path candiates if prefix is valid path.
			  (setq candidates path-candidates)

			;; Fetch syntax completion candidates.
			(setq mode-candidates (append
								   (acm-backend-elisp-candidates keyword)
								   (acm-backend-lsp-candidates keyword)))
			(setq yas-candidates (acm-backend-yas-candidates keyword))
			(setq tempel-candidates (acm-backend-tempel-candidates keyword))

			;; Insert snippet candiates in first page of menu.
			(setq candidates
				  (if (> (length mode-candidates) acm-snippet-insert-index)
					  (append (cl-subseq mode-candidates 0 acm-snippet-insert-index)
							  yas-candidates
							  tempel-candidates
							  (cl-subseq mode-candidates acm-snippet-insert-index))
					(append mode-candidates yas-candidates tempel-candidates)
					))))
		)
	  )

    candidates))

(advice-add 'acm-update-candiates :override #'acm-update-candiates-advice)

;;; ========== at-the-bottom
(provide 'blove-lang-helper)


7 个赞