-
Notifications
You must be signed in to change notification settings - Fork 214
开发多线程异步补全后端
lsp-bridge 基于 Python 的多线程技术来构建补全后端, 有了多线程技术的加持, 不管你搜索多大的数据, lsp-bridge 都将保障补全体验持续丝滑, 复杂的补全后端请多参考已有后端 (lsp-bridge/acm/acm-backend-*.el) 的设计。
针对一些小场景, 比如某种语言需要添加额外的关键字补全, lsp-bridge 提供了一些脚手架代码帮助你快速构建自己的异步补全后端:
(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
是搜索完成后调用的回调函数名称。
(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
记录搜索结果。
(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
, 尝试弹出补全菜单。