package comby
Install
Dune Dependency
Authors
Maintainers
Sources
md5=ee6556d8bd9b25ed0445ebe23862e48a
sha512=e6386c8ce5ef14bbcab2b0ead5b1edc39375438f56330d5f02e81e467afe6623a7e299f97f26008d77bbc62850c6dc63a7cbe5b81671b5183ff3adeee5946bb3
Description
Comby is a tool designed to make it easy to match change syntax for basically every language. You can think of it like grep or sed, but with added ability to recognize code structures like blocks and expressions (e.g., delimited by braces or parentheses), strings (e.g., delimited by quotes), and so on.
Published: 17 Jun 2021
README
comby
See the usage documentation.
A short example below shows how comby simplifies matching and rewriting compared to regex approaches like sed
.
Comby supports interactive review mode (click here to see it in action).
Need help writing patterns or have other problems? Post them in Gitter.
Install (pre-built binaries)
Mac OS X
brew install comby
Ubuntu Linux
bash <(curl -sL get.comby.dev)
Other Linux distributions: The PCRE library is dynamically linked in the Ubuntu binary. For other distributions like Arch Linux, a fixup is needed:
sudo ln -s /usr/lib/libpcre.so /usr/lib/libpcre.so.3
. On Fedora, usesudo ln -s /usr/lib64/libpcre.so /usr/lib64/libpcre.so.3
. Alternatively, consider building from source.
Windows
Install the Windows Subsystem for Linux and install Ubuntu. Then run
bash <(curl -sL get.comby.dev)
Docker
docker pull comby/comby
click to expand an example invocation for the docker image
Running with docker on stdin
:
docker run -a stdin -a stdout -a stderr -i comby/comby '(:[emoji] hi)' 'bye :[emoji]' lisp -stdin <<< '(👋 hi)'
Or try it live.
Isn't a regex approach like sed good enough?
Sometimes, yes. But often, small changes and refactorings are complicated by nested expressions, comments, or strings. Consider the following C-like snippet. Say the challenge is to rewrite the two if
conditions to the value 1
. Can you write a regular expression that matches the contents of the two if condition expressions, and only those two? Feel free to share your pattern with @rvtond on Twitter.
if (fgets(line, 128, file_pointer) == Null) // 1) if (...) returns 0
return 0;
...
if (scanf("%d) %d", &x, &y) == 2) // 2) if (scanf("%d) %d", &x, &y) == 2) returns 0
return 0;
To match these with comby, all you need to write is if (:[condition])
, and specify one flag that this language is C-like. The replacement is if (1)
. See the live example.
Build from source
Install opam. TL;DR do
sh <(curl -sL https://raw.githubusercontent.com/ocaml/opam/master/shell/install.sh)
Run this if you don't have OCaml installed (it bootstraps the OCaml compiler):
opam init
opam switch create 4.11.0 4.11.0
Run
eval $(opam env)
Install OS dependencies:
Linux:
sudo apt-get install autoconf libpcre3-dev pkg-config zlib1g-dev m4 libgmp-dev libev-dev libsqlite3-dev
Mac:
brew install pkg-config gmp pcre libev
Then install the library dependencies:
git clone https://github.com/comby-tools/comby
cd comby
opam install ./comby-kernel.opam --deps-only
opam install ./comby-semantic.opam --deps-only
opam install ./comby.opam --deps-only
Build and test
make
make test
Install
comby
on yourPATH
by running
make install
Dependencies (27)
-
toml
>= "6.0.0"
- shell
- pcre
-
yojson
< "2.0.0"
-
ppx_deriving_yojson
>= "3.6.0"
- ppx_deriving
-
patience_diff
>= "v0.14"
-
parany
>= "12.0.3"
- mparser-pcre
-
mparser
>= "1.3"
- lwt_react
- lwt
-
hack_parallel
arch != "arm32" & arch != "arm64"
- core
-
comby-semantic
= "1.7.0"
-
comby-kernel
= "1.7.0"
- cohttp-lwt-unix
-
conf-zlib
os = "linux"
- conf-sqlite3
- conf-pkg-config
-
conf-m4
os = "linux"
- conf-libpcre
-
conf-libev
os-distribution != "ol"
- conf-gmp
- conf-autoconf
-
ocaml
>= "4.08.1"
-
dune
>= "2.8.0"
Dev Dependencies (1)
-
bisect_ppx
with-test & dev & >= "2.5.0"
Used by
None
Conflicts
None