一个现代化的、精心设计的 Language Server Protocol Python SDK - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
observerw

一个现代化的、精心设计的 Language Server Protocol Python SDK

  •  3
     
  •   observerw 2025 年 7 月 12 日 1865 次点击
    这是一个创建于 279 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目链接: https://github.com/observerw/lsp-client

    各位同行们应该对 LSP 都不陌生,平常咱们使用 VSCode 写代码的时候基本少不了 LSP Server 的帮助。

    我目前所做的工作有关 LLM 代码生成,所以不可避免地会需要对代码仓库进行一些静态分析,但我发现现有的静态分析工具的生存状况堪忧,基本上都没什么人维护了,即使那些还活着的项目,其功能也少得可怜。

    相比之下,各个语言的 LSP Server 活的都非常好(应该是因为用的人也多),而且功能非常全面,看起来比那些半死不活的静态分析工具好太多了。所以我就希望能够在代码中直接调用 LSP Server 的各个功能,来完成一些分析任务,说白了就是需要一个 LSP Server 的 Python SDK 。

    我曾经尝试使用过 multilspy,一个微软开发人员所开发的 LSP Server SDK 。在简单场景下用着没什么问题;但当我想手动扩展一下它的功能时,就发现它的代码写的乱七八糟,让人难以有 follow up 的欲望(微软对于开源项目也太不上心了)。所以我干脆就另起炉灶起了一个新项目,实现一个更加现代化的 LSP Client 。相较于 multilspy ,该项目的优势体现在:

    • 类型标注全面:使用微软官方的 lsprotocol 提供类型,绝对标准而且符合 LSP 协议的规定;所有的能力都声明为 Protocol,所以你甚至可以声明一个新类型用于约束一个 client 必须具有哪些 LSP 能力;
    • 功能更全面:不止支持 goto definition ,find references 等基本能力,而且还能够支持 LSP 协议中规定的很多其他能力;
    • 自带能力检查:启动 LSP Server 的时候将会自动检查 Server 是否支持你想要的能力,避免在运行时出现 bug ;
    • 扩展更容易:代码架构清晰,如果你想要支持一个新的 LSP Server ,只需要通过 Mixin 模式混入你想要的 LSP 能力即可;
    • 自带多进程:能够同时启动多个 LSP Server 进程来处理请求,当你需要批量分析代码的时候能带来可观的速度提升(也带来可观的 CPU 占用率提升)

    后续我计划在该项目中添加 MCP ( Model Context Protocol )支持,从而让 LLM Agent (比如 Cursor )也能够具有调用 LSP Server 的能力。

    目前该项目还处于起步阶段,原生支持的 LSP Server 还不太多;但由于扩展起来比较容易,我预计应该能很快的补全这一短板。欢迎诸位试用,当然更欢迎诸位为本项目提供宝贵的 PR 完善其功能,非常感谢!

    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2025 年 7 月 13 日
    自己做 lsp 太小众了。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5102 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 45ms UTC 09:38 PVG 17:38 LAX 02:38 JFK 05:38
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86