Voting

: seven minus four?
(Example: nine)

The Note You're Voting On

chris AT w3style DOT co UK
15 years ago
A little bit of info regarding useful variables when writing your callback function.

There doesn't seem to be a way to set rl_basic_word_break_characters like with the pure C library, so as previous users have pointed out you'll only receive the current word in the input buffer within your callback. If for example you're typing "big bro|ther", where the bar is the position of your cursor when you hit TAB, you'll receive (string) "brother" and (int) 4 as your callback parameters.

However, it is possible (easily) to get more useful information about what the user has typed into the readline buffer. readline_info() is key here. It will return an array containing:

"line_buffer" => (string)
the entire contents of the line buffer (+ some bugs**)

"point" => (int)
the current position of the cursor in the buffer

"end" => (int)
the position of the last character in the buffer

So for the example above you'd get:

* line_buffer => "big brother"
* point => 7
* end => 11

From this you can easily perform multi-word matches.

** NOTE: line_buffer seems to contain spurious data at the end of the string sometime. Fortunately since $end is provided you can substr() it to get the correct value.

The matches you need to return are full words that can replace $input, so your algorithm might crudely look something like:

<?php

function your_callback($input, $index) {
// Get info about the current buffer
$rl_info = readline_info();

// Figure out what the entire input is
$full_input = substr($rl_info['line_buffer'], 0, $rl_info['end']);

$matches = array();

// Get all matches based on the entire input buffer
foreach (phrases_that_begin_with($full_input) as $phrase) {
// Only add the end of the input (where this word begins)
// to the matches array
$matches[] = substr($phrase, $index);
}

return
$matches;
}

?>

<< Back to user notes page

To Top