V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
YadongZhang
V2EX  ›  程序员

代码自动补全功能的技术实现难点

  •  
  •   YadongZhang · 2020-08-10 21:23:16 +08:00 · 3184 次点击
    这是一个创建于 1595 天前的主题,其中的信息可能已经有所发展或是发生改变。

    自己的开源项目里有一需求是使用 KaTeX 实现数学公式输入,其中一个 Task 是 KaTeX 命令自动补全

    技术上采用 Trie 数据结构,只是在实现上有点难度:

    起初想法是把 KaTeX 所有命令( command )逐个加入 Trie 中,因为它是有限集,不过有 command 嵌套问题,也不是所有 command 都可以嵌套,结构比较复杂,放弃...

    第二种思路是参考 overleaf 的做法:数据驱动实现,将最常用的 command 显示在 dropdown list,所有就有了第三种思路:

    初始状态下,命令集为空,用户输入之后,如果 command 存在,在插入公式之后便将该 command 加入到 Trie 中,那么问题就是,是否需要一个数据库存储命令集,其实命令集并不需要共用,因为每个用户的专业和领域不同,用到的命令分布范围也有所不同,也就是 local 自动补全功能,如果存到某个变量中,似乎不可取,第二次打开页面变量会初始化,并不会记录上次关闭页面时的值

    我一直以为最后一种思路是不可实现的,直到昨天在 emacs 里安装了 auto-complete 写 Agda,发现即使我在一个文件里清空了所有相关代码,再次输入时依然会有 dropdown list 提示,也就是在该文件里会有代码记忆,即使我关闭文件后又重新打开:

    emacs auto-complete snapshot

    这个功能正是我想要的,比较好奇是怎么实现的,虽然我在用 emacs,但是看不懂 emacs-lisp 代码,另外,我的 emacs 里也没有安装 lsp-mode,所以也不会是 lsp 机制影响

    发帖和有经验的 v 友交流一下

    第 1 条附言  ·  2020-08-11 12:11:33 +08:00

    大概浏览了一下源码,auto-complete 使用 cache 机制将 Intelligent completion history 存放在 ~/.emacs.d/ac-comphist.dat 文件里,所以才能做到重新打开文件仍会有之前写过的代码的智能提示和补全功能

    第 2 条附言  ·  2020-08-11 21:37:23 +08:00

    不管是 language server、syntax parser,还是有向图解法,对我难度都有点大了 感谢几位 v 友指点

    4 条回复    2020-08-11 08:20:23 +08:00
    azh7138m
        2
    azh7138m  
       2020-08-10 22:38:54 +08:00   ❤️ 1
    补全看过一点相关的处理文章

    现实的例子,子毅老板的编辑器系列(老板结一下广告费
    https://github.com/dt-fe/weekly/blob/v2/085.%E7%B2%BE%E8%AF%BB%E3%80%8A%E6%89%8B%E5%86%99%20SQL%20%E7%BC%96%E8%AF%91%E5%99%A8%20-%20%E6%99%BA%E8%83%BD%E6%8F%90%E7%A4%BA%E3%80%8B.md
    可以看他之前的一系列的文章,都是在生产实战检验的东西

    轻松愉快的理论例子,装配脑袋的系列
    https://www.cnblogs.com/Ninputer/archive/2011/07/03/2096944.html
    如何处理未完成 /存在错误的语法
    YadongZhang
        3
    YadongZhang  
    OP
       2020-08-10 23:57:42 +08:00 via Android
    @zhuangzhuang1988
    @azh7138m
    感谢两位老哥,我研究一下再回复,感觉有点超出鄙人认知范围了哈哈
    xuanbg
        4
    xuanbg  
       2020-08-11 08:20:23 +08:00
    有向图
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:36 · PVG 13:36 · LAX 21:36 · JFK 00:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.