Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 绑定到Readline库中的箭头键_C_Readline - Fatal编程技术网

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
(您可以在Thomas Dickey维护的中找到更多信息。请注意,
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这真是一个很好的答案!我已经搜索了几乎一整天了…我会试试这个