You can do this by overriding the default binding for TAB(^i). First you need to override the TAB binding, then you need to build a function that calls your command, lastly you need to take the output from that command and update the variable that contains the current command line.
This function takes the current command line and changes the last two characters to 'huugs'.
function my_awesome_tab_completion_function () {
set -- $READLINE_LINE
command="$1"
shift
argument="$*"
argument_length=$(echo -n $argument | wc -c)
if echo $argument | grep '^$$' >/dev/null 2>&1; then
new_argument=$(echo $argument | sed 's/..$/huugs/') # put your autojump here
else
new_argument=$(compgen -d $argument)
fi
new_argument_length=$(echo -n $new_argument | wc -c)
READLINE_POINT=$(( $new_argument_length - $argument_length + $READLINE_POINT ))
READLINE_LINE="$command $new_argument"
}
For your example you'd probably want to change the new_argument line to look like this:
new_argument=$(autojump $argument)
Now override the ^i binding:
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
Now test that it works:
$ cd /ro<TAB>
changes my command to:
$ cd /root
so normal completion still works, you can test the $$ part by doing cd $$... etc
If you run into issues turn on verbose mode:
$ set -x
It will print out everything the function is doing.
I tested this on Ubuntu 11 using bash 4.2.8(1)-release (the default).
Best Answer
You should use the
builtin
command: