Eu tenho uma pequena função útil que uso:
# A function to help with creating directory aliases and providing
# completion for them.
# Taken from here:
# http://blog.caioromao.com/2010/10/10/Custom-directory-completion.html
# Tweaked to work with more than just 'cd'
_make_dir_complete() {
local aliasname=$1
local prgname="__s_${aliasname}__"
cd "$3" >/dev/null 2>&1
local dirname=$(pwd -L)
local realpath=$(pwd -P)
cd - >/dev/null 2>&1
FUNC="function $prgname() {
local cur len wrkdir;
local IFS=\$'\n'
wrkdir=\"$realpath\"
cur=\${COMP_WORDS[COMP_CWORD]};
len=\$((\${#wrkdir} + 2));
COMPREPLY=( \$(compgen -S/ -d \$wrkdir/\$cur| cut -b \$len-) );
}"
ALIAS="$aliasname () { $2 \"$dirname/\$*\"; }"
eval $FUNC
eval $ALIAS
complete -o nospace -F $prgname $aliasname
}
E então eu tenho um código como este para configurar meus atalhos:
test -e ~/projects &&
_make_dir_complete cdp cd ~/projects &&
_make_dir_complete pdp pushd ~/projects
Isso configurará duas funções bash, cdp
e pdp
. cdp
eu uso para alterar diretórios, então eu faço algo como cdp foo
, que será traduzido em cd ~/projects/foo
. pdp
funciona de maneira semelhante, mas usa pushd
. A parte interessante é que ele também é concluído, então eu posso digitar cdp f
, depois pressionar TAB
e ele será concluído com cdp foo
.