關於編寫回呼函數時有用變數的一些資訊。
似乎沒有辦法像純 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;
}
?>