原始输入和输出(第三节)

原始输入与输出

按下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位来在小写字母和大写字母之间切换。)

扫描二维码关注微信公众号,回复密码,即可获取密码

阅读剩余
THE END