我正在尝试为vim tagbar配置一个“自定义语言”,允许使用标签栏查看Abaqus有限元分析输入文件。
我复制了以下链接中的示例:
http://github.com/majutsushi/tagbar/wiki
http://andrew.stwrt.ca/posts/vim-ctags/
ctags, vimwiki, vim and tagbar-plugin
http://ctags.sourceforge.net/EXTENDING.html
这是我正在使用的软件:
Abaqus输入文件示例example.inp
** Analyst:
** Comments
** More comments
**
****************************************
** Section Name One
****************************************
*Keyword1
*KEYWORD2
**
****************************************
** Section Name Two
****************************************
*Keyword3
这是我添加到我的vim配置文件〜/ .vimrc
let g:tagbar_type_AbaqusINP = {
\ 'ctagstype' : 'AbaqusINP',
\ 'kinds' : [
\ 's:Section',
\ 'k:Keyword'
\ ],
\ 'sort' : 0
\ }
我创建了一个ctags配置文件〜/ .ctags
--langdef=AbaqusINP
--langmap=AbaqusINP:.inp
--regex-AbaqusINP=/^\*\*\*[\*]+\n\*\*[ \tA-Za-z]+/\3/s,Section/
--regex-AbaqusINP=/^\*[A-Za-z]+/\1/k,Keyword/
当我打开输入文件然后打开标签栏时,没有任何内容。当我从命令行调用以下内容时,AbaqusINP * .inp在列表中。
$ ctags --list-maps
Ant *.build.xml
...
AbaqusINP *.inp
当我尝试手动创建标记文件时,我会在找到关键字的每一行收到以下警告。
$ ctags example.inp
ctags: Warning: example.inp:8: null expansion of name pattern "\1"
ctags: Warning: example.inp:9: null expansion of name pattern "\1"
ctags: Warning: example.inp:14: null expansion of name pattern "\1"
已创建标记文件,但仅使用默认标题填充。
!_TAG_FILE_FORMAT 2 /extended format; --format=1 will not append ;" to lines/
!_TAG_FILE_SORTED 1 /0=unsorted, 1=sorted, 2=foldcase/
!_TAG_PROGRAM_AUTHOR Darren Hiebert /dhiebert@users.sourceforge.net/
!_TAG_PROGRAM_NAME Exuberant Ctags //
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/
!_TAG_PROGRAM_VERSION 5.8 //
关于为什么ctags没有为标签栏创建标签的任何想法?谢谢你的帮助。
更新:澄清所需的正则表达式。
我希望为节名称和关键字分配标签。我在vim中尝试了这些模式,它们似乎工作正常。
对于上面的example.inp文件,我想要返回部分的正则表达式:
部分名称二
section_regex = ^\*\*\*[\*]+\n\*\*[ \tA-Za-z]+
对于上面的example.inp文件,我希望关键字的正则表达式返回:
keyword_regex = ^\*[A-Za-z]+
答案 0 :(得分:0)
根据this,ctags不支持多行正则表达式。
我能得到的更接近的解决方案是:
--langdef=AbaqusINP
--langmap=AbaqusINP:.inp
--regex-AbaqusINP=/^\*\*([ \tA-Za-z0-9]+)/\1/s,Section/
--regex-AbaqusINP=/^\*([A-Za-z0-9]+)/\1/k,Keyword/
考虑到替换表达式中的\1
是指匹配表达式中的组,因此围绕感兴趣的关键字必须使用括号。这就是你收到这些警告的原因。
我还修复了关键字正则表达式以允许包含数字。
上面的配置将为您发布的示例返回以下标记:
Analyst test.inp /^** Analyst:$/;" s
Comments test.inp /^** Comments$/;" s
KEYWORD2 test.inp /^*KEYWORD2$/;" k
Keyword1 test.inp /^*Keyword1$/;" k
More comments test.inp /^** More comments$/;" s
Section Name One test.inp /^** Section Name One$/;" s
Section Name Two test.inp /^** Section Name Two$/;" s
这仍然会返回评论,这是不可取的。 但是从我可以收集的内容来看,你使用正常的注释来定义部分,所以我猜这种格式并不固定。如果这是真的,一个可能的解决方案是:
--langdef=AbaqusINP
--langmap=AbaqusINP:.inp
--regex-AbaqusINP=/^\*\* *(Section +[ \tA-Za-z0-9]+)/\1/s,Section/
--regex-AbaqusINP=/^\*([A-Za-z0-9]+)/\1/k,Keyword/
虽然它要求所有章节都以关键字" Section"开头,但它会返回您要查找的内容:
KEYWORD2 test.inp /^*KEYWORD2$/;" k
Keyword1 test.inp /^*Keyword1$/;" k
Section Name One test.inp /^** Section Name One$/;" s
Section Name Two test.inp /^** Section Name Two$/;" s