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拓展文件关键词