Neovim:无崩溃增量选择

Neovim:无崩溃增量选择

💡 原文英文,约900词,阅读约需4分钟。
📝

内容提要

当使用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插件,提供替代的增量选择配置。

🏷️

标签

➡️

继续阅读