使用 ctags 在 fortran 中识别 #define 编译器指令
Posted
技术标签:
【中文标题】使用 ctags 在 fortran 中识别 #define 编译器指令【英文标题】:Recognise #define compiler directive in fortran with ctags 【发布时间】:2020-06-26 14:32:37 【问题描述】:我想配置 ctags 以识别 fortran 代码中的编译器指令。更具体地说,我想匹配下面的vim搜索结果
/\v[ \t]*#define[ \t]+([-[:alnum:]*+!_:\/.?]+)/
其中 \v 引发了非常神奇的级别(请参阅Can I turn on extended regular expressions support in Vim?)。或者,使用普通正则表达式进行搜索
/[ \t]*#define[ \t][ \t]*\([-[:alnum:]*+!_:\/.?][-[:alnum:]*+!_:\/.?]*\)/
可以使用。如果找到通用编译器指令,那也会对我有所帮助。一个实际的应用是,当按下
_ABORT("delta_time is too small")
我会被重定向到相应的定义
#define _ABORT(msg) call abimem_abort(msg, __FILE__, __LINE__)
基于https://andrew.stwrt.ca/posts/vim-ctags/,我尝试添加任一
--regex-fortran=/[ \t]*#define[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/d,directives/
或
--regex-fortran=/[ \t]*#define[ \t][ \t]*\([-[:alnum:]*+!_:\/.?][-[:alnum:]*+!_:\/.?]*\)/\1/d,directives/
到 ~/.ctags。基于http://ctags.sourceforge.net/ctags.html,我也尝试添加--line-directives=yes,但在上面举的实际应用中我都无法成功。使用的时候已经可以看到额外的种类了
ctags --list-kinds
但仅此而已。出了什么问题?
【问题讨论】:
您的第一次尝试使用提供的示例。 【参考方案1】:现在好像可以了。我目前的 ~/.ctags 是
--fortran-kinds=+i
--recurse=yes
--exclude=.git
--regex-fortran=/[ \t]*#define[ \t]+([-[:alnum:]*+!_:\/.?]+)/\1/d,directives/
这可能与我之前在 ~/.ctags 中放置了一个 '\v' 的事实有关(并且没有将其正确复制到问题中)。有人可以解释为什么这个 '\v' 不能出现在那里,尽管 vim 被配置为需要它来扩展正则表达式?
在之前的尝试和现在之间发生的另一件事是重新启动(清理临时空间等),如果仍然卡住,这可能会有所帮助。
此外,应该指出额外的正则表达式并不总是必要的。在没有正则表达式的情况下找到了以下宏定义:
# define MSG_ERROR(msg) call libpaw_msg_hndl(msg,"ERROR" ,"PERS")
【讨论】:
以上是关于使用 ctags 在 fortran 中识别 #define 编译器指令的主要内容,如果未能解决你的问题,请参考以下文章