Bash (and other shells such as zsh) have programmable tab completion. For example
./sage --n[TAB]
becomes
./sage --notebook
Below is a rudimentary means of adding such completion to bash. It will most likely not work on all platforms since it uses grep -o but it should not be difficult to change this. Also it uses the new long form options which will hopefully be part of sage soon. To use the old form simply change the --help and --advanced to -help and -advanced respectively.
# add this to .bashrc
# bash tab completion for sage
SAGE_OPTIONS=
_sage_tab() {
COMPREPLY=()
_sage_tab_binary=${COMP_WORDS[0]}
_sage_tab_current_word=${COMP_WORDS[COMP_CWORD]}
# Cache SAGE_OPTIONS for performance
if [ "$SAGE_OPTIONS" = '' ]; then
SAGE_OPTIONS=$(
("$_sage_tab_binary" --help 2>/dev/null;
"$_sage_tab_binary" --advanced 2>/dev/null; ) \
| grep -Eoe '--?[a-zA-Z_][a-zA-Z_-]*' | sort -u)
fi
case ${_sage_tab_current_word} in
-*) # Options
COMPREPLY=($(echo ${SAGE_OPTIONS[@]} | tr " " "\n" \
| grep -oe "${_sage_tab_current_word}[a-z-]*" \
| sort | uniq | tr "\n" " "));;
*) # Search for files that sage understands
# If it doesn't find any it will default to directories
SAGE_EXTENSIONS='sage|py|spkg'
COMPREPLY=($(compgen -G "${_sage_tab_current_word}*" \
| grep -Ee '\.('$SAGE_EXTENSIONS')(\.gz)?$'));;
esac
return 0
}
# use _sage_tab to complete, it produces filenames, and if no matches
# are returned, complete with directory names
complete -F _sage_tab -o filenames -o dirnames sageSee Tips for other handy hints for using Sage.
