起因

tags --exclude=./src/isa/riscv32, 发现加了./就不起作用(也就是说目录下文件还是会被tag).
man ctags, 看到是pattern.

试验

/Users/quebec/Playground/play/a/b/c目录下有main.c
内容:

#include <stdio>

int main() {
}

现在在play下. 用比如ctags -R --exclude=c这样的命令测试. 结果如下. 起作用的意思就是没有被tag, 不起作用就是能找到main tag.

c, 起作用
b/c, 不起作用
b, 起作用
*b/c, 起作用
c/*, 不起作用
/Users/quebec/Playground/play/a/b/c/*, 不起作用
a/b/c/*, 起作用
b, 起作用

推测

据此结果, 猜测其机制为:

  1. 必须是完整匹配, 可以有通配符*, ?之类的. 和gitignore不同的是, *也能匹配..
  2. 会匹配的路径是要么是这个节点(目录或者文件, 由于inode所以把它称为节点)的name, 要么是它相对于当前目录的路径, 相对路径中不包括..

比如, 递归进入目录a后, 发现有目录b, 那么要匹配的目标字符串为a, a/b(而不是绝对路径), 如果匹配成功, 此目录不再进入.

解释结论

1, 3. c, c与目录c的节点名匹配, 不再进入, 起作用, 3和1的道理相同
2, 4, 5. b/c, 根据1必须是完整匹配, 如果加上*, 就像4那样, 起作用
6. 前面说了, 目标字符串不是绝对路径, 因此匹配不上不起作用
7. 根据2, 起作用
8, 根据2, 起作用