乐趣区

关于vim:oeasy教您玩转vim-90-语法定义syntax

内容查找 grep

回顾

  • 咱们这次钻研了一下配色计划
  • murphy 尽管配色难看
  • 然而对于 java 的反对并不好
  • 咱们对于 murphy 进行了批改
  • 减少了 StringStorageClass 色彩的定义
  • 整体思路是在 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 也是能够编程的
  • 怎么玩呢?🤔
  • 下次再说!
退出移动版