2个版本
0.1.1 | 2024年7月27日 |
---|---|
0.1.0 | 2024年7月1日 |
#452 in 开发工具
153 每月下载量
44KB
856 行
dook:代码中的定义查找
使用tree-sitter 和 ripgrep 查找代码定义,并使用 bat 进行美化打印。
安装
cargo install --git https://github.com/pteromys/dook
示例用法
pteromys@delia ~/src/dook $ dook write
───────┬────────────────────────────────────────────────────────────────
│ File: ./src/paging.rs
───────┼────────────────────────────────────────────────────────────────
61 │ impl std::io::Write for MaybePager {
... │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ 8< ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─
69 │ fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {
70 │ match self.pipe() {
71 │ Some(pipe) => pipe.write(buf),
72 │ None => std::io::stdout().write(buf),
73 │ }
74 │ }
───────┴────────────────────────────────────────────────────────────────
还尝试查找赋值、类定义等——为什么你必须在搜索之前弄清楚它们的区别?在旧的javascript代码库中实际上并没有真正的区别!
支持的语言
- c
- c++
- go
- javascript
- python
- rust
- typescript
- tsx
替代品和先例
- symbex:在python中查找定义,以及一些其他操作模式;旨在 将代码作为LLM的输入/输出进行切片/拼接。
- cq:jq-for-code,使用更强大的代码查询语法,也由tree-sitter提供支持。
- ast-grep 和 comby:语法感知的查找和替换(查询语言支持某些形式的捕获)
- mogglo:可lua脚本化代码搜索和转换
git grep -W 'def your_function_name'
(或特定语言的类似命令)在多种语言中通常足够好。- 直接在GitHub上搜索,由 堆栈图 支持
目标与非目标
- 查找定义。
- 显示足够多的上下文以回答查找定义时通常提出的问题。
- 最小化用户输入
- 用户在输入第一个调用之前需要思考的量
- 用户需要阅读或滚动以查看所需内容的输出量
- 调用次数
- 每个调用需要输入的量
- 平衡响应性和全面性:明确地说,在用户想到后续查询之前返回结果。
- 如果必要,为了提高显示相关上下文的机会,可以牺牲一致性和机器可读性。(如果你想得到机器可预测的输出,请使用
cq
代替。) - 为了准确性和我自己的开发时间,牺牲磁盘和RAM占用——tree-sitter解析器可能在磁盘上占用每个约2兆,而你正在搜索的代码库可能更大。但尽量保持RAM使用量比你可能拖延打开的IDE小一个数量级左右。
可能未来的工作
- 更好的语言检测(例如,llvm头文件是C++,但大多数狡猾地以小写.h结尾)
- 更多语言(以及更多语言的测试 😱)
- 显示对函数的所有调用(
git grep -W
已经做到了大部分,所以我不太关心) - 结束这个项目,并将其变为ripgrep的功能(可能不可行,因为所有语言的解析器加起来可能会使二进制文件大小很大;然而,也许rubicon提供了一些希望)
- 升级tree-sitter版本,以便我可以创建更好的模式。当前的C和C++查询模式让我想尖叫。
许可证
依赖项
~0–23MB
~523K SLoC