vim tagbar: 自定义语言配置

vim tagbar: custom language configuration

我正在尝试为 vim 标签栏配置一个 "custom language",这将允许标签栏用于查看 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]+//s,Section/
--regex-AbaqusINP=/^\*[A-Za-z]+//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 ""
ctags: Warning: example.inp:9: null expansion of name pattern ""
ctags: Warning: example.inp:14: null expansion of name pattern ""

标签文件已创建,但仅填充了默认 header。

!_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 没有创建供 tagbar 使用的标签?感谢您的帮助。



更新:阐明所需的正则表达式。

我想为栏目名称和关键字分配标签。我在 vim 中尝试了这些模式,它们似乎工作正常。

对于上面的 example.inp 文件,我希望部分的正则表达式为 return:


对于上面的 example.inp 文件,我希望关键字的正则表达式为 return:

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

根据this ctags 不支持多行正则表达式。

我能得到的更接近的解决方案是:

--langdef=AbaqusINP
--langmap=AbaqusINP:.inp
--regex-AbaqusINP=/^\*\*([ \tA-Za-z0-9]+)//s,Section/
--regex-AbaqusINP=/^\*([A-Za-z0-9]+)//k,Keyword/

考虑到替换表达式中的 </code> 指的是匹配表达式中的组,因此需要在感兴趣的关键字周围加上括号。这就是您收到这些警告的原因。 我还修复了关键字正则表达式以允许包含数字。</p> <p>上面的配置将为您发布的示例 return 以下标签:</p> <pre><code>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

这仍然是return评论,这是不可取的。 但是据我所知,您使用的是普通注释来定义部分,所以我猜格式不是固定的。如果这是真的,一种可能的解决方案是:

--langdef=AbaqusINP
--langmap=AbaqusINP:.inp
--regex-AbaqusINP=/^\*\* *(Section +[ \tA-Za-z0-9]+)//s,Section/
--regex-AbaqusINP=/^\*([A-Za-z0-9]+)//k,Keyword/

尽管它要求所有部分都以关键字 "Section" 开头,但它会 return 您要查找的内容:

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