共计 4148 个字符,预计需要花费 11 分钟才能阅读完成。
内容查找 grep
回顾
- 咱们这次钻研了一下配色计划
- murphy 尽管配色难看
- 然而对于 java 的反对并不好
- 咱们对于 murphy 进行了批改
- 减少了
String
、StorageClass
色彩的定义 - 整体思路是在 syntax 中定义组
- 而后在配色计划中对于组进行色彩设置
- 可是 syntax 中如何定义组的呢?🤔
语法文件
vi /usr/share/vim/vim81/syntax/java.vim
先把配色计划设置为 murphy
- :colorscheme murphy
咱们能够看见这个 java 语法文件的:
- 作者
- github 地址
- 批改工夫
- 而后就是大量的 syn 定义
- 什么是
syn
呢?
syntax 语法
h syn
syntax
就是语法:syntax list
能够列出- syntax item 语法项
- syntax group 语法组
- syntax cluster 集群
- 咱们来试试
syntax list 语法列表
:syntax list
- 语法我的项目都是用 help 打头的
- 为什么呢?
- 先 q 跳出去
:set filetype?
- 能够晓得目前的文件是 help 文件
- 所以语法我的项目都是用 help 结尾的
:q
跳出 help 文件回到java.vim
java.vim
在关上 java.vim 的状况下运行
:syntax list
- 因为以后关上的是.vim 文件
- 所以失去的语法项都是和 vim 无关
- 如果咱们关上一个 java 文件呢?
oeasy.java
:e oeasy.java
:syntax list
- 为什么关上不同的文件就会有不同的语法项列表呢?
语法文件
- 语法列表是由语法文件来决定的
语法文件位于语法文件夹中
/usr/share/vim/vim81/syntax/
help 的语法文件
/usr/share/vim/vim81/syntax/help.vim
vim 的语法文件
/usr/share/vim/vim81/syntax/vim.vim
java 的语法文件
/usr/share/vim/vim81/syntax/java
- 咱们持续来看 java 的语法文件
关键字 keyword
/\<public\>
syntax keyword javaScopeDecl public protected private abstract
- syntax 语法
- keyword 关键字
javaScopeDecl
- java 的
- Scope 可见性
- Declaration 形容
- public protected private abstract 具体的关键字
vi oeasy.java
:colorscheme murphy
:hi javaScopeDecl ctermfg=brown
- 这样设置了 public protected private abstract 这些关键字的色彩了
- 试验胜利
- 咱们能够自定义的一个属于本人的关键字么?
自定义关键字
:h syntax
- 这里是定义 syntax 语法项的中央
- 第一种语法项就是 keyword
- 咱们去定义一个本人的关键字
sudo vi /usr/share/vim/vim81/syntax/java.vim
本人的关键字 keyword
syn keyword oeasy System
- 把 System 定义为 oeasy 这个类型的关键字
- 而后保留退出
- 从新关上
oeasy.java
:syntax list
- 能够发现在 oeasy.java 文件关上后
- 曾经有了一个叫做 oeasy 的关键字类别
- 外面蕴含着 System 这个词
- 那如何给 oeasy 这个类别上色呢?
给 oeasy 列别上色
色彩模式设置为 murphy
:hi oeasy ctermfg=yellow
- 试验胜利
- 然而 public 对应的这个 javaScope
- 又是如何与 StorageClass 挂上关系的呢?
层层关联
- 回到 syntax 中的
java.vim
/\<javaScopeDecl\>
9 个匹配
- 这里有个
hi def link
- 就是对于高亮 hilight 组的链接
- 把 javaScopeDecl、javaClassDecl、javaMethodDecl 链接到了 javaStorageClass 上
- 这样,
:hi javaStorageClass cterm=white
就能够用到三组下面 - 然而上图最上的一句话又是什么意思呢?
hi def link javaStorageClass StorageClass
组名通用化
:e /usr/share/vim/vim81/syntax/c.vim
咱们能够看到不同语言有不同的语言的 StorageClass
- java 的叫做 javaStorageClass
- c 的叫做 cStorageClass
- rust 叫做 rustStorageClass
- 不论他们原来的名字如何,都映射到 StorageClass
- 这样 murphy、morning、blue 等色彩计划只有设置 StorageClass 的高亮
- 就能够映射到不同语言的不同组外面了
- 像 StorageClass 这样的通用组名还有很多
- 如果咱们做一门叫做 oeasy 的语言
- 就须要把关键字定义到 oeasyStorageClass 中
- 而后把 oeasyStorageClass 映射到 StorageClass 上
- 只有色彩计划中有对于 StorageClass 的定义
- 咱们相干关键字就能够显示进去
- 除了 keyword 之外,还有什么样的高亮 item 的定义呢?
match 匹配模式
- match 顾名思义就是匹配模式
比方
syntax match javaComment /#.*/
javaComment
是高亮项名称/#.*/
/
是模式匹配的开始和完结#
代表#
- 如果是 #结尾的行,^#
- 如果是 #结尾的单词,\<#
.
任意字符*
代表任意字符.
的数量是 0 到任意多个
/match
- javaBraces 对应的是左右大括号
“[{}]”
- “” 外面是 pattern
- []外面是或的关系
- {}是左或右大括号
- 匹配 import 或者 import static
- 这里怎么引号里面还有货色呢?
偏移量 offset
"\.\s*\<class\>"
\.
结尾有任意字符\s*
而后有 0 到任意多个空格或 tab- 而后是独立单词 class
- ms 的意思是 Match Start 匹配头
- ms=s+ 1 是什么意思
- s 是 start
- ms=s+1
- 就是把
\s*
后面的\.
去掉开始定义匹配的开始 - 咱们再看一个
javaCommentStar
match 的思路是匹配一个模式
- ^\s* 行结尾有空格或者 tab
- 而后前面有一个不是 / 的字符
- 这个时候要把结尾的地位 me
- 设置为 e -1
- 也就是不蕴含这个非 / 的字符
- :hi javaCommentStar ctermbg=red
- 红色的就是对应的 javaCommentStart 的区域
- 匹配了就进入组
- 除了 match 间接匹配之外
- 还有什么定义高亮组的办法么?
region 区域
最重要的有三个属性
- start 结尾
- end 结尾
- skip 跳过的
start=+”+
- + 是分隔符号相当于 /
- pattern 是 ”
- 以 ” 为结尾
end=+”+”
- 同上
- 以 ” 为结尾
skip=+\”+
- 宰割符还是 +
- 两头如果有 \” 就跳过
- 不作为结尾
echo "i say \"oeasy\"" #echo sth
- 匹配
"i say \"oeasy\""
region 带偏移量
高亮开始
- hs highlight start 高亮开始地位
- e 是 end 指的是 start 开始模式
/\*
的完结地位 - e+ 1 指的是
/*
前面一个字符的地位 - hs=e+1 高亮开始于开始模式开端后一个字符
高亮完结
- he highlight end 高亮完结地位
- s 是 start 指的是 end 完结模式
\*/
的开始地位 - s-1 指的是
*/
后面一个字符的地位 - he=s-1 高亮完结于完结模式结尾前一个字符
- 匹配模式 match 的是
mmm...mmm
的地位 - 匹配高亮的 region 是
rrr
对应的地位 - 除了 region 之外,还有什么高亮组的定义方法么?
嵌入的高亮组
xComment
- x 语言的正文
- % 开始的都是正文
- 正文外面能够蕴含 TODO
xTODO
- x 语言的 TODO
- TODO 高亮组只能存在于正文外面
- 不在正文外面的不是 TODO 高亮组
递归嵌入
xBlock
- x 语言的 Block 块
- 大括号包起来的都是 Block
- Block 能够本身递归嵌套
对立截行 keepend
xComment
- x 语言的正文,从 % 到结尾 $
xPreProc
- x 语言的预处理,从 #到结尾 $
- 能够蕴含 xComment
- 蓝色局部把第二行也认为是预处理
- 因为第一行的结尾回车给了 xComment
- xPreProc 就把第二行的结尾回车当作本人的了
- 为了防止这个状况
- keepend
排除元素 ALLBUT
- contains 外面能够放具体的高亮组
- 也能够放所有货色
- 如果要排除某些货色怎么办呢?
下一组 nextgroup
- 这三个货色必须挨着
- 在一起
- 各自能力成立
匹配组 matchgroup
第一种模式定义了一个组
- 包含括号和括号外面的内容
第二种模式生成了两个组
- xInside
- xParen
- 能够别离上色
通明 transparent
- 如果你想要 while 和 for 循环的条件有不同色彩
- 能够这样试试
- for、while 各有一套
- cCondNest 自身是通明的
- 跟着上一层高亮组走
行内 oneline
- oneline 就是一行
- 保障这个匹配的模式必须在一行以内
- 有一行那有没有多行呢?
多行
- 多行外面蕴含了 xLineContinue
- xLineContinue 蕴含了
\\$
- 换行符被蕴含在了高亮组里
- 于是高亮组能够换行了
集群 cluster
- contains 外面的货色是反复的
- 能够定一个集群 cluster
- 而后 contains 外面就用集群
- 集群实质上是高亮组的列表
- 这个列表能够增加和删除
更多语法
- 比方你关上一个 cpp 文件
- 文件缓冲被解析为 cpp 的高亮组
- 然而我同时想用 c 的高亮组
- 怎么办?
什么是 runtime 呢?
- 运行时环境
syntax/c.vim
- 在运行时环境外面找 syntax/c.vim
- 运行时环境是什么?
:echo $VIMRUNTIME
/usr/share/vim/vim81
这是所有的起源
- 语法文件的起源
- 高亮色彩模式的起源
- 缩进的起源
- 如果呈现了问题
- 能够去看看这里是不是正确
总结
- 这次咱们彻底钻研了 vim 高亮的原理
各种语法项 syntax item
- 关键字 keyword
- 匹配模式 match
- 区域 region
定义好了之后还能够设置链接成组
hi def link javaComment Comment
而后就能够在色彩文件中具体配色了
- 比方 murphy 中对于 Comment 的定义
hi Comment ctermfg=yellow
- 不同的语言能够有不同的语法定义
- 其实,vim 也是门语言
- vimscript 也是能够编程的
- 怎么玩呢?🤔
- 下次再说!
正文完