一些关于在编写回调函数时有用的变量的信息。
似乎无法像使用纯 C 库那样设置 rl_basic_word_break_characters,因此正如之前的用户指出的那样,您只会收到回调中输入缓冲区中的当前单词。例如,如果您正在键入“big bro|ther”,其中竖线是您按 Tab 键时的光标位置,您将收到 (字符串)“brother”和 (整数) 4 作为您的回调参数。
但是,可以(轻松地)获取有关用户在 readline 缓冲区中键入的内容的更多有用信息。readline_info() 是这里的关键。它将返回一个包含以下内容的数组
"line_buffer" => (字符串)
行缓冲区的全部内容(+ 一些错误**)
"point" => (整数)
缓冲区中光标的当前位置
"end" => (整数)
缓冲区中最后一个字符的位置
因此,对于上面的示例,您将获得
* line_buffer => "big brother"
* point => 7
* end => 11
由此您可以轻松地执行多词匹配。
** 注意:line_buffer 有时似乎在字符串末尾包含虚假数据。幸运的是,由于提供了 $end,您可以使用 substr() 获取正确的值。
您需要返回的匹配项是完整单词,可以替换 $input,因此您的算法可能粗略地如下所示
<?php
function your_callback($input, $index) {
// 获取有关当前缓冲区的信息
$rl_info = readline_info();
// 确定整个输入是什么
$full_input = substr($rl_info['line_buffer'], 0, $rl_info['end']);
$matches = array();
// 根据整个输入缓冲区获取所有匹配项
foreach (phrases_that_begin_with($full_input) as $phrase) {
// 仅将输入的末尾(此单词的开头)
// 添加到匹配数组中
$matches[] = substr($phrase, $index);
}
return $matches;
}
?>