texc
载入中...
搜索中...
未找到
main.c 文件参考

主程序入口 更多...

#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
 

详细描述

主程序入口

作者
lancer (lance.nosp@m.rsta.nosp@m.dium@.nosp@m.163..nosp@m.com)
版本
0.1
日期
2024-01-05
注解
参考项目:文本编辑器 | kilo

宏定义说明

◆ ABUF_INIT

#define ABUF_INIT   {NULL, 0}

追加缓冲区初始化

◆ CTRL_KEY

#define CTRL_KEY ( k)    ((k) & 0x1f)

切换宏CRTL+k:按位对二进制值00011111进行AND

◆ HLDB_ENTRIES

#define HLDB_ENTRIES   (sizeof(HLDB) / sizeof(HLDB[0]))

语法突出数据库大小

◆ QUIT_TIMES

#define QUIT_TIMES   2

如果设置了ec.dirty,将在状态栏中显示警告:要求用户再按Ctrl-Q两次才能退出而不保存

◆ TAB_STOP

#define TAB_STOP   8

制表位的长度常量

◆ TEXC_VERSION

#define TEXC_VERSION   "0.0.1"

texc版本

类型定义说明

◆ abuf_t

typedef struct abuf abuf_t

追加缓冲区结构体

全局编辑器配置实例

◆ erow_t

typedef struct erow erow_t

编辑器行

注解
将一行文本存储为指向动态分配的字符数据的指针和其长度

枚举类型说明

◆ editor_key

enum editor_key

编辑器控制键入配置

注解
按键冲突处理 现在我们只需在editor_key枚举中选择 与wasd不冲突的箭头键表示形式即可。 我们将为它们提供一个超出字符范围的大整数值, 以便它们不会与任何普通按键冲突。

函数说明

◆ abuf_append()

void abuf_append ( abuf_t * ab,
const char * s,
int len )

缓冲区追加字符串

参数
ab追加缓冲区
s字符串
len字符串长度

◆ abuf_free()

void abuf_free ( abuf_t * ab)

释放追加缓冲区

参数
ab追加缓冲区

◆ editor_del_row()

void editor_del_row ( int at)

编辑器删除行

参数
at行号

◆ editor_draw_rows()

void editor_draw_rows ( abuf_t * ab)

编辑器绘制行

参数
ab追加缓冲区
注解
类似vim左侧的波浪。
  • 我们打印最后一个波形符时, 会像在任何其他行上一样打印“\r
    ”, 但这会导致终端滚动以便为新的空白行腾出空间。 故打印“\r
    ”时,需要让最后一行成为例外。

◆ editor_draw_status_bar()

void editor_draw_status_bar ( abuf_t * ab)

编辑器绘制状态栏

参数
ab追加缓冲区

◆ editor_draw_status_msg()

void editor_draw_status_msg ( abuf_t * ab)

编辑器绘制状态栏消息

参数
ab追加缓冲区

◆ editor_find_callback()

void editor_find_callback ( char * query,
int key )

编辑器查找回调函数

参数
query查询字符串
key键入

◆ editor_free_row()

void editor_free_row ( erow_t * row)

编辑器释放行

参数
row编辑器行

◆ editor_insert_char()

void editor_insert_char ( int c)

编辑器插入字符

参数
c字符

◆ editor_insert_row()

void editor_insert_row ( int at,
char * s,
size_t len )

编辑器加入行

参数
at行号
s行字符串
len行长度

◆ editor_move_cursor()

void editor_move_cursor ( int key)

编辑器移动光标位置

参数
key键入字符

◆ editor_open()

void editor_open ( char * filename)

编辑器打开文件

参数
filename文件名

◆ editor_proc_key()

void editor_proc_key ( )

编辑器处理键入

TODO: 处理特殊字符

◆ editor_prompt()

char * editor_prompt ( char * prompt,
void(*)(char *, int) callback )

编辑器显示提示,提供文本输入

参数
prompt提示信息
callback回调函数
返回
char* 输入信息

◆ editor_read_key()

int editor_read_key ( )

编辑器读取键入

返回
char 键入字符
注解
Arrow 转义字符处理
  • 如果我们读取一个转义字符,会立即将另外两个字节读入seq缓冲区。 如果其中任何一个读数超时(0.1 秒后), 则假设用户只是按下了 Escape 键并返回该键。 否则,会查看转义序列是否为箭头键转义序列。

◆ editor_row_append_str()

void editor_row_append_str ( erow_t * row,
char * s,
size_t len )

编辑器行加入字符串

参数
row编辑器行
s字符串
len字符串长度
注解
用于实现删除功能

◆ editor_row_cx2rx()

int editor_row_cx2rx ( erow_t * row,
int cx )

将字符索引转换为渲染索引

参数
row编辑器行
cx字符索引
返回
int 渲染索引

◆ editor_row_insert_char()

void editor_row_insert_char ( erow_t * row,
int at,
int c )

在给定位置插入单个字符到erow

参数
row编辑器行
at字符索引
c字符

◆ editor_row_rx2cx()

int editor_row_rx2cx ( erow_t * row,
int rx )

将渲染索引转换为字符索引

参数
row编辑器行
rx渲染索引
返回
int 字符索引

◆ editor_rows2str()

char * editor_rows2str ( int * str_len)

编辑器行转化为字符串

参数
str_len获取字符串长度
返回
char* 字符串指针

◆ editor_scroll()

void editor_scroll ( )

编辑器滚动

注解
设置ec.rowoff值: 策略是检查光标是否已移出可见窗口, 如果是,则调整ec.rowoff, 使光标刚好位于可见窗口内。

◆ editor_set_status_msg()

void editor_set_status_msg ( const char * fmt,
... )

编辑器设置状态栏消息

参数
fmt消息格式化字符串
...其他参数
fmt消息格式化字符串
...

◆ editor_syn2col()

int editor_syn2col ( int hl)

编辑器语法转颜色

参数
hl语法枚举,参考dfitor_highlight
返回
int 颜色

◆ editor_update_row()

void editor_update_row ( erow_t * row)

编辑器(更新)渲染行

参数
row编辑器行

◆ editor_update_syntax()

void editor_update_syntax ( erow_t * row)

编辑器更新语法高亮

参数
row编辑器行

◆ enable_raw_mode()

void enable_raw_mode ( )

开启原始文本模式

注解
原始文本模式 需要关闭相关功能并获取等待延迟

关闭特定功能

  1. ECHO功能会将键入打印到终端。 在原始模式下渲染编辑器UI时, 会妨碍我们输入。
  • 例如,使用sudo在终端上输入密码:
    sudo apt install xxx
  1. ICANON功能会逐个字节监测键入, 而不是逐行读取, 不需要按下Enter键。
  2. ISIG功能会控制如下信号: 默认情况下,Ctrl-C向当前进程发送SIGINT信号, 导致其终止;Ctrl-Z向当前进程发送SIGTSTP信号, 导致其挂起。
  3. IXON功能会控制如下软件流信号: 默认情况下,Ctrl-S停止将数据传输到终端, 直到按Ctrl-Q
  4. IEXTEN功能会控制如下信号: 键入Ctrl-V时,终端会等待你键入其他字符, 然后发送该字符。关闭IEXTEN还可以修复 macOSCtrl-O中的问题。
  5. ICRNL功能控制的Ctrl-M很奇怪: 当我们期望它被读取为13时,它被读取为10 终端有助于将用户输入的任何回车符(13,\r) 转换为换行符(10,\n),关闭这个功能。
  6. OPOST标志控制所有输出处理功能: 在 printf() 语句中添加回车符, 防止光标只向下移动,而不向屏幕的左侧移动。
  7. 其他标志:略

超时读取

  1. VMIN值设置read()返回之前所需输入的最小字节数。 我们将其设置为0,以便read()在有任何输入要读取时立即返回。
  2. VTIME值设置read()返回之前等待的最长时间。 它以十分之一秒为单位,因此我们将其设置为1/10秒,即100毫秒。 如果read()超时,它将返回0。这是有道理的, 因为它通常的返回值是读取的字节数。

◆ fatal()

void fatal ( const char * s)

错误处理:打印错误信息

参数
s错误信息

◆ get_cursor_position()

int get_cursor_position ( int * rows,
int * cols )

获取光标位置

参数
rows行数
cols列数
返回
int 返回值
返回值
-1获取失败
0获取成功

◆ get_window_size()

int get_window_size ( int * rows,
int * cols )

获取窗口大小

参数
rows行数
cols列数
返回
int 返回值
返回值
-1获取失败
0获取成功
注解
自定义获取窗口大小
  • ioctl()不能保证能够在所有系统上请求窗口大小, 我们将提供获取窗口大小的方法。
  • 策略是将光标定位在屏幕的右下角, 然后使用转义序列来查询光标的位置。 这告诉我们屏幕上必须有多少行和列。

◆ is_separator()

int is_separator ( int c)

是否为分隔符

参数
c字符
返回
int

变量说明

◆ C_HL_EXT

char* C_HL_EXT[] = {".c", ".h", ".cpp", NULL}

C拓展文件后缀

◆ C_HL_KEY

char* C_HL_KEY[]
初始值:
= {
"switch", "if", "while", "for", "break", "continue", "return", "else",
"struct", "union", "typedef", "static", "enum", "class", "case",
"int|", "long|", "double|", "float|", "char|", "unsigned|", "signed|",
"void|", NULL
}

C拓展文件关键词

◆ HLDB

esyn_t HLDB[]
初始值:
= {
{
"c",
"//", "/*", "*/",
HL_SYN_NUMBERS | HL_SYN_STRINGS
},
}
char * C_HL_KEY[]
Definition main.c:100
char * C_HL_EXT[]
Definition main.c:98

语法突出数据库