Comby - Structural code search and replace for every language(comby.dev)
comby.dev
Comby - Structural code search and replace for every language
https://comby.dev/
25 comments
yeah i just discovered semgrep a week ago! i'll have to download this and compare.
i found the CLI features lacking in semgrep (vs using a yaml config), so maybe this will have more support there.
i found the CLI features lacking in semgrep (vs using a yaml config), so maybe this will have more support there.
Okay wow. I didn't tools like this existed! There's been more than once where I've found myself in a situation like "find all code like this, change if this, delete if this". Regex can only get you so far.
Does someone know if this or something similar is available as a VSCode extension? It'd be fun to make one if not!
Does someone know if this or something similar is available as a VSCode extension? It'd be fun to make one if not!
Sourcegraph Community Manager here. You can use the Sourcegraph extension for VSCode [1] that would allow you to have the structural search powered by Comby (or literal or regular expression search) inside of VSCode.
You can't do batch changes[2] inside of VSCode yet, only via the Sourcegraph CLI[3]. We're working on expanding this.
[1] https://marketplace.visualstudio.com/items?itemName=sourcegr... [2] https://docs.sourcegraph.com/batch_changes/explanations/intr... [3] https://docs.sourcegraph.com/cli
You can't do batch changes[2] inside of VSCode yet, only via the Sourcegraph CLI[3]. We're working on expanding this.
[1] https://marketplace.visualstudio.com/items?itemName=sourcegr... [2] https://docs.sourcegraph.com/batch_changes/explanations/intr... [3] https://docs.sourcegraph.com/cli
Thanks for letting me know. I'll try it right away.
anything similar for vim?
We don't have an extension for Vim yet, but you can use Sourcegraph CLI[1] in your terminal. Feel free to file a feature request[2] though, which should help bump up the prioritization of a proper Vim extension.
[1] https://docs.sourcegraph.com/cli [2] https://github.com/sourcegraph/sourcegraph/issues/new?assign...
[1] https://docs.sourcegraph.com/cli [2] https://github.com/sourcegraph/sourcegraph/issues/new?assign...
language-server methods like rename
Yes. I regularly use this feature sky-high I was looking for something more advanced as vanesa- spoke in the sibling comment.
- sky-high
+ but
Swiping fiasco. When do we get the edit comment feature in HN? :)
Swiping fiasco. When do we get the edit comment feature in HN? :)
You should be able to edit comments within 2? hours of posting. Maybe this link works for you? https://news.ycombinator.com/edit?id=31417626
I believe Sourcegraph uses Comby under the hood to an extent for structural matching as well!
Yep! (Sourcegraph Community Manager here) We use Comby syntax for structural search: https://docs.sourcegraph.com/code_search/reference/structura...
We also have a few tutorials to make large-scale code changes across many repositories and code hosts (batch changes) with Comby:
- Refactor Go code using Comby: https://docs.sourcegraph.com/batch_changes/tutorials/refacto...
- Updating Go import statements using Comby: https://docs.sourcegraph.com/batch_changes/tutorials/updatin...
The author of Comby is a researcher at Sourcegraph building our search platform.
We also have a few tutorials to make large-scale code changes across many repositories and code hosts (batch changes) with Comby:
- Refactor Go code using Comby: https://docs.sourcegraph.com/batch_changes/tutorials/refacto...
- Updating Go import statements using Comby: https://docs.sourcegraph.com/batch_changes/tutorials/updatin...
The author of Comby is a researcher at Sourcegraph building our search platform.
[deleted]
Superb tool. I used Comby to create a massive (3000+ changes) PR in which I ported JS type annotations into TS typings.
I mocked up a prototype for something similar to this using TreeSitter and its query language the other day for some heavy refactoring I had to do. This looks like a really cool project, will have to try it out!
This looks a lot like https://semgrep.dev/
Interesting that they are both largely OCaml.
ML style languages handle tree structures and traversal so well, I'm wondering if that's a large reason for using it.
License?
Also, how does it compare to Coccinelle?
Also, how does it compare to Coccinelle?
License seems to be apache V2, see https://github.com/comby-tools/comby/blob/master/LICENSE.
They have a comparison section in their faq (https://comby.dev/docs/faq):
"Coccinelle uses a declarative syntax for matching constructs like function calls, if-statements, expression blocks, and so on for the C language. Some notable differences are that Coccinelle provides a patch-like format to express transformations (handy when you want to inline smaller changes in a broader context) and metavariable declarations (handy for developing and organizing more sophisticated patterns). For an example, see the file null_ref.cocci. Coccinelle works only for the C language, and may struggle to parse files that contain non-standard C constructs, like GCC inline assembly. Recent Coccinelle work has started expanding support for Java. In contrast, Comby’s syntax targets a wide range of languages and is more robust to matching patterns in the presence of unrecognized constructs. Comby is more suited to writing quick find-replace patterns for languages beyond C, and works well on C languages too."
They have a comparison section in their faq (https://comby.dev/docs/faq):
"Coccinelle uses a declarative syntax for matching constructs like function calls, if-statements, expression blocks, and so on for the C language. Some notable differences are that Coccinelle provides a patch-like format to express transformations (handy when you want to inline smaller changes in a broader context) and metavariable declarations (handy for developing and organizing more sophisticated patterns). For an example, see the file null_ref.cocci. Coccinelle works only for the C language, and may struggle to parse files that contain non-standard C constructs, like GCC inline assembly. Recent Coccinelle work has started expanding support for Java. In contrast, Comby’s syntax targets a wide range of languages and is more robust to matching patterns in the presence of unrecognized constructs. Comby is more suited to writing quick find-replace patterns for languages beyond C, and works well on C languages too."
s/every language/some languages/
Curious whether the teams behind these tools are aware of each other? I suppose it's unlikely that they're not.