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

但这一段代码在我这里会出问题,eesfhoghoousbdofbousbeogbsudjbguebsodgousbgo 是为了名字空间里没有这个。

(defun func (eesfhoghoousbdofbousbeogbsudjbguebsodgousbgo)
  eesfhoghoousbdofbousbeogbsudjbguebsodgousbgo)

(member "eesfhoghoousbdofbousbeogbsudjbguebsodgousbgo"
        (all-completions "" obarray))

;; ("eesfhoghoousbdofbousbeogbsudjbguebsodgousbgo" "org-at-property-drawer-p" "sldb-frame-number-at-point" "comp-ctxt-funcs-h" "ad-pushnew-advised-function" "cfw:face-default-content" "helpful--format-keys" "prescient-prefix-regexp" "iso-2022-int-1-unix" "common-lisp-trailing-comment" "sp-point-in-empty-sexp" "helm-bibtexkey" ...)

我的 emacs 版本是 28.2

你的意思是 obarray 会包括很多形参的名字?

对zsbd.

欢迎发PR吧, 这个以前确实没有注意到, 因为我写 elisp 代码都是非常明确的, 即使有估计也触发不了这种情况。

在EmacsConf上等着了。哈哈

还有十分钟,lsp-bridge将在Development演讲,不是General,大家不要看错了 emacsconf.org/2022/watch/dev/

1 个赞

已经在看了,youtube上的画质好渣。。。好在原网址的还可以

老王,12月3日的commit后,用了random.randbytes()后,python要求3.9.0以上版本,在readme里提一下?

1 个赞

其实可以用别的算法替代一下, 因为那只是一个随机数。

要是默认的python版本低的话,用了lsp-bridge后,发现不能用,还要看lsp-bridge的log才能知道原因,所以在readme里写清楚依赖python的版本会好点。

1 个赞

修了一下,目前能把形参过滤掉,同时会更新局部参数。 PTAL

1 个赞

这样过滤, 不会影响性能吗?

我还没有测试这个补丁, 这个补丁大量做过滤, 不会在lsp-bridge收集 elisp symbols 的时候导致 Emacs 卡顿?

没注意看版本,要不然用 os.urandom(21).hex() ,这个好像没版本限制。

1 个赞

才看完 EmacsConf Wayland 的那个演讲, 测试了一下大佬的补丁, 很专业, 质量很高。

已经合并了, 感谢感谢。

已经修复了。

@georgealbert 感谢提醒。

1 个赞

全程端小板凳截取的精华 EmacsConf - 2022 - talks - lsp-bridge: a smooth-as-butter asynchronous LSP client

6 个赞

测试了一下,all-completions加上predicate后大概慢了 7 倍左右. 我的 obarray 的大小有63668个。

(benchmark-elapse
 (lsp-bridge-elisp-symbols--global))
;; 0.037313531
(benchmark-elapse
 (all-completions "" obarray))
;; 0.005165364

local symbol不是很慢,也可能和测试样例有关系

(defun let-list (N)
  (if (= N 1)
      nil
    `(let (,(intern (concat "x" (number-to-string N))))
       ,(let-list (- N 1)))))
(let-list 100)
;; (let (x100) (let (x99) (let (x98) (let (x97) (let (x96) (let (x95) (let (x94) (let (x93) (let (x92) (let (x91) (let (x90) (let (x89) (let (x88) (let (x87) (let (x86) (let (x85) (let (x84) (let (x83) (let (x82) (let (x81) (let (x80) (let (x79) (let (x78) (let (x77) (let (x76) (let (x75) (let (x74) (let (x73) (let (x72) (let (x71) (let (x70) (let (x69) (let (x68) (let (x67) (let (x66) (let (x65) (let (x64) (let (x63) (let (x62) (let (x61) (let (x60) (let (x59) (let (x58) (let (x57) (let (x56) (let (x55) (let (x54) (let (x53) (let (x52) (let (x51) (let (x50) (let (x49) (let (x48) (let (x47) (let (x46) (let (x45) (let (x44) (let (x43) (let (x42) (let (x41) (let (x40) (let (x39) (let (x38) (let (x37) (let (x36) (let (x35) (let (x34) (let (x33) (let (x32) (let (x31) (let (x30) (let (x29) (let (x28) (let (x27) (let (x26) (let (x25) (let (x24) (let (x23) (let (x22) (let (x21) (let (x20) (let (x19) (let (x18) (let (x17) (let (x16) (let (x15) (let (x14) (let (x13) (let (x12) (let (x11) (let (x10) (let (x9) (let (x8) (let (x7) (let (x6) (let (x5) (let (x4) (let (x3) (let (x2) nil)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))

在嵌套 let 最里面benchmark

(benchmark-elapse
  (lsp-bridge-elisp-symbols--local))
;; 0.000519512
1 个赞

我的 obarray 的大小有1.5万个左右, 0.03 秒可以接受, 因为大部分都是 idle 才会更新的, 所以不影响用户的输入。

1 个赞
  • acm-backend-search-sdcv-words-dictionary: 用于单词补全的 StarDict 词典, 默认是 kdic-ec-11w, 可以自定义为其他 StarDict 词典, 如果你的系统存在词典 /usr/share/stardict/dic/stardict-oxford-gb-formated-2.4.2/oxford-gb-formated.ifo, 你需要设置这个选项为 /usr/share/stardict/dic/stardict-oxford-gb-formated-2.4.2/oxford-gb-formated, 不需要包括 .ifo 扩展