Getting more helpful tab completion prompts in bash?

Let's say I have a directory with a few files in it like this:

$ ls
file1  file2  file3

And I want to do some tab completion in bash:

$ cat file<tab>
file1  file2  file3  

I remember seeing someone doing tab completion and the shell bolded the next parts, so in this case, it would bold the 1, 2 and 3 of the filename so it'll look like this: file1 file2 file3

which will tell you what you should type in next.

I think this was a feature of zsh, but is there any way to get it in bash?


I don't know of directly ported functionality, but there is a way to hack this in bash. Programmable completion allows you to specify what you'd like to see when you hit that tab key dependent on the calling program, allowing (as a popular example) ssh [tab] to show autocomplete options from ~/.ssh/known_hosts.

Here are some useful resources:

Intro, Source and RPMs

User contributed "completions"

More examples

And more examples

Of course, to duplicate the functionality you specify above, you'll have to get down and dirty with the programmable aspect of completion and write your own functions. Ubuntu ships its own set of user contributed completions, which are a good starting point.


In Red Hat based distros there is a package bash-completion. This package fills the /etc/bash_completion.d/ directory with specific completion behaviour for several programs. I'm using it under Fedora, Red Hat and CentOS.

yum install bash-completion

I'm using tcsh because of a similar feature.

Here is my /etc/csh.cshrc file :

if ($?tcsh && $?prompt) then

   bindkey "\e[1~" beginning-of-line # Home
   bindkey "\e[7~" beginning-of-line # Home rxvt
   bindkey "\e[2~" overwrite-mode    # Ins
   bindkey "\e[3~" delete-char       # Delete
   bindkey "\e[4~" end-of-line       # End
   bindkey "\e[8~" end-of-line       # End rxvt

   bindkey -k up history-search-backward
   bindkey -k down history-search-forward

   set filec
   set prompt="[%B%m%b:%~] %n%# "
   set complete = enhance            # important line
   set autolist                      # important line too
   alias ls 'ls -hA --color'
   alias ll 'ls -l'
endif