资讯专栏INFORMATION COLUMN

自己写VIM语法高亮插件

宠来也 / 3396人阅读

摘要:语法高亮插件语法高亮插件需要两个文件。语法检测当读取或创建时,将后缀的文件类型设置为,之后使用类型的语法高亮方案进行着色。语法高亮这是文本的重点,该文件告诉该怎么着色。

实习之后发现,一切代码活动都局限在一个终端界面了。由于一些安全原因和开发环境的方便,开发都是通过远程ssh到开发机上开发,自然也就只有终端界面了。VNC因为安全原因不让用,所以就别妄想使用Clion等IDE来开发了。在这样的背景下,人们大多使用VIM或者EMACS等编辑器来开发。

在调试过程中,服务端日志是一个重要的参考依据。但是这类文本并不是某种编程语言,通常查阅的时候是没有语法高亮的,而且为了对grep命令友好,通常会将一条日志打在一行里,这就使得日志信息非常密集,分辩关键信息的时候非常不方便。于是我便有了这样一个想法,编写VIM插件,对日志中的关键信息如时间戳、代码行号、错误码进行语法高亮。

为了叙述的方便,我们的目标是为下面这段日志进行高亮,将日志级别、时间戳、代码行号标识出来。

[ERROR][2017-10-01 08:08:08][example.go:231]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
[DEBUG][2017-10-01 08:08:10][example.go:233]Lorem ipsum dolor sit amet
[INFO][2017-10-01 08:09:09][example.go:2333]Lorem ipsum dolor sit amet
语法高亮插件

语法高亮插件需要两个.vim文件。一个是语法检测文件(ftdetect),这是为了让VIM能够将指定语法应用于指定后缀的文件。一个是语法文件(syntax),这里定义了高亮的语法和着色方案。

插件的目录结构如下:

/Users/zhuangqh/.vim
├── ftdetect
│   └── log.vim
└── syntax
    └── log.vim

这些文件在类UNIX系统上要放到$HOME/.vim目录下,Windows系统是$HOME/vimfiles/下。

语法检测

当buffer读取或创建时,将.log后缀的文件类型设置为log,之后使用log类型的语法高亮方案进行着色。

" ftdetect/log.vim
au BufNewFile,BufRead *.log set filetype=log
语法高亮

这是文本的重点,该文件告诉VIM该怎么着色。

关键字高亮
syn keyword ${group} ${keyword}

大多数编程语言都有关键字。规则设置的时候,先给他一个组名,后面再接着一些关键字,之后再根据这个组名设置颜色。关键字高亮的匹配优先级是最高的,如果有其它高亮规则匹配上了也会按关键字的规则来高亮。

这个规则对我们这次任务没什么用,因为我们只想高亮日志开头的那个特定的ERROR字样,存在上下文,实际上并不是关键字。

匹配字高亮
syn match ${name} ${pattern} 

这个命令提供了一种强大的匹配方法,用正则表达式来匹配。我们可以用来匹配我们的时间戳,如:syn match logDate "d{4}-dd-dd"

高亮嵌套

对某个匹配的字符串高亮之后,对子字符应用不同的规则。

比如上述日志中的代码行号 example2.go:233,我们先整体匹配了这个模式,然后希望行号能有不一样的颜色。这可以理解成匹配的上下文,规则只在指定上下文中有效。

syn match logFile "w*.go:d*" contains=logLineNum
syn match logLineNum "d*" contained

contains告诉VIM这个token会包含其他哪些token。contained告诉VIM,只有在被其他token包含时,该规则才有效。

匹配偏移

在高亮行号时,d*规则会将所有的数字高亮,而事实上,只有冒号右边的数字才是行号,这就要用到匹配偏移的规则了。

syn match logLineNum ":d*"ms=s+1 contained

匹配偏移用来调整实际匹配的值。ms(me)表示的是实际匹配的起始(终止)下标,s(e)表示的是原匹配字符的起始(终止)下标。我们用:d*匹配后,将下标向右调整一位即可。

记得偏移命令要紧跟模式项,否则会报错。

区域高亮
syn region ${name} start=${pattern} end=${pattern} skip=${pattern}

区域匹配最常见的是匹配一个字符串,用引号包裹的字符串,可以通过skip来跳过转义字符如"

在我们的日志高亮任务里,想匹配的是包含特定token的中括号,我们只高亮中括号,其他的交由其他规则来匹配。

syn region logBlock matchgroup=logParen start=/[/ end=/]/ fold
配色
hi ${name} ctermfg=${color}

为前面定义的语法token设定着色样式,ctermfg是彩色终端的前景色,其他选项详见:highlight

结果

把所有规则集结起来如下:

if exists("b:current_syntax")
  finish
endif

syn match logLevelError "ERROR" contained
syn match logLevelDebug "DEBUG" contained
syn match logLevelInfo "INFO" contained

syn match logFile "w*.go:d*" contains=logLineNum
syn match logLineNum ":d*"ms=s+1 contained

syn match logDate "d{4}-dd-dd" contained
syn match logTime "dd:dd:dd" contained
syn region logBlock matchgroup=logParen start=/[/ end=/]/ fold
  contains=logLevelError,logLevelDebug,logLevelInfo,logFile,logDate,logTime

hi logLevelError ctermfg=red
hi logLevelDebug ctermfg=yellow
hi logLevelInfo ctermfg=green
hi logFile ctermfg=yellow
hi logLineNum ctermfg=blue
hi logDate ctermfg=yellow
hi logTime ctermfg=blue
hi logBlock ctermfg=white
hi logParen ctermfg=grey

let b:current_syntax = "log"
参考资料

Creating your own syntax files

Vim自定义语法高亮

:highlight

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25110.html

相关文章

  • Vim插件简单介绍

    摘要:转换时支持模板文件,配合强大的模板文件,可以自己创建,或者是实现语法高亮,还支持数学公式编辑。标签文件允许这些项目能够被一个文本编辑器或其它工具简捷迅速的定位。 原文地址 Vim作为一个强大的编辑器,再配合强大的插件,就可以称得上为编辑神器了。 pathogen pathogen为管理插件的插件,类似的还有vundle。在 Pathogen 之前,安装插件就是把插件文件放在.vim目录...

    dackel 评论0 收藏0
  • Vim与Markdown共舞

    摘要:语法高亮是一个比较好的解决方案。本来也支持的语法高亮,但是做得还不够。通过语法高亮,基本就很容易抓住文章的内容和结构了。结语折腾下来,下编辑笔记完全是没有任何问题的,特别是语法高亮和特性,可以尽可能地减小与生俱来的割裂感。 Vim作为编辑器之神,用于Markdown的编辑和阅读,会擦出什么样的火花呢? 因为受不了某知笔记的编辑体验,前段时间探索了在Vim中编辑和管理Markdown笔记...

    RancherLabs 评论0 收藏0
  • 一个前端开发工程师的Vim跟IDE一样

    摘要:一组就是一个插件,的很多功能都由各式插件实现。与相反到行头到本行的第一个非字符到行尾到本行最后一个不是字符的位置。到逗号前的第一个字符。在当前行查找第三个出现的。工程文件菜单自定义快捷键显示文件菜单自带快捷键显示隐藏隐藏文件在新 这里是我新配置出来的 jaywcjlove/vim-web 一直在打磨中,基本上可以用了。拿出来骗 star 先上图 showImg(https://segm...

    Vultr 评论0 收藏0
  • 折腾Vim 编辑器

    摘要:目的不是比较什么编辑器更好,也不是宣传多么神奇,只是想给需要的人提供一些帮助。编辑的时候不用频繁的敲和了。所以,针对不容的环境,不同的项目,应选择最合适的编辑器,就像不同的项目要用不同的开发语言一样。 Abstract 本文主要介绍如何从0开始,构造适合自己的vim。目的不是比较什么编辑器更好,也不是宣传vim多么神奇,只是想给需要的人提供一些帮助。文章以ubuntu14.04,Vim...

    李世赞 评论0 收藏0
  • 如何优雅的使用 Vim(二):插件介绍

    摘要:如何优雅的使用二插件介绍插件使用管理。文件管理器树形结构的文件管理器,目前使用。不同层次的括号颜色不一样,如下图另见然而这些彩虹括号插件,都免不了与冲突会使语法高亮失效,只好放弃了。 如何优雅的使用 Vim(二):插件介绍 插件使用 vim-plug 管理。很长一段时间,我都在用 Vundle,切换到 vim-plug 并非完全必要。 插件定义开始 call plug#begin(~...

    yeooo 评论0 收藏0

发表评论

0条评论

宠来也

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<