vim tagbar:自定义语言配置

时间:2015-10-19 20:53:40

标签: regex vim ctags tagbar

我正在尝试为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

这是我正在使用的软件:

  • RHEL 6.7
  • vim 7.4
  • tagbar 2.6.1
  • 旺盛的Ctags 5.8

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文件,我希望关键字的正则表达式返回:

  • 关键字1
  • KEYWORD2
  • KEYWORD3

keyword_regex = ^\*[A-Za-z]+

1 个答案:

答案 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