1k行代码的编辑器-kilo源码分析
来源:互联网 发布:淘宝购物车有什么用 编辑:程序博客网 时间:2024/05/20 19:33
kilo简介:A text editor in less than 1000 LOC with syntax highlight and search.
kilo由redis的作者antirez 编写的,代码只有短短的1k行,但是基本功能都有,也有代码高亮。很短但很强大。
其实kilo代码逻辑很简单。顺着main函数看下去就行,数据结构也不复杂。花个小半天捋一捋,差不多能弄懂脉络。
先来看数据结构
语法结构体
struct editorSyntax {
char **filematch;
char **keywords;
char singleline_comment_start[2];
char multiline_comment_start[3];
char multiline_comment_end[3];
int flags;
};
//editor row 一行的数据 主要是idx , chars ,reders hl这个几个变量
typedef struct erow {
int idx; /* 当前行的索引 */
int size; /* 一行的大小*/
int rsize; /* 渲染的一行大小,这个值>= size*/
char *chars; /* 一行数据的原始内容*/
char *render; /* 一行渲染的内容 添加了一些终端控制符*/
unsigned char *hl; /* 高亮类型 如:\003\003,每一个字符都是高亮类型*/
int hl_oc; /* 多行注释标示 */
} erow;
//editConfig是核心配置一切都是围绕这它来进行的。程序中会定义一个静态全局变量,editConfig E。
struct editorConfig {
int cx,cy; /* 光标的x,y位置*/
int rowoff; /* 行偏移量*/
int coloff; /* 列偏移量*/
int screenrows; /* 屏幕能显示多少行*/
int screencols; /* 屏幕能显示多少列*/
int numrows; /* 实际多少行*/
int rawmode; /* raw 模式*/
erow *row; /* Rows 真正的内容 row指针,row行指针 row[0] row[1] 以numrows数量,因为内存中连续存储的,所以就可以for numrows来遍历所有的row*/
int dirty; /* 文件内容是否被修改*/
char *filename; /* 文件名字*/
char statusmsg[80]; //状态
time_t statusmsg_time; //状态条时间
struct editorSyntax *syntax; /* 语法高亮 */
};
下面是main函数
initEditor();
editorSelectSyntaxHighlight(argv[1]);
editorOpen(argv[1]);
enableRawMode(STDIN_FILENO);
editorSetStatusMessage(
"HELP: Ctrl-S = save | Ctrl-Q = quit | Ctrl-F = find");
while(1) {
editorRefreshScreen();
editorProcessKeypress(STDIN_FILENO);
}
static struct editorConfig E;
initEditor 就是初始化全局变量E
editorSelectSyntaxHighlight(argv[1]); 根据文件的后缀类型,判断用什么的高亮方法
editorOpen(argv[1]);
E中的erow指针后面是一段连续的erow类型结构内存,数量是numrows个,erow是头指针。
读取文件内容,放到E.erow连续内存中
读取一行,原始数据放置到erow中的chars中,渲染后的数据放到erow的render中
enableRawMode(STDIN_FILENO);
启用终端的raw模式
editorSetStatusMessage(
"HELP: Ctrl-S = save | Ctrl-Q = quit | Ctrl-F = find");
设置底部的状态信息栏,占两行
真正的主逻辑是下面的几行
while(1) {
editorRefreshScreen();
editorProcessKeypress(STDIN_FILENO);
}
简单说就是editorRefreshScreen();
将ebow数组中的数据 存放到abuf的b变量中
struct abuf {
char *b;
int len;
};
然后write到终端输出
editorProcessKeypress(STDIN_FILENO);
读取键盘的input输入,进行相应的处理
插入新行,保存,查找,删除一行,添加字符,换行等
都是操作erow中的原始数据chars,对应的进行erow中的render更新。
然后由editorRefreshScreen函数更新到屏幕上。
大概的说明是这些。当然远远不止这些。具体可以我写的源码的注释
kilo注释源码下载
------------------------------------------------------------------------
也可以查看我的github,fork的kilo分支
https://github.com/prownd/kilo
- 1k行代码的编辑器-kilo源码分析
- 【源码分析】HashMap的put(K k,V v)方法
- 未名人的flash rpg地图编辑器代码分析(1)
- OpenStack Kilo新特性解读和分析(1)
- doom3关卡编辑器代码的一些分析
- OpenStack Kilo版本新功能分析
- 纯js脚本1k大小的3D玫瑰_个人整理的代码(源码)
- 文本编辑器代码分析(续1)
- 文本编辑器代码分析
- K-近邻算法的Python实现 : 源码分析
- Mahout源码K均值聚类算法分析(1)
- TSE源码中MD5代码分析(1)
- nsq源码分析(1):代码结构
- 未名人的flash rpg地图编辑器代码分析(2)
- butterknife源码分析:代码分析
- Centos7 安装kilo-1 总览
- Mahout之k-means算法源码分析
- Mahout clustering Canopy+K-means 源码分析
- matlab转置与共轭转置
- 【杭电-oj】-1715-大菲波数
- caffe源码阅读4-layer.hpp
- 第一次机房收费系统-回顾总结(二)
- hdoj 1796 How many integers can you find<容斥原理>
- 1k行代码的编辑器-kilo源码分析
- Think in java...
- linux主从复制搭建
- Java 8 中的 Streams API 详解
- 消息队列设计精要
- NYOJ 括号配对问题
- Ubuntu配置JDK环境变量
- 大数据时代的技术hive:hive介绍
- XXapp产品过程思考: