Skip to content

开发多线程异步补全后端

Mumulhl edited this page Feb 26, 2023 · 1 revision

开发多线程异步补全后端

lsp-bridge 基于 Python 的多线程技术来构建补全后端, 有了多线程技术的加持, 不管你搜索多大的数据, lsp-bridge 都将保障补全体验持续丝滑, 复杂的补全后端请多参考已有后端 (lsp-bridge/acm/acm-backend-*.el) 的设计。

针对一些小场景, 比如某种语言需要添加额外的关键字补全, lsp-bridge 提供了一些脚手架代码帮助你快速构建自己的异步补全后端:

1. 缓存关键字列表

(lsp-bridge-call-async "search_list_update" "example" (list "keyword_a" "keyword_b" "keyword_c") 100   "lsp-bridge-example-record")

我们可以通过接口函数 search_list_update 快速把关键字列表缓存到 lsp-bridge 的 Python 进程, 其中 example 是补全后端的名字, (list "keyword_a" "keyword_b" "keyword_c") 是关键字列表, 100 是搜索侯选词的最大数目, lsp-bridge-example-record 是搜索完成后调用的回调函数名称。

2. 多线程搜索过滤

(lsp-bridge-call-async "search_list_search" "example" "current_symbol")

当完成关键字缓存以后, 再通过接口函数 search_list_search 进行搜索, 其中 example 是补全后端名字, current_symbol 是搜索关键字, 一般都是光标处的符号。 当调用 search_list_search 时, lsp-bridge 会自动用子线程进行搜索过滤, 并自动检测搜索结果是否已经过期? 如果搜索结果没有过期, 调用回调函数 lsp-bridge-example-record 记录搜索结果。

3. 异步数据弹出补全

(defun lsp-bridge-example-record (candidates)
  (setq-local acm-backend-example-items candidates)
  (lsp-bridge-try-completion))

一般 lsp-bridge-example-record 都是这样定义的, 接到异步后端返回的 candidates 后, 先把搜索结果保存到 buffer 中, 这里是 acm-backend-example-items 局部变量 (需要自己定义), 然后再调用函数 lsp-bridge-try-completion , 尝试弹出补全菜单。