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

我在测试文件 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 个赞

那能增加 orderless 的 completion-styles么,orderless 支持regexp,literal,initialism,prefixes,flex 五种匹配方法,看acm代码只实现了 literal

比如 ad1d 能匹配到 AdaptiveAvgPool1d

你能看懂日文? 群里真是卧虎藏龙啊。

平时会用到韩文, :grinning_face_with_smiling_eyes:所以比较喜欢用 emacs + 补全功能,来提高输入的准确率。而且很多词时间久了不用会忘记,就自己制作了中韩、韩中补全backend,现在结合 acm 框架,使用体验更好啦! :blush:

丢人了,我瞟了一眼,以为是日文呢 :joy:

3 个赞

哈哈, :handshake:我对法文、德文傻傻分不清!

有能力就发补丁吧,现在的功能我已经很满足了。

可以糊着先用。 比如下面这个就支持了 flex 匹配方式。上面的 ad1d 应该没问题了。 顺便说, acm 现在实现的应该是 regexp 方式。

(defun acm-match-orderless-flex (keyword candidate)
  (string-match-p (orderless-flex (downcase keyword)) (downcase candidate)))
 
(advice-add #'acm-candidate-fuzzy-search :override #'acm-match-orderless-flex)

里面 orderless-flex 这个随便换,比如 orderless-initialism 等。 不过我看了, elisp 里面是没有这个 fuzzy-search 的,所以这个 advice 对 elisp 无用。

1 个赞

nice 确实可以用,暂时 lsp 就够啦

又研究了下,发现可以通过 orderless-matching-styles 指定多种匹配方式,orderless-pattern-compiler 生成正则

  (setq orderless-matching-styles '(orderless-flex))

  (defun acm-match-orderless (keyword candidate)
    (string-match-p (car (orderless-pattern-compiler (downcase keyword) orderless-matching-styles)) (downcase candidate)))

  (advice-add #'acm-candidate-fuzzy-search :override #'acm-match-orderless)

这个弹窗怎么修改样式呢? 边框有点粗,里面的符号怎么是也是黑色。