2017-01-30 2 views
0

Я пытаюсь создать синтаксическое определение моих заметок.Область синтаксиса Vim в первых строках файла

Вот пример:

=Title of the note (it's the very first line) 
@context (mandatory) 
!action (mandatory) 
#tag-1 (optional) 
#tag-2 (optional) 
#tag-n (optional) 
>attached-files (optional) 

My note come after the first blank line 
and continue until the end of the file... 

No matter any additional empty line 

Я хотел бы создать синтаксис, чтобы подчеркнуть то тезисы Differents матчи. В моей заметке я могу писать строки, которые выглядят как заголовок (= этот путь) или тег (# this-way), и их не нужно выделять. Я пытаюсь создать область для метаданных заметок, идущих от первой строки до первой пустой строки.

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

augroup gtd 

    autocmd! 

    autocmd BufRead,BufNewFile *.gtd set filetype=gtd 

    autocmd FileType gtd syntax region gtdTags start="\%1l" end="^\s*$" fold transparent contains=gtdTitle,gtdContext,gtdStatus,gtdHashtags,gtdAttachedFiles 
    autocmd FileType gtd syntax match gtdTitle '^=.*' contained 
    autocmd FileType gtd syntax match gtdContext '^@\S\+$' contained 
    autocmd FileType gtd syntax match gtdStatus '^!\S\+$' contained 
    autocmd FileType gtd syntax match gtdHashtags '^#\S\+$' contained 
    autocmd FileType gtd syntax match gtdAttachedFiles '^>attached-files$' contained 

    autocmd FileType gtd syntax match gtdSubtitle '^\s*\*\* .*' 
    autocmd FileType gtd syntax keyword gtdTodo TODO WAITING SOMEDAY SCHEDULED 

    autocmd FileType gtd highlight gtdTitle guifg=white guibg=NONE gui=bold 
    autocmd FileType gtd highlight gtdContext guifg=yellow 
    autocmd FileType gtd highlight gtdStatus guifg=red gui=NONE 
    autocmd FileType gtd highlight gtdHashtags guifg=grey gui=italic 
    autocmd FileType gtd highlight gtdAttachedFiles guifg=red guibg=white gui=bold 

    autocmd FileType gtd highlight gtdSubtitle guifg=black guibg=lightgrey gui=bold 
    autocmd FileType gtd highlight gtdTodo guifg=white guibg=red gui=NONE 

augroup END 

Как остановить регион на первой пустой/пустой строке или в конце файла, в отношении первого, который идет?

ответ

2

Вы можете включить специальный атом, представляющий конец файла в вашем шаблоне для конца области : end="^\s*$\|\@$", но это необязательно. Vim всегда начинает синтаксическую область whe n совпадения с образцами start; он не проверяет для end шаблона, а :help syn-region объясняет:

Примечание: Решение начать регион только основанный на согласовании запуска шаблона. Не существует проверки подходящего шаблона конца.

Таким образом, все области неявно заканчиваются в конце буфера, даже если нет совпадения для шаблона end. И на самом деле, ваш синтаксис работает для меня просто отлично.

Я думаю, вы запутались, потому что не определили правильный сценарий синтаксиса и вместо этого выбрали префиксы autocmd FileType gtd. Кроме того, отсутствует syntax clear.

Поместите свои команды :syntax в отдельный файл в ~/.vim/syntax/gtd.vim и придерживайтесь формата, описанного в :help 44.12. Вы также можете взглянуть на один из различных сценариев синтаксиса в $VIMRUNTIME/syntax/*.vim, которые поставляются вместе с Vim.

Смежные вопросы