1

我正在尝试为 vim 标签栏配置“自定义语言”,以允许标签栏用于查看 Abaqus 有限元分析输入文件。

我从以下链接复制了示例:

http://github.com/majutsushi/tagbar/wiki

http://andrew.stwrt.ca/posts/vim-ctags/

ctags、vimwiki、vim 和 tagbar 插件

http://ctags.sourceforge.net/EXTENDING.html

这是我正在使用的软件:

  • RHEL 6.7
  • 7.4
  • 标签栏 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
  • 关键字2
  • 关键字3

关键字正则表达式 =^\*[A-Za-z]+

4

1 回答 1

0

据此,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
于 2015-10-22T01:47:05.840 回答