我正在尝试处理键盘快捷键,我已经知道如何处理信号,但问题是信号列表没有提供很多选择。所以我想知道是否可以处理快捷键,例如CTRL+'key'
,并且key
可以是任何键盘键,如A Z E R T Y
.
问问题
605 次
1 回答
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> ");
}
对于信号字符等特殊字符Ctrl+C,Ctrl+Z您将需要rl_catch_signals=0
. 这样,您可以定义自己的信号处理程序。
我发现的一件事是rl_bind_keyseq("\\C-z",keyPressed)
不会被调用,即使你raw
在调用之前将终端置于模式readline
。相反,终端仍将解释Ctrl+Z为SIGTSTP
.
翻看源码,很明显每次readline()
被调用,终端设置都会被重置。
//rltty.c
#if defined (HANDLE_SIGNALS)
tiop->c_lflag &= ~ISIG;
#else
tiop->c_lflag |= ISIG;
#endif
除非你想修改readline
,否则我建议为特殊字符定义信号处理程序。
于 2017-12-13T20:33:29.113 回答