内容提要
当使用neovim treesitter增量选择时,会随机崩溃,但无法稳定重现。决定通过自己实现一个新的增量选择功能来解决问题。
延伸解读
崩溃根源:treesitter 增量选择的段错误
文章指出,使用 Neovim 的 treesitter 增量选择时,按 v 扩展选择会随机触发段错误(Segmentation fault)。从堆栈看,崩溃发生在 ts_node_end_point 函数,属于底层 C 库问题,而非 Lua 配置错误。作者多次更新 Neovim 和 treesitter 后问题依旧,说明这不是简单升级能解决的,而是需要规避或替代方案。
替代方案:自实现增量选择逻辑
作者决定禁用原有增量选择,自己用 Lua 实现了一套。核心思路是维护一个节点列表和当前索引,通过 vim.fn.setpos 和 normal! v 手动设置选区。功能包括:v 键开始选择、v 键扩展至父节点、<BS> 恢复上次选择。代码依赖 nvim-treesitter.ts_utils 获取节点,并处理了父节点范围与当前节点相同的情况,避免无效扩展。
适用场景与注意事项
该方案适合受 treesitter 增量选择崩溃困扰、且愿意用自定义配置替代的用户。作者提供了完整配置片段,可直接粘贴到 Neovim 配置中。但需注意,这并非官方修复,而是绕过底层崩溃的变通方法;若未来 Neovim 或 treesitter 修复了该问题,可能不再需要。此外,自定义实现的行为可能与原版略有差异,需自行测试。
Q&A
使用neovim的treesitter增量选择时,常见的问题是什么?
使用neovim的treesitter增量选择时,常见的问题是随机崩溃,且无法稳定重现。
如何解决neovim treesitter增量选择崩溃的问题?
决定禁用增量选择功能,并实现一个新的增量选择功能来解决崩溃问题。
新的增量选择功能有哪些特点?
新的增量选择功能可以通过v键扩展选择、选择父节点和恢复上次选择。
如何配置neovim的treesitter增量选择?
可以通过在配置文件中添加特定的配置代码来启用增量选择功能。
在使用v键扩展选择时,可能会遇到什么错误?
在使用v键扩展选择时,可能会遇到段错误(Segmentation fault)。
如果有其他人遇到相同的问题,作者有什么计划?
作者愿意为有相同问题的人创建一个新的treesitter插件,提供替代的增量选择配置。