neovim新出了一个插件叫做 ssr.nvim 感觉非常厉害(基于treesitter)

ssr.nvim 是基于 treesitter 对代码进行基于语法结构分析的批量编辑修改的插件。

这个插件并没有利用到什么 vim 的特性,主要就是基于 treesitter,emacs 要做一个类似的实现应该并不会太复杂。

用法如下,假设有一行代码是

foo.baz(paramA= valA)

选中这一行后唤起这个插件,会弹出一个框框让你输入这一行的基于语法分析的 pattern,然后你再输入replace为什么样子的东西,

比如你输入 pattern 为 $a.$b($c=$d),然后 replace 为 $b * $c == $a + $d,这样上一行代码就会被替换为 baz * paramA == foo + valA

然后所有满足你输入的 pattern (也就是具备相似语法结构)的代码都会被高亮,并且你可以交互式的选择那些代码你想要做替换,哪些你不要做替换。

懒猫似乎有一个插件叫做 grammatical-edit,不知道有没有实现类似的功能。

2 个赞

这个是不是类似于通用的 el-search?

我原来用的是外部tree-sitter,还没有这种功能。

确实有点像这个插件,不过是基于 treesitter 从而可以对大量的语言做这件事情。不过这个应该没有 el-search 灵活,el-search目前看来似乎可以用 sexp 来表达 pattern 和 replace。这个应该只能用 固定的 matched group ($xxx 就是一个 matched group。)

这个插件在实际编辑场景的效率高吗?

一直不能理解什么样的悲摧编程语言用的上这种功能

6 个赞

静态分析工具和自动修复工具链缺少你想要的规则的时候,可以用这个功能快速实现一个。 IntelliJ IDEA的Structural Replace/Find和这个功能类似,主要让用户来自定义代码静态检查规则。 我一般用来看看哪位同事会catch异常,然后不处理,这样的同事以后合作的时候就要多上点心 :)

写这个template比正则简单多了,比如catch中只有注释的情况也能匹配出来。

3 个赞

都在用 tree-sitter 了,直接用 tree-sitter 实现 linter 唄。

同理、也可以做一些重构。这个重构的精确度就是在lsp的语义级和正则的文本级之间。lsp如果没有实现类似的code action,很多时候重构会比正则快很多。

1 个赞

这只能算是玩具吧,从抽象语法树(AST)到静态分析工具还有很多工作要做。

还有一个最后一年前的 WIP 的包