|
1 # ######################################################################### |
|
2 # This bash script adds tab-completion feature to django-admin.py and |
|
3 # manage.py. |
|
4 # |
|
5 # Testing it out without installing |
|
6 # ================================= |
|
7 # |
|
8 # To test out the completion without "installing" this, just run this file |
|
9 # directly, like so: |
|
10 # |
|
11 # . ~/path/to/django_bash_completion |
|
12 # |
|
13 # Note: There's a dot ('.') at the beginning of that command. |
|
14 # |
|
15 # After you do that, tab completion will immediately be made available in your |
|
16 # current Bash shell. But it won't be available next time you log in. |
|
17 # |
|
18 # Installing |
|
19 # ========== |
|
20 # |
|
21 # To install this, point to this file from your .bash_profile, like so: |
|
22 # |
|
23 # . ~/path/to/django_bash_completion |
|
24 # |
|
25 # Do the same in your .bashrc if .bashrc doesn't invoke .bash_profile. |
|
26 # |
|
27 # Settings will take effect the next time you log in. |
|
28 # |
|
29 # Uninstalling |
|
30 # ============ |
|
31 # |
|
32 # To uninstall, just remove the line from your .bash_profile and .bashrc. |
|
33 |
|
34 # Enable extended pattern matching operators. |
|
35 shopt -s extglob |
|
36 |
|
37 _django_completion() |
|
38 { |
|
39 local cur prev opts actions action_shell_opts action_runfcgi_opts |
|
40 COMPREPLY=() |
|
41 cur="${COMP_WORDS[COMP_CWORD]}" |
|
42 prev="${COMP_WORDS[COMP_CWORD-1]}" |
|
43 |
|
44 # Standalone options |
|
45 opts="--help --settings --pythonpath --version" |
|
46 # Actions |
|
47 actions="adminindex createcachetable dbshell diffsettings \ |
|
48 inspectdb install reset runfcgi runserver \ |
|
49 shell sql sqlall sqlclear sqlindexes sqlinitialdata \ |
|
50 sqlreset sqlsequencereset startapp startproject \ |
|
51 syncdb validate" |
|
52 # Action's options |
|
53 action_shell_opts="--plain" |
|
54 action_runfcgi_opts="host port socket method maxspare minspare maxchildren daemonize pidfile workdir" |
|
55 |
|
56 if [[ # django-admin.py, ./manage, manage.py |
|
57 ( ${COMP_CWORD} -eq 1 && |
|
58 ( ${COMP_WORDS[0]} == django-admin.py || |
|
59 ${COMP_WORDS[0]} == ./manage.py || |
|
60 ${COMP_WORDS[0]} == manage.py ) ) |
|
61 || |
|
62 # python manage.py, /some/path/python manage.py (if manage.py exists) |
|
63 ( ${COMP_CWORD} -eq 2 && |
|
64 ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) && |
|
65 ( $( basename ${COMP_WORDS[1]} ) == manage.py) && |
|
66 ( -r ${COMP_WORDS[1]} ) ) |
|
67 || |
|
68 ( ${COMP_CWORD} -eq 2 && |
|
69 ( $( basename ${COMP_WORDS[0]} ) == python?([1-9]\.[0-9]) ) && |
|
70 ( $( basename ${COMP_WORDS[1]} ) == django-admin.py) && |
|
71 ( -r ${COMP_WORDS[1]} ) ) ]] ; then |
|
72 |
|
73 case ${cur} in |
|
74 -*) |
|
75 COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) ) |
|
76 action=$COMPREPLY |
|
77 return 0 |
|
78 ;; |
|
79 *) |
|
80 COMPREPLY=( $(compgen -W "${actions}" -- ${cur}) ) |
|
81 action=$COMPREPLY |
|
82 return 0 |
|
83 ;; |
|
84 esac |
|
85 else |
|
86 case ${prev} in |
|
87 adminindex|install|reset| \ |
|
88 sql|sqlall|sqlclear|sqlindexes| \ |
|
89 sqlinitialdata|sqlreset|sqlsequencereset) |
|
90 # App completion |
|
91 settings="" |
|
92 # If settings.py in the PWD, use that |
|
93 if [ -e settings.py ] ; then |
|
94 settings="$PWD/settings.py" |
|
95 else |
|
96 # Use the ENV variable if it is set |
|
97 if [ $DJANGO_SETTINGS_MODULE ] ; then |
|
98 settings=$DJANGO_SETTINGS_MODULE |
|
99 fi |
|
100 fi |
|
101 # Couldn't find settings so return nothing |
|
102 if [ -z $settings ] ; then |
|
103 COMPREPLY=() |
|
104 # Otherwise inspect settings.py file |
|
105 else |
|
106 apps=`sed -n "/INSTALLED_APPS = (/,/)/p" $settings | \ |
|
107 grep -v "django.contrib" | |
|
108 sed -n "s/^[ ]*'\(.*\.\)*\(.*\)'.*$/\2 /pg" | \ |
|
109 tr -d "\n"` |
|
110 COMPREPLY=( $(compgen -W "${apps}" -- ${cur}) ) |
|
111 fi |
|
112 return 0 |
|
113 ;; |
|
114 |
|
115 createcachetable|dbshell|diffsettings| \ |
|
116 inspectdb|runserver|startapp|startproject|syncdb| \ |
|
117 validate) |
|
118 COMPREPLY=() |
|
119 return 0 |
|
120 ;; |
|
121 shell) |
|
122 COMPREPLY=( $(compgen -W "$action_shell_opts" -- ${cur}) ) |
|
123 return 0 |
|
124 ;; |
|
125 runfcgi) |
|
126 COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) ) |
|
127 return 0 |
|
128 ;; |
|
129 host*|port*|socket*|method*|maxspare*|minspare*|maxchildren*|daemonize*|pidfile*|workdir*) |
|
130 if [ "$action" == "runfcgi" ] ; then |
|
131 COMPREPLY=( $(compgen -W "$action_runfcgi_opts" -- ${cur}) ) |
|
132 return 0 |
|
133 fi |
|
134 return 0 |
|
135 ;; |
|
136 *) |
|
137 #COMPREPLY=( $(compgen -W "auth core" -- ${cur}) ) |
|
138 COMPREPLY=() |
|
139 return 0 |
|
140 ;; |
|
141 esac |
|
142 fi |
|
143 } |
|
144 |
|
145 complete -F _django_completion django-admin.py manage.py |
|
146 |
|
147 # Support for multiple interpreters. |
|
148 unset pythons |
|
149 if command -v whereis &>/dev/null; then |
|
150 python_interpreters=$(whereis python | cut -d " " -f 2-) |
|
151 for python in $python_interpreters; do |
|
152 pythons="${pythons} $(basename $python)" |
|
153 done |
|
154 pythons=$(echo $pythons | tr " " "\n" | sort -u | tr "\n" " ") |
|
155 else |
|
156 pythons=python |
|
157 fi |
|
158 |
|
159 complete -F _django_completion -o default $pythons |