根本原因:resolve_context() 的扫描逻辑有缺陷,它会扫描整个文件并不断覆盖 connection/database 值。
解决方案:重构 context 解析为两阶段:
- Phase 1 (Global):扫描文件头部(第一个
###之前)获取全局默认值 - Phase 2 (Block-local):扫描当前查询块(从当前
###到下一个###)获取覆盖值
现在的用法:
-- @connection my-blog
-- @database blog
### Query: all authors
SELECT * FROM authors WHERE [这里会提示列名]
### Query: posts
SELECT * FROM posts WHERE [这里也会提示列名]
### Query: use different db (optional override)
-- @database analytics
SELECT * FROM events WHERE [提示 analytics.events 的列名]根本原因:get_items() 函数没有接收 cursor_line 参数,导致 extract_from_tables() 使用 vim.fn.line(".") 获取行号,在异步 completion context 中不准确。
解决方案:
- 修改
get_items()签名,添加cursor_line参数 - 从
ctx.cursor[1]获取正确的行号并传递 - 更新 blink.cmp 和 nvim-cmp 两个 source
修改的函数:
get_items(bufnr, line_before, cursor_line, callback)- 新增 cursor_line 参数M:get_completions(ctx, callback)- 提取 ctx.cursor[1] 并传递M.source:complete(params, callback)- 使用 vim.fn.line(".") 传递
- 重构
resolve_context()为两阶段扫描 - 全局默认 + 块级覆盖
get_items()新增cursor_line参数extract_from_tables()使用传入的 cursor_line- 更新 blink.cmp 和 nvim-cmp sources
使用 test_completion.sql:
-- @connection my-blog
-- @database blog
### Query: all authors
SELECT * FROM authors WHERE 验证:
- 光标在第 5 行
WHERE后面 - 运行
:PosteSQLCmpStatus应该显示:- Connection: my-blog
- Database: blog
- 触发 completion 应该显示 authors 表的列名
同样的文件,在 WHERE 后输入字母(如 i):
- 之前:显示 BIGINT, BIGSERIAL 等关键词
- 现在:显示 id, name, email 等列名
-- 每个查询都需要重复
### Query 1
-- @connection my-blog
-- @database blog
SELECT * FROM authors
### Query 2
-- @connection my-blog -- 必须重复
-- @database blog -- 必须重复
SELECT * FROM posts-- 文件级别的默认值
-- @connection my-blog
-- @database blog
### Query 1
SELECT * FROM authors -- 自动使用 my-blog/blog
### Query 2
SELECT * FROM posts -- 自动使用 my-blog/blog
### Query 3 (optional override)
-- @database analytics -- 仅覆盖 database
SELECT * FROM events -- 使用 my-blog/analytics可以添加更友好的 UI:
- Connection picker:
:PosteSQLConnection选择并绑定 connection - Database picker:
:PosteSQLDatabase选择 database - 自动插入指令:选择后自动在文件头部添加/更新
@connection和@database - 持久化:将绑定关系存储在
.poste/目录中
但当前的解决方案已经大大简化了使用体验:只需在文件顶部声明一次。