使用C语言自定义shell方向键控件
Arrow keys control in a custom shell using C language
我正在尝试让箭头键在单行字符之间(左 + 右)和历史命令(上 + 下)之间移动,用于自定义 shell(学期项目)。
此时,当按下其中一个箭头 ^[[A、^[[B、^[[C 或 ^[[D 时,在按下回车键后,我发现其中一个是使用以下方式命中的:
char a = getchar();
if (a == '3') {
getchar();
int ch2 = getchar();
switch(ch2){
case 'A':
printf("UP\n");
break;
case 'B':
printf("DOWN\n");
break;
case 'D':
printf("LEFT\n");
break;
case 'C':
printf("RIGHT\n");
break;
default:
printf("SOME OTHER SCROLL KEY PRESSED: %d %d\n", a, ch2);
break;
}
}
我想要得到的是,一旦我按下其中一个箭头,动作就会发生,而不会显示任何内容。
默认情况下,unix 系统中的终端输入是行缓冲的,您可以使用 termios 为 stdin 函数指定您自己的 return 条件:
#include <stdio.h>
#include <termios.h>
static struct termios orig_termios;
char get_char_wait_for_keypress(void) {
struct termios raw;
// Get stdin file descriptor (0 by default)
int stdin_fileno = fileno(stdin);
// Copy terminal io settings
raw = orig_termios;
// Set return condition at first byte being received (For input timeout you can use `raw.c_cc[VTIME] = secs`)
raw.c_cc[VMIN] = 1;
// Apply settings with new return condition
tcsetattr(stdin_fileno, TCSANOW, &raw);
// Get char with new conditions
char c = getchar();
// Restore old settings
tcsetattr(stdin_fileno, TCSANOW, &orig_termios);
return c;
}
int main(void) {
struct termios raw;
char c = get_char_wait_for_keypress();
printf("%d", c);
}
我正在尝试让箭头键在单行字符之间(左 + 右)和历史命令(上 + 下)之间移动,用于自定义 shell(学期项目)。
此时,当按下其中一个箭头 ^[[A、^[[B、^[[C 或 ^[[D 时,在按下回车键后,我发现其中一个是使用以下方式命中的:
char a = getchar();
if (a == '3') {
getchar();
int ch2 = getchar();
switch(ch2){
case 'A':
printf("UP\n");
break;
case 'B':
printf("DOWN\n");
break;
case 'D':
printf("LEFT\n");
break;
case 'C':
printf("RIGHT\n");
break;
default:
printf("SOME OTHER SCROLL KEY PRESSED: %d %d\n", a, ch2);
break;
}
}
我想要得到的是,一旦我按下其中一个箭头,动作就会发生,而不会显示任何内容。
默认情况下,unix 系统中的终端输入是行缓冲的,您可以使用 termios 为 stdin 函数指定您自己的 return 条件:
#include <stdio.h>
#include <termios.h>
static struct termios orig_termios;
char get_char_wait_for_keypress(void) {
struct termios raw;
// Get stdin file descriptor (0 by default)
int stdin_fileno = fileno(stdin);
// Copy terminal io settings
raw = orig_termios;
// Set return condition at first byte being received (For input timeout you can use `raw.c_cc[VTIME] = secs`)
raw.c_cc[VMIN] = 1;
// Apply settings with new return condition
tcsetattr(stdin_fileno, TCSANOW, &raw);
// Get char with new conditions
char c = getchar();
// Restore old settings
tcsetattr(stdin_fileno, TCSANOW, &orig_termios);
return c;
}
int main(void) {
struct termios raw;
char c = get_char_wait_for_keypress();
printf("%d", c);
}