在Vim中自定义语法高亮

7

如何突出显示以sql_开头并在引号内的字符串?

我的日志文件:

MGPostgreSQLConnection.OpenQuery; "sql_p_factory_history"-ExecTime: 47ms
2010-11-12T17:28:18+01:00;custom; MGPostgreSQLConnection.OpenQuery; "sql_p_factory_history"-ExecTime+FetchTime: 47ms
2010-11-12T17:28:18+01:00;custom; MGPostgreSQLConnection.OpenQuery; "sql_factory"-ExecTime: 47ms
2010-11-12T17:28:18+01:00;custom; MGPostgreSQLConnection.OpenQuery; "sql_factory_contactperson"-ExecTime+FetchTime: 62ms

我的vimrc(当然这是不起作用的):

au BufRead,BufNewFile *.log syn match "sql_*"
au BufRead,BufNewFile *.log hi sql guifg=white guibg=red
4个回答

7
你已经接近成功了!这个版本(可以工作)不会突出显示引号。
au BufRead,BufNewFile *.log hi sql guifg=white guibg=red ctermfg=white ctermbg=red
au BufRead,BufNewFile *.log syn match sql /"\zssql_\w*\ze"/

screen-shot

更多信息请参见以下内容:

  • :help :syn-match " 用于语法匹配
  • :help /\zs " 设置匹配的起始位置
  • :help /\ze " 设置匹配的结束位置
  • :help /\w " 单词字符

调试:

命令:verbose :syn应该会给你类似这样的输出:

--- Syntax items ---
[...]
sql            xxx match /"\zssql_\w*\ze"/

关于:verbose :hi命令:

        Last set from ~/.vimrc
[...]
sql            xxx cterm=bold ctermfg=7 ctermbg=1 guifg=white guibg=red

xxx应该与您指定的颜色相同(并且看起来像我屏幕截图中的高亮显示)。如果您没有看到这些内容,请检查您的.vimrc(或Windows上的_vimrc)是否已被引用:

:scriptnames
1: /home/javh/.vimrc
[...]

当然,这仅适用于以下情况:

:echo has('syntax')

返回1(或:version包括+syntax)。


1
如果您不想突出显示尖括号,那么\zs\ze是很好的选择。但我认为[^"]*有点过于宽松了。 - Benoit
它在Ubuntu和Win7上使用Vim 7.2可以工作,但在XP上使用Vim 7.3就不行。 - JAVH
很高兴在几个安装上它能正常工作。上面的任何调试步骤是否对您在XP上使用v7.3有所帮助? - johnsyweb
调试步骤的结果是OK的(如您所描述的)。 - JAVH
如果“xxx”字符串出现在正确的颜色中,那么您必须能够显示它们。日志文件完全相同吗?(不使用“智能引号”或类似物)?也许尝试不同的匹配模式... - johnsyweb
显示剩余7条评论

2

syn match的语法是syn match highlight_group reg_exp

因此,请尝试:

au BufRead,BufNewFile *.log syn match Todo /"sql_\w\+"/

为什么不阅读:syn的帮助文档呢?Vim的帮助文档非常好,可以快速找到所有答案 :)

:help :syntax

0

谢谢,但我需要一个特殊的“syn match”。 - JAVH

0

另一种方法是不使用 syntax match,而是直接使用 :match 命令或 matchadd() 命令。

简而言之:

" to enable
:match Todo /"\@<=sql_\w\+"\@=/
" reference:
" \@<= is such a beautiful duck, :help /\@<= for more help
" :help /\@= for the \@= part, also.
"
" to cancel
:match none
" :help :match / :help :2match / :help :3match

或者

" to enable
:call matchadd('Todo', '"\zssql_\w\+\ze"')
" or
:let foobarbaz = matchadd('Todo', '"\zssql_\w\+\ze"')
"
" to disable
:call matchdelete(foobarbaz)
" or
:call clearmatches()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接