我正在尝试处理键盘快捷键,我已经知道如何使用信号,但问题是信号列表没有提供很多选择。
所以我想知道是否可以处理像 CTRL +'key'这样的快捷方式
key
可以是任何键盘键,如A Z E R T Y
。
答案 0 :(得分:0)
以下是使用GNU readline
的示例。您可以捕获关键序列 Ctrl + P , Ctrl + G 等。
int keyPressed(int count, int key) {
printf("key pressed: %d\n",key);
rl_on_new_line();
return 0;
}
int main() {
rl_catch_signals = 0;
rl_bind_keyseq("\\C-g",keyPressed);
rl_bind_keyseq("\\C-p",keyPressed);
rl_bind_keyseq("\\C-z",keyPressed);
while(1) {
char *line = readline("rl> ");
}
对于special characters,例如信号字符, Ctrl + C , Ctrl + Z ,您需要rl_catch_signals=0
。这样,您就可以定义自己的信号处理程序。
我发现有一件事是,即使您在调用rl_bind_keyseq("\\C-z",keyPressed)
之前将终端设置为raw
模式,也不会调用readline
。相反,终端仍将 Ctrl + Z 解释为SIGTSTP
。
查看源代码,显然每次调用readline()
时,终端设置为reset。
//rltty.c
#if defined (HANDLE_SIGNALS)
tiop->c_lflag &= ~ISIG;
#else
tiop->c_lflag |= ISIG;
#endif
除非你想修改readline
,否则我建议为特殊字符定义信号处理程序。