源码阅读

(3 mins to read)

静态分析

cloc

统计代码行数,由perl实现。

  • cloc {{file/directory}}
  • --by-file:按文件统计,而不是按语言
  • --exclude-list-file=<file>
  • --exclude-dir=<D1>[,D2,]

diff

git diff

git diff --no-index --word-diff=color file1 file2

--word-diff-regex=.可以以字符为单位进行比较,默认情况下word-diff以word为单位,即连续的非空白字符。

git-delta

1
2
git diff | delta # 配置.gitconfig中的pager就不需要再管道传到delta
rg "word" ./ | delta

difft

基于语法进行diff

1
difft --help

bat

just replace cat

fd

查找文件,由rust实现,是find的替代品。

  • fd {{pattern}} [directory]:默认为正则匹配,可以指定目录,不指定则搜索当前目前
  • --extension:查找扩展名
  • --exclude:排除某些文件或目录
  • --no-ignore:默认会遵守目录下的.gitignore,指定该选项则不遵守

rg

查找文件内容,由rust实现,是grep的替代品。

  • rg {{pattern}} [path ...]:搜索文本为正则匹配
  • --type {{filetype}}:指定要查找的文件类型
  • -i:大小写不敏感
  • --glob {{pattern}}:仅查找匹配glob模式的文件
  • --files-with-matches:只列出存在匹配的文件名
  • -A/-B/-C N:打印匹配行以及后/前/前后N行
  • --files:查找文件名

ast-grep

基于Tree-sitter进行代码搜索、替换,由rust实现。它基于AST节点(其实是CST,AST是抽象语法树,而Ts生成的CST是具体语法树,它为每个token都存储了一个对应的节点,即使是逗号、括号等字符串字面量,而AST则会去掉这些无意义的节点;这里称作命名节点和匿名节点)进行结构匹配,而不是简单的文本匹配。

  • ast-grep [OPTIONS] --p <PATTERN> [PATHS]...
  • PATTERN:AST模式
    • 元变量:$开头后跟大写字母、下划线或数字1-9,匹配单个AST节点(类比正则中的.
    • 多元变量:$$$来匹配零个或多个AST节点(类比正则中的*
    • 元变量捕获:可以重复使用同名变量,此时它们被要求匹配相同的内容,可以用下划线开头来抑制该行为
    • 匿名节点:$$开头,即CST中直接用字符串字面量定义的,比如+/,/;
  • -l:指定语言
  • --rewrite:改写替换
  • --interactive:交互模式
  • -A/-B/-C

运行时分析

strace

ltrace

uftrace