关于编写回调函数时有用变量的一些信息。
似乎没有办法像使用纯 C 库一样设置 rl_basic_word_break_characters,因此正如之前的用户指出的那样,您只会在回调函数中收到输入缓冲区中的当前单词。例如,如果您正在输入“big bro|ther”,其中竖线是您按下 TAB 时光标的位置,您将收到 (string) “brother” 和 (int) 4 作为您的回调参数。
但是,可以(轻松地)获取有关用户输入到 readline 缓冲区中的更多有用信息。readline_info() 是关键。它将返回一个包含以下内容的数组
"line_buffer" => (string)
行缓冲区的全部内容(+ 一些错误**)
"point" => (int)
缓冲区中光标的当前位置
"end" => (int)
缓冲区中最后一个字符的位置
因此,对于上面的示例,您将得到
* 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 数组中
$matches[] = substr($phrase, $index);
}
return $matches;
}
?>