文件

时间:2017-01-30 21:56:37

标签: vim vim-plugin vim-syntax-highlighting

我尝试创建笔记的语法定义。

以下是一个例子:

=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

我想创建语法以突出显示这些不同的匹配。在我的笔记中,我可以编写看起来像标题(=这种方式)或标签(#his-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

如何停止第一个空/空白行或文件末尾的区域,关于第一个来的?

1 个答案:

答案 0 :(得分:2)

您可以在区域结尾的模式中包含表示文件末尾的特殊原子:end="^\s*$\|\@$";但是,这不是必要的。当start模式匹配时,Vim 始终启动语法区域;它没有检查end模式,因为:help syn-region解释了:

  

注意:启动区域的决定仅基于匹配的开始     图案。没有检查匹配的结束模式。

因此,即使没有end模式的匹配,所有区域都隐式地在缓冲区的末尾结束。事实上,你的语法对我很有用。

我认为您已经感到困惑,因为您没有定义正确的语法脚本,而是选择了autocmd FileType gtd前缀。此外,syntax clear缺失。

:syntax个命令放入~/.vim/syntax/gtd.vim中的单独文件中,并遵循:help 44.12中描述的格式。您还可以查看Vim附带的$VIMRUNTIME/syntax/*.vim中的各种语法脚本之一。