原始输入和输出(第三节)
原始输入与输出
按下Ctrl-Q退出程序
在上一章中,我们看到Ctrl键与字母键组合似乎会映射到字节值1到26。我们可以利用这一点来检测Ctrl键组合,并将它们映射到我们编辑器中的不同操作上。我们首先将Ctrl-Q映射到退出操作。
kilo.c
步骤20:Ctrl-Q操作
/*** 包含的头文件 ***/
#include <ctype.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <termios.h>
#include <unistd.h>
/*** 宏定义 ***/
#define CTRL_KEY(k) ((k) & 0x1f)
/*** 数据 ***/
/*** 终端相关函数 ***/
/*** 初始化函数 ***/
int main() {
enableRawMode();
while (1) {
char c = '\0';
if (read(STDIN_FILENO, &c, 1) == -1 && errno != EAGAIN) die("read");
if (iscntrl(c)) {
printf("%d\r\n", c);
} else {
printf("%d ('%c')\r\n", c, c);
}
if (c == CTRL_KEY('q')) break;
}
return 0;
}
♐︎ 可编译
CTRL_KEY
宏将一个字符与二进制值 00011111
进行按位与运算。(在C语言中,由于C没有二进制字面量,通常使用十六进制来指定位掩码,而且一旦你习惯了,十六进制会更简洁易读。)换句话说,它将字符的高3位设置为0。这与终端中Ctrl键的作用是一致的:无论你按下哪个键与Ctrl键组合,它都会去除该键对应字节的第5位和第6位,然后发送出去。(按照惯例,位的编号从0开始。)ASCII字符集似乎就是故意这样设计的。(它的设计也类似地使得你可以通过设置和清除第5位来在小写字母和大写字母之间切换。)

扫描二维码关注微信公众号,回复密码,即可获取密码
阅读剩余
版权声明:
作者:讳疾忌医-note
链接:https://www.1217zy.vip/archives/104
文章版权归作者所有,未经允许请勿转载。
THE END