vim tagbar: настраиваемая языковая конфигурация

Я пытаюсь настроить "пользовательский язык" для панели тегов vim, который позволил бы использовать панель тегов для просмотра входных файлов Abaqus Finite Element Analysis.

Я продублировал примеры из следующих ссылок:

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

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

ctags, vimwiki, vim и tagbar-плагин

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

Это программное обеспечение, которое я использую:

  • РЕЛ 6,7
  • Vim 7,4
  • tagbar 2.6.1
  • Exuberant 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 не создает теги для использования тега bar? Спасибо за вашу помощь.



Обновление: уточнение нужных регулярных выражений.

Я хотел бы, чтобы названия разделов и ключевые слова были назначены теги. Я попробовал эти шаблоны в VIM, и они, казалось, работали правильно.

Для файла example.inp выше я хотел бы, чтобы регулярное выражение для разделов возвращало:

  • Название Секции Один
  • Название Секции Два

    section_regex = ^\*\*\*[\*]+\n\*\*[ \tA-Za-z]+


Для файла example.inp, приведенного выше, я хотел бы, чтобы регулярное выражение для ключевых слов возвращало:

  • Ключевое слово 1
  • KEYWORD2
  • KEYWORD3

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

1 ответ

Решение

Согласно этому 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/

Хотя для этого требуется, чтобы все разделы начинались с ключевого слова "раздел", он вернет то, что вы ищете:

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
Другие вопросы по тегам