2015-10-19 9 views
0

Я пытаюсь настроить «настраиваемый язык» для тегаба vim, который позволит использовать тегбар для просмотра входных файлов с использованием анализа конечных элементов Abaqus.vim tagbar: настраиваемая языковая конфигурация

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

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

Это софы tware Я использую:

  • RHEL 6.7
  • ВИМ 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 

Это то, что я добавил в мой файл конфигурации ВИМ ~/.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 /[email protected]/ 
!_TAG_PROGRAM_NAME Exuberant Ctags // 
!_TAG_PROGRAM_URL http://ctags.sourceforge.net /official site/ 
!_TAG_PROGRAM_VERSION 5.8 // 

Любые мысли о том, почему Ctags не создает теги для tagbar использовать? Спасибо за вашу помощь.



Update: Уточнить желательные регулярные выражения.

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

Для примера.вх файл выше, я хотел бы регулярное выражение для сечения, чтобы вернуться:

  • Раздел Имя Один
  • Раздел Название Два

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


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

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

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

+1

Случайная мысль: старайтесь избегать многострочных шаблонов – Vitor

+0

Не могли бы вы показать нам, что вы пытаетесь совместить и захватывать своими регулярными выражениями? Кроме того, у вас нет групп в шаблоне «Секция», поэтому у ctags будет сложнее извлечь третий. – romainl

ответ

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 в заменить выражение относится к группам, в выражении соответствия, поэтому круглые скобки необходимы вокруг ключевых слов, представляющего интереса. Вот почему вы получили эти предупреждения. Я также исправил ключевое слово regular expression, чтобы разрешить включение чисел.

Конфигурация выше будет возвращать следующие тег для примера вы публикуемые:

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