无法从文件中的“#define __mrs_s(v, r)”生成标记 __mrs_s。即使使用 --excmd=pattern

can't generate tag __mrs_s from "#define __mrs_s(v, r)" in a file.. even using --excmd=pattern

使用 ctags 生成标签似乎很棘手。
我想为 https://elixir.bootlin.com/linux/v5.4.21/source/arch/arm64/include/asm/sysreg.h
制作标签文件 你可以通过

获得这个sysreg.h文件
wget https://elixir.bootlin.com/linux/v5.4.21/source/arch/arm64/include/asm/sysreg.h

请参阅。我在这个答案中尝试了与下面相同的方法。

ctags --excmd=pattern sysreg.h 

我在生成的 tags 文件中看到 mrs_smsr_s 的标记。但是我没有看到我最初想要的 __mrs_s__msr_s 的标签。怎么了?

没有简单的方法可以满足目标。

sysreg.h 包含使 ctags 的 C++ 索引器混淆的汇编语言代码。参见 https://elixir.bootlin.com/linux/v5.4.21/source/arch/arm64/include/asm/sysreg.h#L741

(最好向 C++ 索引器添加一个功能以跳过 __ASSEMBLY____ASSEMBLER__ 区域。)

我发现了一种仅适用于 Universal ctags (https://ctags.io) 的骇人听闻的技术。您的 ctags 可能是 Exuberant Ctags。所以我在这里写的技术可能不适用于你的ctags。

$ ./ctags --version
./ctags --version
Universal Ctags 5.9.0(692f5fd15), Copyright (C) 2015 Universal Ctags Team
Universal Ctags is derived from Exuberant Ctags.
Exuberant Ctags 5.8, Copyright (C) 1996-2009 Darren Hiebert
  Compiled: Feb  6 2022, 06:19:35
  URL: https://ctags.io/
  Optional compiled features: +wildcards, +regex, +gnulib_regex, +iconv, +debug, +option-directory, +xpath, +json, +interactive, +sandbox, +yaml, +packcc, +optscript, +pcre2
$ ./ctags --options=NONE -Dendm='endm;' -o - /tmp/sysreg.h | grep __msr_s 
./ctags --options=NONE -Dendm='endm;' -o - /tmp/sysreg.h | grep __msr_s 
ctags: Notice: No options will be read from files or environment
__msr_s /tmp/sysreg.h   /^#define __msr_s(/;"   d

选项 -D...__ASSEMBLY__ 区域中的单词 endm 替换为 endm;。附加的分号字符减轻了索引器的混淆。