C 绑定到Readline库中的箭头键
我正在尝试使用。我已经打印出了C 绑定到Readline库中的箭头键,c,readline,C,Readline,我正在尝试使用。我已经打印出了rl_bind_key的所有可能的ASCII(0-255)键值组合,但似乎没有检测到箭头键 我怎样才能和他们绑在一起 static int readline_func(int count, int key) { printf("key pressed\n"); return 0; } int i = 0; for (; i < 255; i++) { rl_bind_key(i, readline_func); } static int
rl_bind_key
的所有可能的ASCII(0-255)键值组合,但似乎没有检测到箭头键
我怎样才能和他们绑在一起
static int readline_func(int count, int key) {
printf("key pressed\n");
return 0;
}
int i = 0;
for (; i < 255; i++) {
rl_bind_key(i, readline_func);
}
static int readline_func(int count,int key){
printf(“按下键”);
返回0;
}
int i=0;
对于(;i<255;i++){
rl_bind_键(i,readline_func);
}
谢谢你的帮助 如您所见,没有普通键盘提供的箭头键等特殊键的概念
它是您的平台键盘驱动程序发送字节序列到您的程序,所以答案将取决于平台。例如,在Linux上,termcap提供此信息,您可以通过从C程序访问此信息
检查。绑定箭头键并不是那么简单 首先,箭头键不是单个字符;它们是字符序列。每个箭头键发送的精确字符序列将取决于您的终端仿真器,但如果您将Linux与类似xterm的终端仿真器一起使用,您可能会发现箭头键发送序列:
- ↑ 电子稳定控制系统[A]
- ↓ ESC[B
- → ESC[C
- ← ESC[D
CSI
是“控制序列启动器”ESC[)
要绑定这些序列,您需要使用rl\u bind\u keyseq
,指定读线样式“keyseq”(请参阅;搜索keyseq
)。例如,要将右箭头绑定到函数,您可以调用:
rl_bind_keyseq("\\e[C", right_arrow_function);
初始读线绑定包括所有标准键的绑定,在终端仿真器使用其他仿真时,使用各种不同的键到键eq映射
您可能认为使用rl_bind_key
绑定转义键(0x1B)会覆盖该键序列(因为它以转义开始),但readline不是这样工作的
Readline使用链接键映射的trie绑定多字符序列,序列中的每个键依次绑定到下一个键映射。精确的机制并不重要——Readline将处理它——但您需要知道,绑定键序列的前缀是不可能的,因为前缀将绑定到子键映射p和sub-keymap绑定优先于任何其他类型的绑定
因此,任何重新绑定绑定的keyseq前缀的尝试都将失败,且不会出现任何错误指示;rl\u bind\u key
(或rl\u bind\u keyseq
)即使绑定无效,也将返回0。因此,您在所有可能的8位字符上的循环将尝试绑定ESC,并且调用rl_bind_key
将成功,但转义键仍将绑定到子键映射。(我个人觉得缺少错误返回令人恼火;获得错误指示会很好。)
当调用
rl_command_函数
时,顺便说一下,key
参数将包含序列中最后一个键的代码。(这是因为它是在相应的子键映射中实际保存绑定信息的最后一个键。)这对于箭头键来说没问题,但是绑定大量键(包括PageUp和PageDown)会让人恼火,因为它们的代码序列的形式是ESC[p
~其中p
是一些(可能是多位数)标识密钥的数字,但所有序列中的最后一个字符是~。这是一个很好的答案!我很惊讶没有更多关于这个的文档。非常感谢!@rici这真是一个很好的答案!我已经搜索了几乎一整天了…我会试试这个