核心用法
lsp 是一个基于 Pyright 的 Language Server Protocol (LSP) 客户端,通过管理后台守护进程实现快速代码导航。用户通过 lsp-query 命令行工具执行各类 LSP 操作,守护进程在首次查询时自动启动,闲置 5 分钟后自动退出。
主要命令涵盖:
- definition: 跳转到符号定义处
- references: 查找全工作区符号引用
- hover: 获取类型签名与文档字符串
- symbols: 列出文件内所有类/函数/变量
- workspace-symbols: 跨文件符号搜索
- diagnostics: 静态类型错误检查
- completions/signature: 代码补全与函数签名提示
- rename: 重命名影响范围预览
使用前需设置 LSP_WORKSPACE 环境变量指向项目根目录,或依赖自动检测的 git 根目录。
显著优点
1. IDE 级导航体验: 提供精确的语义分析,远超文本搜索 (grep),理解继承关系、类型推导等复杂场景
2. 零配置启动: 守护进程自动管理,无需手动启停,首次查询冷启动约 1-2 秒,后续查询约 200ms
3. 纯 Python 实现: lsp-query.py 仅依赖标准库,无额外 pip 包,部署轻量
4. 人类友好输出: 行号列号采用 1-indexed,与编辑器显示一致
5. 灵活可配置: 支持自定义 LSP 服务器、超时时间、Unix socket 路径
潜在缺点与局限性
1. Python 专属: 仅支持 Python 3.10+,其他语言需更换 LSP 服务器
2. 依赖 Node.js 生态: 需要全局安装 pyright-langserver (npm install -g pyright)
3. 类型检查局限性: 诊断功能依赖当前 Python 环境的包安装状态,虚拟环境未激活时会产生误报的 import 错误
4. 内存占用: 持久化守护进程持续占用内存,虽会自动回收但需权衡
5. 符号索引范围: 大型代码库初次索引可能较慢,且切换分支后可能需要手动重启 (lsp-query shutdown)
适合人群
- 代码审查者: 需要快速理解陌生代码库的结构与依赖关系
- 重构开发者: 评估修改影响范围,进行安全的跨文件重构
- 类型安全倡导者: 在运行前捕获类型错误,辅助渐进式类型注解
- CLI 优先用户: 偏好终端工作流,不愿打开完整 IDE
常规风险
- 守护进程残留: 异常退出可能导致 socket 文件残留,需手动清理
~/.cache/lsp-query/ - 路径遍历风险: 若
LSP_WORKSPACE被恶意设置,可能暴露敏感文件内容(符号搜索范围) - 信息泄露: hover/references 等命令可能暴露代码库的完整结构与依赖关系
- 命令注入: 虽
lsp-query.py使用标准库 subprocess 但未显见过滤LSP_SERVER环境变量,自定义服务器命令时需谨慎 - 竞争条件: 多并发查询对 Unix socket 的访问可能存在边界情况