_rails 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625
  1. #compdef rails
  2. # ------------------------------------------------------------------------------
  3. # Copyright (c) 2016 GitHub zsh-users - http://github.com/zsh-users
  4. # All rights reserved.
  5. #
  6. # Redistribution and use in source and binary forms, with or without
  7. # modification, are permitted provided that the following conditions are met:
  8. # * Redistributions of source code must retain the above copyright
  9. # notice, this list of conditions and the following disclaimer.
  10. # * Redistributions in binary form must reproduce the above copyright
  11. # notice, this list of conditions and the following disclaimer in the
  12. # documentation and/or other materials provided with the distribution.
  13. # * Neither the name of the zsh-users nor the
  14. # names of its contributors may be used to endorse or promote products
  15. # derived from this software without specific prior written permission.
  16. #
  17. # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
  18. # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  19. # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  20. # DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
  21. # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  22. # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
  23. # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
  24. # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25. # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
  26. # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27. # ------------------------------------------------------------------------------
  28. # Description
  29. # -----------
  30. #
  31. # Completion script for Ruby on Rails (http://rubyonrails.org/).
  32. #
  33. # ------------------------------------------------------------------------------
  34. # Authors
  35. # -------
  36. #
  37. # * Kazuya Takeshima (https://github.com/mitukiii)
  38. #
  39. # ------------------------------------------------------------------------------
  40. _rails() {
  41. local context state line curcontext="$curcontext"
  42. if (( CURRENT > 2 )); then
  43. (( CURRENT-- ))
  44. shift words
  45. _call_function - "_rails_${words[1]}" || _nothing
  46. else
  47. __rails_commands
  48. fi
  49. }
  50. __rails_commands() {
  51. local context state line curcontext="$curcontext"
  52. local -a rails_options
  53. __rails_setup_rails_options
  54. _arguments -C \
  55. $rails_options \
  56. ': :->command'
  57. case "$state" in
  58. command)
  59. local -a commands
  60. local application_directory
  61. __rails_setup_application_directory
  62. if [ -n "$application_directory" ]; then
  63. commands=(
  64. {generate,g}'[Generate new code]'
  65. {console,c}'[Start the Rails console]'
  66. {server,s}'[Start the Rails server]'
  67. {dbconsole,db}'[Start a console for the database specified in config/database.yml]'
  68. application'[Generate the Rails application code]'
  69. {destroy,d}'[Undo code generated with "generate"]'
  70. benchmarker'[See how fast a piece of code runs]'
  71. profiler'[Get profile information from a piece of code]'
  72. plugin'[Install a plugin]'
  73. {runner,r}'[Run a piece of code in the application environment]'
  74. {test,t}'[Run tests]'
  75. )
  76. else
  77. commands=(
  78. new'[Create a new Rails application]'
  79. )
  80. fi
  81. _values 'command' $commands
  82. ;;
  83. esac
  84. }
  85. __rails_setup_application_directory() {
  86. application_directory="$(pwd)"
  87. while [ -n "$application_directory" ]; do
  88. if [ -f "${application_directory}/script/rails" -o -f "${application_directory}/bin/rails" ]; then
  89. return
  90. fi
  91. application_directory="${application_directory%/*}"
  92. done
  93. application_directory=
  94. }
  95. __rails_setup_rails_options() {
  96. rails_options=(
  97. {-h,--help}'[Show this help message and quit]'
  98. {-v,--version}'[Show Rails version number and quit]'
  99. )
  100. }
  101. __rails_setup_runtime_options() {
  102. runtime_options=(
  103. '(-f --force)'{-f,--force}'[Overwrite files that already exist]'
  104. '(-p --pretend)'{-p,--pretend}'[Run but do not make any changes]'
  105. '(-q --quiet)'{-q,--quiet}'[Suppress status output]'
  106. '(-s --skip)'{-s,--skip}'[Skip files that already exist]'
  107. )
  108. }
  109. __rails_setup_generators_options() {
  110. local -a runtime_options
  111. __rails_setup_runtime_options
  112. generators_options=(
  113. $runtime_options
  114. --skip-namespace'[Skip namespace (affects only isolated applications)]'
  115. --old-style-hash"[Force using old style hash (:foo => 'bar') on Ruby >= 1.9]"
  116. )
  117. }
  118. __rails_setup_model_generators_options() {
  119. local -a generators_options
  120. __rails_setup_generators_options
  121. model_generators_options=(
  122. $generators_options
  123. '(-o --orm)'{-o,--orm=}'[Orm to be invoked]:orm'
  124. )
  125. }
  126. __rails_setup_resource_generators_options() {
  127. local -a model_generators_options
  128. __rails_setup_model_generators_options
  129. resource_generators_options=(
  130. $model_generators_options
  131. --force-plural'[Forces the use of a plural ModelName]'
  132. --resource-route'[Indicates when to generate resource route]: :__rails_boolean'
  133. )
  134. }
  135. __rails_boolean() {
  136. _values 'boolean' 'true' 'false'
  137. }
  138. __rails_migration_fields() {
  139. if compset -P '*:*:'; then
  140. _values 'index' 'index' 'uniq'
  141. else
  142. if compset -P '*:'; then
  143. _values -s ':' 'type' 'string' 'text' 'integer' 'float' 'decimal' 'datetime' 'timestamp' 'time' 'date' 'binary' 'boolean' 'references'
  144. else
  145. _guard '[[:alnum:]_]#' 'field'
  146. fi
  147. fi
  148. }
  149. _rails_generate() {
  150. local context state line curcontext="$curcontext"
  151. if (( CURRENT > 2 )); then
  152. (( CURRENT-- ))
  153. shift words
  154. _call_function - "_rails_generate_${words[1]}" || _rails_generate_default
  155. else
  156. __rails_generate_commands
  157. fi
  158. }
  159. _rails_g() {
  160. _rails_generate
  161. }
  162. __rails_generate_commands() {
  163. local context curcontext="$curcontext" update_policy
  164. zstyle -s ":completion:${curcontext}:" cache-policy update_policy
  165. if [ -z "$update_policy" ]; then
  166. zstyle ":completion:${curcontext}:" cache-policy _rails_generate_commands_caching_policy
  167. fi
  168. local application_directory
  169. __rails_setup_application_directory
  170. local cache_name
  171. cache_name="rails/${application_directory##*/}/all_generators"
  172. if ! _retrieve_cache ${cache_name}; then
  173. local -a all_generators
  174. all_generators=($(_call_program rails_generators rails generate 2> /dev/null | awk '/^ [a-zA-Z_]+/{ print $1 }'))
  175. _store_cache ${cache_name} all_generators
  176. fi
  177. local -a rails_generators
  178. rails_generators=(${all_generators:#*:*})
  179. _describe -t rails_generators 'rails generator' rails_generators
  180. local -a -U namespaces
  181. local namespace
  182. local -a generators
  183. namespaces=(${(R)${(M)all_generators:#*:*}%:*})
  184. for namespace in $namespaces; do
  185. generators=(${${(M)all_generators:#${namespace}:*}/:/\\:})
  186. _describe -t ${namespace}_generators "${namespace/_/ } generator" generators
  187. done
  188. }
  189. _rails_generate_commands_caching_policy() {
  190. local application_directory
  191. __rails_setup_application_directory
  192. if [ "${application_directory}/Gemfile" -nt "$1" ]; then
  193. return 0
  194. fi
  195. local -a oldp
  196. oldp=( "$1"(Nmw+1) )
  197. (( $#oldp ))
  198. }
  199. _rails_generate_default() {
  200. local -a generators_options
  201. __rails_setup_generators_options
  202. _arguments \
  203. $generators_options \
  204. '*:argument'
  205. }
  206. _rails_generate_assets() {
  207. local -a generators_options
  208. __rails_setup_generators_options
  209. _arguments \
  210. $generators_options \
  211. '(-j --javascripts)'{-j,--javascripts}'[Generate JavaScripts]: :__rails_boolean' \
  212. '(-y --stylesheets)'{-y,--stylesheets}'[Generate Stylesheets]: :__rails_boolean' \
  213. '(-je --javascript-engine)'{-je,--javascript-engine=}'[Engine for JavaScripts]:javascript engine' \
  214. '(-se --stylesheet-engine)'{-se,--stylesheet-engine=}'[Engine for Stylesheets]:stylesheet engine' \
  215. ': :_guard "^-*" "name"'
  216. }
  217. _rails_generate_controller() {
  218. local -a generators_options
  219. __rails_setup_generators_options
  220. _arguments \
  221. $generators_options \
  222. '(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
  223. '(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
  224. --helper'[Indicates when to generate helper]: :__rails_boolean' \
  225. --assets'[Indicates when to generate assets]: :__rails_boolean' \
  226. ': :_guard "^-*" "name"' \
  227. '*: :_guard "^-*" "action"'
  228. }
  229. _rails_generate_generator() {
  230. local -a generators_options
  231. __rails_setup_generators_options
  232. _arguments \
  233. $generators_options \
  234. --namespace'[Namespace generator under lib/generators/name]: :__rails_boolean' \
  235. ': :_guard "^-*" "name"'
  236. }
  237. _rails_generate_helper() {
  238. local -a generators_options
  239. __rails_setup_generators_options
  240. _arguments \
  241. $generators_options \
  242. '(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
  243. ': :_guard "^-*" "name"' \
  244. }
  245. _rails_generate_integration_test() {
  246. local -a generators_options
  247. __rails_setup_generators_options
  248. _arguments \
  249. $generators_options \
  250. --integration-tool='[Integration tool to be invoke]:integration tool' \
  251. ': :_guard "^-*" "name"' \
  252. }
  253. _rails_generate_jbuilder() {
  254. local -a generators_options
  255. __rails_setup_generators_options
  256. _arguments \
  257. $generators_options \
  258. ': :_guard "^-*" "name"' \
  259. '*: :__rails_migration_fields'
  260. }
  261. _rails_generate_mailer() {
  262. local -a generators_options
  263. __rails_setup_generators_options
  264. _arguments \
  265. $generators_options \
  266. '(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
  267. '(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
  268. ': :_guard "^-*" "name"' \
  269. '*: :_guard "^-*" "method"'
  270. }
  271. _rails_generate_migration() {
  272. local -a modelgenerators_options
  273. __rails_setup_model_generators_options
  274. _arguments \
  275. $model_generators_options \
  276. ': :_guard "^-*" "name"' \
  277. '*: :__rails_migration_fields'
  278. }
  279. _rails_generate_model() {
  280. _rails_generate_migration
  281. }
  282. _rails_generate_observer() {
  283. local -a model_generators_options
  284. __rails_setup_model_generators_options
  285. _arguments \
  286. $model_generators_options \
  287. ': :_guard "^-*" "name"'
  288. }
  289. _rails_generate_performance_test() {
  290. local -a generators_options
  291. __rails_setup_generators_options
  292. _arguments \
  293. $generators_options \
  294. --performance-tool='[Performance tool to be invoked]:performance tool' \
  295. ': :_guard "^-*" "name"' \
  296. }
  297. _rails_generate_resource() {
  298. local context state line curcontext="$curcontext"
  299. local -a resource_generators_options
  300. __rails_setup_resource_generators_options
  301. _arguments -C \
  302. $resource_generators_options \
  303. '(-c --resource-controller)'{-c,--resource-controller=}'[Resource controller to be invoked]:name' \
  304. '(-a --actions)'{-a,--actions=}'[Actions for the resource controller]: :->actions' \
  305. ': :->name' \
  306. '*: :->fields'
  307. if (( words[(I)(--actions=*|-a)] > 0 && words[(I)(--actions=*|-a)] == words[(I)-*] )); then
  308. state=actions
  309. fi
  310. case "$state" in
  311. actions)
  312. _guard "[[:alnum:]_]#" "actions"
  313. ;;
  314. name)
  315. _guard "^-*" "name"
  316. ;;
  317. fields)
  318. __rails_migration_fields
  319. ;;
  320. esac
  321. }
  322. _rails_generate_scaffold() {
  323. local -a resource_generators_options
  324. __rails_setup_resource_generators_options
  325. _arguments \
  326. $resource_generators_options \
  327. '(-y --stylesheets)'{-y,--stylesheets}'[Generate Stylesheets]: :__rails_boolean' \
  328. '(-se --stylesheet-engine)'{-se,--stylesheet-engine=}'[Engine for Stylesheets]:stylesheet engine' \
  329. '(-c --scaffold-controller)'{-c,--scaffold-controller=}'[Scaffold controller to be invoked]:name' \
  330. --assets'[Indicates when to generate assets]:boolean:(true false)' \
  331. ': :_guard "^-*" "name"' \
  332. '*: :__rails_migration_fields'
  333. }
  334. _rails_generate_scaffold_controller() {
  335. local -a model_generators_options
  336. __rails_setup_model_generators_options
  337. _arguments \
  338. $model_generators_options \
  339. '(-e --template-engine)'{-e,--template-engine=}'[Template engine to be invoked]:template engine' \
  340. '(-t --test-framework)'{-t,--test-framework=}'[Test framework to be invoked]:test framework' \
  341. --helper'[Indicates when to generate helper]: :__rails_boolean' \
  342. ': :_guard "^-*" "name"'
  343. }
  344. _rails_generate_session_migration() {
  345. local -a model_generators_options
  346. __rails_setup_model_generators_options
  347. _arguments \
  348. $model_generators_options \
  349. ': :_guard "^-*" "name"'
  350. }
  351. _rails_generate_task() {
  352. local -a generators_options
  353. __rails_setup_generators_options
  354. _arguments \
  355. $generators_options \
  356. ': :_guard "^-*" "name"' \
  357. '*: :_guard "^-*" "action"'
  358. }
  359. _rails_console() {
  360. _arguments \
  361. '(- *)'{-h,--help}'[Show this help message]' \
  362. '(-s --sandbox)'{-s,--sandbox}'[Rollback database modifications on exit]' \
  363. --debugger'[Enable ruby-debugging for the console]'
  364. }
  365. _rails_c() {
  366. _rails_console
  367. }
  368. _rails_server() {
  369. _arguments \
  370. '(- *)'{-h,--help}'[Show this help message]' \
  371. '(-p --port)'{-p,--port=}'[Runs Rails on the specified port]: :_guard "[[\:digit\:]]#" "port"' \
  372. '(-b --binding)'{-b,--binding=}'[Binds Rails to the specified ip]:ip:_hosts' \
  373. '(-c --config)'{-c,--config=}'[Use custom rackup configuration file]:file:_files -g "*.ru"' \
  374. '(-d --daemon)'{-d,--daemon}'[Make server run as a Daemon]' \
  375. '(-u --debugger)'{-u,--debugger}'[Enable ruby-debugging for the server]' \
  376. '(-e --environment)'{-e,--environment=}'[Specifies the environment to run this server under (test/development/production)]:name:(test development production)' \
  377. '(-P --pid)'{-P,--pid=}'[Specifies the PID file]:pid:_files -g "*.pid"'
  378. }
  379. _rails_s() {
  380. _rails_server
  381. }
  382. _rails_dbconsole() {
  383. _arguments \
  384. '(- *)'--help'[Show this help message]' \
  385. '(-p --include-password)'{-p,--include-password}'[Automatically provide the password from database.yml]' \
  386. --mode'[Automatically put the sqlite3 database in the specified mode (html, list, line, column)]:mode:(html list line column)' \
  387. --header
  388. }
  389. _rails_new() {
  390. local context state line curcontext="$curcontext"
  391. local _a rails_options runtime_options
  392. __rails_setup_rails_options
  393. __rails_setup_runtime_options
  394. _arguments -C \
  395. $rails_options \
  396. $runtime_options \
  397. '(-r --ruby)'{-r,--ruby=}'[Path to the Ruby binary of your choice]:path' \
  398. '(-b --builder)'{-b,--builder=}'[Path to a application builder (can be a filesystem path or URL)]: :->path_or_url' \
  399. '(-m --template)'{-m,--template=}'[Path to an application template (can be a filesystem path or URL)]: :->path_or_url' \
  400. --skip-gemfile"[Don't create a Gemfile]" \
  401. --skip-bundle"[Don't run bundle install]" \
  402. '(-G --skip-git)'{-G,--skip-git}'[Skip Git ignores and keeps]' \
  403. '(-O --skip-active-record)'{-O,--skip-active-record}'[Skip Active Record files]' \
  404. '(-S --skip-sprockets)'{-S,--skip-sprockets}'[Skip Sprockets files]' \
  405. '(-d --database)'{-d,--database=}'[Preconfigure for selected database]:database:(mysql oracle postgresql sqlite3 frontbase ibm_db sqlserver jdbcmysql jdbcsqlite3 jdbcpostgresql jdbc)' \
  406. '(-j --javascript)'{-j,--javascript=}'[Preconfigure for selected JavaScript library]:javascript' \
  407. '(-J --skip-javascript)'{-J,--skip-javascript}'[Skip JavaScript files]' \
  408. --dev'[Setup the application with Gemfile pointing to your Rails checkout]' \
  409. --edge'[Setup the application with Gemfile pointing to Rails repository]' \
  410. '(-T --skip-test-unit)'{-T,--skip-test-unit}'[Skip Test::Unit files]' \
  411. --old-style-hash"[Force using old style hash (:foo => 'bar') on Ruby >= 1.9]" \
  412. ':app path:_directories'
  413. case "$state" in
  414. path_or_url)
  415. _alternative \
  416. 'files:path:_files -g "*.rb"' \
  417. 'url:url:_urls'
  418. ;;
  419. esac
  420. }
  421. _rails_application() {
  422. _rails_new
  423. }
  424. _rails_db() {
  425. _rails_dbconsole
  426. }
  427. _rails_destroy() {
  428. _rails_generate
  429. }
  430. _rails_d() {
  431. _rails_destroy
  432. }
  433. _rails_benchmarker() {
  434. _arguments \
  435. '(- *)'{-h,--help}'[Show this help message]' \
  436. '(-r --runs)'{-r,--runs}'[Number of runs]: :_guard "[[\:digit\:]]#" "number"' \
  437. '(-o --output)'{-o,--output}'[Directory to use when writing the results]:directory:_directories' \
  438. '(-m --metrics)'{-m,--metrics}'[Metrics to use]: :_values -s "," "metrics" "wall_time" "memory" "objects" "gc_runs" "gc_time"' \
  439. '*: :_guard "^-*" "ruby code"'
  440. }
  441. _rails_profiler() {
  442. _arguments \
  443. '(- *)'{-h,--help}'[Show this help message]' \
  444. '(-r --runs)'{-r,--runs}'[Number of runs]: :_guard "[[\:digit\:]]#" "number"' \
  445. '(-o --output)'{-o,--output}'[Directory to use when writing the results]:directory:_directories' \
  446. '(-m --metrics)'{-m,--metrics}'[Metrics to use]: :_values -s "," "metrics" "process_time" "memory" "objects"' \
  447. '(-f --formats)'{-f,--formats}'[Formats to output to]: :_values -s "," "formats" "flat" "graph" "html" "call_tree" "call_stack"' \
  448. '*: :_guard "^-*" "ruby code"'
  449. }
  450. _rails_plugin() {
  451. local context state line curcontext="$curcontext"
  452. if (( CURRENT > 2 )); then
  453. (( CURRENT-- ))
  454. shift words
  455. _call_function - "_rails_plugin_${words[1]}" || _nothing
  456. else
  457. __rails_plugin_commands
  458. fi
  459. }
  460. __rails_plugin_commands() {
  461. _values 'plugin command' \
  462. install'[Install plugin(s) from known repositories or URLs]' \
  463. remove'[Uninstall plugins]' \
  464. new
  465. }
  466. _rails_plugin_install() {
  467. _arguments \
  468. '(-x --externals)'{-x,--externals}'[Use svn:externals to grab the plugin. Enables plugin updates and plugin versioning]' \
  469. '(-o --checkout)'{-o,--checkout}'[Use svn checkout to grab the plugin. Enables updating but does not add a svn:externals entry]' \
  470. '(-e --export)'{-e,--export}'[Use svn export to grab the plugin. Exports the plugin, allowing you to check it into your local repository. Does not enable updates or add an svn:externals entry]' \
  471. '(-q --quiet)'{-q,--quiet}'[Suppresses the output from installation. Ignored if -v is passed (rails plugin -v install ...)]' \
  472. '(-r --revision)'{-r,--revision=}'[Checks out the given revision from subversion or git. Ignored if subversion/git is not used]:revision' \
  473. '(-f --force)'{-f,--force}"[Reinstalls a plugin if it's already installed]" \
  474. '*:plugin:_urls'
  475. }
  476. _rails_plugin_remove() {
  477. local -a plugins
  478. plugins=($(_call_program rails_plugins ls -1 vendor/plugins))
  479. _describe -t plugins 'plugin' plugins
  480. }
  481. _rails_plugin_new() {
  482. _rails_new
  483. }
  484. _rails_runner() {
  485. local context state line curcontext="$curcontext"
  486. _arguments -C \
  487. '(- *)'{-h,--help}'[Show this help message]' \
  488. '(-e --environment)'{-e,--environment=}'[Specifies the environment for the runner to operate under (test/development/production)]:name:(test development production)' \
  489. ': :->code_or_path'
  490. case "$state" in
  491. code_or_path)
  492. _alternative \
  493. 'files:filename:_files -g "*.rb"' \
  494. 'codes:ruby code:_guard "^-*" "ruby code"'
  495. ;;
  496. esac
  497. }
  498. _rails_r() {
  499. _rails_runner
  500. }
  501. _rails_test() {
  502. local context state line curcontext="$curcontext"
  503. _arguments -C \
  504. ': :->path'
  505. case "$state" in
  506. path)
  507. _alternative \
  508. 'files:filename:_files -g "*.rb"'
  509. ;;
  510. esac
  511. }
  512. _rails_t() {
  513. _rails_test
  514. }
  515. _rails "$@"
  516. # Local Variables:
  517. # mode: Shell-Script
  518. # sh-indentation: 2
  519. # indent-tabs-mode: nil
  520. # sh-basic-offset: 2
  521. # End:
  522. # vim: ft=zsh sw=2 ts=2 et