|
texc
|
主程序入口 更多...
#include <stdio.h>#include <ctype.h>#include <errno.h>#include <fcntl.h>#include <stdarg.h>#include <unistd.h>#include <string.h>#include <sys/ioctl.h>#include <sys/types.h>#include <termios.h>#include <time.h>#include <stdlib.h>类 | |
| struct | esyn |
| 对特定文件类型的语法突出显示信息 更多... | |
| struct | erow |
| 编辑器行 更多... | |
| struct | editor_config |
| 编辑器配置结构体,保存了编辑器的信息。 更多... | |
| struct | abuf |
| 追加缓冲区结构体 更多... | |
宏定义 | |
| #define | _DEFAULT_SOURCE |
| #define | _BSD_SOURCE |
| #define | _GNU_SOURCE |
| #define | TEXC_VERSION "0.0.1" |
| #define | CTRL_KEY(k) ((k) & 0x1f) |
| #define | TAB_STOP 8 |
| #define | QUIT_TIMES 2 |
| #define | HL_SYN_NUMBERS (1 << 0) |
| #define | HL_SYN_STRINGS (1 << 1) |
| #define | HLDB_ENTRIES (sizeof(HLDB) / sizeof(HLDB[0])) |
| #define | ABUF_INIT {NULL, 0} |
类型定义 | |
| typedef struct esyn | esyn_t |
| 对特定文件类型的语法突出显示信息 | |
| typedef struct erow | erow_t |
| 编辑器行 | |
| typedef struct editor_config | editor_config_t |
| 编辑器配置结构体,保存了编辑器的信息。 | |
| typedef struct abuf | abuf_t |
| 追加缓冲区结构体 | |
枚举 | |
| enum | editor_key { BACK_SPACE = 127 , ARROW_LEFT = 1000 , ARROW_RIGHT , ARROW_UP , ARROW_DOWN , DEL_KEY , HOME_KEY , END_KEY , PAGE_UP , PAGE_DOWN } |
| 编辑器控制键入配置 更多... | |
| enum | editor_highlight { HL_NORMAL = 0 , HL_STRING , HL_NUMBER , HL_COMMENT , HL_MLCOMMENT , HL_KEYWORD1 , HL_KEYWORD2 , HL_MATCH } |
函数 | |
| void | abuf_append (abuf_t *ab, const char *s, int len) |
| 缓冲区追加字符串 | |
| void | abuf_free (abuf_t *ab) |
| 释放追加缓冲区 | |
| void | editor_set_status_msg (const char *fmt,...) |
| 编辑器设置状态栏消息 | |
| void | editor_refresh_screen () |
| 编辑器清除屏幕 | |
| char * | editor_prompt (char *prompt, void(*callback)(char *, int)) |
| 编辑器显示提示,提供文本输入 | |
| void | fatal (const char *s) |
| 错误处理:打印错误信息 | |
| void | disable_raw_mode () |
关闭原始文本模式:参考enable_raw_mode | |
| void | enable_raw_mode () |
| 开启原始文本模式 | |
| int | editor_read_key () |
| 编辑器读取键入 | |
| int | get_cursor_position (int *rows, int *cols) |
| 获取光标位置 | |
| int | get_window_size (int *rows, int *cols) |
| 获取窗口大小 | |
| int | is_separator (int c) |
| 是否为分隔符 | |
| void | editor_update_syntax (erow_t *row) |
| 编辑器更新语法高亮 | |
| int | editor_syn2col (int hl) |
| 编辑器语法转颜色 | |
| void | editor_select_syntax_highlight () |
| 编辑器匹配文件名的语法高亮 | |
| int | editor_row_cx2rx (erow_t *row, int cx) |
| 将字符索引转换为渲染索引 | |
| int | editor_row_rx2cx (erow_t *row, int rx) |
| 将渲染索引转换为字符索引 | |
| void | editor_update_row (erow_t *row) |
| 编辑器(更新)渲染行 | |
| void | editor_insert_row (int at, char *s, size_t len) |
| 编辑器加入行 | |
| void | editor_free_row (erow_t *row) |
| 编辑器释放行 | |
| void | editor_del_row (int at) |
| 编辑器删除行 | |
| void | editor_row_insert_char (erow_t *row, int at, int c) |
在给定位置插入单个字符到erow | |
| void | editor_row_append_str (erow_t *row, char *s, size_t len) |
| 编辑器行加入字符串 | |
| void | editor_row_del_char (erow_t *row, int at) |
| void | editor_insert_char (int c) |
| 编辑器插入字符 | |
| void | editor_insert_newline () |
| 编辑器插入新行 | |
| void | editor_del_char () |
| 编辑器删除字符 | |
| char * | editor_rows2str (int *str_len) |
| 编辑器行转化为字符串 | |
| void | editor_open (char *filename) |
| 编辑器打开文件 | |
| void | editor_save () |
| 编辑器保存 | |
| void | editor_find_callback (char *query, int key) |
| 编辑器查找回调函数 | |
| void | editor_find () |
| 编辑器寻找字符串 | |
| void | editor_scroll () |
| 编辑器滚动 | |
| void | editor_draw_rows (abuf_t *ab) |
| 编辑器绘制行 | |
| void | editor_draw_status_bar (abuf_t *ab) |
| 编辑器绘制状态栏 | |
| void | editor_draw_status_msg (abuf_t *ab) |
| 编辑器绘制状态栏消息 | |
| void | editor_move_cursor (int key) |
| 编辑器移动光标位置 | |
| void | editor_proc_key () |
| 编辑器处理键入 | |
| void | editor_init () |
| 编辑器初始化 | |
| int | main (int argc, char *argv[]) |
变量 | |
| char * | C_HL_EXT [] = {".c", ".h", ".cpp", NULL} |
| char * | C_HL_KEY [] |
| esyn_t | HLDB [] |
| editor_config_t | ec |
| #define ABUF_INIT {NULL, 0} |
追加缓冲区初始化
| #define CTRL_KEY | ( | k | ) | ((k) & 0x1f) |
切换宏CRTL+k:按位对二进制值00011111进行AND。
| #define QUIT_TIMES 2 |
如果设置了ec.dirty,将在状态栏中显示警告:要求用户再按Ctrl-Q两次才能退出而不保存
| #define TAB_STOP 8 |
制表位的长度常量
| #define TEXC_VERSION "0.0.1" |
texc版本
| enum editor_key |
编辑器控制键入配置
editor_key枚举中选择 与wasd不冲突的箭头键表示形式即可。 我们将为它们提供一个超出字符范围的大整数值, 以便它们不会与任何普通按键冲突。 | void abuf_append | ( | abuf_t * | ab, |
| const char * | s, | ||
| int | len ) |
缓冲区追加字符串
| ab | 追加缓冲区 |
| s | 字符串 |
| len | 字符串长度 |
| void abuf_free | ( | abuf_t * | ab | ) |
释放追加缓冲区
| ab | 追加缓冲区 |
| void editor_del_row | ( | int | at | ) |
编辑器删除行
| at | 行号 |
| void editor_draw_rows | ( | abuf_t * | ab | ) |
编辑器绘制行
| ab | 追加缓冲区 |
vim左侧的波浪。| void editor_draw_status_bar | ( | abuf_t * | ab | ) |
编辑器绘制状态栏
| ab | 追加缓冲区 |
| void editor_draw_status_msg | ( | abuf_t * | ab | ) |
编辑器绘制状态栏消息
| ab | 追加缓冲区 |
| void editor_find_callback | ( | char * | query, |
| int | key ) |
编辑器查找回调函数
| query | 查询字符串 |
| key | 键入 |
| void editor_free_row | ( | erow_t * | row | ) |
编辑器释放行
| row | 编辑器行 |
| void editor_insert_char | ( | int | c | ) |
编辑器插入字符
| c | 字符 |
| void editor_insert_row | ( | int | at, |
| char * | s, | ||
| size_t | len ) |
编辑器加入行
| at | 行号 |
| s | 行字符串 |
| len | 行长度 |
| void editor_move_cursor | ( | int | key | ) |
编辑器移动光标位置
| key | 键入字符 |
| void editor_open | ( | char * | filename | ) |
编辑器打开文件
| filename | 文件名 |
| void editor_proc_key | ( | ) |
编辑器处理键入
TODO: 处理特殊字符
| char * editor_prompt | ( | char * | prompt, |
| void(*)(char *, int) | callback ) |
编辑器显示提示,提供文本输入
| prompt | 提示信息 |
| callback | 回调函数 |
| int editor_read_key | ( | ) |
编辑器读取键入
seq缓冲区。 如果其中任何一个读数超时(0.1 秒后), 则假设用户只是按下了 Escape 键并返回该键。 否则,会查看转义序列是否为箭头键转义序列。 | void editor_row_append_str | ( | erow_t * | row, |
| char * | s, | ||
| size_t | len ) |
编辑器行加入字符串
| row | 编辑器行 |
| s | 字符串 |
| len | 字符串长度 |
| int editor_row_cx2rx | ( | erow_t * | row, |
| int | cx ) |
将字符索引转换为渲染索引
| row | 编辑器行 |
| cx | 字符索引 |
| void editor_row_insert_char | ( | erow_t * | row, |
| int | at, | ||
| int | c ) |
在给定位置插入单个字符到erow
| row | 编辑器行 |
| at | 字符索引 |
| c | 字符 |
| int editor_row_rx2cx | ( | erow_t * | row, |
| int | rx ) |
将渲染索引转换为字符索引
| row | 编辑器行 |
| rx | 渲染索引 |
| char * editor_rows2str | ( | int * | str_len | ) |
编辑器行转化为字符串
| str_len | 获取字符串长度 |
| void editor_scroll | ( | ) |
编辑器滚动
ec.rowoff值: 策略是检查光标是否已移出可见窗口, 如果是,则调整ec.rowoff, 使光标刚好位于可见窗口内。 | void editor_set_status_msg | ( | const char * | fmt, |
| ... ) |
编辑器设置状态栏消息
| fmt | 消息格式化字符串 |
| ... | 其他参数 |
| fmt | 消息格式化字符串 |
| ... |
| int editor_syn2col | ( | int | hl | ) |
编辑器语法转颜色
| hl | 语法枚举,参考dfitor_highlight |
| void editor_update_row | ( | erow_t * | row | ) |
编辑器(更新)渲染行
| row | 编辑器行 |
| void editor_update_syntax | ( | erow_t * | row | ) |
编辑器更新语法高亮
| row | 编辑器行 |
| void enable_raw_mode | ( | ) |
开启原始文本模式
ECHO功能会将键入打印到终端。 在原始模式下渲染编辑器UI时, 会妨碍我们输入。sudo在终端上输入密码: ICANON功能会逐个字节监测键入, 而不是逐行读取, 不需要按下Enter键。ISIG功能会控制如下信号: 默认情况下,Ctrl-C向当前进程发送SIGINT信号, 导致其终止;Ctrl-Z向当前进程发送SIGTSTP信号, 导致其挂起。IXON功能会控制如下软件流信号: 默认情况下,Ctrl-S停止将数据传输到终端, 直到按Ctrl-Q。IEXTEN功能会控制如下信号: 键入Ctrl-V时,终端会等待你键入其他字符, 然后发送该字符。关闭IEXTEN还可以修复 macOSCtrl-O中的问题。ICRNL功能控制的Ctrl-M很奇怪: 当我们期望它被读取为13时,它被读取为10 终端有助于将用户输入的任何回车符(13,\r) 转换为换行符(10,\n),关闭这个功能。OPOST标志控制所有输出处理功能: 在 printf() 语句中添加回车符, 防止光标只向下移动,而不向屏幕的左侧移动。VMIN值设置read()返回之前所需输入的最小字节数。 我们将其设置为0,以便read()在有任何输入要读取时立即返回。VTIME值设置read()返回之前等待的最长时间。 它以十分之一秒为单位,因此我们将其设置为1/10秒,即100毫秒。 如果read()超时,它将返回0。这是有道理的, 因为它通常的返回值是读取的字节数。 | void fatal | ( | const char * | s | ) |
错误处理:打印错误信息
| s | 错误信息 |
| int get_cursor_position | ( | int * | rows, |
| int * | cols ) |
获取光标位置
| rows | 行数 |
| cols | 列数 |
| -1 | 获取失败 |
| 0 | 获取成功 |
| int get_window_size | ( | int * | rows, |
| int * | cols ) |
获取窗口大小
| rows | 行数 |
| cols | 列数 |
| -1 | 获取失败 |
| 0 | 获取成功 |
ioctl()不能保证能够在所有系统上请求窗口大小, 我们将提供获取窗口大小的方法。| int is_separator | ( | int | c | ) |
是否为分隔符
| c | 字符 |
| char* C_HL_EXT[] = {".c", ".h", ".cpp", NULL} |
C拓展文件后缀
| char* C_HL_KEY[] |
C拓展文件关键词