# ######################################################################### # This bash script adds tab-completion feature to django-admin.py and # manage.py. # # Testing it out without installing # ================================= # # To test out the completion without "installing" this, just run this file # directly, like so: # # . ~/path/to/django_bash_completion # # Note: There's a dot ('.') at the beginning of that command. # # After you do that, tab completion will immediately be made available in your # current Bash shell. But it won't be available next time you log in. # # Installing # ========== # # To install this, point to this file from your .bash_profile, like so: # # . ~/path/to/django_bash_completion # # Do the same in your .bashrc if .bashrc doesn't invoke .bash_profile. # # Settings will take effect the next time you log in. # # Uninstalling # ============ # # To uninstall, just remove the line from your .bash_profile and .bashrc. # Enable extended pattern matching operators. shopt -s extglob _django_completion() { local cur prev opts actions action_shell_opts action_runfcgi_opts COMPREPLY=() cur="${COMP_WORDS[COMP_CWORD]}" prev="${COMP_WORDS[COMP_CWORD-1]}" # Standalone options opts="--help --settings --pythonpath --noinput --noreload --format --indent --verbosity --adminmedia --version" # Actions actions="adminindex createcachetable dbshell diffsettings \ dumpdata flush inspectdb loaddata reset runfcgi runserver \ shell sql sqlall sqlclear sqlcustom sqlflush sqlindexes \ sqlreset sqlsequencereset startapp startproject \ syncdb test validate" # Action's options action_shell_opts="--plain" action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir" if [[ # django-admin.py, ./manage, manage.py ( ${COMP_CWORD} -eq 1 && ( ${COMP_WORDS[0]} == django-admin.py || ${COMP_WORDS[0]} == ./manage.py || ${COMP_WORDS[0]} == manage.py ) ) || # python manage.py, /some/path/python manage.py (if manage.py exists) ( ${COMP_CWORD} -eq 2 && ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) && ( $( basename ${COMP_WORDS[1]} ) == manage.py) && ( -r ${COMP_WORDS[1]} ) ) || ( ${COMP_CWORD} -eq 2 && ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) && ( $( basename ${COMP_WORDS[1]} ) == django-admin.py) && ( -r ${COMP_WORDS[1]} ) ) ]] ; then case ${cur} in -*) COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) action=$COMPREPLY return 0 ;; *) COMPREPLY=( $(compgen -W "${actions}" -- ${cur}) ) action=$COMPREPLY return 0 ;; esac else case ${prev} in adminindex|dumpdata|reset| \ sql|sqlall|sqlclear|sqlcustom|sqlindexes| \ sqlreset|sqlsequencereset|test) # App completion settings="" # If settings.py in the PWD, use that if [ -e settings.py ] ; then settings="$PWD/settings.py" else # Use the ENV variable if it is set if [ $DJANGO_SETTINGS_MODULE ] ; then settings=$DJANGO_SETTINGS_MODULE fi fi # Couldn't find settings so return nothing if [ -z $settings ] ; then COMPREPLY=() # Otherwise inspect settings.py file else apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \ grep -v "django.contrib" | sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \ tr -d "\n"` COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) ) fi return 0 ;; createcachetable|dbshell|diffsettings| \ inspectdb|runserver|startapp|startproject|syncdb| \ validate) COMPREPLY=() return 0 ;; shell) COMPREPLY=( $(compgen -W "$action_shell_opts" -- ${cur}) ) return 0 ;; runfcgi) COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) ) return 0 ;; host*|port*|socket*|method*|maxspare*|minspare*|maxchildren*|daemonize*|pidfile*|workdir*) if [ "$action" == "runfcgi" ] ; then COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) ) return 0 fi return 0 ;; *) #COMPREPLY=( $(compgen -W "auth core" -- ${cur}) ) COMPREPLY=() return 0 ;; esac fi } complete -F _django_completion django-admin.py manage.py # Support for multiple interpreters. unset pythons if command -v whereis &>/dev/null; then python_interpreters=$(whereis python | cut -d " " -f 2-) for python in $python_interpreters; do pythons="${pythons} $(basename $python)" done pythons=$(echo $pythons | tr " " "\n" | sort -u | tr "\n" " ") else pythons=python fi complete -F _django_completion -o default $pythons