Tab completion doesn't work for arguments when command is an alias
Edit: OK. Seems like I might have misread the situation. Thought you meant program options as in:
$ mplayer_alias -pla<tab><tab>
-playing-msg -playlist
$
but guess it is file completion. I don't know, but give it a go.
As a quick fix this should work:
complete -f -o default ee
Giving:
$ ee<tab><tab>
file1 file2 file3
$
as of Programmable Completion Builtins. E.g. the -X pattern
can be useful. E.g. to exclude .swp
and .swo
files:
complete -f -X '*.sw[op]' ee
only show .zip
, .ZIP
:
complete -f -o default -X '!*.+(zip|ZIP)' my_unzip_alias
some might need you to add shopt -s extglob
in configuration file.
OLD Answer:
You could try out something like this in your .bash_completion
.
At least as a starter.
The core idea is to simply add complete
for the alias using the existing
complete script for the real program. Here I assume that they are all in the format:
complete -F _complete_function_from_original program_name
You can get what it is by executing: complete -p program_name
. Best to check first.
For some methods like apt-get
one can use only alias + load:
_load_comp_hack apt-get myalias
For others like mplayer
one need a function wrapper, as in e.g.:
myalias() { mplayer "$@"; }
|
+--- Could be messy
It is quite possible there is a better way to solve this, but has worked fine for my use. I mostly use it for wrapper scripts where I extend the functionality of the original program. Have not used it on aliases.
I do not feel to safe on this hack, but you could see if it works.
_load_comp_hack()
{
local cc=
# Make sure completion scripts are sourced.
# Report error if source fail.
if . "/usr/share/bash-completion/completions/$1" >/dev/null 2>&1; then
# Extract the completion function used by the "real" program.
if cc="$(complete -p "$1" | cut -d' ' -f3)"; then
# Add it to the alias
complete -F "$cc" "$2"
return 0
fi
fi
echo "bash-completion '$1' for '$2' not found."
}
_load_comp_hack mplayer mplad
_load_comp_hack apt-get z
| |
| +----- Alias, script or function
+------------- Real function
Some programs use more general completion like _longopt
, by which the
source file won't be located. Usually it is no need to source either, so a
simpler variant could be:
_load_comp_hack()
{
local cc=
if cc=$(complete -p "$1" | cut -d' ' -f3); then
complete -F "$cc" "$2"
fi
}
One problem here, IIRC, is that some completion scripts are not loaded until first run, as in first:
prog
tabtab. As an alternative perhaps add it as an else
if sourcing of file fails.