【发布时间】:2020-10-20 20:06:51
【问题描述】:
我正在学习如何编写自己的文本编辑器的教程 Build Your Own Text Editor。
我目前处于低级按键读取并将其映射到编辑器操作(部分:重构键盘输入)。但是当我在我的代码中实现相同的并运行它时,我的终端只是冻结了,我必须重新启动才能恢复正常。我正在使用 Parrot OS(如果重要的话)。这是我的源代码的相关部分:
char editorReadKey() {
int nread;
char c;
while ((nread = read(STDIN_FILENO, &c, 1) != 1)) {
if (nread == -1 && errno != EAGAIN)
die("read");
/*if (iscntrl(c))
printf("%d\r\n", c);
else
printf("%d('%c')\r\n", c, c);
*/
}
return c;
}
void editorProcessKeypress() {
char c = editorReadKey();
switch (c) {
case CTRL_KEY('q') : exit(0);
break;
}
}
int main(void) {
enableRawMode();
while (1) {
editorProcessKeypress();
}
return 0;
enableRawMode 和 disableRawMode 函数没有区别,或多或少是教程的确切实现。
void disableRawMode() {
if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios) == -1)
die("tcsetattr");
}
void enableRawMode() {
if(tcgetattr(STDIN_FILENO, &orig_termios) == -1)
die("tcgetattr");
atexit(disableRawMode);
struct termios raw = orig_termios;
tcgetattr(STDIN_FILENO, &raw);
//turns off echoing the command on the screen
//turn off cannonical mode
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
raw.c_oflag &= ~(OPOST);
raw.c_cflag |= (CS8);
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
raw.c_cc[VMIN] = 0;
raw.c_cc[VTIME] = 1;
if(tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1)
die("tcsetattr");
}
关于为什么会发生这种情况的任何原因?还是我做错了什么?
编辑:将返回值添加到editorReadKey(),我不知何故错过了将它放在这里。
【问题讨论】:
-
以
int c;开头,可能您正在使用termcap 或curses:至少添加相关标题。 -
@wildplasser
int c;- 这次不行 -
那么“终端冻结”是什么意思?你有
ctrl+q作为退出键,你按ctrl+q了吗?! -
@wildplasser 已经尝试过。问题仍然存在。
-
editorReadKey需要返回一个值。