内容查找 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也是可以编程的
  • 怎么玩呢?
  • 下次再说!

oeasy教您玩转vim - 90 - # 语法定义syntax的更多相关文章

  1. oeasy教您玩转vim - 56 - # 字符可视化模式

    ​ 可视化编辑 回忆上节课内容 我们学习了关于模式匹配中使用参数 单个参数 :%s/<h2>\(.*\)</h2>/ - \1/g 多个参数 :%s/<img src=\ ...

  2. oeasy教您玩转vim - 57 - # 行可视化

    ​ 可视化编辑 回忆上节课内容 上次我们了解到可视模式 其实可视化对应三种子模式 字符可视模式 v 行可视模式 大写V 块可视模式ctrl+v 我们先来了解字符可视化模式 快捷键 v 可配合各种mot ...

  3. oeasy教您玩转vim - 53 - # 批量替换

    查找细节 回忆上节课内容 我们温习了关于搜索的相关内容 /正向,?反向 n保持方向,N改变方向 可以设置 是否忽略大写小写 是否从头开始查找 是否高亮显示 还有一些正则表达式的使用方法 行头行尾 ^$ ...

  4. oeasy教您玩转linux010203显示logo

    我们来回顾一下 上一部分我们都讲了什么?

  5. oeasy教您玩转linux010202软件包管理apt

    顾一下 上一部分我们都讲了什么?

  6. oeasy 教您玩转linux010101查看内核uname

    linux([?l?n?ks]) 是什么????? 咱们这次讲点什么呢?这次咱们讲讲这个 linux([?l?n?ks]),什么是 linux([?l?n?ks])呢?这linux([?l?n?ks] ...

  7. oeasy教您玩转linux010201持续输出yes

    我们来回顾一下 上一部分我们都讲了什么?

  8. oeasy教您玩转linux010108到底哪个which

    到底哪个which 回忆上次内容 我们上次讲了查找命令位置whereis 我想找到whereis的位置怎么办?

  9. oeasy教您玩转python - 006 - # hello world

    ​ Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...

  10. oeasy教您玩转linux-010110内容回顾

    我们来回顾一下 我们都讲了什么?

随机推荐

  1. 可视化学习:使用极坐标参数方程和SDF绘制有趣的图案

    前言 本文将介绍如何使用极坐标参数方程和上一篇文章提到的距离场SDF来绘制有趣的图案. 说到曲线和几何图形的绘制,我们知道图形系统默认支持的是通过直角坐标绘制,但是有些曲线呢,不太容易使用直角坐标系来 ...

  2. 实用!!!!springBoot加入微信扫码支付功能,有一说一还是挺有意思的

    基于springboot微服务加入微信支付的功能 在线微信支付开发文档: https://pay.weixin.qq.com/wiki/doc/api/index.html native扫码支付方式: ...

  3. JSON转化工具的使用

    概述 JSON是一种轻量化的数据传输格式,在各种场景都有运用.比如在ajax中,服务端的数据一般通过JSON字符串的格式传输给前端,前端ajax引擎自动将JSON字符串转化为JS对象(需要将ajax的 ...

  4. 轻松绕过 Graphql 接口爬取有米有数的商品数据

    轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...

  5. Django——启动项目时报错mysqlclient

    报错内容如下: Watching for file changes with StatReloader Exception in thread django-main-thread: Tracebac ...

  6. 大数据平台搭建手册——hadoop

    从0开始 超详细搭建hadoop平台手册 创建三台使用centos7操作系统的虚拟机 基础环境配置 ps:不建议使用DHCP,因为ip地址会变动 配置ip 1.master [root@master ...

  7. pandas rank()函数简介

    本文简单的说一下自己对pandas的rank()函数的简单讲解. 函数原型:rank(axis=0, method: str = 'average', numeric_only: Union[bool ...

  8. JavaSE 数据类型以及基本转化与包装

    目录 数据类型. 1.基本类型(八个) 数值型 整型类型 byte型:1字节 8bit位 第一位是符号位 null short型:2字节 int 型:4字节 long型:8字节 浮点类型 float ...

  9. LocalDateTime与LocalDate之间转换

    LocalDateTime与LocalDate之间转换 //LocalDateTime转换LocalDate LocalDateTime now2 = LocalDateTime.now(); Loc ...

  10. 基于 WEB 的 WMS 3D 可视化管理系统

    基于 WEB 的 WMS 3D 可视化管理系统 前言 首先介绍一下什么是WMS.WMS是仓库管理系统(Warehouse Management System) 的缩写,仓库管理系统是通过入库业务.出库 ...