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