github atom创建自己的语法高亮
使用atom一段时间了,有些插件还不是很成熟。比如项目中使用protobuf,早就有人写了语法高亮(https://github.com/podgib/atom-protobuf),但是效果不是很好。于是决定自己写一个。
atom linux的配置目录在~/.atom下,里面有一个packages目录,所有安装的插件(或者叫做包)都在这里。所有在这里的包在启动时都会自动加载。因此,我们直接在这里创建一个包。
cd .atom/packages
mkdir language-protobuf
cd language-protobuf
atom的packages都是有特定的目录结构和文件的。首先,要有一个package.json来描述你的包,在language-protobuf目录下创建它。
{
"name": "language-proto",
"version": "0.2.0",
"description": "Syntax highlighting for google protobuf",
"repository": "https://github.com/changnet/language-protobuf",
"license": "MIT",
"engines": {
"atom": "*",
"node": "*"
}
}
其中,name(包名)、version(版本)、description(描述)这些都是要的。如果你准备发布这个包repository(源)这些也是要的。可以到github上参考别人的怎么写。
现在已经创建了一个空包。要实现语法高亮,就要有一些语法规则来指定如何高亮。下面开始创建语法规则。
mkdir grammars
cd grammars
然后在grammars目录下创建语法规则文件protobuf.cson(atom的配置文件用cson来保存的)
'scopeName': 'source.protobuf'
'name': 'protobuf'
'fileTypes': ['proto']
'patterns': [
{
'match': '\\b[0-9]+\\b'
'name': 'constant.numeric.protobuf'
}
]
上面是一个简单的语法规则文件。
scopeName是指定本文件的范围,相当于C++中的namespace。比如你写了一个C的语法高亮(source.c),然后要写一个C++的语法高亮,那么可以直接在C++的语法文件中'include': 'source.c'即可把C的语法规则给包含进来。
name是语法的名字,C就是C,java就是java。atom通常会把它显示在状态栏右下角。
fileTypes是文件后缀。atom打开时会根据文件后缀来判断采用哪一种语法高亮。多个文件后缀按行分开即可。如
'fileTypes': [
'h'
'hpp'
'cpp'
]
patterns是规则匹配的集合,它是一个数组,每个元素是一个对象{}。
在上面的例子中,对象的内容如下:
match是正则表达式(在cson中转义字符要多加一个\,如\b变成\\b),指明如何要匹配到高亮的目标。如\\b[0-9]+\\b用来匹配常数。比如"required int32 id = 1;"中的1
name是高亮的名字,constant.numeric.protobuf表示用constant(常量)下的numeric(数字)规则(什么字体、颜色)来高亮匹配的字符。
一个简单的包就解释完了。但是constant.numeric.protobuf是如何指定高亮规则的。这得从atom的主题说起。atom的主题分为ui和语法。ui是界面(像标签、状态栏...)相关的,与语法无关。语法主题则是控制代码高亮的,在设置中指定。我使用的是Monokai主题,分析这个主题可以发现它里面有一个index.less文件(https://github.com/burntime/atom-monokai/blob/master/index.less)。里面指定了大部分结构的高亮规则。比如:
.comment {
color: #75715E;
}
.string {
color: #E6DB74;
}
.constant.numeric {
color: #AE81FF;
}
这分别指定了comment(注释)、string(字符串)、constant.number(常量分类下的数字)的颜色。而在constant.numeric.protobuf这个命名中,从上而下找。先找到constant,再到numberic,发现protobuf没找到,于是就使用constant.numeric的颜色。所以,如果你要先了解主题中有哪些颜色分类可以用。
来龙去脉了解了,下面我们来添加更多的规则。
{
'match': '\\b(message|enum|service)\\b'
'name': 'storage.type.custom.protobuf'
}
{
'match': '\\b(rpc|returns)\\b'
'name': 'keyword.protobuf'
}
{
'match': '\\b[0-9]+\\b'
'name': 'constant.numeric.protobuf'
}
{
'match': '\\b(required|optional|repeated)\\b'
'name': 'storage.modifier.protobuf'
}
{
'captures':
'1':
'name': 'storage.modifier.protobuf'
'2':
'name': 'entity.name.instance.protobuf'
'match': '\\b(required|optional|repeated)(\\s+\\w+)\\b'
'name': 'entity.name.instance.protobuf'
}
仔细看上面最后一条规则,与其他不一样。
captures表示要匹配的多个规则。第一个是storage.modifier.protobuf,另一个是entity.name.instance.protobuf。但是只有一个正则表达式啊,如何匹配多个呢?仔细看正则表达式,你会发现有两个括号。(required|optional|repeated)匹配第一个,(\\s+\\w+)匹配第二个。这样,"required Info info = 1;"中的required按第一个规则高亮,Info按第二个规则高亮。而它本身的名字entity.name.instance.protobuf则不指定语法高亮了,随意写都可以。(PS:这个规则是我推导测试出来的,未找到官方文档的说明)
接着继承添加其他规则:
{
'begin': '"'
'beginCaptures':
'0':
'name': 'punctuation.definition.string.begin.protobuf'
'end': '"'
'endCaptures':
'0':
'name': 'punctuation.definition.string.end.protobuf'
'name': 'string.quoted.double.protobuf'
'patterns': [
{
'include': 'punctuation.definition.string.begin.protobuf'
}
{
'include': 'punctuation.definition.string.end.protobuf'
}
{
'match': '\\\\.'
'name': 'constant.character.escape.protobuf'
}
]
}
这是一个很复杂的规则,连我看得也不是很明白。这是一个匹配字符串的规则。begin表示字符串以"开始,beginCaptures表示开始字符串要匹配多个规则(万一这个开始字符串很复杂),其中的name也表示高亮规则。end表示字符串以"结束,endCaptures对应。string.quoted...表示以字符串规则进行高亮,注意,如果这个整个规则中某个部分(比如开始部分的名字)未找到对应高亮规则,则使用这个规则。patterns表示字符串中包含多个匹配规则,还要在字符串内部进一行匹配。比如'\\\\.'表示正则匹配一个\和一个\r\n以外的字符(即正则中的点号),即匹配字符串中\t之类的。include表示字符串内部包含其他现成高亮规则,遗憾的是我并没有测试成功。只有写完整的match才OK。
一此为止,所有的匹配规则都已介绍完了。如果还有你想高亮而不能高亮的地方,哪就在正则表达式上多下点功夫。另一个好办法是去看一下其他现在的语言的高亮是怎么做的。
写完了,当然还要调试。下面说几个调试要点:
语法文件是在打开atom的时候加载的,你改了后,要看看效果。一种办法是重启atom;另一种办法是ctrl+shift+p,输入widown:Reload重新加载,对应快捷键是ctrl+alt+r
把鼠标放在高亮的字符尾,然后ctrl+shift+p,输入Editor:log curso scope,atom会在右上角显示当前的高亮信息。

atom本身是基于webkit内核的一个web编辑器。在View-->devloper-->toggle developer tools即可打开web调试界面。对应做web的来说,这个应该很容易。

调试完了,该说一下发布。atom是github开发的,它的包要在github上(也可能不需要,但我发布时确实要用到github的密码)。因此当前开始的包要在github上创建一个源,测试好,把最新的代码提交。然后从cmd进入到包的根目录,利用atom自带的apm进行发布。
apm publish minor
第一次的时候,要注册atom开发帐号(可以直接用github帐号关联),然后拿到帐号中的开发key进行绑定

然后重新发布:

如果没有什么问题,发布成功后就可以在atom的设置界面搜索并进行安装。
proto的语法高亮最终效果如下:

在atom中搜索language-proto可以搜索到这个包。
参考:
http://blog.gaku.net/create-a-custom-syntax-highlighting-with-atom-editor/
http://stackoverflow.com/questions/23963733/syntax-highlighting-guide-for-atom
http://sublime-text-unofficial-documentation.readthedocs.org/en/latest/reference/syntaxdefs.html
github atom创建自己的语法高亮的更多相关文章
- github atom 试用
github的编辑器atom 1.0已经出来了,在https://atom.io/ 我之前在win上一直用notepad++写了两年脚本.最近改写lua了,项目组统一用的sublime text.su ...
- 一个C#语法高亮插件
语法高亮对程序员阅读代码来说有着不小的帮助,虽然VisualStudio本身支持C#语法高亮,但也只是对关键字.类名.字符串等少数元素加了标记,而我们代码中主题:变量.函数.属性.事件等都没有进行高亮 ...
- Sublog: 支持Markdown和语法高亮的跨平台博客客户端
灵感来自米米饭 功能一览 为什么你应该试试用Sublog写博客 项目主页: sublog 使用方法: 本项目是一个插件,首先要安装Sublime Text 2 重命名sublog.sublime-se ...
- 我是如何给discuz模板做语法高亮的
本人一直做ASP.NET开发,近期接到任务要用Discuz开发一个社区,第一次接触PHP,PHP灵活的语法,天生的模块化,各种语法糖深深的震惊了我,我从内心深处感受到了PHP是最牛逼的语言!!! 好了 ...
- sublime的Vue语法高亮插件安装
1.准备语法高亮插件vue-syntax-highlight. 下载地址: https://github.com/vuejs/vue-syntax-highlight 下载页面并下载: 解开压缩包vu ...
- ace -- 语法高亮
Creating a Syntax Highlighter for Ace 给ace创建一个语法高亮 Creating a new syntax highlighter for Ace is extr ...
- Vim技能修炼教程(3) - 语法高亮进阶
语法高亮进阶 首先我们复习一下上节学到的三个命令: * syntax match用于定义正则表达式和规则的对应 * highlight default定义配色方案 * highlight link将正 ...
- 我是如何给discuz模板做语法高亮的/vs code/textmate
本人一直做ASP.NET开发,近期接到任务要用Discuz开发一个社区,第一次接触PHP,PHP灵活的语法,天生的模块化,各种语法糖深深的震惊了我,我从内心深处感受到了PHP是最牛逼的语言!!! 好了 ...
- Linux系统里让vim支持markdown格式的语法高亮
Markdown是深受程序员喜爱的一个文件格式. 然而Linux里默认的vim设置,并不支持markdown格式的语法高亮显示. 下面就来介绍如何设置使得markdown格式的文件在vim里也能享有语 ...
随机推荐
- ListIterator add remove 使用注意
add方法示例 //在最前面添加 List<String> list1 = new LinkedList<String>(Arrays.asList(new String[] ...
- 关于 submit 按钮的 onclick 验证事件,第一次验证失败,第二次 submit 按钮失效的原因解析
今天在做一个生成订单的简单验证页面 主要功能:实现点击提交按钮后,先在页面上用JavaScript验证信息是否输入完全,不完全不允许提交,待输入完全后,才可以提交 页面:如下页面,可以看到,当文本框有 ...
- 服务器端调用Word组件读取Word权限、未将对象引用到对象实例终极解决方案
最近因为业务需要,需要在服务器上调用Word组件,结果遇到各种问题,比如检索 COM 类工厂中 CLSID 为 {000209FF-0000-0000-C000-000000000046} 的组件失败 ...
- Android开发手记(11) 滑动条SeekBar
安卓滑动条的操作特别简单,通过getProgress()可以获得SeekBar的位置,通过setProgress(int progress)可以设置SeekBar的位置.要想动态获取用户对SeekBa ...
- 非UI线程和UI线程通信
public void onClick(View v) { new Thread(new Runnable() { public void run() { final Bitmap bitmap = ...
- 武汉科技大学ACM :1002: 零起点学算法66——反话连篇
Problem Description 把输入的字符按照反着顺序输出 Input 多组测试数据 每组一行(每组数据不超过200个字符) Output 按照输入的顺序反着输出各个字符 Sample I ...
- Android 用ListView实现GridView分列显示
我想实现百度影音首页的这种效果: 在网上用ScrollView+GridView可以实现,但是touch scrollview的时候会莫名刷新gridview,这样用户体验很不好,而且感觉百度不是这样 ...
- Javascript的location对象
JavaScript window.location对象 示例 注意 方法 经常使用window.location,它的结构总是记不住,简单梳理下,方便以后查询. 示例 URL:http://b.a. ...
- VS Code 项目编译
编译运行vs code源码 如果我们想本地运行 vs code 需要安装一些必要的库. 我们需要安装 'Node.JS' . 这里需要注意的是,最低版本要求是'5.1.0'. 还需要安装 'Pytho ...
- 在windows下搭建linux-c学习环境
下载virtualbox并安装: https://www.virtualbox.org/wiki/Downloads 现在vagrant并安装: https://www.vagrantup.com/d ...