#preprocessor #ripgrep #string #search #comments #remove #language

app just-the-code

一种用于从代码中删除注释和字符串的 ripgrep 预处理器

1 个稳定版本

1.0.0 2024年2月25日

#7#ripgrep

MIT 许可证

33KB
653

仅代码

一个 ripgrep 预处理器,它从您的代码中去除注释和字符串,让您能够搜索 仅代码,有时可以极大地减少搜索结果中的噪声

just-the-code 的示例输出 左侧:原始文件。右侧:just-the-code 的输出。

它相较于其他方法的主要优点是

  • 它非常高效,因为它不需要构建语法树或编译您的代码
  • 它在您的终端中运行,因此可以与其他 CLI 工具集成
  • 它可以很容易地定制以满足您的需求:您只需要指定注释和字符串的样式,它就可以与您选择的语言一起工作
  • 准确处理嵌套注释、字符串和不同类型注释之间的交互
  • ripgrep 原生集成,因此使用它就像传递一个额外的参数一样简单

安装

如果您已经安装了 cargo,则只需运行

cargo install just-the-code

如果您希望修改源代码或将它安装在其他位置,则可以运行以下命令

# Grab the code
git clone https://github.com/adri326/just-the-code/

# Navigate to the correct repository
cd just-the-code/

# Build the code
cargo build --release

# The built binary will be ./target/release/just-the-code

使用方法

要使用此工具与 ripgrep 一起使用,只需将 --pre just-the-code 添加到您的命令中。例如

# Noisy, since a lot of "hello"s are present in strings in the code:
rg "hello"

# No more noise :)
rg --pre just-the-code "hello"

或者,您也可以以独立模式使用此工具。例如

just-the-code src/parse.rs | bat --language rust

有几个选项可以自定义 just-the-code 的行为,这些选项可以通过运行 just-the-code --help 来查看。要使这些选项与 ripgrep 一起工作,您需要创建自定义的 bash 脚本,这些脚本本身会使用所需的选项调用 just-the-code。您可以在 ripgrep 指南中找到更多信息

配置

要配置 just-the-code,您需要创建文件 ~/.config/just-the-code/config.toml。其中包含一些全局选项,但大多数将是特定于语言的

# Whether or not to keep strings in the output
keep_strings = false

[lang.rust]
# Single-line comment tokens
line_comments = ["//"]

# Multi-line comment tokens, grouped as pairs
multiline_comments = [["/*", "*/"]]

# String delimiters
strings = ["\"", "'"]

# Tokens to ignore
blacklist = ["\\\"", "\\\\"]

# Whether or not to allow nested comments
nested_comments = false

just-the-code 的主要逻辑已经足够通用,以至于你只需要告诉它字符串和注释的样式,它就可以与你的选择语言一起工作。要做到这一点,你需要指定以下内容:

  • 单行注释标记(line_comments):例如 //#;在其后的任何内容都将被视为注释的一部分,并且在其后不能打开多行注释。
  • 多行注释分隔符(multiline_comments):例如 /**/;它们之间的单行注释将被忽略。它们被分组为开/闭对。
  • 字符串分隔符(strings):在字符串中的注释标记将被忽略,在注释中的字符串分隔符也将被忽略。
  • 黑名单标记(blacklist):如果指定的标记与黑名单标记重叠,则不会匹配。这让你可以在字符串中黑名单 ",例如。
  • 是否允许嵌套注释(nested_comments):如果启用,那么 a /* /* */ */ b 将变为 a b。如果禁用(默认情况下),相同的代码将变为 a */ b

" 的注意事项

如果你的语言使用 " 作为字符串,并且允许通过输入 \ 来在字符串中转义引号,那么简单地添加 \ 到黑名单是不够的:"\ 将解析错误,因为 " 将被视为一个转义的引号。

为了解决这个问题,黑名单标记被设计为相互排斥的:两个黑名单标记不能重叠。这意味着如果你还把 \ 添加到黑名单,那么 "\ 现在将正确解析:\ 被视为一个黑名单标记,阻止 " 被解释为转义的引号。

已知问题

当添加 --pre 时,ripgrep 的性能会显著下降,因为 ripgrep 实际上需要为每个搜索的文件执行一次 fork。将来有可能直接在 ripgrep 中集成 just-the-code,这样所有操作都可以在同一个进程中完成。

依赖项

~2–12MB
~103K SLoC