使用 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 时

_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 编译器指令的主要内容,如果未能解决你的问题,请参考以下文章

Fortran 中的变量识别问题

安装了MPI,可是Fortran仍然不能识别use mpi

VHDL标签在使用ctags + taglist的vim中效率不高

Fortran 无法从文件中读取

如何递归创建 ctags 文件?

如何在 Fortran 中有效地计算矩阵内积?