Você pode fazer isso substituindo a ligação padrão para TAB (^ i). Primeiro você precisa sobrescrever a ligação TAB, então você precisa construir uma função que chame seu comando, por último você precisa pegar a saída desse comando e atualizar a variável que contém a linha de comando atual.
Esta função assume a linha de comando atual e altera os dois últimos caracteres para '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"
}
Para o seu exemplo, você provavelmente desejará alterar a linha new_argument para ficar assim:
new_argument=$(autojump $argument)
Agora substitua a ligação ^ i:
$ bind -x '"\C-i"':'my_awesome_tab_completion_function'
Agora teste que funciona:
$ cd /ro<TAB>
changes my command to:
$ cd /root
assim a conclusão normal ainda funciona, você pode testar a parte $$ fazendo cd $$ ... etc
Se você tiver problemas, ative o modo detalhado:
$ set -x
Ele imprimirá tudo o que a função está fazendo.
Eu testei isso no Ubuntu 11 usando o bash 4.2.8 (1) -release (o padrão).