utils 0.0.67 → 0.0.68

Sign up to get free protection for your applications and to get access to all the features.
Files changed (77) hide show
  1. data/VERSION +1 -1
  2. data/bin/edit +3 -1
  3. data/lib/utils/editor.rb +14 -0
  4. data/lib/utils/version.rb +1 -1
  5. data/utils.gemspec +3 -3
  6. metadata +3 -74
  7. data/lib/utils/config/vim/after/syntax/haml.vim +0 -9
  8. data/lib/utils/config/vim/after/syntax/html.vim +0 -11
  9. data/lib/utils/config/vim/autoload/Align.vim +0 -1029
  10. data/lib/utils/config/vim/autoload/AlignMaps.vim +0 -330
  11. data/lib/utils/config/vim/autoload/ctrlp/bookmarkdir.vim +0 -139
  12. data/lib/utils/config/vim/autoload/ctrlp/buffertag.vim +0 -238
  13. data/lib/utils/config/vim/autoload/ctrlp/changes.vim +0 -96
  14. data/lib/utils/config/vim/autoload/ctrlp/dir.vim +0 -90
  15. data/lib/utils/config/vim/autoload/ctrlp/line.vim +0 -63
  16. data/lib/utils/config/vim/autoload/ctrlp/mixed.vim +0 -83
  17. data/lib/utils/config/vim/autoload/ctrlp/mrufiles.vim +0 -119
  18. data/lib/utils/config/vim/autoload/ctrlp/quickfix.vim +0 -62
  19. data/lib/utils/config/vim/autoload/ctrlp/rtscript.vim +0 -49
  20. data/lib/utils/config/vim/autoload/ctrlp/tag.vim +0 -112
  21. data/lib/utils/config/vim/autoload/ctrlp/undo.vim +0 -154
  22. data/lib/utils/config/vim/autoload/ctrlp/utils.vim +0 -72
  23. data/lib/utils/config/vim/autoload/ctrlp.vim +0 -1772
  24. data/lib/utils/config/vim/autoload/rails.vim +0 -4570
  25. data/lib/utils/config/vim/autoload/rubycomplete.vim +0 -801
  26. data/lib/utils/config/vim/autoload/sqlcomplete.vim +0 -741
  27. data/lib/utils/config/vim/autoload/vimball.vim +0 -750
  28. data/lib/utils/config/vim/colors/flori.vim +0 -116
  29. data/lib/utils/config/vim/compiler/coffee.vim +0 -68
  30. data/lib/utils/config/vim/compiler/eruby.vim +0 -40
  31. data/lib/utils/config/vim/compiler/ruby.vim +0 -67
  32. data/lib/utils/config/vim/compiler/rubyunit.vim +0 -34
  33. data/lib/utils/config/vim/doc/Decho.txt +0 -372
  34. data/lib/utils/config/vim/doc/coffee-script.txt +0 -116
  35. data/lib/utils/config/vim/doc/ctrlp.txt +0 -1113
  36. data/lib/utils/config/vim/doc/fugitive.txt +0 -257
  37. data/lib/utils/config/vim/doc/rails.txt +0 -1022
  38. data/lib/utils/config/vim/doc/xml-plugin.txt +0 -226
  39. data/lib/utils/config/vim/ftdetect/coffee.vim +0 -8
  40. data/lib/utils/config/vim/ftdetect/eco.vim +0 -1
  41. data/lib/utils/config/vim/ftdetect/ragel.vim +0 -2
  42. data/lib/utils/config/vim/ftdetect/ruby.vim +0 -17
  43. data/lib/utils/config/vim/ftdetect/slim.vim +0 -2
  44. data/lib/utils/config/vim/ftplugin/coffee.vim +0 -221
  45. data/lib/utils/config/vim/ftplugin/eruby.vim +0 -100
  46. data/lib/utils/config/vim/ftplugin/ruby.vim +0 -260
  47. data/lib/utils/config/vim/ftplugin/xml.vim +0 -941
  48. data/lib/utils/config/vim/indent/IndentAnything_html.vim +0 -35
  49. data/lib/utils/config/vim/indent/coffee.vim +0 -338
  50. data/lib/utils/config/vim/indent/eruby.vim +0 -77
  51. data/lib/utils/config/vim/indent/javascript.vim +0 -116
  52. data/lib/utils/config/vim/indent/ruby.vim +0 -377
  53. data/lib/utils/config/vim/indent/slim.vim +0 -75
  54. data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +0 -242
  55. data/lib/utils/config/vim/plugin/AlignPlugin.vim +0 -41
  56. data/lib/utils/config/vim/plugin/Decho.vim +0 -592
  57. data/lib/utils/config/vim/plugin/IndentAnything.vim +0 -675
  58. data/lib/utils/config/vim/plugin/bufexplorer.vim +0 -1144
  59. data/lib/utils/config/vim/plugin/cecutil.vim +0 -508
  60. data/lib/utils/config/vim/plugin/ctrlp.vim +0 -61
  61. data/lib/utils/config/vim/plugin/fugitive.vim +0 -2041
  62. data/lib/utils/config/vim/plugin/lusty-explorer.vim +0 -1509
  63. data/lib/utils/config/vim/plugin/rails.vim +0 -339
  64. data/lib/utils/config/vim/plugin/rubyextra.vim +0 -193
  65. data/lib/utils/config/vim/plugin/surround.vim +0 -628
  66. data/lib/utils/config/vim/plugin/taglist.vim +0 -4546
  67. data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +0 -131
  68. data/lib/utils/config/vim/plugin/vimballPlugin.vim +0 -40
  69. data/lib/utils/config/vim/syntax/Decho.vim +0 -101
  70. data/lib/utils/config/vim/syntax/coffee.vim +0 -217
  71. data/lib/utils/config/vim/syntax/eco.vim +0 -62
  72. data/lib/utils/config/vim/syntax/eruby.vim +0 -73
  73. data/lib/utils/config/vim/syntax/javascript.vim +0 -246
  74. data/lib/utils/config/vim/syntax/ragel.vim +0 -165
  75. data/lib/utils/config/vim/syntax/ruby.vim +0 -367
  76. data/lib/utils/config/vim/syntax/slim.vim +0 -117
  77. data/lib/utils/config/vimrc +0 -540
@@ -1,4570 +0,0 @@
1
- " autoload/rails.vim
2
- " Author: Tim Pope <http://tpo.pe/>
3
-
4
- " Install this file as autoload/rails.vim.
5
-
6
- if exists('g:autoloaded_rails') || &cp
7
- finish
8
- endif
9
- let g:autoloaded_rails = '4.4'
10
-
11
- let s:cpo_save = &cpo
12
- set cpo&vim
13
-
14
- " Utility Functions {{{1
15
-
16
- let s:app_prototype = {}
17
- let s:file_prototype = {}
18
- let s:buffer_prototype = {}
19
- let s:readable_prototype = {}
20
-
21
- function! s:add_methods(namespace, method_names)
22
- for name in a:method_names
23
- let s:{a:namespace}_prototype[name] = s:function('s:'.a:namespace.'_'.name)
24
- endfor
25
- endfunction
26
-
27
- function! s:function(name)
28
- return function(substitute(a:name,'^s:',matchstr(expand('<sfile>'), '<SNR>\d\+_'),''))
29
- endfunction
30
-
31
- function! s:sub(str,pat,rep)
32
- return substitute(a:str,'\v\C'.a:pat,a:rep,'')
33
- endfunction
34
-
35
- function! s:gsub(str,pat,rep)
36
- return substitute(a:str,'\v\C'.a:pat,a:rep,'g')
37
- endfunction
38
-
39
- function! s:startswith(string,prefix)
40
- return strpart(a:string, 0, strlen(a:prefix)) ==# a:prefix
41
- endfunction
42
-
43
- function! s:compact(ary)
44
- return s:sub(s:sub(s:gsub(a:ary,'\n\n+','\n'),'\n$',''),'^\n','')
45
- endfunction
46
-
47
- function! s:uniq(list)
48
- let seen = {}
49
- let i = 0
50
- while i < len(a:list)
51
- if has_key(seen,a:list[i])
52
- call remove(a:list, i)
53
- else
54
- let seen[a:list[i]] = 1
55
- let i += 1
56
- endif
57
- endwhile
58
- return a:list
59
- endfunction
60
-
61
- function! s:scrub(collection,item)
62
- " Removes item from a newline separated collection
63
- let col = "\n" . a:collection
64
- let idx = stridx(col,"\n".a:item."\n")
65
- let cnt = 0
66
- while idx != -1 && cnt < 100
67
- let col = strpart(col,0,idx).strpart(col,idx+strlen(a:item)+1)
68
- let idx = stridx(col,"\n".a:item."\n")
69
- let cnt += 1
70
- endwhile
71
- return strpart(col,1)
72
- endfunction
73
-
74
- function! s:escarg(p)
75
- return s:gsub(a:p,'[ !%#]','\\&')
76
- endfunction
77
-
78
- function! s:esccmd(p)
79
- return s:gsub(a:p,'[!%#]','\\&')
80
- endfunction
81
-
82
- function! s:rquote(str)
83
- " Imperfect but adequate for Ruby arguments
84
- if a:str =~ '^[A-Za-z0-9_/.:-]\+$'
85
- return a:str
86
- elseif &shell =~? 'cmd'
87
- return '"'.s:gsub(s:gsub(a:str,'\','\\'),'"','\\"').'"'
88
- else
89
- return "'".s:gsub(s:gsub(a:str,'\','\\'),"'","'\\\\''")."'"
90
- endif
91
- endfunction
92
-
93
- function! s:sname()
94
- return fnamemodify(s:file,':t:r')
95
- endfunction
96
-
97
- function! s:pop_command()
98
- if exists("s:command_stack") && len(s:command_stack) > 0
99
- exe remove(s:command_stack,-1)
100
- endif
101
- endfunction
102
-
103
- function! s:push_chdir(...)
104
- if !exists("s:command_stack") | let s:command_stack = [] | endif
105
- if exists("b:rails_root") && (a:0 ? getcwd() !=# rails#app().path() : !s:startswith(getcwd(), rails#app().path()))
106
- let chdir = exists("*haslocaldir") && haslocaldir() ? "lchdir " : "chdir "
107
- call add(s:command_stack,chdir.s:escarg(getcwd()))
108
- exe chdir.s:escarg(rails#app().path())
109
- else
110
- call add(s:command_stack,"")
111
- endif
112
- endfunction
113
-
114
- function! s:app_path(...) dict
115
- return join([self.root]+a:000,'/')
116
- endfunction
117
-
118
- function! s:app_has_file(file) dict
119
- return filereadable(self.path(a:file))
120
- endfunction
121
-
122
- function! s:app_find_file(name, ...) dict abort
123
- let trim = strlen(self.path())+1
124
- if a:0
125
- let path = s:pathjoin(map(s:pathsplit(a:1),'self.path(v:val)'))
126
- else
127
- let path = s:pathjoin([self.path()])
128
- endif
129
- let suffixesadd = s:pathjoin(get(a:000,1,&suffixesadd))
130
- let default = get(a:000,2,'')
131
- let oldsuffixesadd = &l:suffixesadd
132
- try
133
- let &suffixesadd = suffixesadd
134
- " Versions before 7.1.256 returned directories from findfile
135
- if type(default) == type(0) && (v:version < 702 || default == -1)
136
- let all = findfile(a:name,path,-1)
137
- if v:version < 702
138
- call filter(all,'!isdirectory(v:val)')
139
- endif
140
- call map(all,'s:gsub(strpart(fnamemodify(v:val,":p"),trim),"\\\\","/")')
141
- return default < 0 ? all : get(all,default-1,'')
142
- elseif type(default) == type(0)
143
- let found = findfile(a:name,path,default)
144
- else
145
- let i = 1
146
- let found = findfile(a:name,path)
147
- while v:version < 702 && found != "" && isdirectory(found)
148
- let i += 1
149
- let found = findfile(a:name,path,i)
150
- endwhile
151
- endif
152
- return found == "" ? default : s:gsub(strpart(fnamemodify(found,':p'),trim),'\\','/')
153
- finally
154
- let &l:suffixesadd = oldsuffixesadd
155
- endtry
156
- endfunction
157
-
158
- call s:add_methods('app',['path','has_file','find_file'])
159
-
160
- " Split a path into a list. From pathogen.vim
161
- function! s:pathsplit(path) abort
162
- if type(a:path) == type([]) | return copy(a:path) | endif
163
- let split = split(a:path,'\\\@<!\%(\\\\\)*\zs,')
164
- return map(split,'substitute(v:val,''\\\([\\, ]\)'',''\1'',"g")')
165
- endfunction
166
-
167
- " Convert a list to a path. From pathogen.vim
168
- function! s:pathjoin(...) abort
169
- let i = 0
170
- let path = ""
171
- while i < a:0
172
- if type(a:000[i]) == type([])
173
- let list = a:000[i]
174
- let j = 0
175
- while j < len(list)
176
- let escaped = substitute(list[j],'[\\, ]','\\&','g')
177
- if exists("+shellslash") && !&shellslash
178
- let escaped = substitute(escaped,'^\(\w:\\\)\\','\1','')
179
- endif
180
- let path .= ',' . escaped
181
- let j += 1
182
- endwhile
183
- else
184
- let path .= "," . a:000[i]
185
- endif
186
- let i += 1
187
- endwhile
188
- return substitute(path,'^,','','')
189
- endfunction
190
-
191
- function! s:readable_end_of(lnum) dict abort
192
- if a:lnum == 0
193
- return 0
194
- endif
195
- if self.name() =~# '\.yml$'
196
- return -1
197
- endif
198
- let cline = self.getline(a:lnum)
199
- let spc = matchstr(cline,'^\s*')
200
- let endpat = '\<end\>'
201
- if matchstr(self.getline(a:lnum+1),'^'.spc) && !matchstr(self.getline(a:lnum+1),'^'.spc.endpat) && matchstr(cline,endpat)
202
- return a:lnum
203
- endif
204
- let endl = a:lnum
205
- while endl <= self.line_count()
206
- let endl += 1
207
- if self.getline(endl) =~ '^'.spc.endpat
208
- return endl
209
- elseif self.getline(endl) =~ '^=begin\>'
210
- while self.getline(endl) !~ '^=end\>' && endl <= self.line_count()
211
- let endl += 1
212
- endwhile
213
- let endl += 1
214
- elseif self.getline(endl) !~ '^'.spc && self.getline(endl) !~ '^\s*\%(#.*\)\=$'
215
- return 0
216
- endif
217
- endwhile
218
- return 0
219
- endfunction
220
-
221
- function! s:endof(lnum)
222
- return rails#buffer().end_of(a:lnum)
223
- endfunction
224
-
225
- function! s:readable_last_opening_line(start,pattern,limit) dict abort
226
- let line = a:start
227
- while line > a:limit && self.getline(line) !~ a:pattern
228
- let line -= 1
229
- endwhile
230
- let lend = self.end_of(line)
231
- if line > a:limit && (lend < 0 || lend >= a:start)
232
- return line
233
- else
234
- return -1
235
- endif
236
- endfunction
237
-
238
- function! s:lastopeningline(pattern,limit,start)
239
- return rails#buffer().last_opening_line(a:start,a:pattern,a:limit)
240
- endfunction
241
-
242
- function! s:readable_define_pattern() dict abort
243
- if self.name() =~ '\.yml$'
244
- return '^\%(\h\k*:\)\@='
245
- endif
246
- let define = '^\s*def\s\+\(self\.\)\='
247
- if self.name() =~# '\.rake$'
248
- let define .= "\\\|^\\s*\\%(task\\\|file\\)\\s\\+[:'\"]"
249
- endif
250
- if self.name() =~# '/schema\.rb$'
251
- let define .= "\\\|^\\s*create_table\\s\\+[:'\"]"
252
- endif
253
- if self.type_name('test')
254
- let define .= '\|^\s*test\s*[''"]'
255
- endif
256
- return define
257
- endfunction
258
-
259
- function! s:readable_last_method_line(start) dict abort
260
- return self.last_opening_line(a:start,self.define_pattern(),0)
261
- endfunction
262
-
263
- function! s:lastmethodline(start)
264
- return rails#buffer().last_method_line(a:start)
265
- endfunction
266
-
267
- function! s:readable_last_method(start) dict abort
268
- let lnum = self.last_method_line(a:start)
269
- let line = self.getline(lnum)
270
- if line =~# '^\s*test\s*\([''"]\).*\1'
271
- let string = matchstr(line,'^\s*\w\+\s*\([''"]\)\zs.*\ze\1')
272
- return 'test_'.s:gsub(string,' +','_')
273
- elseif lnum
274
- return s:sub(matchstr(line,'\%('.self.define_pattern().'\)\zs\h\%(\k\|[:.]\)*[?!=]\='),':$','')
275
- else
276
- return ""
277
- endif
278
- endfunction
279
-
280
- function! s:lastmethod(...)
281
- return rails#buffer().last_method(a:0 ? a:1 : line("."))
282
- endfunction
283
-
284
- function! s:readable_last_format(start) dict abort
285
- if self.type_name('view')
286
- let format = fnamemodify(self.path(),':r:e')
287
- if format == ''
288
- return get({'rhtml': 'html', 'rxml': 'xml', 'rjs': 'js', 'haml': 'html'},fnamemodify(self.path(),':e'),'')
289
- else
290
- return format
291
- endif
292
- endif
293
- let rline = self.last_opening_line(a:start,'\C^\s*\%(mail\>.*\|respond_to\)\s*\%(\<do\|{\)\s*|\zs\h\k*\ze|',self.last_method_line(a:start))
294
- if rline
295
- let variable = matchstr(self.getline(rline),'\C^\s*\%(mail\>.*\|respond_to\)\s*\%(\<do\|{\)\s*|\zs\h\k*\ze|')
296
- let line = a:start
297
- while line > rline
298
- let match = matchstr(self.getline(line),'\C^\s*'.variable.'\s*\.\s*\zs\h\k*')
299
- if match != ''
300
- return match
301
- endif
302
- let line -= 1
303
- endwhile
304
- endif
305
- return ""
306
- endfunction
307
-
308
- function! s:lastformat(start)
309
- return rails#buffer().last_format(a:start)
310
- endfunction
311
-
312
- function! s:format(...)
313
- let format = rails#buffer().last_format(a:0 > 1 ? a:2 : line("."))
314
- return format ==# '' && a:0 ? a:1 : format
315
- endfunction
316
-
317
- call s:add_methods('readable',['end_of','last_opening_line','last_method_line','last_method','last_format','define_pattern'])
318
-
319
- let s:view_types = split('rhtml,erb,rxml,builder,rjs,mab,liquid,haml,dryml,mn,slim',',')
320
-
321
- function! s:viewspattern()
322
- return '\%('.join(s:view_types,'\|').'\)'
323
- endfunction
324
-
325
- function! s:controller(...)
326
- return rails#buffer().controller_name(a:0 ? a:1 : 0)
327
- endfunction
328
-
329
- function! s:readable_controller_name(...) dict abort
330
- let f = self.name()
331
- if has_key(self,'getvar') && self.getvar('rails_controller') != ''
332
- return self.getvar('rails_controller')
333
- elseif f =~ '\<app/views/layouts/'
334
- return s:sub(f,'.*<app/views/layouts/(.{-})\..*','\1')
335
- elseif f =~ '\<app/views/'
336
- return s:sub(f,'.*<app/views/(.{-})/\k+\.\k+%(\.\k+)=$','\1')
337
- elseif f =~ '\<app/helpers/.*_helper\.rb$'
338
- return s:sub(f,'.*<app/helpers/(.{-})_helper\.rb$','\1')
339
- elseif f =~ '\<app/controllers/.*\.rb$'
340
- return s:sub(f,'.*<app/controllers/(.{-})%(_controller)=\.rb$','\1')
341
- elseif f =~ '\<app/mailers/.*\.rb$'
342
- return s:sub(f,'.*<app/mailers/(.{-})\.rb$','\1')
343
- elseif f =~ '\<app/apis/.*_api\.rb$'
344
- return s:sub(f,'.*<app/apis/(.{-})_api\.rb$','\1')
345
- elseif f =~ '\<test/functional/.*_test\.rb$'
346
- return s:sub(f,'.*<test/functional/(.{-})%(_controller)=_test\.rb$','\1')
347
- elseif f =~ '\<test/unit/helpers/.*_helper_test\.rb$'
348
- return s:sub(f,'.*<test/unit/helpers/(.{-})_helper_test\.rb$','\1')
349
- elseif f =~ '\<spec/controllers/.*_spec\.rb$'
350
- return s:sub(f,'.*<spec/controllers/(.{-})%(_controller)=_spec\.rb$','\1')
351
- elseif f =~ '\<spec/helpers/.*_helper_spec\.rb$'
352
- return s:sub(f,'.*<spec/helpers/(.{-})_helper_spec\.rb$','\1')
353
- elseif f =~ '\<spec/views/.*/\w\+_view_spec\.rb$'
354
- return s:sub(f,'.*<spec/views/(.{-})/\w+_view_spec\.rb$','\1')
355
- elseif f =~ '\<components/.*_controller\.rb$'
356
- return s:sub(f,'.*<components/(.{-})_controller\.rb$','\1')
357
- elseif f =~ '\<components/.*\.'.s:viewspattern().'$'
358
- return s:sub(f,'.*<components/(.{-})/\k+\.\k+$','\1')
359
- elseif f =~ '\<app/models/.*\.rb$' && self.type_name('mailer')
360
- return s:sub(f,'.*<app/models/(.{-})\.rb$','\1')
361
- elseif f =~ '\<\%(public\|app/assets\)/stylesheets/.*\.css\%(\.\w\+\)\=$'
362
- return s:sub(f,'.*<%(public|app/assets)/stylesheets/(.{-})\.css%(\.\w+)=$','\1')
363
- elseif f =~ '\<\%(public\|app/assets\)/javascripts/.*\.js\%(\.\w\+\)\=$'
364
- return s:sub(f,'.*<%(public|app/assets)/javascripts/(.{-})\.js%(\.\w+)=$','\1')
365
- elseif a:0 && a:1
366
- return rails#pluralize(self.model_name())
367
- endif
368
- return ""
369
- endfunction
370
-
371
- function! s:model(...)
372
- return rails#buffer().model_name(a:0 ? a:1 : 0)
373
- endfunction
374
-
375
- function! s:readable_model_name(...) dict abort
376
- let f = self.name()
377
- if has_key(self,'getvar') && self.getvar('rails_model') != ''
378
- return self.getvar('rails_model')
379
- elseif f =~ '\<app/models/.*_observer.rb$'
380
- return s:sub(f,'.*<app/models/(.*)_observer\.rb$','\1')
381
- elseif f =~ '\<app/models/.*\.rb$'
382
- return s:sub(f,'.*<app/models/(.*)\.rb$','\1')
383
- elseif f =~ '\<test/unit/.*_observer_test\.rb$'
384
- return s:sub(f,'.*<test/unit/(.*)_observer_test\.rb$','\1')
385
- elseif f =~ '\<test/unit/.*_test\.rb$'
386
- return s:sub(f,'.*<test/unit/(.*)_test\.rb$','\1')
387
- elseif f =~ '\<spec/models/.*_spec\.rb$'
388
- return s:sub(f,'.*<spec/models/(.*)_spec\.rb$','\1')
389
- elseif f =~ '\<\%(test\|spec\)/fixtures/.*\.\w*\~\=$'
390
- return rails#singularize(s:sub(f,'.*<%(test|spec)/fixtures/(.*)\.\w*\~=$','\1'))
391
- elseif f =~ '\<\%(test\|spec\)/blueprints/.*\.rb$'
392
- return s:sub(f,'.*<%(test|spec)/blueprints/(.{-})%(_blueprint)=\.rb$','\1')
393
- elseif f =~ '\<\%(test\|spec\)/exemplars/.*_exemplar\.rb$'
394
- return s:sub(f,'.*<%(test|spec)/exemplars/(.*)_exemplar\.rb$','\1')
395
- elseif f =~ '\<\%(test/\|spec/\)\=factories/.*\.rb$'
396
- return s:sub(f,'.*<%(test/|spec/)=factories/(.{-})%(_factory)=\.rb$','\1')
397
- elseif f =~ '\<\%(test/\|spec/\)\=fabricators/.*\.rb$'
398
- return s:sub(f,'.*<%(test/|spec/)=fabricators/(.{-})%(_fabricator)=\.rb$','\1')
399
- elseif a:0 && a:1
400
- return rails#singularize(self.controller_name())
401
- endif
402
- return ""
403
- endfunction
404
-
405
- call s:add_methods('readable',['controller_name','model_name'])
406
-
407
- function! s:readfile(path,...)
408
- let nr = bufnr('^'.a:path.'$')
409
- if nr < 0 && exists('+shellslash') && ! &shellslash
410
- let nr = bufnr('^'.s:gsub(a:path,'/','\\').'$')
411
- endif
412
- if bufloaded(nr)
413
- return getbufline(nr,1,a:0 ? a:1 : '$')
414
- elseif !filereadable(a:path)
415
- return []
416
- elseif a:0
417
- return readfile(a:path,'',a:1)
418
- else
419
- return readfile(a:path)
420
- endif
421
- endfunction
422
-
423
- function! s:file_lines() dict abort
424
- let ftime = getftime(self.path)
425
- if ftime > get(self,last_lines_ftime,0)
426
- let self.last_lines = readfile(self.path())
427
- let self.last_lines_ftime = ftime
428
- endif
429
- return get(self,'last_lines',[])
430
- endfunction
431
-
432
- function! s:file_getline(lnum,...) dict abort
433
- if a:0
434
- return self.lines[lnum-1 : a:1-1]
435
- else
436
- return self.lines[lnum-1]
437
- endif
438
- endfunction
439
-
440
- function! s:buffer_lines() dict abort
441
- return self.getline(1,'$')
442
- endfunction
443
-
444
- function! s:buffer_getline(...) dict abort
445
- if a:0 == 1
446
- return get(call('getbufline',[self.number()]+a:000),0,'')
447
- else
448
- return call('getbufline',[self.number()]+a:000)
449
- endif
450
- endfunction
451
-
452
- function! s:readable_line_count() dict abort
453
- return len(self.lines())
454
- endfunction
455
-
456
- function! s:environment()
457
- if exists('$RAILS_ENV')
458
- return $RAILS_ENV
459
- else
460
- return "development"
461
- endif
462
- endfunction
463
-
464
- function! s:Complete_environments(...)
465
- return s:completion_filter(rails#app().environments(),a:0 ? a:1 : "")
466
- endfunction
467
-
468
- function! s:warn(str)
469
- echohl WarningMsg
470
- echomsg a:str
471
- echohl None
472
- " Sometimes required to flush output
473
- echo ""
474
- let v:warningmsg = a:str
475
- endfunction
476
-
477
- function! s:error(str)
478
- echohl ErrorMsg
479
- echomsg a:str
480
- echohl None
481
- let v:errmsg = a:str
482
- endfunction
483
-
484
- function! s:debug(str)
485
- if exists("g:rails_debug") && g:rails_debug
486
- echohl Debug
487
- echomsg a:str
488
- echohl None
489
- endif
490
- endfunction
491
-
492
- function! s:buffer_getvar(varname) dict abort
493
- return getbufvar(self.number(),a:varname)
494
- endfunction
495
-
496
- function! s:buffer_setvar(varname, val) dict abort
497
- return setbufvar(self.number(),a:varname,a:val)
498
- endfunction
499
-
500
- call s:add_methods('buffer',['getvar','setvar'])
501
-
502
- " }}}1
503
- " "Public" Interface {{{1
504
-
505
- " RailsRoot() is the only official public function
506
-
507
- function! rails#underscore(str)
508
- let str = s:gsub(a:str,'::','/')
509
- let str = s:gsub(str,'(\u+)(\u\l)','\1_\2')
510
- let str = s:gsub(str,'(\l|\d)(\u)','\1_\2')
511
- let str = tolower(str)
512
- return str
513
- endfunction
514
-
515
- function! rails#camelize(str)
516
- let str = s:gsub(a:str,'/(.=)','::\u\1')
517
- let str = s:gsub(str,'%([_-]|<)(.)','\u\1')
518
- return str
519
- endfunction
520
-
521
- function! rails#singularize(word)
522
- " Probably not worth it to be as comprehensive as Rails but we can
523
- " still hit the common cases.
524
- let word = a:word
525
- if word =~? '\.js$' || word == ''
526
- return word
527
- endif
528
- let word = s:sub(word,'eople$','ersons')
529
- let word = s:sub(word,'%([Mm]ov|[aeio])@<!ies$','ys')
530
- let word = s:sub(word,'xe[ns]$','xs')
531
- let word = s:sub(word,'ves$','fs')
532
- let word = s:sub(word,'ss%(es)=$','sss')
533
- let word = s:sub(word,'s$','')
534
- let word = s:sub(word,'%([nrt]ch|tatus|lias)\zse$','')
535
- let word = s:sub(word,'%(nd|rt)\zsice$','ex')
536
- return word
537
- endfunction
538
-
539
- function! rails#pluralize(word)
540
- let word = a:word
541
- if word == ''
542
- return word
543
- endif
544
- let word = s:sub(word,'[aeio]@<!y$','ie')
545
- let word = s:sub(word,'%(nd|rt)@<=ex$','ice')
546
- let word = s:sub(word,'%([osxz]|[cs]h)$','&e')
547
- let word = s:sub(word,'f@<!f$','ve')
548
- let word .= 's'
549
- let word = s:sub(word,'ersons$','eople')
550
- return word
551
- endfunction
552
-
553
- function! rails#app(...)
554
- let root = a:0 ? a:1 : RailsRoot()
555
- " TODO: populate dynamically
556
- " TODO: normalize path
557
- return get(s:apps,root,0)
558
- endfunction
559
-
560
- function! rails#buffer(...)
561
- return extend(extend({'#': bufnr(a:0 ? a:1 : '%')},s:buffer_prototype,'keep'),s:readable_prototype,'keep')
562
- endif
563
- endfunction
564
-
565
- function! s:buffer_app() dict abort
566
- if self.getvar('rails_root') != ''
567
- return rails#app(self.getvar('rails_root'))
568
- else
569
- return 0
570
- endif
571
- endfunction
572
-
573
- function! s:readable_app() dict abort
574
- return self._app
575
- endfunction
576
-
577
- function! RailsRevision()
578
- return 1000*matchstr(g:autoloaded_rails,'^\d\+')+matchstr(g:autoloaded_rails,'[1-9]\d*$')
579
- endfunction
580
-
581
- function! RailsRoot()
582
- if exists("b:rails_root")
583
- return b:rails_root
584
- else
585
- return ""
586
- endif
587
- endfunction
588
-
589
- function! s:app_file(name)
590
- return extend(extend({'_app': self, '_name': a:name}, s:file_prototype,'keep'),s:readable_prototype,'keep')
591
- endfunction
592
-
593
- function! s:file_path() dict abort
594
- return self.app().path(self._name)
595
- endfunction
596
-
597
- function! s:file_name() dict abort
598
- return self._name
599
- endfunction
600
-
601
- function! s:buffer_number() dict abort
602
- return self['#']
603
- endfunction
604
-
605
- function! s:buffer_path() dict abort
606
- return s:gsub(fnamemodify(bufname(self.number()),':p'),'\\ @!','/')
607
- endfunction
608
-
609
- function! s:buffer_name() dict abort
610
- let app = self.app()
611
- let f = s:gsub(fnamemodify(bufname(self.number()),':p'),'\\ @!','/')
612
- let f = s:sub(f,'/$','')
613
- let sep = matchstr(f,'^[^\\/]\{3,\}\zs[\\/]')
614
- if sep != ""
615
- let f = getcwd().sep.f
616
- endif
617
- if s:startswith(tolower(f),s:gsub(tolower(app.path()),'\\ @!','/')) || f == ""
618
- return strpart(f,strlen(app.path())+1)
619
- else
620
- if !exists("s:path_warn")
621
- let s:path_warn = 1
622
- call s:warn("File ".f." does not appear to be under the Rails root ".self.app().path().". Please report to the rails.vim author!")
623
- endif
624
- return f
625
- endif
626
- endfunction
627
-
628
- function! RailsFilePath()
629
- if !exists("b:rails_root")
630
- return ""
631
- else
632
- return rails#buffer().name()
633
- endif
634
- endfunction
635
-
636
- function! RailsFile()
637
- return RailsFilePath()
638
- endfunction
639
-
640
- function! RailsFileType()
641
- if !exists("b:rails_root")
642
- return ""
643
- else
644
- return rails#buffer().type_name()
645
- end
646
- endfunction
647
-
648
- function! s:readable_calculate_file_type() dict abort
649
- let f = self.name()
650
- let e = fnamemodify(f,':e')
651
- let r = "-"
652
- let full_path = self.path()
653
- let nr = bufnr('^'.full_path.'$')
654
- if nr < 0 && exists('+shellslash') && ! &shellslash
655
- let nr = bufnr('^'.s:gsub(full_path,'/','\\').'$')
656
- endif
657
- if f == ""
658
- let r = f
659
- elseif nr > 0 && getbufvar(nr,'rails_file_type') != ''
660
- return getbufvar(nr,'rails_file_type')
661
- elseif f =~ '_controller\.rb$' || f =~ '\<app/controllers/.*\.rb$'
662
- if join(s:readfile(full_path,50),"\n") =~ '\<wsdl_service_name\>'
663
- let r = "controller-api"
664
- else
665
- let r = "controller"
666
- endif
667
- elseif f =~ '_api\.rb'
668
- let r = "api"
669
- elseif f =~ '\<test/test_helper\.rb$'
670
- let r = "test"
671
- elseif f =~ '\<spec/spec_helper\.rb$'
672
- let r = "spec"
673
- elseif f =~ '_helper\.rb$'
674
- let r = "helper"
675
- elseif f =~ '\<app/metal/.*\.rb$'
676
- let r = "metal"
677
- elseif f =~ '\<app/mailers/.*\.rb'
678
- let r = "mailer"
679
- elseif f =~ '\<app/models/'
680
- let top = join(s:readfile(full_path,50),"\n")
681
- let class = matchstr(top,'\<Acti\w\w\u\w\+\%(::\h\w*\)\+\>')
682
- if class == "ActiveResource::Base"
683
- let class = "ares"
684
- let r = "model-ares"
685
- elseif class == 'ActionMailer::Base'
686
- let r = "mailer"
687
- elseif class != ''
688
- let class = tolower(s:gsub(class,'[^A-Z]',''))
689
- let r = "model-".class
690
- elseif f =~ '_mailer\.rb$'
691
- let r = "mailer"
692
- elseif top =~ '\<\%(validates_\w\+_of\|set_\%(table_name\|primary_key\)\|has_one\|has_many\|belongs_to\)\>'
693
- let r = "model-arb"
694
- else
695
- let r = "model"
696
- endif
697
- elseif f =~ '\<app/views/layouts\>.*\.'
698
- let r = "view-layout-" . e
699
- elseif f =~ '\<\%(app/views\|components\)/.*/_\k\+\.\k\+\%(\.\k\+\)\=$'
700
- let r = "view-partial-" . e
701
- elseif f =~ '\<app/views\>.*\.' || f =~ '\<components/.*/.*\.'.s:viewspattern().'$'
702
- let r = "view-" . e
703
- elseif f =~ '\<test/unit/.*_test\.rb$'
704
- let r = "test-unit"
705
- elseif f =~ '\<test/functional/.*_test\.rb$'
706
- let r = "test-functional"
707
- elseif f =~ '\<test/integration/.*_test\.rb$'
708
- let r = "test-integration"
709
- elseif f =~ '\<spec/lib/.*_spec\.rb$'
710
- let r = 'spec-lib'
711
- elseif f =~ '\<lib/.*\.rb$'
712
- let r = 'lib'
713
- elseif f =~ '\<spec/\w*s/.*_spec\.rb$'
714
- let r = s:sub(f,'.*<spec/(\w*)s/.*','spec-\1')
715
- elseif f =~ '\<features/.*\.feature$'
716
- let r = 'cucumber-feature'
717
- elseif f =~ '\<features/step_definitions/.*_steps\.rb$'
718
- let r = 'cucumber-steps'
719
- elseif f =~ '\<features/.*\.rb$'
720
- let r = 'cucumber'
721
- elseif f =~ '\<\%(test\|spec\)/fixtures\>'
722
- if e == "yml"
723
- let r = "fixtures-yaml"
724
- else
725
- let r = "fixtures" . (e == "" ? "" : "-" . e)
726
- endif
727
- elseif f =~ '\<test/.*_test\.rb'
728
- let r = "test"
729
- elseif f =~ '\<spec/.*_spec\.rb'
730
- let r = "spec"
731
- elseif f =~ '\<spec/support/.*\.rb'
732
- let r = "spec"
733
- elseif f =~ '\<db/migrate\>'
734
- let r = "db-migration"
735
- elseif f=~ '\<db/schema\.rb$'
736
- let r = "db-schema"
737
- elseif f =~ '\<vendor/plugins/.*/recipes/.*\.rb$' || f =~ '\.rake$' || f =~ '\<\%(Rake\|Cap\)file$' || f =~ '\<config/deploy\.rb$'
738
- let r = "task"
739
- elseif f =~ '\<log/.*\.log$'
740
- let r = "log"
741
- elseif e == "css" || e =~ "s[ac]ss" || e == "less"
742
- let r = "stylesheet-".e
743
- elseif e == "js"
744
- let r = "javascript"
745
- elseif e == "coffee"
746
- let r = "javascript-coffee"
747
- elseif e == "html"
748
- let r = e
749
- elseif f =~ '\<config/routes\>.*\.rb$'
750
- let r = "config-routes"
751
- elseif f =~ '\<config/'
752
- let r = "config"
753
- endif
754
- return r
755
- endfunction
756
-
757
- function! s:buffer_type_name(...) dict abort
758
- let type = getbufvar(self.number(),'rails_cached_file_type')
759
- if type == ''
760
- let type = self.calculate_file_type()
761
- endif
762
- return call('s:match_type',[type == '-' ? '' : type] + a:000)
763
- endfunction
764
-
765
- function! s:readable_type_name() dict abort
766
- let type = self.calculate_file_type()
767
- return call('s:match_type',[type == '-' ? '' : type] + a:000)
768
- endfunction
769
-
770
- function! s:match_type(type,...)
771
- if a:0
772
- return !empty(filter(copy(a:000),'a:type =~# "^".v:val."\\%(-\\|$\\)"'))
773
- else
774
- return a:type
775
- endif
776
- endfunction
777
-
778
- function! s:app_environments() dict
779
- if self.cache.needs('environments')
780
- call self.cache.set('environments',self.relglob('config/environments/','**/*','.rb'))
781
- endif
782
- return copy(self.cache.get('environments'))
783
- endfunction
784
-
785
- function! s:app_default_locale() dict abort
786
- if self.cache.needs('default_locale')
787
- let candidates = map(filter(s:readfile(self.path('config/environment.rb')),'v:val =~ "^ *config.i18n.default_locale = :[\"'']\\=[A-Za-z-]\\+[\"'']\\= *$"'),'matchstr(v:val,"[A-Za-z-]\\+[\"'']\\= *$")')
788
- call self.cache.set('default_locale',get(candidates,0,'en'))
789
- endif
790
- return self.cache.get('default_locale')
791
- endfunction
792
-
793
- function! s:app_has(feature) dict
794
- let map = {
795
- \'test': 'test/',
796
- \'spec': 'spec/',
797
- \'cucumber': 'features/',
798
- \'sass': 'public/stylesheets/sass/',
799
- \'lesscss': 'app/stylesheets/',
800
- \'coffee': 'app/scripts/'}
801
- if self.cache.needs('features')
802
- call self.cache.set('features',{})
803
- endif
804
- let features = self.cache.get('features')
805
- if !has_key(features,a:feature)
806
- let path = get(map,a:feature,a:feature.'/')
807
- let features[a:feature] = isdirectory(rails#app().path(path))
808
- endif
809
- return features[a:feature]
810
- endfunction
811
-
812
- " Returns the subset of ['test', 'spec', 'cucumber'] present on the app.
813
- function! s:app_test_suites() dict
814
- return filter(['test','spec','cucumber'],'self.has(v:val)')
815
- endfunction
816
-
817
- call s:add_methods('app',['default_locale','environments','file','has','test_suites'])
818
- call s:add_methods('file',['path','name','lines','getline'])
819
- call s:add_methods('buffer',['app','number','path','name','lines','getline','type_name'])
820
- call s:add_methods('readable',['app','calculate_file_type','type_name','line_count'])
821
-
822
- " }}}1
823
- " Ruby Execution {{{1
824
-
825
- function! s:app_ruby_shell_command(cmd) dict abort
826
- if self.path() =~ '://'
827
- return "ruby ".a:cmd
828
- else
829
- return "ruby -C ".s:rquote(self.path())." ".a:cmd
830
- endif
831
- endfunction
832
-
833
- function! s:app_script_shell_command(cmd) dict abort
834
- if self.has_file('script/rails') && a:cmd !~# '^rails\>'
835
- let cmd = 'script/rails '.a:cmd
836
- else
837
- let cmd = 'script/'.a:cmd
838
- endif
839
- return self.ruby_shell_command(cmd)
840
- endfunction
841
-
842
- function! s:app_background_script_command(cmd) dict abort
843
- let cmd = s:esccmd(self.script_shell_command(a:cmd))
844
- if has_key(self,'options') && has_key(self.options,'gnu_screen')
845
- let screen = self.options.gnu_screen
846
- else
847
- let screen = g:rails_gnu_screen
848
- endif
849
- if has("gui_win32")
850
- if &shellcmdflag == "-c" && ($PATH . &shell) =~? 'cygwin'
851
- silent exe "!cygstart -d ".s:rquote(self.path())." ruby ".a:cmd
852
- else
853
- exe "!start ".cmd
854
- endif
855
- elseif exists("$STY") && !has("gui_running") && screen && executable("screen")
856
- silent exe "!screen -ln -fn -t ".s:sub(s:sub(a:cmd,'\s.*',''),'^%(script|-rcommand)/','rails-').' '.cmd
857
- elseif exists("$TMUX") && !has("gui_running") && screen && executable("tmux")
858
- silent exe '!tmux new-window -d -n "'.s:sub(s:sub(a:cmd,'\s.*',''),'^%(script|-rcommand)/','rails-').'" "'.cmd.'"'
859
- else
860
- exe "!".cmd
861
- endif
862
- return v:shell_error
863
- endfunction
864
-
865
- function! s:app_execute_script_command(cmd) dict abort
866
- exe '!'.s:esccmd(self.script_shell_command(a:cmd))
867
- return v:shell_error
868
- endfunction
869
-
870
- function! s:app_lightweight_ruby_eval(ruby,...) dict abort
871
- let def = a:0 ? a:1 : ""
872
- if !executable("ruby")
873
- return def
874
- endif
875
- let args = '-e '.s:rquote('begin; require %{rubygems}; rescue LoadError; end; begin; require %{active_support}; rescue LoadError; end; '.a:ruby)
876
- let cmd = self.ruby_shell_command(args)
877
- " If the shell is messed up, this command could cause an error message
878
- silent! let results = system(cmd)
879
- return v:shell_error == 0 ? results : def
880
- endfunction
881
-
882
- function! s:app_eval(ruby,...) dict abort
883
- let def = a:0 ? a:1 : ""
884
- if !executable("ruby")
885
- return def
886
- endif
887
- let args = "-r./config/boot -r ".s:rquote(self.path("config/environment"))." -e ".s:rquote(a:ruby)
888
- let cmd = self.ruby_shell_command(args)
889
- " If the shell is messed up, this command could cause an error message
890
- silent! let results = system(cmd)
891
- return v:shell_error == 0 ? results : def
892
- endfunction
893
-
894
- call s:add_methods('app', ['ruby_shell_command','script_shell_command','execute_script_command','background_script_command','lightweight_ruby_eval','eval'])
895
-
896
- " }}}1
897
- " Commands {{{1
898
-
899
- function! s:prephelp()
900
- let fn = fnamemodify(s:file,':h:h').'/doc/'
901
- if filereadable(fn.'rails.txt')
902
- if !filereadable(fn.'tags') || getftime(fn.'tags') <= getftime(fn.'rails.txt')
903
- silent! helptags `=fn`
904
- endif
905
- endif
906
- endfunction
907
-
908
- function! RailsHelpCommand(...)
909
- call s:prephelp()
910
- let topic = a:0 ? a:1 : ""
911
- if topic == "" || topic == "-"
912
- return "help rails"
913
- elseif topic =~ '^g:'
914
- return "help ".topic
915
- elseif topic =~ '^-'
916
- return "help rails".topic
917
- else
918
- return "help rails-".topic
919
- endif
920
- endfunction
921
-
922
- function! s:BufCommands()
923
- call s:BufFinderCommands()
924
- call s:BufNavCommands()
925
- call s:BufScriptWrappers()
926
- command! -buffer -bar -nargs=? -bang -count -complete=customlist,s:Complete_rake Rake :call s:Rake(<bang>0,!<count> && <line1> ? -1 : <count>,<q-args>)
927
- command! -buffer -bar -nargs=? -bang -range -complete=customlist,s:Complete_preview Rpreview :call s:Preview(<bang>0,<line1>,<q-args>)
928
- command! -buffer -bar -nargs=? -bang -complete=customlist,s:Complete_environments Rlog :call s:Log(<bang>0,<q-args>)
929
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_set Rset :call s:Set(<bang>0,<f-args>)
930
- command! -buffer -bar -nargs=0 Rtags :call rails#app().tags_command()
931
- " Embedding all this logic directly into the command makes the error
932
- " messages more concise.
933
- command! -buffer -bar -nargs=? -bang Rdoc :
934
- \ if <bang>0 || <q-args> =~ "^\\([:'-]\\|g:\\)" |
935
- \ exe RailsHelpCommand(<q-args>) |
936
- \ else | call s:Doc(<bang>0,<q-args>) | endif
937
- command! -buffer -bar -nargs=0 -bang Rrefresh :if <bang>0|unlet! g:autoloaded_rails|source `=s:file`|endif|call s:Refresh(<bang>0)
938
- if exists(":NERDTree")
939
- command! -buffer -bar -nargs=? -complete=customlist,s:Complete_cd Rtree :NERDTree `=rails#app().path(<f-args>)`
940
- endif
941
- if exists("g:loaded_dbext")
942
- command! -buffer -bar -nargs=? -complete=customlist,s:Complete_environments Rdbext :call s:BufDatabase(2,<q-args>)|let b:dbext_buffer_defaulted = 1
943
- endif
944
- let ext = expand("%:e")
945
- if ext =~ s:viewspattern()
946
- " TODO: complete controller names with trailing slashes here
947
- command! -buffer -bar -bang -nargs=? -range -complete=customlist,s:controllerList Rextract :<line1>,<line2>call s:Extract(<bang>0,<f-args>)
948
- endif
949
- if RailsFilePath() =~ '\<db/migrate/.*\.rb$'
950
- command! -buffer -bar Rinvert :call s:Invert(<bang>0)
951
- endif
952
- endfunction
953
-
954
- function! s:Doc(bang, string)
955
- if a:string != ""
956
- if exists("g:rails_search_url")
957
- let query = substitute(a:string,'[^A-Za-z0-9_.~-]','\="%".printf("%02X",char2nr(submatch(0)))','g')
958
- let url = printf(g:rails_search_url, query)
959
- else
960
- return s:error("specify a g:rails_search_url with %s for a query placeholder")
961
- endif
962
- elseif isdirectory(rails#app().path("doc/api/classes"))
963
- let url = rails#app().path("/doc/api/index.html")
964
- elseif s:getpidfor("0.0.0.0","8808") > 0
965
- let url = "http://localhost:8808"
966
- else
967
- let url = "http://api.rubyonrails.org"
968
- endif
969
- call s:initOpenURL()
970
- if exists(":OpenURL")
971
- exe "OpenURL ".s:escarg(url)
972
- else
973
- return s:error("No :OpenURL command found")
974
- endif
975
- endfunction
976
-
977
- function! s:Log(bang,arg)
978
- if a:arg == ""
979
- let lf = "log/".s:environment().".log"
980
- else
981
- let lf = "log/".a:arg.".log"
982
- endif
983
- let size = getfsize(rails#app().path(lf))
984
- if size >= 1048576
985
- call s:warn("Log file is ".((size+512)/1024)."KB. Consider :Rake log:clear")
986
- endif
987
- if a:bang
988
- exe "cgetfile ".lf
989
- clast
990
- else
991
- if exists(":Tail")
992
- Tail `=rails#app().path(lf)`
993
- else
994
- pedit `=rails#app().path(lf)`
995
- endif
996
- endif
997
- endfunction
998
-
999
- function! rails#new_app_command(bang,...)
1000
- if a:0 == 0
1001
- let msg = "rails.vim ".g:autoloaded_rails
1002
- if a:bang && exists('b:rails_root') && rails#buffer().type_name() == ''
1003
- echo msg." (Rails)"
1004
- elseif a:bang && exists('b:rails_root')
1005
- echo msg." (Rails-".rails#buffer().type_name().")"
1006
- elseif a:bang
1007
- echo msg
1008
- else
1009
- !rails
1010
- endif
1011
- return
1012
- endif
1013
- let args = map(copy(a:000),'expand(v:val)')
1014
- if a:bang
1015
- let args = ['--force'] + args
1016
- endif
1017
- exe '!rails '.join(map(copy(args),'s:rquote(v:val)'),' ')
1018
- for dir in args
1019
- if dir !~# '^-' && filereadable(dir.'/'.g:rails_default_file)
1020
- edit `=dir.'/'.g:rails_default_file`
1021
- return
1022
- endif
1023
- endfor
1024
- endfunction
1025
-
1026
- function! s:app_tags_command() dict
1027
- if exists("g:Tlist_Ctags_Cmd")
1028
- let cmd = g:Tlist_Ctags_Cmd
1029
- elseif executable("exuberant-ctags")
1030
- let cmd = "exuberant-ctags"
1031
- elseif executable("ctags-exuberant")
1032
- let cmd = "ctags-exuberant"
1033
- elseif executable("ctags")
1034
- let cmd = "ctags"
1035
- elseif executable("ctags.exe")
1036
- let cmd = "ctags.exe"
1037
- else
1038
- return s:error("ctags not found")
1039
- endif
1040
- exe '!'.cmd.' -f '.s:escarg(self.path("tmp/tags")).' -R --langmap="ruby:+.rake.builder.rjs" '.g:rails_ctags_arguments.' '.s:escarg(self.path())
1041
- endfunction
1042
-
1043
- call s:add_methods('app',['tags_command'])
1044
-
1045
- function! s:Refresh(bang)
1046
- if exists("g:rubycomplete_rails") && g:rubycomplete_rails && has("ruby") && exists('g:rubycomplete_completions')
1047
- silent! ruby ActiveRecord::Base.reset_subclasses if defined?(ActiveRecord)
1048
- silent! ruby if defined?(ActiveSupport::Dependencies); ActiveSupport::Dependencies.clear; elsif defined?(Dependencies); Dependencies.clear; end
1049
- if a:bang
1050
- silent! ruby ActiveRecord::Base.clear_reloadable_connections! if defined?(ActiveRecord)
1051
- endif
1052
- endif
1053
- call rails#app().cache.clear()
1054
- silent doautocmd User BufLeaveRails
1055
- if a:bang
1056
- for key in keys(s:apps)
1057
- if type(s:apps[key]) == type({})
1058
- call s:apps[key].cache.clear()
1059
- endif
1060
- call extend(s:apps[key],filter(copy(s:app_prototype),'type(v:val) == type(function("tr"))'),'force')
1061
- endfor
1062
- endif
1063
- let i = 1
1064
- let max = bufnr('$')
1065
- while i <= max
1066
- let rr = getbufvar(i,"rails_root")
1067
- if rr != ""
1068
- call setbufvar(i,"rails_refresh",1)
1069
- endif
1070
- let i += 1
1071
- endwhile
1072
- silent doautocmd User BufEnterRails
1073
- endfunction
1074
-
1075
- function! s:RefreshBuffer()
1076
- if exists("b:rails_refresh") && b:rails_refresh
1077
- let oldroot = b:rails_root
1078
- unlet! b:rails_root
1079
- let b:rails_refresh = 0
1080
- call RailsBufInit(oldroot)
1081
- unlet! b:rails_refresh
1082
- endif
1083
- endfunction
1084
-
1085
- " }}}1
1086
- " Rake {{{1
1087
-
1088
- function! s:app_rake_tasks() dict
1089
- if self.cache.needs('rake_tasks')
1090
- call s:push_chdir()
1091
- try
1092
- let lines = split(system("rake -T"),"\n")
1093
- finally
1094
- call s:pop_command()
1095
- endtry
1096
- if v:shell_error != 0
1097
- return []
1098
- endif
1099
- call map(lines,'matchstr(v:val,"^rake\\s\\+\\zs\\S*")')
1100
- call filter(lines,'v:val != ""')
1101
- call self.cache.set('rake_tasks',lines)
1102
- endif
1103
- return self.cache.get('rake_tasks')
1104
- endfunction
1105
-
1106
- call s:add_methods('app', ['rake_tasks'])
1107
-
1108
- let s:efm_backtrace='%D(in\ %f),'
1109
- \.'%\\s%#from\ %f:%l:%m,'
1110
- \.'%\\s%#from\ %f:%l:,'
1111
- \.'%\\s#{RAILS_ROOT}/%f:%l:\ %#%m,'
1112
- \.'%\\s%##\ %f:%l:%m,'
1113
- \.'%\\s%##\ %f:%l,'
1114
- \.'%\\s%#[%f:%l:\ %#%m,'
1115
- \.'%\\s%#%f:%l:\ %#%m,'
1116
- \.'%\\s%#%f:%l:,'
1117
- \.'%m\ [%f:%l]:'
1118
-
1119
- function! s:makewithruby(arg,bang,...)
1120
- let old_make = &makeprg
1121
- try
1122
- let &l:makeprg = rails#app().ruby_shell_command(a:arg)
1123
- exe 'make'.(a:bang ? '!' : '')
1124
- if !a:bang
1125
- cwindow
1126
- endif
1127
- finally
1128
- let &l:makeprg = old_make
1129
- endtry
1130
- endfunction
1131
-
1132
- function! s:Rake(bang,lnum,arg)
1133
- let self = rails#app()
1134
- let lnum = a:lnum < 0 ? 0 : a:lnum
1135
- let old_makeprg = &l:makeprg
1136
- let old_errorformat = &l:errorformat
1137
- try
1138
- if exists('b:bundler_root') && b:bundler_root ==# rails#app().path()
1139
- let &l:makeprg = 'bundle exec rake'
1140
- else
1141
- let &l:makeprg = 'rake'
1142
- endif
1143
- let &l:errorformat = s:efm_backtrace
1144
- let arg = a:arg
1145
- if &filetype == "ruby" && arg == '' && g:rails_modelines
1146
- let mnum = s:lastmethodline(lnum)
1147
- let str = getline(mnum)."\n".getline(mnum+1)."\n".getline(mnum+2)."\n"
1148
- let pat = '\s\+\zs.\{-\}\ze\%(\n\|\s\s\|#{\@!\|$\)'
1149
- let mat = matchstr(str,'#\s*rake'.pat)
1150
- let mat = s:sub(mat,'\s+$','')
1151
- if mat != ""
1152
- let arg = mat
1153
- endif
1154
- endif
1155
- if arg == ''
1156
- let opt = s:getopt('task','bl')
1157
- if opt != ''
1158
- let arg = opt
1159
- else
1160
- let arg = rails#buffer().default_rake_task(lnum)
1161
- endif
1162
- endif
1163
- if !has_key(self,'options') | let self.options = {} | endif
1164
- if arg == '-'
1165
- let arg = get(self.options,'last_rake_task','')
1166
- endif
1167
- let self.options['last_rake_task'] = arg
1168
- let withrubyargs = '-r ./config/boot -r '.s:rquote(self.path('config/environment')).' -e "puts \%((in \#{Dir.getwd}))" '
1169
- if arg =~# '^notes\>'
1170
- let &l:errorformat = '%-P%f:,\ \ *\ [%*[\ ]%l]\ [%t%*[^]]] %m,\ \ *\ [%*[\ ]%l] %m,%-Q'
1171
- " %D to chdir is apparently incompatible with %P multiline messages
1172
- call s:push_chdir(1)
1173
- exe 'make! '.arg
1174
- call s:pop_command()
1175
- if !a:bang
1176
- cwindow
1177
- endif
1178
- elseif arg =~# '^\%(stats\|routes\|secret\|time:zones\|db:\%(charset\|collation\|fixtures:identify\>.*\|migrate:status\|version\)\)\%([: ]\|$\)'
1179
- let &l:errorformat = '%D(in\ %f),%+G%.%#'
1180
- exe 'make! '.arg
1181
- if !a:bang
1182
- copen
1183
- endif
1184
- elseif arg =~ '^preview\>'
1185
- exe (lnum == 0 ? '' : lnum).'R'.s:gsub(arg,':','/')
1186
- elseif arg =~ '^runner:'
1187
- let arg = s:sub(arg,'^runner:','')
1188
- let root = matchstr(arg,'%\%(:\w\)*')
1189
- let file = expand(root).matchstr(arg,'%\%(:\w\)*\zs.*')
1190
- if file =~ '#.*$'
1191
- let extra = " -- -n ".matchstr(file,'#\zs.*')
1192
- let file = s:sub(file,'#.*','')
1193
- else
1194
- let extra = ''
1195
- endif
1196
- if self.has_file(file) || self.has_file(file.'.rb')
1197
- call s:makewithruby(withrubyargs.'-r"'.file.'"'.extra,a:bang,file !~# '_\%(spec\|test\)\%(\.rb\)\=$')
1198
- else
1199
- call s:makewithruby(withrubyargs.'-e '.s:esccmd(s:rquote(arg)),a:bang)
1200
- endif
1201
- elseif arg == 'run' || arg == 'runner'
1202
- call s:makewithruby(withrubyargs.'-r"'.RailsFilePath().'"',a:bang,RailsFilePath() !~# '_\%(spec\|test\)\%(\.rb\)\=$')
1203
- elseif arg =~ '^run:'
1204
- let arg = s:sub(arg,'^run:','')
1205
- let arg = s:sub(arg,'^\%:h',expand('%:h'))
1206
- let arg = s:sub(arg,'^%(\%|$|#@=)',expand('%'))
1207
- let arg = s:sub(arg,'#(\w+[?!=]=)$',' -- -n\1')
1208
- call s:makewithruby(withrubyargs.'-r'.arg,a:bang,arg !~# '_\%(spec\|test\)\.rb$')
1209
- else
1210
- exe 'make! '.arg
1211
- if !a:bang
1212
- cwindow
1213
- endif
1214
- endif
1215
- finally
1216
- let &l:errorformat = old_errorformat
1217
- let &l:makeprg = old_makeprg
1218
- endtry
1219
- endfunction
1220
-
1221
- function! s:readable_default_rake_task(lnum) dict abort
1222
- let app = self.app()
1223
- let lnum = a:lnum < 0 ? 0 : a:lnum
1224
- if self.getvar('&buftype') == 'quickfix'
1225
- return '-'
1226
- elseif self.getline(lnum) =~# '# rake '
1227
- return matchstr(self.getline(lnum),'\C# rake \zs.*')
1228
- elseif self.getline(self.last_method_line(lnum)-1) =~# '# rake '
1229
- return matchstr(self.getline(self.last_method_line(lnum)-1),'\C# rake \zs.*')
1230
- elseif self.getline(self.last_method_line(lnum)) =~# '# rake '
1231
- return matchstr(self.getline(self.last_method_line(lnum)),'\C# rake \zs.*')
1232
- elseif self.getline(1) =~# '# rake ' && !lnum
1233
- return matchstr(self.getline(1),'\C# rake \zs.*')
1234
- elseif self.type_name('config-routes')
1235
- return 'routes'
1236
- elseif self.type_name('fixtures-yaml') && lnum
1237
- return "db:fixtures:identify LABEL=".self.last_method(lnum)
1238
- elseif self.type_name('fixtures') && lnum == 0
1239
- return "db:fixtures:load FIXTURES=".s:sub(fnamemodify(self.name(),':r'),'^.{-}/fixtures/','')
1240
- elseif self.type_name('task')
1241
- let mnum = self.last_method_line(lnum)
1242
- let line = getline(mnum)
1243
- " We can't grab the namespace so only run tasks at the start of the line
1244
- if line =~# '^\%(task\|file\)\>'
1245
- return self.last_method(a:lnum)
1246
- else
1247
- return matchstr(self.getline(1),'\C# rake \zs.*')
1248
- endif
1249
- elseif self.type_name('spec')
1250
- if self.name() =~# '\<spec/spec_helper\.rb$'
1251
- return 'spec'
1252
- elseif lnum > 0
1253
- return 'spec SPEC="'.self.path().'":'.lnum
1254
- else
1255
- return 'spec SPEC="'.self.path().'"'
1256
- endif
1257
- elseif self.type_name('test')
1258
- let meth = self.last_method(lnum)
1259
- if meth =~ '^test_'
1260
- let call = " -n".meth.""
1261
- else
1262
- let call = ""
1263
- endif
1264
- if self.type_name('test-unit','test-functional','test-integration')
1265
- return s:sub(s:gsub(self.type_name(),'-',':'),'unit$|functional$','&s').' TEST="'.self.path().'"'.s:sub(call,'^ ',' TESTOPTS=')
1266
- elseif self.name() =~# '\<test/test_helper\.rb$'
1267
- return 'test'
1268
- else
1269
- return 'test:recent TEST="'.self.path().'"'.s:sub(call,'^ ',' TESTOPTS=')
1270
- endif
1271
- elseif self.type_name('db-migration')
1272
- let ver = matchstr(self.name(),'\<db/migrate/0*\zs\d*\ze_')
1273
- if ver != ""
1274
- let method = self.last_method(lnum)
1275
- if method == "down"
1276
- return "db:migrate:down VERSION=".ver
1277
- elseif method == "up"
1278
- return "db:migrate:up VERSION=".ver
1279
- elseif lnum > 0
1280
- return "db:migrate:down db:migrate:up VERSION=".ver
1281
- else
1282
- return "db:migrate VERSION=".ver
1283
- endif
1284
- else
1285
- return 'db:migrate'
1286
- endif
1287
- elseif self.name() =~# '\<db/seeds\.rb$'
1288
- return 'db:seed'
1289
- elseif self.type_name('controller') && lnum
1290
- let lm = self.last_method(lnum)
1291
- if lm != ''
1292
- " rake routes doesn't support ACTION... yet...
1293
- return 'routes CONTROLLER='.self.controller_name().' ACTION='.lm
1294
- else
1295
- return 'routes CONTROLLER='.self.controller_name()
1296
- endif
1297
- elseif app.has('spec') && self.name() =~# '^app/.*\.\w\+$' && app.has_file(s:sub(self.name(),'^app/(.*)\.\w\+$','spec/\1_spec.rb'))
1298
- return 'spec SPEC="'.fnamemodify(s:sub(self.name(),'<app/','spec/'),':p:r').'_spec.rb"'
1299
- elseif app.has('spec') && self.name() =~# '^app/.*\.\w\+$' && app.has_file(s:sub(self.name(),'^app/(.*)$','spec/\1_spec.rb'))
1300
- return 'spec SPEC="'.fnamemodify(s:sub(self.name(),'<app/','spec/'),':p').'_spec.rb"'
1301
- elseif self.type_name('model')
1302
- return 'test:units TEST="'.fnamemodify(s:sub(self.name(),'<app/models/','test/unit/'),':p:r').'_test.rb"'
1303
- elseif self.type_name('api','mailer')
1304
- return 'test:units TEST="'.fnamemodify(s:sub(self.name(),'<app/%(apis|mailers|models)/','test/functional/'),':p:r').'_test.rb"'
1305
- elseif self.type_name('helper')
1306
- return 'test:units TEST="'.fnamemodify(s:sub(self.name(),'<app/','test/unit/'),':p:r').'_test.rb"'
1307
- elseif self.type_name('controller','helper','view')
1308
- if self.name() =~ '\<app/' && s:controller() !~# '^\%(application\)\=$'
1309
- return 'test:functionals TEST="'.s:escarg(app.path('test/functional/'.s:controller().'_controller_test.rb')).'"'
1310
- else
1311
- return 'test:functionals'
1312
- endif
1313
- elseif self.type_name('cucumber-feature')
1314
- if lnum > 0
1315
- return 'cucumber FEATURE="'.self.path().'":'.lnum
1316
- else
1317
- return 'cucumber FEATURE="'.self.path().'"'
1318
- endif
1319
- elseif self.type_name('cucumber')
1320
- return 'cucumber'
1321
- else
1322
- return ''
1323
- endif
1324
- endfunction
1325
-
1326
- function! s:Complete_rake(A,L,P)
1327
- return s:completion_filter(rails#app().rake_tasks(),a:A)
1328
- endfunction
1329
-
1330
- call s:add_methods('readable',['default_rake_task'])
1331
-
1332
- " }}}1
1333
- " Preview {{{1
1334
-
1335
- function! s:initOpenURL()
1336
- if !exists(":OpenURL")
1337
- if has("gui_mac") || has("gui_macvim") || exists("$SECURITYSESSIONID")
1338
- command -bar -nargs=1 OpenURL :!open <args>
1339
- elseif has("gui_win32")
1340
- command -bar -nargs=1 OpenURL :!start cmd /cstart /b <args>
1341
- elseif executable("sensible-browser")
1342
- command -bar -nargs=1 OpenURL :!sensible-browser <args>
1343
- endif
1344
- endif
1345
- endfunction
1346
-
1347
- function! s:scanlineforuris(line)
1348
- let url = matchstr(a:line,"\\v\\C%(%(GET|PUT|POST|DELETE)\\s+|\\w+://[^/]*)/[^ \n\r\t<>\"]*[^] .,;\n\r\t<>\":]")
1349
- if url =~ '\C^\u\+\s\+'
1350
- let method = matchstr(url,'^\u\+')
1351
- let url = matchstr(url,'\s\+\zs.*')
1352
- if method !=? "GET"
1353
- let url .= (url =~ '?' ? '&' : '?') . '_method='.tolower(method)
1354
- endif
1355
- endif
1356
- if url != ""
1357
- return [url]
1358
- else
1359
- return []
1360
- endif
1361
- endfunction
1362
-
1363
- function! s:readable_preview_urls(lnum) dict abort
1364
- let urls = []
1365
- let start = self.last_method_line(a:lnum) - 1
1366
- while start > 0 && self.getline(start) =~ '^\s*\%(\%(-\=\|<%\)#.*\)\=$'
1367
- let urls = s:scanlineforuris(self.getline(start)) + urls
1368
- let start -= 1
1369
- endwhile
1370
- let start = 1
1371
- while start < self.line_count() && self.getline(start) =~ '^\s*\%(\%(-\=\|<%\)#.*\)\=$'
1372
- let urls += s:scanlineforuris(self.getline(start))
1373
- let start += 1
1374
- endwhile
1375
- if has_key(self,'getvar') && self.getvar('rails_preview') != ''
1376
- let url += [self.getvar('rails_preview')]
1377
- end
1378
- if self.name() =~ '^public/stylesheets/sass/'
1379
- let urls = urls + [s:sub(s:sub(self.name(),'^public/stylesheets/sass/','/stylesheets/'),'\.s[ac]ss$','.css')]
1380
- elseif self.name() =~ '^public/'
1381
- let urls = urls + [s:sub(self.name(),'^public','')]
1382
- elseif self.name() =~ '^app/assets/stylesheets/'
1383
- let urls = urls + ['/assets/application.css']
1384
- elseif self.name() =~ '^app/assets/javascripts/'
1385
- let urls = urls + ['/assets/application.js']
1386
- elseif self.name() =~ '^app/stylesheets/'
1387
- let urls = urls + [s:sub(s:sub(self.name(),'^app/stylesheets/','/stylesheets/'),'\.less$','.css')]
1388
- elseif self.name() =~ '^app/scripts/'
1389
- let urls = urls + [s:sub(s:sub(self.name(),'^app/scripts/','/javascripts/'),'\.coffee$','.js')]
1390
- elseif self.controller_name() != '' && self.controller_name() != 'application'
1391
- if self.type_name('controller') && self.last_method(a:lnum) != ''
1392
- let urls += ['/'.self.controller_name().'/'.self.last_method(a:lnum).'/']
1393
- elseif self.type_name('controller','view-layout','view-partial')
1394
- let urls += ['/'.self.controller_name().'/']
1395
- elseif self.type_name('view')
1396
- let urls += ['/'.s:controller().'/'.fnamemodify(self.name(),':t:r:r').'/']
1397
- endif
1398
- endif
1399
- return urls
1400
- endfunction
1401
-
1402
- call s:add_methods('readable',['preview_urls'])
1403
-
1404
- function! s:Preview(bang,lnum,arg)
1405
- let root = s:getopt("root_url")
1406
- if root == ''
1407
- let root = s:getopt("url")
1408
- endif
1409
- let root = s:sub(root,'/$','')
1410
- if a:arg =~ '://'
1411
- let uri = a:arg
1412
- elseif a:arg != ''
1413
- let uri = root.'/'.s:sub(a:arg,'^/','')
1414
- else
1415
- let uri = get(rails#buffer().preview_urls(a:lnum),0,'')
1416
- let uri = root.'/'.s:sub(s:sub(uri,'^/',''),'/$','')
1417
- endif
1418
- call s:initOpenURL()
1419
- if exists(':OpenURL') && !a:bang
1420
- exe 'OpenURL '.uri
1421
- else
1422
- " Work around bug where URLs ending in / get handled as FTP
1423
- let url = uri.(uri =~ '/$' ? '?' : '')
1424
- silent exe 'pedit '.url
1425
- wincmd w
1426
- if &filetype == ''
1427
- if uri =~ '\.css$'
1428
- setlocal filetype=css
1429
- elseif uri =~ '\.js$'
1430
- setlocal filetype=javascript
1431
- elseif getline(1) =~ '^\s*<'
1432
- setlocal filetype=xhtml
1433
- endif
1434
- endif
1435
- call RailsBufInit(rails#app().path())
1436
- map <buffer> <silent> q :bwipe<CR>
1437
- wincmd p
1438
- if !a:bang
1439
- call s:warn("Define a :OpenURL command to use a browser")
1440
- endif
1441
- endif
1442
- endfunction
1443
-
1444
- function! s:Complete_preview(A,L,P)
1445
- return rails#buffer().preview_urls(a:L =~ '^\d' ? matchstr(a:L,'^\d\+') : line('.'))
1446
- endfunction
1447
-
1448
- " }}}1
1449
- " Script Wrappers {{{1
1450
-
1451
- function! s:BufScriptWrappers()
1452
- command! -buffer -bar -nargs=* -complete=customlist,s:Complete_script Rscript :call rails#app().script_command(<bang>0,<f-args>)
1453
- command! -buffer -bar -nargs=* -complete=customlist,s:Complete_generate Rgenerate :call rails#app().generate_command(<bang>0,<f-args>)
1454
- command! -buffer -bar -nargs=* -complete=customlist,s:Complete_destroy Rdestroy :call rails#app().destroy_command(<bang>0,<f-args>)
1455
- command! -buffer -bar -nargs=? -bang -complete=customlist,s:Complete_server Rserver :call rails#app().server_command(<bang>0,<q-args>)
1456
- command! -buffer -bang -nargs=1 -range=0 -complete=customlist,s:Complete_ruby Rrunner :call rails#app().runner_command(<bang>0 ? -2 : (<count>==<line2>?<count>:-1),<f-args>)
1457
- command! -buffer -nargs=1 -range=0 -complete=customlist,s:Complete_ruby Rp :call rails#app().runner_command(<count>==<line2>?<count>:-1,'p begin '.<f-args>.' end')
1458
- command! -buffer -nargs=1 -range=0 -complete=customlist,s:Complete_ruby Rpp :call rails#app().runner_command(<count>==<line2>?<count>:-1,'require %{pp}; pp begin '.<f-args>.' end')
1459
- command! -buffer -nargs=1 -range=0 -complete=customlist,s:Complete_ruby Ry :call rails#app().runner_command(<count>==<line2>?<count>:-1,'y begin '.<f-args>.' end')
1460
- endfunction
1461
-
1462
- function! s:app_generators() dict
1463
- if self.cache.needs('generators')
1464
- let generators = self.relglob("vendor/plugins/","*/generators/*")
1465
- let generators += self.relglob("","lib/generators/*")
1466
- call filter(generators,'v:val =~ "/$"')
1467
- let generators += split(glob(expand("~/.rails/generators")."/*"),"\n")
1468
- call map(generators,'s:sub(v:val,"^.*[\\\\/]generators[\\\\/]\\ze.","")')
1469
- call map(generators,'s:sub(v:val,"[\\\\/]$","")')
1470
- call self.cache.set('generators',generators)
1471
- endif
1472
- return sort(split(g:rails_generators,"\n") + self.cache.get('generators'))
1473
- endfunction
1474
-
1475
- function! s:app_script_command(bang,...) dict
1476
- let str = ""
1477
- let cmd = a:0 ? a:1 : "console"
1478
- let c = 2
1479
- while c <= a:0
1480
- let str .= " " . s:rquote(a:{c})
1481
- let c += 1
1482
- endwhile
1483
- if cmd ==# "plugin"
1484
- call self.cache.clear('generators')
1485
- endif
1486
- if a:bang || cmd =~# 'console'
1487
- return self.background_script_command(cmd.str)
1488
- else
1489
- return self.execute_script_command(cmd.str)
1490
- endif
1491
- endfunction
1492
-
1493
- function! s:app_runner_command(count,args) dict
1494
- if a:count == -2
1495
- return self.script_command(a:bang,"runner",a:args)
1496
- else
1497
- let str = self.ruby_shell_command('-r./config/boot -e "require '."'commands/runner'".'" '.s:rquote(a:args))
1498
- let res = s:sub(system(str),'\n$','')
1499
- if a:count < 0
1500
- echo res
1501
- else
1502
- exe a:count.'put =res'
1503
- endif
1504
- endif
1505
- endfunction
1506
-
1507
- function! s:getpidfor(bind,port)
1508
- if has("win32") || has("win64")
1509
- let netstat = system("netstat -anop tcp")
1510
- let pid = matchstr(netstat,'\<'.a:bind.':'.a:port.'\>.\{-\}LISTENING\s\+\zs\d\+')
1511
- elseif executable('lsof')
1512
- let pid = system("lsof -i 4tcp@".a:bind.':'.a:port."|grep LISTEN|awk '{print $2}'")
1513
- let pid = s:sub(pid,'\n','')
1514
- else
1515
- let pid = ""
1516
- endif
1517
- return pid
1518
- endfunction
1519
-
1520
- function! s:app_server_command(bang,arg) dict
1521
- let port = matchstr(a:arg,'\%(-p\|--port=\=\)\s*\zs\d\+')
1522
- if port == ''
1523
- let port = "3000"
1524
- endif
1525
- " TODO: Extract bind argument
1526
- let bind = "0.0.0.0"
1527
- if a:bang && executable("ruby")
1528
- let pid = s:getpidfor(bind,port)
1529
- if pid =~ '^\d\+$'
1530
- echo "Killing server with pid ".pid
1531
- if !has("win32")
1532
- call system("ruby -e 'Process.kill(:TERM,".pid.")'")
1533
- sleep 100m
1534
- endif
1535
- call system("ruby -e 'Process.kill(9,".pid.")'")
1536
- sleep 100m
1537
- endif
1538
- if a:arg == "-"
1539
- return
1540
- endif
1541
- endif
1542
- if has_key(self,'options') && has_key(self.options,'gnu_screen')
1543
- let screen = self.options.gnu_screen
1544
- else
1545
- let screen = g:rails_gnu_screen
1546
- endif
1547
- if has("win32") || has("win64") || (exists("$STY") && !has("gui_running") && screen && executable("screen")) || (exists("$TMUX") && !has("gui_running") && screen && executable("tmux"))
1548
- call self.background_script_command('server '.a:arg)
1549
- else
1550
- " --daemon would be more descriptive but lighttpd does not support it
1551
- call self.execute_script_command('server '.a:arg." -d")
1552
- endif
1553
- call s:setopt('a:root_url','http://'.(bind=='0.0.0.0'?'localhost': bind).':'.port.'/')
1554
- endfunction
1555
-
1556
- function! s:app_destroy_command(bang,...) dict
1557
- if a:0 == 0
1558
- return self.execute_script_command('destroy')
1559
- elseif a:0 == 1
1560
- return self.execute_script_command('destroy '.s:rquote(a:1))
1561
- endif
1562
- let str = ""
1563
- let c = 1
1564
- while c <= a:0
1565
- let str .= " " . s:rquote(a:{c})
1566
- let c += 1
1567
- endwhile
1568
- call self.execute_script_command('destroy'.str)
1569
- call self.cache.clear('user_classes')
1570
- endfunction
1571
-
1572
- function! s:app_generate_command(bang,...) dict
1573
- if a:0 == 0
1574
- return self.execute_script_command('generate')
1575
- elseif a:0 == 1
1576
- return self.execute_script_command('generate '.s:rquote(a:1))
1577
- endif
1578
- let cmd = join(map(copy(a:000),'s:rquote(v:val)'),' ')
1579
- if cmd !~ '-p\>' && cmd !~ '--pretend\>'
1580
- let execstr = self.script_shell_command('generate '.cmd.' -p -f')
1581
- let res = system(execstr)
1582
- let g:res = res
1583
- let junk = '\%(\e\[[0-9;]*m\)\='
1584
- let file = matchstr(res,junk.'\s\+\%(create\|force\)'.junk.'\s\+\zs\f\+\.rb\ze\n')
1585
- if file == ""
1586
- let file = matchstr(res,junk.'\s\+\%(identical\)'.junk.'\s\+\zs\f\+\.rb\ze\n')
1587
- endif
1588
- else
1589
- let file = ""
1590
- endif
1591
- if !self.execute_script_command('generate '.cmd) && file != ''
1592
- call self.cache.clear('user_classes')
1593
- call self.cache.clear('features')
1594
- if file =~ '^db/migrate/\d\d\d\d'
1595
- let file = get(self.relglob('',s:sub(file,'\d+','[0-9]*[0-9]')),-1,file)
1596
- endif
1597
- edit `=self.path(file)`
1598
- endif
1599
- endfunction
1600
-
1601
- call s:add_methods('app', ['generators','script_command','runner_command','server_command','destroy_command','generate_command'])
1602
-
1603
- function! s:Complete_script(ArgLead,CmdLine,P)
1604
- let cmd = s:sub(a:CmdLine,'^\u\w*\s+','')
1605
- if cmd !~ '^[ A-Za-z0-9_=:-]*$'
1606
- return []
1607
- elseif cmd =~# '^\w*$'
1608
- return s:completion_filter(rails#app().relglob("script/","**/*"),a:ArgLead)
1609
- elseif cmd =~# '^\%(plugin\)\s\+'.a:ArgLead.'$'
1610
- return s:completion_filter(["discover","list","install","update","remove","source","unsource","sources"],a:ArgLead)
1611
- elseif cmd =~# '\%(plugin\)\s\+\%(install\|remove\)\s\+'.a:ArgLead.'$' || cmd =~ '\%(generate\|destroy\)\s\+plugin\s\+'.a:ArgLead.'$'
1612
- return s:pluginList(a:ArgLead,a:CmdLine,a:P)
1613
- elseif cmd =~# '^\%(generate\|destroy\)\s\+'.a:ArgLead.'$'
1614
- return s:completion_filter(rails#app().generators(),a:ArgLead)
1615
- elseif cmd =~# '^\%(generate\|destroy\)\s\+\w\+\s\+'.a:ArgLead.'$'
1616
- let target = matchstr(cmd,'^\w\+\s\+\%(\w\+:\)\=\zs\w\+\ze\s\+')
1617
- if target =~# '^\w*controller$'
1618
- return filter(s:controllerList(a:ArgLead,"",""),'v:val !=# "application"')
1619
- elseif target ==# 'generator'
1620
- return s:completion_filter(map(rails#app().relglob('lib/generators/','*'),'s:sub(v:val,"/$","")'))
1621
- elseif target ==# 'helper'
1622
- return s:helperList(a:ArgLead,"","")
1623
- elseif target ==# 'integration_test' || target ==# 'integration_spec' || target ==# 'feature'
1624
- return s:integrationtestList(a:ArgLead,"","")
1625
- elseif target ==# 'metal'
1626
- return s:metalList(a:ArgLead,"","")
1627
- elseif target ==# 'migration' || target ==# 'session_migration'
1628
- return s:migrationList(a:ArgLead,"","")
1629
- elseif target =~# '^\w*\%(model\|resource\)$' || target =~# '\w*scaffold\%(_controller\)\=$' || target ==# 'mailer'
1630
- return s:modelList(a:ArgLead,"","")
1631
- elseif target ==# 'observer'
1632
- let observers = s:observerList("","","")
1633
- let models = s:modelList("","","")
1634
- if cmd =~# '^destroy\>'
1635
- let models = []
1636
- endif
1637
- call filter(models,'index(observers,v:val) < 0')
1638
- return s:completion_filter(observers + models,a:ArgLead)
1639
- else
1640
- return []
1641
- endif
1642
- elseif cmd =~# '^\%(generate\|destroy\)\s\+scaffold\s\+\w\+\s\+'.a:ArgLead.'$'
1643
- return filter(s:controllerList(a:ArgLead,"",""),'v:val !=# "application"')
1644
- return s:completion_filter(rails#app().environments())
1645
- elseif cmd =~# '^\%(console\)\s\+\(--\=\w\+\s\+\)\='.a:ArgLead."$"
1646
- return s:completion_filter(rails#app().environments()+["-s","--sandbox"],a:ArgLead)
1647
- elseif cmd =~# '^\%(server\)\s\+.*-e\s\+'.a:ArgLead."$"
1648
- return s:completion_filter(rails#app().environments(),a:ArgLead)
1649
- elseif cmd =~# '^\%(server\)\s\+'
1650
- if a:ArgLead =~# '^--environment='
1651
- return s:completion_filter(map(copy(rails#app().environments()),'"--environment=".v:val'),a:ArgLead)
1652
- else
1653
- return filter(["-p","-b","-e","-m","-d","-u","-c","-h","--port=","--binding=","--environment=","--mime-types=","--daemon","--debugger","--charset=","--help"],'s:startswith(v:val,a:ArgLead)')
1654
- endif
1655
- endif
1656
- return ""
1657
- endfunction
1658
-
1659
- function! s:CustomComplete(A,L,P,cmd)
1660
- let L = "Rscript ".a:cmd." ".s:sub(a:L,'^\h\w*\s+','')
1661
- let P = a:P - strlen(a:L) + strlen(L)
1662
- return s:Complete_script(a:A,L,P)
1663
- endfunction
1664
-
1665
- function! s:Complete_server(A,L,P)
1666
- return s:CustomComplete(a:A,a:L,a:P,"server")
1667
- endfunction
1668
-
1669
- function! s:Complete_console(A,L,P)
1670
- return s:CustomComplete(a:A,a:L,a:P,"console")
1671
- endfunction
1672
-
1673
- function! s:Complete_generate(A,L,P)
1674
- return s:CustomComplete(a:A,a:L,a:P,"generate")
1675
- endfunction
1676
-
1677
- function! s:Complete_destroy(A,L,P)
1678
- return s:CustomComplete(a:A,a:L,a:P,"destroy")
1679
- endfunction
1680
-
1681
- function! s:Complete_ruby(A,L,P)
1682
- return s:completion_filter(rails#app().user_classes()+["ActiveRecord::Base"],a:A)
1683
- endfunction
1684
-
1685
- " }}}1
1686
- " Navigation {{{1
1687
-
1688
- function! s:BufNavCommands()
1689
- command! -buffer -bar -nargs=? -complete=customlist,s:Complete_cd Rcd :cd `=rails#app().path(<q-args>)`
1690
- command! -buffer -bar -nargs=? -complete=customlist,s:Complete_cd Rlcd :lcd `=rails#app().path(<q-args>)`
1691
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find Rfind :call s:Find(<count>,'<bang>' ,<f-args>)
1692
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find REfind :call s:Find(<count>,'E<bang>',<f-args>)
1693
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find RSfind :call s:Find(<count>,'S<bang>',<f-args>)
1694
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find RVfind :call s:Find(<count>,'V<bang>',<f-args>)
1695
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find RTfind :call s:Find(<count>,'T<bang>',<f-args>)
1696
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find Rsfind :<count>RSfind<bang> <args>
1697
- command! -buffer -bar -nargs=* -count=1 -complete=customlist,s:Complete_find Rtabfind :<count>RTfind<bang> <args>
1698
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_edit Redit :call s:Edit(<count>,'<bang>' ,<f-args>)
1699
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_edit REedit :call s:Edit(<count>,'E<bang>',<f-args>)
1700
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_edit RSedit :call s:Edit(<count>,'S<bang>',<f-args>)
1701
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_edit RVedit :call s:Edit(<count>,'V<bang>',<f-args>)
1702
- command! -buffer -bar -nargs=* -bang -complete=customlist,s:Complete_edit RTedit :call s:Edit(<count>,'T<bang>',<f-args>)
1703
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_edit RDedit :call s:Edit(<count>,'<line1>D<bang>',<f-args>)
1704
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related A :call s:Alternate('<bang>', <line1>,<line2>,<count>,<f-args>)
1705
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AE :call s:Alternate('E<bang>',<line1>,<line2>,<count>,<f-args>)
1706
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AS :call s:Alternate('S<bang>',<line1>,<line2>,<count>,<f-args>)
1707
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AV :call s:Alternate('V<bang>',<line1>,<line2>,<count>,<f-args>)
1708
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AT :call s:Alternate('T<bang>',<line1>,<line2>,<count>,<f-args>)
1709
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AD :call s:Alternate('D<bang>',<line1>,<line2>,<count>,<f-args>)
1710
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related AN :call s:Related('<bang>' ,<line1>,<line2>,<count>,<f-args>)
1711
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related R :call s:Related('<bang>' ,<line1>,<line2>,<count>,<f-args>)
1712
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related RE :call s:Related('E<bang>',<line1>,<line2>,<count>,<f-args>)
1713
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related RS :call s:Related('S<bang>',<line1>,<line2>,<count>,<f-args>)
1714
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related RV :call s:Related('V<bang>',<line1>,<line2>,<count>,<f-args>)
1715
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related RT :call s:Related('T<bang>',<line1>,<line2>,<count>,<f-args>)
1716
- command! -buffer -bar -nargs=* -range=0 -complete=customlist,s:Complete_related RD :call s:Related('D<bang>',<line1>,<line2>,<count>,<f-args>)
1717
- endfunction
1718
-
1719
- function! s:djump(def)
1720
- let def = s:sub(a:def,'^[#:]','')
1721
- if def =~ '^\d\+$'
1722
- exe def
1723
- elseif def =~ '^!'
1724
- if expand('%') !~ '://' && !isdirectory(expand('%:p:h'))
1725
- call mkdir(expand('%:p:h'),'p')
1726
- endif
1727
- elseif def != ''
1728
- let ext = matchstr(def,'\.\zs.*')
1729
- let def = matchstr(def,'[^.]*')
1730
- let v:errmsg = ''
1731
- silent! exe "djump ".def
1732
- if ext != '' && (v:errmsg == '' || v:errmsg =~ '^E387')
1733
- let rpat = '\C^\s*\%(mail\>.*\|respond_to\)\s*\%(\<do\|{\)\s*|\zs\h\k*\ze|'
1734
- let end = s:endof(line('.'))
1735
- let rline = search(rpat,'',end)
1736
- if rline > 0
1737
- let variable = matchstr(getline(rline),rpat)
1738
- let success = search('\C^\s*'.variable.'\s*\.\s*\zs'.ext.'\>','',end)
1739
- if !success
1740
- silent! exe "djump ".def
1741
- endif
1742
- endif
1743
- endif
1744
- endif
1745
- endfunction
1746
-
1747
- function! s:Find(count,cmd,...)
1748
- let str = ""
1749
- if a:0
1750
- let i = 1
1751
- while i < a:0
1752
- let str .= s:escarg(a:{i}) . " "
1753
- let i += 1
1754
- endwhile
1755
- let file = a:{i}
1756
- let tail = matchstr(file,'[#!].*$\|:\d*\%(:in\>.*\)\=$')
1757
- if tail != ""
1758
- let file = s:sub(file,'[#!].*$|:\d*%(:in>.*)=$','')
1759
- endif
1760
- if file != ""
1761
- let file = s:RailsIncludefind(file)
1762
- endif
1763
- else
1764
- let file = s:RailsFind()
1765
- let tail = ""
1766
- endif
1767
- call s:findedit((a:count==1?'' : a:count).a:cmd,file.tail,str)
1768
- endfunction
1769
-
1770
- function! s:Edit(count,cmd,...)
1771
- if a:0
1772
- let str = ""
1773
- let i = 1
1774
- while i < a:0
1775
- let str .= "`=a:".i."` "
1776
- let i += 1
1777
- endwhile
1778
- let file = a:{i}
1779
- call s:findedit(s:editcmdfor(a:cmd),file,str)
1780
- else
1781
- exe s:editcmdfor(a:cmd)
1782
- endif
1783
- endfunction
1784
-
1785
- function! s:fuzzyglob(arg)
1786
- return s:gsub(s:gsub(a:arg,'[^/.]','[&]*'),'%(/|^)\.@!|\.','&*')
1787
- endfunction
1788
-
1789
- function! s:Complete_find(ArgLead, CmdLine, CursorPos)
1790
- let paths = s:pathsplit(&l:path)
1791
- let seen = {}
1792
- for path in paths
1793
- if s:startswith(path,rails#app().path()) && path !~ '[][*]'
1794
- let path = path[strlen(rails#app().path()) + 1 : ]
1795
- for file in rails#app().relglob(path == '' ? '' : path.'/',s:fuzzyglob(rails#underscore(a:ArgLead)), a:ArgLead =~# '\u' ? '.rb' : '')
1796
- let seen[file] = 1
1797
- endfor
1798
- endif
1799
- endfor
1800
- return s:autocamelize(sort(keys(seen)),a:ArgLead)
1801
- endfunction
1802
-
1803
- function! s:Complete_edit(ArgLead, CmdLine, CursorPos)
1804
- return s:completion_filter(rails#app().relglob("",s:fuzzyglob(a:ArgLead)),a:ArgLead)
1805
- endfunction
1806
-
1807
- function! s:Complete_cd(ArgLead, CmdLine, CursorPos)
1808
- let all = rails#app().relglob("",a:ArgLead."*")
1809
- call filter(all,'v:val =~ "/$"')
1810
- return filter(all,'s:startswith(v:val,a:ArgLead)')
1811
- endfunction
1812
-
1813
- function! RailsIncludeexpr()
1814
- " Is this foolproof?
1815
- if mode() =~ '[iR]' || expand("<cfile>") != v:fname
1816
- return s:RailsIncludefind(v:fname)
1817
- else
1818
- return s:RailsIncludefind(v:fname,1)
1819
- endif
1820
- endfunction
1821
-
1822
- function! s:linepeak()
1823
- let line = getline(line("."))
1824
- let line = s:sub(line,'^(.{'.col(".").'}).*','\1')
1825
- let line = s:sub(line,'([:"'."'".']|\%[qQ]=[[({<])=\f*$','')
1826
- return line
1827
- endfunction
1828
-
1829
- function! s:matchcursor(pat)
1830
- let line = getline(".")
1831
- let lastend = 0
1832
- while lastend >= 0
1833
- let beg = match(line,'\C'.a:pat,lastend)
1834
- let end = matchend(line,'\C'.a:pat,lastend)
1835
- if beg < col(".") && end >= col(".")
1836
- return matchstr(line,'\C'.a:pat,lastend)
1837
- endif
1838
- let lastend = end
1839
- endwhile
1840
- return ""
1841
- endfunction
1842
-
1843
- function! s:findit(pat,repl)
1844
- let res = s:matchcursor(a:pat)
1845
- if res != ""
1846
- return substitute(res,'\C'.a:pat,a:repl,'')
1847
- else
1848
- return ""
1849
- endif
1850
- endfunction
1851
-
1852
- function! s:findamethod(func,repl)
1853
- return s:findit('\s*\<\%('.a:func.'\)\s*(\=\s*[@:'."'".'"]\(\f\+\)\>.\=',a:repl)
1854
- endfunction
1855
-
1856
- function! s:findasymbol(sym,repl)
1857
- return s:findit('\s*\%(:\%('.a:sym.'\)\s*=>\|\<'.a:sym.':\)\s*(\=\s*[@:'."'".'"]\(\f\+\)\>.\=',a:repl)
1858
- endfunction
1859
-
1860
- function! s:findfromview(func,repl)
1861
- " ( ) ( ) ( \1 ) ( )
1862
- return s:findit('\s*\%(<%\)\==\=\s*\<\%('.a:func.'\)\s*(\=\s*[@:'."'".'"]\(\f\+\)\>['."'".'"]\=\s*\%(%>\s*\)\=',a:repl)
1863
- endfunction
1864
-
1865
- function! s:RailsFind()
1866
- if filereadable(expand("<cfile>"))
1867
- return expand("<cfile>")
1868
- endif
1869
-
1870
- " UGH
1871
- let buffer = rails#buffer()
1872
- let format = s:format('html')
1873
-
1874
- let res = s:findit('\v\s*<require\s*\(=\s*File.dirname\(__FILE__\)\s*\+\s*[:'."'".'"](\f+)>.=',expand('%:h').'/\1')
1875
- if res != ""|return res.(fnamemodify(res,':e') == '' ? '.rb' : '')|endif
1876
-
1877
- let res = s:findit('\v<File.dirname\(__FILE__\)\s*\+\s*[:'."'".'"](\f+)>['."'".'"]=',expand('%:h').'\1')
1878
- if res != ""|return res|endif
1879
-
1880
- let res = rails#underscore(s:findit('\v\s*<%(include|extend)\(=\s*<([[:alnum:]_:]+)>','\1'))
1881
- if res != ""|return res.".rb"|endif
1882
-
1883
- let res = s:findamethod('require','\1')
1884
- if res != ""|return res.(fnamemodify(res,':e') == '' ? '.rb' : '')|endif
1885
-
1886
- let res = s:findamethod('belongs_to\|has_one\|composed_of\|validates_associated\|scaffold','app/models/\1.rb')
1887
- if res != ""|return res|endif
1888
-
1889
- let res = rails#singularize(s:findamethod('has_many\|has_and_belongs_to_many','app/models/\1'))
1890
- if res != ""|return res.".rb"|endif
1891
-
1892
- let res = rails#singularize(s:findamethod('create_table\|change_table\|drop_table\|add_column\|rename_column\|remove_column\|add_index','app/models/\1'))
1893
- if res != ""|return res.".rb"|endif
1894
-
1895
- let res = rails#singularize(s:findasymbol('through','app/models/\1'))
1896
- if res != ""|return res.".rb"|endif
1897
-
1898
- let res = s:findamethod('fixtures','fixtures/\1')
1899
- if res != ""
1900
- return RailsFilePath() =~ '\<spec/' ? 'spec/'.res : res
1901
- endif
1902
-
1903
- let res = s:findamethod('\%(\w\+\.\)\=resources','app/controllers/\1_controller.rb')
1904
- if res != ""|return res|endif
1905
-
1906
- let res = s:findamethod('\%(\w\+\.\)\=resource','app/controllers/\1')
1907
- if res != ""|return rails#pluralize(res)."_controller.rb"|endif
1908
-
1909
- let res = s:findasymbol('to','app/controllers/\1')
1910
- if res =~ '#'|return s:sub(res,'#','_controller.rb#')|endif
1911
-
1912
- let res = s:findamethod('root\s*\%(:to\s*=>\|\<to:\)\s*','app/controllers/\1')
1913
- if res =~ '#'|return s:sub(res,'#','_controller.rb#')|endif
1914
-
1915
- let res = s:findamethod('\%(match\|get\|put\|post\|delete\|redirect\)\s*(\=\s*[:''"][^''"]*[''"]\=\s*\%(\%(,\s*:to\s*\)\==>\|,\s*to:\)\s*','app/controllers/\1')
1916
- if res =~ '#'|return s:sub(res,'#','_controller.rb#')|endif
1917
-
1918
- let res = s:findamethod('layout','\=s:findlayout(submatch(1))')
1919
- if res != ""|return res|endif
1920
-
1921
- let res = s:findasymbol('layout','\=s:findlayout(submatch(1))')
1922
- if res != ""|return res|endif
1923
-
1924
- let res = s:findamethod('helper','app/helpers/\1_helper.rb')
1925
- if res != ""|return res|endif
1926
-
1927
- let res = s:findasymbol('controller','app/controllers/\1_controller.rb')
1928
- if res != ""|return res|endif
1929
-
1930
- let res = s:findasymbol('action','\1')
1931
- if res != ""|return res|endif
1932
-
1933
- let res = s:findasymbol('template','app/views/\1')
1934
- if res != ""|return res|endif
1935
-
1936
- let res = s:sub(s:sub(s:findasymbol('partial','\1'),'^/',''),'[^/]+$','_&')
1937
- if res != ""|return res."\n".s:findview(res)|endif
1938
-
1939
- let res = s:sub(s:sub(s:findfromview('render\s*(\=\s*\%(:partial\s\+=>\|partial:\)\s*','\1'),'^/',''),'[^/]+$','_&')
1940
- if res != ""|return res."\n".s:findview(res)|endif
1941
-
1942
- let res = s:findamethod('render\>\s*\%(:\%(template\|action\)\s\+=>\|template:\|action:\)\s*','\1.'.format.'\n\1')
1943
- if res != ""|return res|endif
1944
-
1945
- let res = s:sub(s:findfromview('render','\1'),'^/','')
1946
- if buffer.type_name('view') | let res = s:sub(res,'[^/]+$','_&') | endif
1947
- if res != ""|return res."\n".s:findview(res)|endif
1948
-
1949
- let res = s:findamethod('redirect_to\s*(\=\s*\%\(:action\s\+=>\|\<action:\)\s*','\1')
1950
- if res != ""|return res|endif
1951
-
1952
- let res = s:findfromview('stylesheet_link_tag','public/stylesheets/\1')
1953
- if res != '' && fnamemodify(res, ':e') == '' " Append the default extension iff the filename doesn't already contains an extension
1954
- let res .= '.css'
1955
- end
1956
- if res != ""|return res|endif
1957
-
1958
- let res = s:sub(s:findfromview('javascript_include_tag','public/javascripts/\1'),'/defaults>','/application')
1959
- if res != '' && fnamemodify(res, ':e') == '' " Append the default extension iff the filename doesn't already contains an extension
1960
- let res .= '.js'
1961
- end
1962
- if res != ""|return res|endif
1963
-
1964
- if buffer.type_name('controller')
1965
- let contr = s:controller()
1966
- let view = s:findit('\s*\<def\s\+\(\k\+\)\>(\=','/\1')
1967
- let res = s:findview(contr.'/'.view)
1968
- if res != ""|return res|endif
1969
- endif
1970
-
1971
- let old_isfname = &isfname
1972
- try
1973
- set isfname=@,48-57,/,-,_,:,#
1974
- " TODO: grab visual selection in visual mode
1975
- let cfile = expand("<cfile>")
1976
- finally
1977
- let &isfname = old_isfname
1978
- endtry
1979
- let res = s:RailsIncludefind(cfile,1)
1980
- return res
1981
- endfunction
1982
-
1983
- function! s:app_named_route_file(route) dict
1984
- call self.route_names()
1985
- if self.cache.has("named_routes") && has_key(self.cache.get("named_routes"),a:route)
1986
- return self.cache.get("named_routes")[a:route]
1987
- endif
1988
- return ""
1989
- endfunction
1990
-
1991
- function! s:app_route_names() dict
1992
- if self.cache.needs("named_routes")
1993
- let exec = "ActionController::Routing::Routes.named_routes.each {|n,r| puts %{#{n} app/controllers/#{r.requirements[:controller]}_controller.rb##{r.requirements[:action]}}}"
1994
- let string = self.eval(exec)
1995
- let routes = {}
1996
- for line in split(string,"\n")
1997
- let route = split(line," ")
1998
- let name = route[0]
1999
- let routes[name] = route[1]
2000
- endfor
2001
- call self.cache.set("named_routes",routes)
2002
- endif
2003
-
2004
- return keys(self.cache.get("named_routes"))
2005
- endfunction
2006
-
2007
- call s:add_methods('app', ['route_names','named_route_file'])
2008
-
2009
- function! RailsNamedRoutes()
2010
- return rails#app().route_names()
2011
- endfunction
2012
-
2013
- function! s:RailsIncludefind(str,...)
2014
- if a:str ==# "ApplicationController"
2015
- return "application_controller.rb\napp/controllers/application.rb"
2016
- elseif a:str ==# "Test::Unit::TestCase"
2017
- return "test/unit/testcase.rb"
2018
- endif
2019
- let str = a:str
2020
- if a:0 == 1
2021
- " Get the text before the filename under the cursor.
2022
- " We'll cheat and peak at this in a bit
2023
- let line = s:linepeak()
2024
- let line = s:sub(line,'([:"'."'".']|\%[qQ]=[[({<])=\f*$','')
2025
- else
2026
- let line = ""
2027
- endif
2028
- let str = s:sub(str,'^\s*','')
2029
- let str = s:sub(str,'\s*$','')
2030
- let str = s:sub(str,'^:=[:@]','')
2031
- let str = s:sub(str,':0x\x+$','') " For #<Object:0x...> style output
2032
- let str = s:gsub(str,"[\"']",'')
2033
- if line =~# '\<\(require\|load\)\s*(\s*$'
2034
- return str
2035
- elseif str =~# '^\l\w*#\w\+$'
2036
- return 'app/controllers/'.s:sub(str,'#','_controller.rb#')
2037
- endif
2038
- let str = rails#underscore(str)
2039
- let fpat = '\(\s*\%("\f*"\|:\f*\|'."'\\f*'".'\)\s*,\s*\)*'
2040
- if a:str =~# '\u'
2041
- " Classes should always be in .rb files
2042
- let str .= '.rb'
2043
- elseif line =~# ':partial\s*=>\s*'
2044
- let str = s:sub(str,'[^/]+$','_&')
2045
- let str = s:findview(str)
2046
- elseif line =~# '\<layout\s*(\=\s*' || line =~# ':layout\s*=>\s*'
2047
- let str = s:findview(s:sub(str,'^/=','layouts/'))
2048
- elseif line =~# ':controller\s*=>\s*'
2049
- let str = 'app/controllers/'.str.'_controller.rb'
2050
- elseif line =~# '\<helper\s*(\=\s*'
2051
- let str = 'app/helpers/'.str.'_helper.rb'
2052
- elseif line =~# '\<fixtures\s*(\='.fpat
2053
- if RailsFilePath() =~# '\<spec/'
2054
- let str = s:sub(str,'^/@!','spec/fixtures/')
2055
- else
2056
- let str = s:sub(str,'^/@!','test/fixtures/')
2057
- endif
2058
- elseif line =~# '\<stylesheet_\(link_tag\|path\)\s*(\='.fpat
2059
- let str = s:sub(str,'^/@!','/stylesheets/')
2060
- if str != '' && fnamemodify(str, ':e') == ''
2061
- let str .= '.css'
2062
- endif
2063
- elseif line =~# '\<javascript_\(include_tag\|path\)\s*(\='.fpat
2064
- if str ==# "defaults"
2065
- let str = "application"
2066
- endif
2067
- let str = s:sub(str,'^/@!','/javascripts/')
2068
- if str != '' && fnamemodify(str, ':e') == ''
2069
- let str .= '.js'
2070
- endif
2071
- elseif line =~# '\<\(has_one\|belongs_to\)\s*(\=\s*'
2072
- let str = 'app/models/'.str.'.rb'
2073
- elseif line =~# '\<has_\(and_belongs_to_\)\=many\s*(\=\s*'
2074
- let str = 'app/models/'.rails#singularize(str).'.rb'
2075
- elseif line =~# '\<def\s\+' && expand("%:t") =~# '_controller\.rb'
2076
- let str = s:findview(str)
2077
- elseif str =~# '_\%(path\|url\)$' || (line =~# ':as\s*=>\s*$' && rails#buffer().type_name('config-routes'))
2078
- if line !~# ':as\s*=>\s*$'
2079
- let str = s:sub(str,'_%(path|url)$','')
2080
- let str = s:sub(str,'^hash_for_','')
2081
- endif
2082
- let file = rails#app().named_route_file(str)
2083
- if file == ""
2084
- let str = s:sub(str,'^formatted_','')
2085
- if str =~# '^\%(new\|edit\)_'
2086
- let str = 'app/controllers/'.s:sub(rails#pluralize(str),'^(new|edit)_(.*)','\2_controller.rb#\1')
2087
- elseif str ==# rails#singularize(str)
2088
- " If the word can't be singularized, it's probably a link to the show
2089
- " method. We should verify by checking for an argument, but that's
2090
- " difficult the way things here are currently structured.
2091
- let str = 'app/controllers/'.rails#pluralize(str).'_controller.rb#show'
2092
- else
2093
- let str = 'app/controllers/'.str.'_controller.rb#index'
2094
- endif
2095
- else
2096
- let str = file
2097
- endif
2098
- elseif str !~ '/'
2099
- " If we made it this far, we'll risk making it singular.
2100
- let str = rails#singularize(str)
2101
- let str = s:sub(str,'_id$','')
2102
- endif
2103
- if str =~ '^/' && !filereadable(str)
2104
- let str = s:sub(str,'^/','')
2105
- endif
2106
- if str =~# '^lib/' && !filereadable(str)
2107
- let str = s:sub(str,'^lib/','')
2108
- endif
2109
- return str
2110
- endfunction
2111
-
2112
- " }}}1
2113
- " File Finders {{{1
2114
-
2115
- function! s:addfilecmds(type)
2116
- let l = s:sub(a:type,'^.','\l&')
2117
- let cmds = 'ESVTD '
2118
- let cmd = ''
2119
- while cmds != ''
2120
- let cplt = " -complete=customlist,".s:sid.l."List"
2121
- exe "command! -buffer -bar ".(cmd == 'D' ? '-range=0 ' : '')."-nargs=*".cplt." R".cmd.l." :call s:".l.'Edit("'.(cmd == 'D' ? '<line1>' : '').cmd.'<bang>",<f-args>)'
2122
- let cmd = strpart(cmds,0,1)
2123
- let cmds = strpart(cmds,1)
2124
- endwhile
2125
- endfunction
2126
-
2127
- function! s:BufFinderCommands()
2128
- command! -buffer -bar -nargs=+ Rnavcommand :call s:Navcommand(<bang>0,<f-args>)
2129
- call s:addfilecmds("metal")
2130
- call s:addfilecmds("model")
2131
- call s:addfilecmds("view")
2132
- call s:addfilecmds("controller")
2133
- call s:addfilecmds("mailer")
2134
- call s:addfilecmds("migration")
2135
- call s:addfilecmds("observer")
2136
- call s:addfilecmds("helper")
2137
- call s:addfilecmds("layout")
2138
- call s:addfilecmds("fixtures")
2139
- call s:addfilecmds("locale")
2140
- if rails#app().has('test') || rails#app().has('spec')
2141
- call s:addfilecmds("unittest")
2142
- call s:addfilecmds("functionaltest")
2143
- endif
2144
- if rails#app().has('test') || rails#app().has('spec') || rails#app().has('cucumber')
2145
- call s:addfilecmds("integrationtest")
2146
- endif
2147
- if rails#app().has('spec')
2148
- call s:addfilecmds("spec")
2149
- endif
2150
- call s:addfilecmds("stylesheet")
2151
- call s:addfilecmds("javascript")
2152
- call s:addfilecmds("plugin")
2153
- call s:addfilecmds("task")
2154
- call s:addfilecmds("lib")
2155
- call s:addfilecmds("environment")
2156
- call s:addfilecmds("initializer")
2157
- endfunction
2158
-
2159
- function! s:completion_filter(results,A)
2160
- let results = sort(type(a:results) == type("") ? split(a:results,"\n") : copy(a:results))
2161
- call filter(results,'v:val !~# "\\~$"')
2162
- let filtered = filter(copy(results),'s:startswith(v:val,a:A)')
2163
- if !empty(filtered) | return filtered | endif
2164
- let regex = s:gsub(a:A,'[^/]','[&].*')
2165
- let filtered = filter(copy(results),'v:val =~# "^".regex')
2166
- if !empty(filtered) | return filtered | endif
2167
- let regex = s:gsub(a:A,'.','[&].*')
2168
- let filtered = filter(copy(results),'v:val =~# regex')
2169
- return filtered
2170
- endfunction
2171
-
2172
- function! s:autocamelize(files,test)
2173
- if a:test =~# '^\u'
2174
- return s:completion_filter(map(copy(a:files),'rails#camelize(v:val)'),a:test)
2175
- else
2176
- return s:completion_filter(a:files,a:test)
2177
- endif
2178
- endfunction
2179
-
2180
- function! s:app_relglob(path,glob,...) dict
2181
- if exists("+shellslash") && ! &shellslash
2182
- let old_ss = &shellslash
2183
- let &shellslash = 1
2184
- endif
2185
- let path = a:path
2186
- if path !~ '^/' && path !~ '^\w:'
2187
- let path = self.path(path)
2188
- endif
2189
- let suffix = a:0 ? a:1 : ''
2190
- let full_paths = split(glob(path.a:glob.suffix),"\n")
2191
- let relative_paths = []
2192
- for entry in full_paths
2193
- if suffix == '' && isdirectory(entry) && entry !~ '/$'
2194
- let entry .= '/'
2195
- endif
2196
- let relative_paths += [entry[strlen(path) : -strlen(suffix)-1]]
2197
- endfor
2198
- if exists("old_ss")
2199
- let &shellslash = old_ss
2200
- endif
2201
- return relative_paths
2202
- endfunction
2203
-
2204
- call s:add_methods('app', ['relglob'])
2205
-
2206
- function! s:relglob(...)
2207
- return join(call(rails#app().relglob,a:000,rails#app()),"\n")
2208
- endfunction
2209
-
2210
- function! s:helperList(A,L,P)
2211
- return s:autocamelize(rails#app().relglob("app/helpers/","**/*","_helper.rb"),a:A)
2212
- endfunction
2213
-
2214
- function! s:controllerList(A,L,P)
2215
- let con = rails#app().relglob("app/controllers/","**/*",".rb")
2216
- call map(con,'s:sub(v:val,"_controller$","")')
2217
- return s:autocamelize(con,a:A)
2218
- endfunction
2219
-
2220
- function! s:mailerList(A,L,P)
2221
- return s:autocamelize(rails#app().relglob("app/mailers/","**/*",".rb"),a:A)
2222
- endfunction
2223
-
2224
- function! s:viewList(A,L,P)
2225
- let c = s:controller(1)
2226
- let top = rails#app().relglob("app/views/",s:fuzzyglob(a:A))
2227
- call filter(top,'v:val !~# "\\~$"')
2228
- if c != '' && a:A !~ '/'
2229
- let local = rails#app().relglob("app/views/".c."/","*.*[^~]")
2230
- return s:completion_filter(local+top,a:A)
2231
- endif
2232
- return s:completion_filter(top,a:A)
2233
- endfunction
2234
-
2235
- function! s:layoutList(A,L,P)
2236
- return s:completion_filter(rails#app().relglob("app/views/layouts/","*"),a:A)
2237
- endfunction
2238
-
2239
- function! s:stylesheetList(A,L,P)
2240
- let list = rails#app().relglob('app/assets/stylesheets/','**/*.*','')
2241
- call map(list,'s:sub(v:val,"\\..*$","")')
2242
- let list += rails#app().relglob('public/stylesheets/','**/*','.css')
2243
- if rails#app().has('sass')
2244
- call extend(list,rails#app().relglob('public/stylesheets/sass/','**/*','.s?ss'))
2245
- call s:uniq(list)
2246
- endif
2247
- return s:completion_filter(list,a:A)
2248
- endfunction
2249
-
2250
- function! s:javascriptList(A,L,P)
2251
- let list = rails#app().relglob('app/assets/javascripts/','**/*.*','')
2252
- call map(list,'s:sub(v:val,"\\..*$","")')
2253
- let list += rails#app().relglob("public/javascripts/","**/*",".js")
2254
- return s:completion_filter(list,a:A)
2255
- endfunction
2256
-
2257
- function! s:metalList(A,L,P)
2258
- return s:autocamelize(rails#app().relglob("app/metal/","**/*",".rb"),a:A)
2259
- endfunction
2260
-
2261
- function! s:modelList(A,L,P)
2262
- let models = rails#app().relglob("app/models/","**/*",".rb")
2263
- call filter(models,'v:val !~# "_observer$"')
2264
- return s:autocamelize(models,a:A)
2265
- endfunction
2266
-
2267
- function! s:observerList(A,L,P)
2268
- return s:autocamelize(rails#app().relglob("app/models/","**/*","_observer.rb"),a:A)
2269
- endfunction
2270
-
2271
- function! s:fixturesList(A,L,P)
2272
- return s:completion_filter(rails#app().relglob("test/fixtures/","**/*")+rails#app().relglob("spec/fixtures/","**/*"),a:A)
2273
- endfunction
2274
-
2275
- function! s:localeList(A,L,P)
2276
- return s:completion_filter(rails#app().relglob("config/locales/","**/*"),a:A)
2277
- endfunction
2278
-
2279
- function! s:migrationList(A,L,P)
2280
- if a:A =~ '^\d'
2281
- let migrations = rails#app().relglob("db/migrate/",a:A."[0-9_]*",".rb")
2282
- return map(migrations,'matchstr(v:val,"^[0-9]*")')
2283
- else
2284
- let migrations = rails#app().relglob("db/migrate/","[0-9]*[0-9]_*",".rb")
2285
- call map(migrations,'s:sub(v:val,"^[0-9]*_","")')
2286
- return s:autocamelize(migrations,a:A)
2287
- endif
2288
- endfunction
2289
-
2290
- function! s:unittestList(A,L,P)
2291
- let found = []
2292
- if rails#app().has('test')
2293
- let found += rails#app().relglob("test/unit/","**/*","_test.rb")
2294
- endif
2295
- if rails#app().has('spec')
2296
- let found += rails#app().relglob("spec/models/","**/*","_spec.rb")
2297
- endif
2298
- return s:autocamelize(found,a:A)
2299
- endfunction
2300
-
2301
- function! s:functionaltestList(A,L,P)
2302
- let found = []
2303
- if rails#app().has('test')
2304
- let found += rails#app().relglob("test/functional/","**/*","_test.rb")
2305
- endif
2306
- if rails#app().has('spec')
2307
- let found += rails#app().relglob("spec/controllers/","**/*","_spec.rb")
2308
- let found += rails#app().relglob("spec/mailers/","**/*","_spec.rb")
2309
- endif
2310
- return s:autocamelize(found,a:A)
2311
- endfunction
2312
-
2313
- function! s:integrationtestList(A,L,P)
2314
- if a:A =~# '^\u'
2315
- return s:autocamelize(rails#app().relglob("test/integration/","**/*","_test.rb"),a:A)
2316
- endif
2317
- let found = []
2318
- if rails#app().has('test')
2319
- let found += rails#app().relglob("test/integration/","**/*","_test.rb")
2320
- endif
2321
- if rails#app().has('spec')
2322
- let found += rails#app().relglob("spec/requests/","**/*","_spec.rb")
2323
- let found += rails#app().relglob("spec/integration/","**/*","_spec.rb")
2324
- endif
2325
- if rails#app().has('cucumber')
2326
- let found += rails#app().relglob("features/","**/*",".feature")
2327
- endif
2328
- return s:completion_filter(found,a:A)
2329
- endfunction
2330
-
2331
- function! s:specList(A,L,P)
2332
- return s:completion_filter(rails#app().relglob("spec/","**/*","_spec.rb"),a:A)
2333
- endfunction
2334
-
2335
- function! s:pluginList(A,L,P)
2336
- if a:A =~ '/'
2337
- return s:completion_filter(rails#app().relglob('vendor/plugins/',matchstr(a:A,'.\{-\}/').'**/*'),a:A)
2338
- else
2339
- return s:completion_filter(rails#app().relglob('vendor/plugins/',"*","/init.rb"),a:A)
2340
- endif
2341
- endfunction
2342
-
2343
- " Task files, not actual rake tasks
2344
- function! s:taskList(A,L,P)
2345
- let all = rails#app().relglob("lib/tasks/","**/*",".rake")
2346
- if RailsFilePath() =~ '\<vendor/plugins/.'
2347
- let path = s:sub(RailsFilePath(),'<vendor/plugins/[^/]*/\zs.*','')
2348
- let all = rails#app().relglob(path."tasks/","**/*",".rake")+rails#app().relglob(path."lib/tasks/","**/*",".rake")+all
2349
- endif
2350
- return s:autocamelize(all,a:A)
2351
- endfunction
2352
-
2353
- function! s:libList(A,L,P)
2354
- let all = rails#app().relglob('lib/',"**/*",".rb")
2355
- if RailsFilePath() =~ '\<vendor/plugins/.'
2356
- let path = s:sub(RailsFilePath(),'<vendor/plugins/[^/]*/\zs.*','lib/')
2357
- let all = rails#app().relglob(path,"**/*",".rb") + all
2358
- endif
2359
- return s:autocamelize(all,a:A)
2360
- endfunction
2361
-
2362
- function! s:environmentList(A,L,P)
2363
- return s:completion_filter(rails#app().relglob("config/environments/","**/*",".rb"),a:A)
2364
- endfunction
2365
-
2366
- function! s:initializerList(A,L,P)
2367
- return s:completion_filter(rails#app().relglob("config/initializers/","**/*",".rb"),a:A)
2368
- endfunction
2369
-
2370
- function! s:Navcommand(bang,...)
2371
- let suffix = ".rb"
2372
- let filter = "**/*"
2373
- let prefix = ""
2374
- let default = ""
2375
- let name = ""
2376
- let i = 0
2377
- while i < a:0
2378
- let i += 1
2379
- let arg = a:{i}
2380
- if arg =~# '^-suffix='
2381
- let suffix = matchstr(arg,'-suffix=\zs.*')
2382
- elseif arg =~# '^-default='
2383
- let default = matchstr(arg,'-default=\zs.*')
2384
- elseif arg =~# '^-\%(glob\|filter\)='
2385
- let filter = matchstr(arg,'-\w*=\zs.*')
2386
- elseif arg !~# '^-'
2387
- " A literal '\n'. For evaluation below
2388
- if name == ""
2389
- let name = arg
2390
- else
2391
- let prefix .= "\\n".s:sub(arg,'/=$','/')
2392
- endif
2393
- endif
2394
- endwhile
2395
- let prefix = s:sub(prefix,'^\\n','')
2396
- if name !~ '^[A-Za-z]\+$'
2397
- return s:error("E182: Invalid command name")
2398
- endif
2399
- let cmds = 'ESVTD '
2400
- let cmd = ''
2401
- while cmds != ''
2402
- exe 'command! -buffer -bar -bang -nargs=* -complete=customlist,'.s:sid.'CommandList R'.cmd.name." :call s:CommandEdit('".cmd."<bang>','".name."',\"".prefix."\",".string(suffix).",".string(filter).",".string(default).",<f-args>)"
2403
- let cmd = strpart(cmds,0,1)
2404
- let cmds = strpart(cmds,1)
2405
- endwhile
2406
- endfunction
2407
-
2408
- function! s:CommandList(A,L,P)
2409
- let cmd = matchstr(a:L,'\CR[A-Z]\=\w\+')
2410
- exe cmd." &"
2411
- let lp = s:last_prefix . "\n"
2412
- let res = []
2413
- while lp != ""
2414
- let p = matchstr(lp,'.\{-\}\ze\n')
2415
- let lp = s:sub(lp,'.{-}\n','')
2416
- let res += rails#app().relglob(p,s:last_filter,s:last_suffix)
2417
- endwhile
2418
- if s:last_camelize
2419
- return s:autocamelize(res,a:A)
2420
- else
2421
- return s:completion_filter(res,a:A)
2422
- endif
2423
- endfunction
2424
-
2425
- function! s:CommandEdit(cmd,name,prefix,suffix,filter,default,...)
2426
- if a:0 && a:1 == "&"
2427
- let s:last_prefix = a:prefix
2428
- let s:last_suffix = a:suffix
2429
- let s:last_filter = a:filter
2430
- let s:last_camelize = (a:suffix =~# '\.rb$')
2431
- else
2432
- if a:default == "both()"
2433
- if s:model() != ""
2434
- let default = s:model()
2435
- else
2436
- let default = s:controller()
2437
- endif
2438
- elseif a:default == "model()"
2439
- let default = s:model(1)
2440
- elseif a:default == "controller()"
2441
- let default = s:controller(1)
2442
- else
2443
- let default = a:default
2444
- endif
2445
- call s:EditSimpleRb(a:cmd,a:name,a:0 ? a:1 : default,a:prefix,a:suffix)
2446
- endif
2447
- endfunction
2448
-
2449
- function! s:EditSimpleRb(cmd,name,target,prefix,suffix,...)
2450
- let cmd = s:findcmdfor(a:cmd)
2451
- if a:target == ""
2452
- " Good idea to emulate error numbers like this?
2453
- return s:error("E471: Argument required")
2454
- endif
2455
- let f = a:0 ? a:target : rails#underscore(a:target)
2456
- let jump = matchstr(f,'[#!].*\|:\d*\%(:in\)\=$')
2457
- let f = s:sub(f,'[#!].*|:\d*%(:in)=$','')
2458
- if jump =~ '^!'
2459
- let cmd = s:editcmdfor(cmd)
2460
- endif
2461
- if f == '.'
2462
- let f = s:sub(f,'\.$','')
2463
- else
2464
- let f .= a:suffix.jump
2465
- endif
2466
- let f = s:gsub(a:prefix,'\n',f.'\n').f
2467
- return s:findedit(cmd,f)
2468
- endfunction
2469
-
2470
- function! s:app_migration(file) dict
2471
- let arg = a:file
2472
- if arg =~ '^0$\|^0\=[#:]'
2473
- let suffix = s:sub(arg,'^0*','')
2474
- if self.has_file('db/schema.rb')
2475
- return 'db/schema.rb'.suffix
2476
- elseif self.has_file('db/'.s:environment().'_structure.sql')
2477
- return 'db/'.s:environment().'_structure.sql'.suffix
2478
- else
2479
- return 'db/schema.rb'.suffix
2480
- endif
2481
- elseif arg =~ '^\d$'
2482
- let glob = '00'.arg.'_*.rb'
2483
- elseif arg =~ '^\d\d$'
2484
- let glob = '0'.arg.'_*.rb'
2485
- elseif arg =~ '^\d\d\d$'
2486
- let glob = ''.arg.'_*.rb'
2487
- elseif arg == ''
2488
- let glob = '*.rb'
2489
- else
2490
- let glob = '*'.rails#underscore(arg).'*rb'
2491
- endif
2492
- let files = split(glob(self.path('db/migrate/').glob),"\n")
2493
- if arg == ''
2494
- return get(files,-1,'')
2495
- endif
2496
- call map(files,'strpart(v:val,1+strlen(self.path()))')
2497
- let keep = get(files,0,'')
2498
- if glob =~# '^\*.*\*rb'
2499
- let pattern = glob[1:-4]
2500
- call filter(files,'v:val =~# ''db/migrate/\d\+_''.pattern.''\.rb''')
2501
- let keep = get(files,0,keep)
2502
- endif
2503
- return keep
2504
- endfunction
2505
-
2506
- call s:add_methods('app', ['migration'])
2507
-
2508
- function! s:migrationEdit(cmd,...)
2509
- let cmd = s:findcmdfor(a:cmd)
2510
- let arg = a:0 ? a:1 : ''
2511
- let migr = arg == "." ? "db/migrate" : rails#app().migration(arg)
2512
- if migr != ''
2513
- call s:findedit(cmd,migr)
2514
- else
2515
- return s:error("Migration not found".(arg=='' ? '' : ': '.arg))
2516
- endif
2517
- endfunction
2518
-
2519
- function! s:fixturesEdit(cmd,...)
2520
- if a:0
2521
- let c = rails#underscore(a:1)
2522
- else
2523
- let c = rails#pluralize(s:model(1))
2524
- endif
2525
- if c == ""
2526
- return s:error("E471: Argument required")
2527
- endif
2528
- let e = fnamemodify(c,':e')
2529
- let e = e == '' ? e : '.'.e
2530
- let c = fnamemodify(c,':r')
2531
- let file = get(rails#app().test_suites(),0,'test').'/fixtures/'.c.e
2532
- if file =~ '\.\w\+$' && rails#app().find_file(c.e,["test/fixtures","spec/fixtures"]) ==# ''
2533
- call s:edit(a:cmd,file)
2534
- else
2535
- call s:findedit(a:cmd,rails#app().find_file(c.e,["test/fixtures","spec/fixtures"],[".yml",".csv"],file))
2536
- endif
2537
- endfunction
2538
-
2539
- function! s:localeEdit(cmd,...)
2540
- let c = a:0 ? a:1 : rails#app().default_locale()
2541
- if c =~# '\.'
2542
- call s:edit(a:cmd,rails#app().find_file(c,'config/locales',[],'config/locales/'.c))
2543
- else
2544
- call s:findedit(a:cmd,rails#app().find_file(c,'config/locales',['.yml','.rb'],'config/locales/'.c))
2545
- endif
2546
- endfunction
2547
-
2548
- function! s:metalEdit(cmd,...)
2549
- if a:0
2550
- call s:EditSimpleRb(a:cmd,"metal",a:1,"app/metal/",".rb")
2551
- else
2552
- call s:EditSimpleRb(a:cmd,"metal",'config/boot',"",".rb")
2553
- endif
2554
- endfunction
2555
-
2556
- function! s:modelEdit(cmd,...)
2557
- call s:EditSimpleRb(a:cmd,"model",a:0? a:1 : s:model(1),"app/models/",".rb")
2558
- endfunction
2559
-
2560
- function! s:observerEdit(cmd,...)
2561
- call s:EditSimpleRb(a:cmd,"observer",a:0? a:1 : s:model(1),"app/models/","_observer.rb")
2562
- endfunction
2563
-
2564
- function! s:viewEdit(cmd,...)
2565
- if a:0 && a:1 =~ '^[^!#:]'
2566
- let view = matchstr(a:1,'[^!#:]*')
2567
- elseif rails#buffer().type_name('controller','mailer')
2568
- let view = s:lastmethod(line('.'))
2569
- else
2570
- let view = ''
2571
- endif
2572
- if view == ''
2573
- return s:error("No view name given")
2574
- elseif view == '.'
2575
- return s:edit(a:cmd,'app/views')
2576
- elseif view !~ '/' && s:controller(1) != ''
2577
- let view = s:controller(1) . '/' . view
2578
- endif
2579
- if view !~ '/'
2580
- return s:error("Cannot find view without controller")
2581
- endif
2582
- let file = "app/views/".view
2583
- let found = s:findview(view)
2584
- if found != ''
2585
- let dir = fnamemodify(rails#app().path(found),':h')
2586
- if !isdirectory(dir)
2587
- if a:0 && a:1 =~ '!'
2588
- call mkdir(dir,'p')
2589
- else
2590
- return s:error('No such directory')
2591
- endif
2592
- endif
2593
- call s:edit(a:cmd,found)
2594
- elseif file =~ '\.\w\+$'
2595
- call s:findedit(a:cmd,file)
2596
- else
2597
- let format = s:format(rails#buffer().type_name('mailer') ? 'text' : 'html')
2598
- if glob(rails#app().path(file.'.'.format).'.*[^~]') != ''
2599
- let file .= '.' . format
2600
- endif
2601
- call s:findedit(a:cmd,file)
2602
- endif
2603
- endfunction
2604
-
2605
- function! s:findview(name)
2606
- let self = rails#buffer()
2607
- let name = a:name
2608
- let pre = 'app/views/'
2609
- if name !~# '/'
2610
- let controller = self.controller_name(1)
2611
- if controller != ''
2612
- let name = controller.'/'.name
2613
- endif
2614
- endif
2615
- if name =~# '\.\w\+\.\w\+$' || name =~# '\.'.s:viewspattern().'$'
2616
- return pre.name
2617
- else
2618
- for format in ['.'.s:format('html'), '']
2619
- for type in s:view_types
2620
- if self.app().has_file(pre.name.format.'.'.type)
2621
- return pre.name.format.'.'.type
2622
- endif
2623
- endfor
2624
- endfor
2625
- endif
2626
- return ''
2627
- endfunction
2628
-
2629
- function! s:findlayout(name)
2630
- return s:findview("layouts/".(a:name == '' ? 'application' : a:name))
2631
- endfunction
2632
-
2633
- function! s:layoutEdit(cmd,...)
2634
- if a:0
2635
- return s:viewEdit(a:cmd,"layouts/".a:1)
2636
- endif
2637
- let file = s:findlayout(s:controller(1))
2638
- if file == ""
2639
- let file = s:findlayout("application")
2640
- endif
2641
- if file == ""
2642
- let file = "app/views/layouts/application.html.erb"
2643
- endif
2644
- call s:edit(a:cmd,s:sub(file,'^/',''))
2645
- endfunction
2646
-
2647
- function! s:controllerEdit(cmd,...)
2648
- let suffix = '.rb'
2649
- if a:0 == 0
2650
- let controller = s:controller(1)
2651
- if rails#buffer().type_name() =~# '^view\%(-layout\|-partial\)\@!'
2652
- let suffix .= '#'.expand('%:t:r')
2653
- endif
2654
- else
2655
- let controller = a:1
2656
- endif
2657
- if rails#app().has_file("app/controllers/".controller."_controller.rb") || !rails#app().has_file("app/controllers/".controller.".rb")
2658
- let suffix = "_controller".suffix
2659
- endif
2660
- return s:EditSimpleRb(a:cmd,"controller",controller,"app/controllers/",suffix)
2661
- endfunction
2662
-
2663
- function! s:mailerEdit(cmd,...)
2664
- return s:EditSimpleRb(a:cmd,"mailer",a:0? a:1 : s:controller(1),"app/mailers/\napp/models/",".rb")
2665
- endfunction
2666
-
2667
- function! s:helperEdit(cmd,...)
2668
- return s:EditSimpleRb(a:cmd,"helper",a:0? a:1 : s:controller(1),"app/helpers/","_helper.rb")
2669
- endfunction
2670
-
2671
- function! s:stylesheetEdit(cmd,...)
2672
- let name = a:0 ? a:1 : s:controller(1)
2673
- if rails#app().has('sass') && rails#app().has_file('public/stylesheets/sass/'.name.'.sass')
2674
- return s:EditSimpleRb(a:cmd,"stylesheet",name,"public/stylesheets/sass/",".sass",1)
2675
- elseif rails#app().has('sass') && rails#app().has_file('public/stylesheets/sass/'.name.'.scss')
2676
- return s:EditSimpleRb(a:cmd,"stylesheet",name,"public/stylesheets/sass/",".scss",1)
2677
- elseif rails#app().has('lesscss') && rails#app().has_file('app/stylesheets/'.name.'.less')
2678
- return s:EditSimpleRb(a:cmd,"stylesheet",name,"app/stylesheets/",".less",1)
2679
- else
2680
- let types = rails#app().relglob('app/assets/stylesheets/'.name,'.*','')
2681
- if !empty(types)
2682
- return s:EditSimpleRb(a:cmd,'stylesheet',name,'app/assets/stylesheets/',types[0],1)
2683
- else
2684
- return s:EditSimpleRb(a:cmd,'stylesheet',name,'public/stylesheets/','.css',1)
2685
- endif
2686
- endif
2687
- endfunction
2688
-
2689
- function! s:javascriptEdit(cmd,...)
2690
- let name = a:0 ? a:1 : s:controller(1)
2691
- if rails#app().has('coffee') && rails#app().has_file('app/scripts/'.name.'.coffee')
2692
- return s:EditSimpleRb(a:cmd,'javascript',name,'app/scripts/','.coffee',1)
2693
- elseif rails#app().has('coffee') && rails#app().has_file('app/scripts/'.name.'.js')
2694
- return s:EditSimpleRb(a:cmd,'javascript',name,'app/scripts/','.js',1)
2695
- else
2696
- let types = rails#app().relglob('app/assets/javascripts/'.name,'.*','')
2697
- if !empty(types)
2698
- return s:EditSimpleRb(a:cmd,'javascript',name,'app/assets/javascripts/',types[0],1)
2699
- else
2700
- return s:EditSimpleRb(a:cmd,'javascript',name,'public/javascripts/','.js',1)
2701
- endif
2702
- endif
2703
- endfunction
2704
-
2705
- function! s:unittestEdit(cmd,...)
2706
- let f = rails#underscore(a:0 ? matchstr(a:1,'[^!#:]*') : s:model(1))
2707
- let jump = a:0 ? matchstr(a:1,'[!#:].*') : ''
2708
- if jump =~ '!'
2709
- let cmd = s:editcmdfor(a:cmd)
2710
- else
2711
- let cmd = s:findcmdfor(a:cmd)
2712
- endif
2713
- let mapping = {'test': ['test/unit/','_test.rb'], 'spec': ['spec/models/','_spec.rb']}
2714
- let tests = map(filter(rails#app().test_suites(),'has_key(mapping,v:val)'),'get(mapping,v:val)')
2715
- if empty(tests)
2716
- let tests = [mapping['test']]
2717
- endif
2718
- for [prefix, suffix] in tests
2719
- if !a:0 && rails#buffer().type_name('model-aro') && f != '' && f !~# '_observer$'
2720
- if rails#app().has_file(prefix.f.'_observer'.suffix)
2721
- return s:findedit(cmd,prefix.f.'_observer'.suffix.jump)
2722
- endif
2723
- endif
2724
- endfor
2725
- for [prefix, suffix] in tests
2726
- if rails#app().has_file(prefix.f.suffix)
2727
- return s:findedit(cmd,prefix.f.suffix.jump)
2728
- endif
2729
- endfor
2730
- return s:EditSimpleRb(a:cmd,"unittest",f.jump,tests[0][0],tests[0][1],1)
2731
- endfunction
2732
-
2733
- function! s:functionaltestEdit(cmd,...)
2734
- let f = rails#underscore(a:0 ? matchstr(a:1,'[^!#:]*') : s:controller(1))
2735
- let jump = a:0 ? matchstr(a:1,'[!#:].*') : ''
2736
- if jump =~ '!'
2737
- let cmd = s:editcmdfor(a:cmd)
2738
- else
2739
- let cmd = s:findcmdfor(a:cmd)
2740
- endif
2741
- let mapping = {'test': [['test/functional/'],['_test.rb','_controller_test.rb']], 'spec': [['spec/controllers/','spec/mailers/'],['_spec.rb','_controller_spec.rb']]}
2742
- let tests = map(filter(rails#app().test_suites(),'has_key(mapping,v:val)'),'get(mapping,v:val)')
2743
- if empty(tests)
2744
- let tests = [mapping[tests]]
2745
- endif
2746
- for [prefixes, suffixes] in tests
2747
- for prefix in prefixes
2748
- for suffix in suffixes
2749
- if rails#app().has_file(prefix.f.suffix)
2750
- return s:findedit(cmd,prefix.f.suffix.jump)
2751
- endif
2752
- endfor
2753
- endfor
2754
- endfor
2755
- return s:EditSimpleRb(a:cmd,"functionaltest",f.jump,tests[0][0][0],tests[0][1][0],1)
2756
- endfunction
2757
-
2758
- function! s:integrationtestEdit(cmd,...)
2759
- if !a:0
2760
- return s:EditSimpleRb(a:cmd,"integrationtest","test/test_helper\nfeatures/support/env\nspec/spec_helper","",".rb")
2761
- endif
2762
- let f = rails#underscore(matchstr(a:1,'[^!#:]*'))
2763
- let jump = matchstr(a:1,'[!#:].*')
2764
- if jump =~ '!'
2765
- let cmd = s:editcmdfor(a:cmd)
2766
- else
2767
- let cmd = s:findcmdfor(a:cmd)
2768
- endif
2769
- let tests = [['test/integration/','_test.rb'], [ 'spec/requests/','_spec.rb'], [ 'spec/integration/','_spec.rb'], [ 'features/','.feature']]
2770
- call filter(tests, 'isdirectory(rails#app().path(v:val[0]))')
2771
- if empty(tests)
2772
- let tests = [['test/integration/','_test.rb']]
2773
- endif
2774
- for [prefix, suffix] in tests
2775
- if rails#app().has_file(prefix.f.suffix)
2776
- return s:findedit(cmd,prefix.f.suffix.jump)
2777
- elseif rails#app().has_file(prefix.rails#underscore(f).suffix)
2778
- return s:findedit(cmd,prefix.rails#underscore(f).suffix.jump)
2779
- endif
2780
- endfor
2781
- return s:EditSimpleRb(a:cmd,"integrationtest",f.jump,tests[0][0],tests[0][1],1)
2782
- endfunction
2783
-
2784
- function! s:specEdit(cmd,...)
2785
- if a:0
2786
- return s:EditSimpleRb(a:cmd,"spec",a:1,"spec/","_spec.rb")
2787
- else
2788
- call s:EditSimpleRb(a:cmd,"spec","spec_helper","spec/",".rb")
2789
- endif
2790
- endfunction
2791
-
2792
- function! s:pluginEdit(cmd,...)
2793
- let cmd = s:findcmdfor(a:cmd)
2794
- let plugin = ""
2795
- let extra = ""
2796
- if RailsFilePath() =~ '\<vendor/plugins/.'
2797
- let plugin = matchstr(RailsFilePath(),'\<vendor/plugins/\zs[^/]*\ze')
2798
- let extra = "vendor/plugins/" . plugin . "/\n"
2799
- endif
2800
- if a:0
2801
- if a:1 =~ '^[^/.]*/\=$' && rails#app().has_file("vendor/plugins/".a:1."/init.rb")
2802
- return s:EditSimpleRb(a:cmd,"plugin",s:sub(a:1,'/$',''),"vendor/plugins/","/init.rb")
2803
- elseif plugin == ""
2804
- call s:edit(cmd,"vendor/plugins/".s:sub(a:1,'\.$',''))
2805
- elseif a:1 == "."
2806
- call s:findedit(cmd,"vendor/plugins/".plugin)
2807
- elseif isdirectory(rails#app().path("vendor/plugins/".matchstr(a:1,'^[^/]*')))
2808
- call s:edit(cmd,"vendor/plugins/".a:1)
2809
- else
2810
- call s:findedit(cmd,"vendor/plugins/".a:1."\nvendor/plugins/".plugin."/".a:1)
2811
- endif
2812
- else
2813
- call s:findedit(a:cmd,"Gemfile")
2814
- endif
2815
- endfunction
2816
-
2817
- function! s:taskEdit(cmd,...)
2818
- let plugin = ""
2819
- let extra = ""
2820
- if RailsFilePath() =~ '\<vendor/plugins/.'
2821
- let plugin = matchstr(RailsFilePath(),'\<vendor/plugins/[^/]*')
2822
- let extra = plugin."/tasks/\n".plugin."/lib/tasks/\n"
2823
- endif
2824
- if a:0
2825
- call s:EditSimpleRb(a:cmd,"task",a:1,extra."lib/tasks/",".rake")
2826
- else
2827
- call s:findedit(a:cmd,(plugin != "" ? plugin."/Rakefile\n" : "")."Rakefile")
2828
- endif
2829
- endfunction
2830
-
2831
- function! s:libEdit(cmd,...)
2832
- let extra = ""
2833
- if RailsFilePath() =~ '\<vendor/plugins/.'
2834
- let extra = s:sub(RailsFilePath(),'<vendor/plugins/[^/]*/\zs.*','lib/')."\n"
2835
- endif
2836
- if a:0
2837
- call s:EditSimpleRb(a:cmd,"lib",a:0? a:1 : "",extra."lib/",".rb")
2838
- else
2839
- call s:EditSimpleRb(a:cmd,"lib","seeds","db/",".rb")
2840
- endif
2841
- endfunction
2842
-
2843
- function! s:environmentEdit(cmd,...)
2844
- if a:0 || rails#app().has_file('config/application.rb')
2845
- return s:EditSimpleRb(a:cmd,"environment",a:0? a:1 : "../application","config/environments/",".rb")
2846
- else
2847
- return s:EditSimpleRb(a:cmd,"environment","environment","config/",".rb")
2848
- endif
2849
- endfunction
2850
-
2851
- function! s:initializerEdit(cmd,...)
2852
- return s:EditSimpleRb(a:cmd,"initializer",a:0? a:1 : "../routes","config/initializers/",".rb")
2853
- endfunction
2854
-
2855
- " }}}1
2856
- " Alternate/Related {{{1
2857
-
2858
- function! s:findcmdfor(cmd)
2859
- let bang = ''
2860
- if a:cmd =~ '\!$'
2861
- let bang = '!'
2862
- let cmd = s:sub(a:cmd,'\!$','')
2863
- else
2864
- let cmd = a:cmd
2865
- endif
2866
- if cmd =~ '^\d'
2867
- let num = matchstr(cmd,'^\d\+')
2868
- let cmd = s:sub(cmd,'^\d+','')
2869
- else
2870
- let num = ''
2871
- endif
2872
- if cmd == '' || cmd == 'E' || cmd == 'F'
2873
- return num.'find'.bang
2874
- elseif cmd == 'S'
2875
- return num.'sfind'.bang
2876
- elseif cmd == 'V'
2877
- return 'vert '.num.'sfind'.bang
2878
- elseif cmd == 'T'
2879
- return num.'tabfind'.bang
2880
- elseif cmd == 'D'
2881
- return num.'read'.bang
2882
- else
2883
- return num.cmd.bang
2884
- endif
2885
- endfunction
2886
-
2887
- function! s:editcmdfor(cmd)
2888
- let cmd = s:findcmdfor(a:cmd)
2889
- let cmd = s:sub(cmd,'<sfind>','split')
2890
- let cmd = s:sub(cmd,'find>','edit')
2891
- return cmd
2892
- endfunction
2893
-
2894
- function! s:try(cmd) abort
2895
- if !exists(":try")
2896
- " I've seen at least one weird setup without :try
2897
- exe a:cmd
2898
- else
2899
- try
2900
- exe a:cmd
2901
- catch
2902
- call s:error(s:sub(v:exception,'^.{-}:\zeE',''))
2903
- return 0
2904
- endtry
2905
- endif
2906
- return 1
2907
- endfunction
2908
-
2909
- function! s:findedit(cmd,files,...) abort
2910
- let cmd = s:findcmdfor(a:cmd)
2911
- let files = type(a:files) == type([]) ? copy(a:files) : split(a:files,"\n")
2912
- if len(files) == 1
2913
- let file = files[0]
2914
- else
2915
- let file = get(filter(copy(files),'rails#app().has_file(s:sub(v:val,"#.*|:\\d*$",""))'),0,get(files,0,''))
2916
- endif
2917
- if file =~ '[#!]\|:\d*\%(:in\)\=$'
2918
- let djump = matchstr(file,'!.*\|#\zs.*\|:\zs\d*\ze\%(:in\)\=$')
2919
- let file = s:sub(file,'[#!].*|:\d*%(:in)=$','')
2920
- else
2921
- let djump = ''
2922
- endif
2923
- if file == ''
2924
- let testcmd = "edit"
2925
- elseif isdirectory(rails#app().path(file))
2926
- let arg = file == "." ? rails#app().path() : rails#app().path(file)
2927
- let testcmd = s:editcmdfor(cmd).' '.(a:0 ? a:1 . ' ' : '').s:escarg(arg)
2928
- exe testcmd
2929
- return
2930
- elseif rails#app().path() =~ '://' || cmd =~ 'edit' || cmd =~ 'split'
2931
- if file !~ '^/' && file !~ '^\w:' && file !~ '://'
2932
- let file = s:escarg(rails#app().path(file))
2933
- endif
2934
- let testcmd = s:editcmdfor(cmd).' '.(a:0 ? a:1 . ' ' : '').file
2935
- else
2936
- let testcmd = cmd.' '.(a:0 ? a:1 . ' ' : '').file
2937
- endif
2938
- if s:try(testcmd)
2939
- call s:djump(djump)
2940
- endif
2941
- endfunction
2942
-
2943
- function! s:edit(cmd,file,...)
2944
- let cmd = s:editcmdfor(a:cmd)
2945
- let cmd .= ' '.(a:0 ? a:1 . ' ' : '')
2946
- let file = a:file
2947
- if file !~ '^/' && file !~ '^\w:' && file !~ '://'
2948
- exe cmd."`=fnamemodify(rails#app().path(file),':.')`"
2949
- else
2950
- exe cmd.file
2951
- endif
2952
- endfunction
2953
-
2954
- function! s:Alternate(cmd,line1,line2,count,...)
2955
- if a:0
2956
- if a:count && a:cmd !~# 'D'
2957
- return call('s:Find',[1,a:line1.a:cmd]+a:000)
2958
- elseif a:count
2959
- return call('s:Edit',[1,a:line1.a:cmd]+a:000)
2960
- else
2961
- return call('s:Edit',[1,a:cmd]+a:000)
2962
- endif
2963
- else
2964
- let file = s:getopt(a:count ? 'related' : 'alternate', 'bl')
2965
- if file == ''
2966
- let file = rails#buffer().related(a:count)
2967
- endif
2968
- if file != ''
2969
- call s:findedit(a:cmd,file)
2970
- else
2971
- call s:warn("No alternate file is defined")
2972
- endif
2973
- endif
2974
- endfunction
2975
-
2976
- function! s:Related(cmd,line1,line2,count,...)
2977
- if a:count == 0 && a:0 == 0
2978
- return s:Alternate(a:cmd,a:line1,a:line1,a:line1)
2979
- else
2980
- return call('s:Alternate',[a:cmd,a:line1,a:line2,a:count]+a:000)
2981
- endif
2982
- endfunction
2983
-
2984
- function! s:Complete_related(A,L,P)
2985
- if a:L =~# '^[[:alpha:]]'
2986
- return s:Complete_edit(a:A,a:L,a:P)
2987
- else
2988
- return s:Complete_find(a:A,a:L,a:P)
2989
- endif
2990
- endfunction
2991
-
2992
- function! s:readable_related(...) dict abort
2993
- let f = self.name()
2994
- if a:0 && a:1
2995
- let lastmethod = self.last_method(a:1)
2996
- if self.type_name('controller','mailer') && lastmethod != ""
2997
- let root = s:sub(s:sub(s:sub(f,'/application%(_controller)=\.rb$','/shared_controller.rb'),'/%(controllers|models|mailers)/','/views/'),'%(_controller)=\.rb$','/'.lastmethod)
2998
- let format = self.last_format(a:1)
2999
- if format == ''
3000
- let format = self.type_name('mailer') ? 'text' : 'html'
3001
- endif
3002
- if glob(self.app().path().'/'.root.'.'.format.'.*[^~]') != ''
3003
- return root . '.' . format
3004
- else
3005
- return root
3006
- endif
3007
- elseif f =~ '\<config/environments/'
3008
- return "config/database.yml#". fnamemodify(f,':t:r')
3009
- elseif f =~ '\<config/database\.yml$'
3010
- if lastmethod != ""
3011
- return "config/environments/".lastmethod.".rb"
3012
- else
3013
- return "config/application.rb\nconfig/environment.rb"
3014
- endif
3015
- elseif f =~ '\<config/routes\.rb$' | return "config/database.yml"
3016
- elseif f =~ '\<config/\%(application\|environment\)\.rb$'
3017
- return "config/routes.rb"
3018
- elseif self.type_name('view-layout')
3019
- return s:sub(s:sub(f,'/views/','/controllers/'),'/layouts/(\k+)\..*$','/\1_controller.rb')
3020
- elseif self.type_name('view')
3021
- let controller = s:sub(s:sub(f,'/views/','/controllers/'),'/(\k+%(\.\k+)=)\..*$','_controller.rb#\1')
3022
- let controller2 = s:sub(s:sub(f,'/views/','/controllers/'),'/(\k+%(\.\k+)=)\..*$','.rb#\1')
3023
- let mailer = s:sub(s:sub(f,'/views/','/mailers/'),'/(\k+%(\.\k+)=)\..*$','.rb#\1')
3024
- let model = s:sub(s:sub(f,'/views/','/models/'),'/(\k+)\..*$','.rb#\1')
3025
- if self.app().has_file(s:sub(controller,'#.{-}$',''))
3026
- return controller
3027
- elseif self.app().has_file(s:sub(controller2,'#.{-}$',''))
3028
- return controller2
3029
- elseif self.app().has_file(s:sub(mailer,'#.{-}$',''))
3030
- return mailer
3031
- elseif self.app().has_file(s:sub(model,'#.{-}$','')) || model =~ '_mailer\.rb#'
3032
- return model
3033
- else
3034
- return controller
3035
- endif
3036
- elseif self.type_name('controller')
3037
- return s:sub(s:sub(f,'/controllers/','/helpers/'),'%(_controller)=\.rb$','_helper.rb')
3038
- " elseif self.type_name('helper')
3039
- " return s:findlayout(s:controller())
3040
- elseif self.type_name('model-arb')
3041
- let table_name = matchstr(join(self.getline(1,50),"\n"),'\n\s*set_table_name\s*[:"'']\zs\w\+')
3042
- if table_name == ''
3043
- let table_name = rails#pluralize(s:gsub(s:sub(fnamemodify(f,':r'),'.{-}<app/models/',''),'/','_'))
3044
- endif
3045
- return self.app().migration('0#'.table_name)
3046
- elseif self.type_name('model-aro')
3047
- return s:sub(f,'_observer\.rb$','.rb')
3048
- elseif self.type_name('db-schema')
3049
- return self.app().migration(1)
3050
- endif
3051
- endif
3052
- if f =~ '\<config/environments/'
3053
- return "config/application.rb\nconfig/environment.rb"
3054
- elseif f == 'README'
3055
- return "config/database.yml"
3056
- elseif f =~ '\<config/database\.yml$' | return "config/routes.rb"
3057
- elseif f =~ '\<config/routes\.rb$'
3058
- return "config/application.rb\nconfig/environment.rb"
3059
- elseif f =~ '\<config/\%(application\|environment\)\.rb$'
3060
- return "config/database.yml"
3061
- elseif f ==# 'Gemfile'
3062
- return 'Gemfile.lock'
3063
- elseif f ==# 'Gemfile.lock'
3064
- return 'Gemfile'
3065
- elseif f =~ '\<db/migrate/'
3066
- let migrations = sort(self.app().relglob('db/migrate/','*','.rb'))
3067
- let me = matchstr(f,'\<db/migrate/\zs.*\ze\.rb$')
3068
- if !exists('l:lastmethod') || lastmethod == 'down'
3069
- let candidates = reverse(filter(copy(migrations),'v:val < me'))
3070
- let migration = "db/migrate/".get(candidates,0,migrations[-1]).".rb"
3071
- else
3072
- let candidates = filter(copy(migrations),'v:val > me')
3073
- let migration = "db/migrate/".get(candidates,0,migrations[0]).".rb"
3074
- endif
3075
- return migration . (exists('l:lastmethod') && lastmethod != '' ? '#'.lastmethod : '')
3076
- elseif f =~ '\<application\.js$'
3077
- return "app/helpers/application_helper.rb"
3078
- elseif self.type_name('javascript')
3079
- return "public/javascripts/application.js"
3080
- elseif self.type_name('db/schema')
3081
- return self.app().migration('')
3082
- elseif self.type_name('view')
3083
- let spec1 = fnamemodify(f,':s?\<app/?spec/?')."_spec.rb"
3084
- let spec2 = fnamemodify(f,':r:s?\<app/?spec/?')."_spec.rb"
3085
- let spec3 = fnamemodify(f,':r:r:s?\<app/?spec/?')."_spec.rb"
3086
- if self.app().has_file(spec1)
3087
- return spec1
3088
- elseif self.app().has_file(spec2)
3089
- return spec2
3090
- elseif self.app().has_file(spec3)
3091
- return spec3
3092
- elseif self.app().has('spec')
3093
- return spec2
3094
- else
3095
- if self.type_name('view-layout')
3096
- let dest = fnamemodify(f,':r:s?/layouts\>??').'/layout.'.fnamemodify(f,':e')
3097
- else
3098
- let dest = f
3099
- endif
3100
- return s:sub(s:sub(dest,'<app/views/','test/functional/'),'/[^/]*$','_controller_test.rb')
3101
- endif
3102
- elseif self.type_name('controller-api')
3103
- let api = s:sub(s:sub(f,'/controllers/','/apis/'),'_controller\.rb$','_api.rb')
3104
- return api
3105
- elseif self.type_name('api')
3106
- return s:sub(s:sub(f,'/apis/','/controllers/'),'_api\.rb$','_controller.rb')
3107
- elseif self.type_name('fixtures') && f =~ '\<spec/'
3108
- let file = rails#singularize(fnamemodify(f,":t:r")).'_spec.rb'
3109
- return file
3110
- elseif self.type_name('fixtures')
3111
- let file = rails#singularize(fnamemodify(f,":t:r")).'_test.rb'
3112
- return file
3113
- elseif f == ''
3114
- call s:warn("No filename present")
3115
- elseif f =~ '\<test/unit/routing_test\.rb$'
3116
- return 'config/routes.rb'
3117
- elseif self.type_name('spec-view')
3118
- return s:sub(s:sub(f,'<spec/','app/'),'_spec\.rb$','')
3119
- elseif fnamemodify(f,":e") == "rb"
3120
- let file = fnamemodify(f,":r")
3121
- if file =~ '_\%(test\|spec\)$'
3122
- let file = s:sub(file,'_%(test|spec)$','.rb')
3123
- else
3124
- let file .= '_test.rb'
3125
- endif
3126
- if self.type_name('helper')
3127
- return s:sub(file,'<app/helpers/','test/unit/helpers/')."\n".s:sub(s:sub(file,'_test\.rb$','_spec.rb'),'<app/helpers/','spec/helpers/')
3128
- elseif self.type_name('model')
3129
- return s:sub(file,'<app/models/','test/unit/')."\n".s:sub(s:sub(file,'_test\.rb$','_spec.rb'),'<app/models/','spec/models/')
3130
- elseif self.type_name('controller')
3131
- return s:sub(file,'<app/controllers/','test/functional/')."\n".s:sub(s:sub(file,'_test\.rb$','_spec.rb'),'app/controllers/','spec/controllers/')
3132
- elseif self.type_name('mailer')
3133
- return s:sub(file,'<app/m%(ailer|odel)s/','test/unit/')."\n".s:sub(s:sub(file,'_test\.rb$','_spec.rb'),'<app/','spec/')
3134
- elseif self.type_name('test-unit')
3135
- return s:sub(s:sub(file,'test/unit/helpers/','app/helpers/'),'test/unit/','app/models/')."\n".s:sub(file,'test/unit/','lib/')
3136
- elseif self.type_name('test-functional')
3137
- if file =~ '_api\.rb'
3138
- return s:sub(file,'test/functional/','app/apis/')
3139
- elseif file =~ '_controller\.rb'
3140
- return s:sub(file,'test/functional/','app/controllers/')
3141
- else
3142
- return s:sub(file,'test/functional/','')
3143
- endif
3144
- elseif self.type_name('spec-lib')
3145
- return s:sub(file,'<spec/','')
3146
- elseif self.type_name('lib')
3147
- return s:sub(f, '<lib/(.*)\.rb$', 'test/unit/\1_test.rb')."\n".s:sub(f, '<lib/(.*)\.rb$', 'spec/lib/\1_spec.rb')
3148
- elseif self.type_name('spec')
3149
- return s:sub(file,'<spec/','app/')
3150
- elseif file =~ '\<vendor/.*/lib/'
3151
- return s:sub(file,'<vendor/.{-}/\zslib/','test/')
3152
- elseif file =~ '\<vendor/.*/test/'
3153
- return s:sub(file,'<vendor/.{-}/\zstest/','lib/')
3154
- else
3155
- return fnamemodify(file,':t')."\n".s:sub(s:sub(f,'\.rb$','_spec.rb'),'^app/','spec/')
3156
- endif
3157
- else
3158
- return ""
3159
- endif
3160
- endfunction
3161
-
3162
- call s:add_methods('readable',['related'])
3163
-
3164
- " }}}1
3165
- " Partial Extraction {{{1
3166
-
3167
- function! s:Extract(bang,...) range abort
3168
- if a:0 == 0 || a:0 > 1
3169
- return s:error("Incorrect number of arguments")
3170
- endif
3171
- if a:1 =~ '[^a-z0-9_/.]'
3172
- return s:error("Invalid partial name")
3173
- endif
3174
- let rails_root = rails#app().path()
3175
- let ext = expand("%:e")
3176
- let file = s:sub(a:1,'%(/|^)\zs_\ze[^/]*$','')
3177
- let first = a:firstline
3178
- let last = a:lastline
3179
- let range = first.",".last
3180
- if rails#buffer().type_name('view-layout')
3181
- if RailsFilePath() =~ '\<app/views/layouts/application\>'
3182
- let curdir = 'app/views/shared'
3183
- if file !~ '/'
3184
- let file = "shared/" .file
3185
- endif
3186
- else
3187
- let curdir = s:sub(RailsFilePath(),'.*<app/views/layouts/(.*)%(\.\w*)$','app/views/\1')
3188
- endif
3189
- else
3190
- let curdir = fnamemodify(RailsFilePath(),':h')
3191
- endif
3192
- let curdir = rails_root."/".curdir
3193
- let dir = fnamemodify(file,":h")
3194
- let fname = fnamemodify(file,":t")
3195
- if fnamemodify(fname,":e") == ""
3196
- let name = fname
3197
- let fname .= ".".matchstr(expand("%:t"),'\.\zs.*')
3198
- elseif fnamemodify(fname,":e") !~ '^'.s:viewspattern().'$'
3199
- let name = fnamemodify(fname,":r")
3200
- let fname .= ".".ext
3201
- else
3202
- let name = fnamemodify(fname,":r:r")
3203
- endif
3204
- let var = "@".name
3205
- let collection = ""
3206
- if dir =~ '^/'
3207
- let out = (rails_root).dir."/_".fname
3208
- elseif dir == "" || dir == "."
3209
- let out = (curdir)."/_".fname
3210
- elseif isdirectory(curdir."/".dir)
3211
- let out = (curdir)."/".dir."/_".fname
3212
- else
3213
- let out = (rails_root)."/app/views/".dir."/_".fname
3214
- endif
3215
- if filereadable(out) && !a:bang
3216
- return s:error('E13: File exists (add ! to override)')
3217
- endif
3218
- if !isdirectory(fnamemodify(out,':h'))
3219
- if a:bang
3220
- call mkdir(fnamemodify(out,':h'),'p')
3221
- else
3222
- return s:error('No such directory')
3223
- endif
3224
- endif
3225
- " No tabs, they'll just complicate things
3226
- if ext =~? '^\%(rhtml\|erb\|dryml\)$'
3227
- let erub1 = '\<\%\s*'
3228
- let erub2 = '\s*-=\%\>'
3229
- else
3230
- let erub1 = ''
3231
- let erub2 = ''
3232
- endif
3233
- let spaces = matchstr(getline(first),"^ *")
3234
- if getline(last+1) =~ '\v^\s*'.erub1.'end'.erub2.'\s*$'
3235
- let fspaces = matchstr(getline(last+1),"^ *")
3236
- if getline(first-1) =~ '\v^'.fspaces.erub1.'for\s+(\k+)\s+in\s+([^ %>]+)'.erub2.'\s*$'
3237
- let collection = s:sub(getline(first-1),'^'.fspaces.erub1.'for\s+(\k+)\s+in\s+([^ >]+)'.erub2.'\s*$','\1>\2')
3238
- elseif getline(first-1) =~ '\v^'.fspaces.erub1.'([^ %>]+)\.each\s+do\s+\|\s*(\k+)\s*\|'.erub2.'\s*$'
3239
- let collection = s:sub(getline(first-1),'^'.fspaces.erub1.'([^ %>]+)\.each\s+do\s+\|\s*(\k+)\s*\|'.erub2.'\s*$','\2>\1')
3240
- endif
3241
- if collection != ''
3242
- let var = matchstr(collection,'^\k\+')
3243
- let collection = s:sub(collection,'^\k+\>','')
3244
- let first -= 1
3245
- let last += 1
3246
- endif
3247
- else
3248
- let fspaces = spaces
3249
- endif
3250
- let renderstr = "render :partial => '".fnamemodify(file,":r:r")."'"
3251
- if collection != ""
3252
- let renderstr .= ", :collection => ".collection
3253
- elseif "@".name != var
3254
- let renderstr .= ", :object => ".var
3255
- endif
3256
- if ext =~? '^\%(rhtml\|erb\|dryml\)$'
3257
- let renderstr = "<%= ".renderstr." %>"
3258
- elseif ext == "rxml" || ext == "builder"
3259
- let renderstr = "xml << ".s:sub(renderstr,"render ","render(").")"
3260
- elseif ext == "rjs"
3261
- let renderstr = "page << ".s:sub(renderstr,"render ","render(").")"
3262
- elseif ext == "haml"
3263
- let renderstr = "= ".renderstr
3264
- elseif ext == "mn"
3265
- let renderstr = "_".renderstr
3266
- endif
3267
- let buf = @@
3268
- silent exe range."yank"
3269
- let partial = @@
3270
- let @@ = buf
3271
- let old_ai = &ai
3272
- try
3273
- let &ai = 0
3274
- silent exe "norm! :".first.",".last."change\<CR>".fspaces.renderstr."\<CR>.\<CR>"
3275
- finally
3276
- let &ai = old_ai
3277
- endtry
3278
- if renderstr =~ '<%'
3279
- norm ^6w
3280
- else
3281
- norm ^5w
3282
- endif
3283
- let ft = &ft
3284
- let shortout = fnamemodify(out,':.')
3285
- silent split `=shortout`
3286
- silent %delete
3287
- let &ft = ft
3288
- let @@ = partial
3289
- silent put
3290
- 0delete
3291
- let @@ = buf
3292
- if spaces != ""
3293
- silent! exe '%substitute/^'.spaces.'//'
3294
- endif
3295
- silent! exe '%substitute?\%(\w\|[@:"'."'".'-]\)\@<!'.var.'\>?'.name.'?g'
3296
- 1
3297
- endfunction
3298
-
3299
- " }}}1
3300
- " Migration Inversion {{{1
3301
-
3302
- function! s:mkeep(str)
3303
- " Things to keep (like comments) from a migration statement
3304
- return matchstr(a:str,' #[^{].*')
3305
- endfunction
3306
-
3307
- function! s:mextargs(str,num)
3308
- if a:str =~ '^\s*\w\+\s*('
3309
- return s:sub(matchstr(a:str,'^\s*\w\+\s*\zs(\%([^,)]\+[,)]\)\{,'.a:num.'\}'),',$',')')
3310
- else
3311
- return s:sub(s:sub(matchstr(a:str,'\w\+\>\zs\s*\%([^,){ ]*[, ]*\)\{,'.a:num.'\}'),'[, ]*$',''),'^\s+',' ')
3312
- endif
3313
- endfunction
3314
-
3315
- function! s:migspc(line)
3316
- return matchstr(a:line,'^\s*')
3317
- endfunction
3318
-
3319
- function! s:invertrange(beg,end)
3320
- let str = ""
3321
- let lnum = a:beg
3322
- while lnum <= a:end
3323
- let line = getline(lnum)
3324
- let add = ""
3325
- if line == ''
3326
- let add = ' '
3327
- elseif line =~ '^\s*\(#[^{].*\)\=$'
3328
- let add = line
3329
- elseif line =~ '\<create_table\>'
3330
- let add = s:migspc(line)."drop_table".s:mextargs(line,1).s:mkeep(line)
3331
- let lnum = s:endof(lnum)
3332
- elseif line =~ '\<drop_table\>'
3333
- let add = s:sub(line,'<drop_table>\s*\(=\s*([^,){ ]*).*','create_table \1 do |t|'."\n".matchstr(line,'^\s*').'end').s:mkeep(line)
3334
- elseif line =~ '\<add_column\>'
3335
- let add = s:migspc(line).'remove_column'.s:mextargs(line,2).s:mkeep(line)
3336
- elseif line =~ '\<remove_column\>'
3337
- let add = s:sub(line,'<remove_column>','add_column')
3338
- elseif line =~ '\<add_index\>'
3339
- let add = s:migspc(line).'remove_index'.s:mextargs(line,1)
3340
- let mat = matchstr(line,':name\s*=>\s*\zs[^ ,)]*')
3341
- if mat != ''
3342
- let add = s:sub(add,'\)=$',', :name => '.mat.'&')
3343
- else
3344
- let mat = matchstr(line,'\<add_index\>[^,]*,\s*\zs\%(\[[^]]*\]\|[:"'."'".']\w*["'."'".']\=\)')
3345
- if mat != ''
3346
- let add = s:sub(add,'\)=$',', :column => '.mat.'&')
3347
- endif
3348
- endif
3349
- let add .= s:mkeep(line)
3350
- elseif line =~ '\<remove_index\>'
3351
- let add = s:sub(s:sub(line,'<remove_index','add_index'),':column\s*\=\>\s*','')
3352
- elseif line =~ '\<rename_\%(table\|column\|index\)\>'
3353
- let add = s:sub(line,'<rename_%(table\s*\(=\s*|%(column|index)\s*\(=\s*[^,]*,\s*)\zs([^,]*)(,\s*)([^,]*)','\3\2\1')
3354
- elseif line =~ '\<change_column\>'
3355
- let add = s:migspc(line).'change_column'.s:mextargs(line,2).s:mkeep(line)
3356
- elseif line =~ '\<change_column_default\>'
3357
- let add = s:migspc(line).'change_column_default'.s:mextargs(line,2).s:mkeep(line)
3358
- elseif line =~ '\.update_all(\(["'."'".']\).*\1)$' || line =~ '\.update_all \(["'."'".']\).*\1$'
3359
- " .update_all('a = b') => .update_all('b = a')
3360
- let pre = matchstr(line,'^.*\.update_all[( ][}'."'".'"]')
3361
- let post = matchstr(line,'["'."'".'])\=$')
3362
- let mat = strpart(line,strlen(pre),strlen(line)-strlen(pre)-strlen(post))
3363
- let mat = s:gsub(','.mat.',','%(,\s*)@<=([^ ,=]{-})(\s*\=\s*)([^,=]{-})%(\s*,)@=','\3\2\1')
3364
- let add = pre.s:sub(s:sub(mat,'^,',''),',$','').post
3365
- elseif line =~ '^s\*\%(if\|unless\|while\|until\|for\)\>'
3366
- let lnum = s:endof(lnum)
3367
- endif
3368
- if lnum == 0
3369
- return -1
3370
- endif
3371
- if add == ""
3372
- let add = s:sub(line,'^\s*\zs.*','raise ActiveRecord::IrreversibleMigration')
3373
- elseif add == " "
3374
- let add = ""
3375
- endif
3376
- let str = add."\n".str
3377
- let lnum += 1
3378
- endwhile
3379
- let str = s:gsub(str,'(\s*raise ActiveRecord::IrreversibleMigration\n)+','\1')
3380
- return str
3381
- endfunction
3382
-
3383
- function! s:Invert(bang)
3384
- let err = "Could not parse method"
3385
- let src = "up"
3386
- let dst = "down"
3387
- let beg = search('\%('.&l:define.'\).*'.src.'\>',"w")
3388
- let end = s:endof(beg)
3389
- if beg + 1 == end
3390
- let src = "down"
3391
- let dst = "up"
3392
- let beg = search('\%('.&l:define.'\).*'.src.'\>',"w")
3393
- let end = s:endof(beg)
3394
- endif
3395
- if !beg || !end
3396
- return s:error(err)
3397
- endif
3398
- let str = s:invertrange(beg+1,end-1)
3399
- if str == -1
3400
- return s:error(err)
3401
- endif
3402
- let beg = search('\%('.&l:define.'\).*'.dst.'\>',"w")
3403
- let end = s:endof(beg)
3404
- if !beg || !end
3405
- return s:error(err)
3406
- endif
3407
- if foldclosed(beg) > 0
3408
- exe beg."foldopen!"
3409
- endif
3410
- if beg + 1 < end
3411
- exe (beg+1).",".(end-1)."delete _"
3412
- endif
3413
- if str != ''
3414
- exe beg.'put =str'
3415
- exe 1+beg
3416
- endif
3417
- endfunction
3418
-
3419
- " }}}1
3420
- " Cache {{{1
3421
-
3422
- let s:cache_prototype = {'dict': {}}
3423
-
3424
- function! s:cache_clear(...) dict
3425
- if a:0 == 0
3426
- let self.dict = {}
3427
- elseif has_key(self,'dict') && has_key(self.dict,a:1)
3428
- unlet! self.dict[a:1]
3429
- endif
3430
- endfunction
3431
-
3432
- function! rails#cache_clear(...)
3433
- if exists('b:rails_root')
3434
- return call(rails#app().cache.clear,a:000,rails#app().cache)
3435
- endif
3436
- endfunction
3437
-
3438
- function! s:cache_get(...) dict
3439
- if a:0 == 1
3440
- return self.dict[a:1]
3441
- else
3442
- return self.dict
3443
- endif
3444
- endfunction
3445
-
3446
- function! s:cache_has(key) dict
3447
- return has_key(self.dict,a:key)
3448
- endfunction
3449
-
3450
- function! s:cache_needs(key) dict
3451
- return !has_key(self.dict,a:key)
3452
- endfunction
3453
-
3454
- function! s:cache_set(key,value) dict
3455
- let self.dict[a:key] = a:value
3456
- endfunction
3457
-
3458
- call s:add_methods('cache', ['clear','needs','has','get','set'])
3459
-
3460
- let s:app_prototype.cache = s:cache_prototype
3461
-
3462
- " }}}1
3463
- " Syntax {{{1
3464
-
3465
- function! s:resetomnicomplete()
3466
- if exists("+completefunc") && &completefunc == 'syntaxcomplete#Complete'
3467
- if exists("g:loaded_syntax_completion")
3468
- " Ugly but necessary, until we have our own completion
3469
- unlet g:loaded_syntax_completion
3470
- silent! delfunction syntaxcomplete#Complete
3471
- endif
3472
- endif
3473
- endfunction
3474
-
3475
- function! s:helpermethods()
3476
- return ""
3477
- \."atom_feed audio_path audio_tag auto_discovery_link_tag auto_link "
3478
- \."button_to button_to_function "
3479
- \."cache capture cdata_section check_box check_box_tag collection_select concat content_for content_tag content_tag_for csrf_meta_tag current_cycle cycle "
3480
- \."date_select datetime_select debug distance_of_time_in_words distance_of_time_in_words_to_now div_for dom_class dom_id draggable_element draggable_element_js drop_receiving_element drop_receiving_element_js "
3481
- \."email_field email_field_tag error_message_on error_messages_for escape_javascript escape_once excerpt "
3482
- \."favicon_link_tag field_set_tag fields_for file_field file_field_tag form form_for form_tag "
3483
- \."grouped_collection_select grouped_options_for_select "
3484
- \."hidden_field hidden_field_tag highlight "
3485
- \."image_path image_submit_tag image_tag input "
3486
- \."javascript_cdata_section javascript_include_tag javascript_path javascript_tag "
3487
- \."l label label_tag link_to link_to_function link_to_if link_to_unless link_to_unless_current localize "
3488
- \."mail_to "
3489
- \."number_field number_field_tag number_to_currency number_to_human number_to_human_size number_to_percentage number_to_phone number_with_delimiter number_with_precision "
3490
- \."option_groups_from_collection_for_select options_for_select options_from_collection_for_select "
3491
- \."password_field password_field_tag path_to_audio path_to_image path_to_javascript path_to_stylesheet path_to_video phone_field phone_field_tag pluralize "
3492
- \."radio_button radio_button_tag range_field range_field_tag raw remote_function reset_cycle "
3493
- \."safe_concat sanitize sanitize_css search_field search_field_tag select select_date select_datetime select_day select_hour select_minute select_month select_second select_tag select_time select_year simple_format sortable_element sortable_element_js strip_links strip_tags stylesheet_link_tag stylesheet_path submit_tag "
3494
- \."t tag telephone_field telephone_field_tag text_area text_area_tag text_field text_field_tag time_ago_in_words time_select time_zone_options_for_select time_zone_select translate truncate "
3495
- \."update_page update_page_tag url_field url_field_tag url_for url_options "
3496
- \."video_path video_tag visual_effect "
3497
- \."word_wrap"
3498
- endfunction
3499
-
3500
- function! s:app_user_classes() dict
3501
- if self.cache.needs("user_classes")
3502
- let controllers = self.relglob("app/controllers/","**/*",".rb")
3503
- call map(controllers,'v:val == "application" ? v:val."_controller" : v:val')
3504
- let classes =
3505
- \ self.relglob("app/models/","**/*",".rb") +
3506
- \ controllers +
3507
- \ self.relglob("app/helpers/","**/*",".rb") +
3508
- \ self.relglob("lib/","**/*",".rb")
3509
- call map(classes,'rails#camelize(v:val)')
3510
- call self.cache.set("user_classes",classes)
3511
- endif
3512
- return self.cache.get('user_classes')
3513
- endfunction
3514
-
3515
- function! s:app_user_assertions() dict
3516
- if self.cache.needs("user_assertions")
3517
- if self.has_file("test/test_helper.rb")
3518
- let assertions = map(filter(s:readfile(self.path("test/test_helper.rb")),'v:val =~ "^ def assert_"'),'matchstr(v:val,"^ def \\zsassert_\\w\\+")')
3519
- else
3520
- let assertions = []
3521
- endif
3522
- call self.cache.set("user_assertions",assertions)
3523
- endif
3524
- return self.cache.get('user_assertions')
3525
- endfunction
3526
-
3527
- call s:add_methods('app', ['user_classes','user_assertions'])
3528
-
3529
- function! s:BufSyntax()
3530
- if (!exists("g:rails_syntax") || g:rails_syntax)
3531
- let buffer = rails#buffer()
3532
- let s:javascript_functions = "$ $$ $A $F $H $R $w jQuery"
3533
- let classes = s:gsub(join(rails#app().user_classes(),' '),'::',' ')
3534
- if &syntax == 'ruby'
3535
- if classes != ''
3536
- exe "syn keyword rubyRailsUserClass ".classes." containedin=rubyClassDeclaration,rubyModuleDeclaration,rubyClass,rubyModule"
3537
- endif
3538
- if buffer.type_name() == ''
3539
- syn keyword rubyRailsMethod params request response session headers cookies flash
3540
- endif
3541
- if buffer.type_name('api')
3542
- syn keyword rubyRailsAPIMethod api_method inflect_names
3543
- endif
3544
- if buffer.type_name() ==# 'model' || buffer.type_name('model-arb')
3545
- syn keyword rubyRailsARMethod default_scope named_scope scope serialize
3546
- syn keyword rubyRailsARAssociationMethod belongs_to has_one has_many has_and_belongs_to_many composed_of accepts_nested_attributes_for
3547
- syn keyword rubyRailsARCallbackMethod before_create before_destroy before_save before_update before_validation before_validation_on_create before_validation_on_update
3548
- syn keyword rubyRailsARCallbackMethod after_create after_destroy after_save after_update after_validation after_validation_on_create after_validation_on_update
3549
- syn keyword rubyRailsARCallbackMethod around_create around_destroy around_save around_update
3550
- syn keyword rubyRailsARCallbackMethod after_commit after_find after_initialize after_rollback after_touch
3551
- syn keyword rubyRailsARClassMethod attr_accessible attr_protected attr_readonly establish_connection set_inheritance_column set_locking_column set_primary_key set_sequence_name set_table_name
3552
- syn keyword rubyRailsARValidationMethod validate validates validate_on_create validate_on_update validates_acceptance_of validates_associated validates_confirmation_of validates_each validates_exclusion_of validates_format_of validates_inclusion_of validates_length_of validates_numericality_of validates_presence_of validates_size_of validates_uniqueness_of
3553
- syn keyword rubyRailsMethod logger
3554
- endif
3555
- if buffer.type_name('model-aro')
3556
- syn keyword rubyRailsARMethod observe
3557
- endif
3558
- if buffer.type_name('mailer')
3559
- syn keyword rubyRailsMethod logger url_for polymorphic_path polymorphic_url
3560
- syn keyword rubyRailsRenderMethod mail render
3561
- syn keyword rubyRailsControllerMethod attachments default helper helper_attr helper_method
3562
- endif
3563
- if buffer.type_name('controller','view','helper')
3564
- syn keyword rubyRailsMethod params request response session headers cookies flash
3565
- syn keyword rubyRailsRenderMethod render
3566
- syn keyword rubyRailsMethod logger polymorphic_path polymorphic_url
3567
- endif
3568
- if buffer.type_name('helper','view')
3569
- exe "syn keyword rubyRailsHelperMethod ".s:gsub(s:helpermethods(),'<%(content_for|select)\s+','')
3570
- syn match rubyRailsHelperMethod '\<select\>\%(\s*{\|\s*do\>\|\s*(\=\s*&\)\@!'
3571
- syn match rubyRailsHelperMethod '\<\%(content_for?\=\|current_page?\)'
3572
- syn match rubyRailsViewMethod '\.\@<!\<\(h\|html_escape\|u\|url_encode\|controller\)\>'
3573
- if buffer.type_name('view-partial')
3574
- syn keyword rubyRailsMethod local_assigns
3575
- endif
3576
- elseif buffer.type_name('controller')
3577
- syn keyword rubyRailsControllerMethod helper helper_attr helper_method filter layout url_for serialize exempt_from_layout filter_parameter_logging hide_action cache_sweeper protect_from_forgery caches_page cache_page caches_action expire_page expire_action rescue_from
3578
- syn keyword rubyRailsRenderMethod head redirect_to render_to_string respond_with
3579
- syn match rubyRailsRenderMethod '\<respond_to\>?\@!'
3580
- syn keyword rubyRailsFilterMethod before_filter append_before_filter prepend_before_filter after_filter append_after_filter prepend_after_filter around_filter append_around_filter prepend_around_filter skip_before_filter skip_after_filter
3581
- syn keyword rubyRailsFilterMethod verify
3582
- endif
3583
- if buffer.type_name('db-migration','db-schema')
3584
- syn keyword rubyRailsMigrationMethod create_table change_table drop_table rename_table add_column rename_column change_column change_column_default remove_column add_index remove_index rename_index execute
3585
- endif
3586
- if buffer.type_name('test')
3587
- if !empty(rails#app().user_assertions())
3588
- exe "syn keyword rubyRailsUserMethod ".join(rails#app().user_assertions())
3589
- endif
3590
- syn keyword rubyRailsTestMethod add_assertion assert assert_block assert_equal assert_in_delta assert_instance_of assert_kind_of assert_match assert_nil assert_no_match assert_not_equal assert_not_nil assert_not_same assert_nothing_raised assert_nothing_thrown assert_operator assert_raise assert_respond_to assert_same assert_send assert_throws assert_recognizes assert_generates assert_routing flunk fixtures fixture_path use_transactional_fixtures use_instantiated_fixtures assert_difference assert_no_difference assert_valid
3591
- syn keyword rubyRailsTestMethod test setup teardown
3592
- if !buffer.type_name('test-unit')
3593
- syn match rubyRailsTestControllerMethod '\.\@<!\<\%(get\|post\|put\|delete\|head\|process\|assigns\)\>'
3594
- syn keyword rubyRailsTestControllerMethod get_via_redirect post_via_redirect put_via_redirect delete_via_redirect request_via_redirect
3595
- syn keyword rubyRailsTestControllerMethod assert_response assert_redirected_to assert_template assert_recognizes assert_generates assert_routing assert_dom_equal assert_dom_not_equal assert_select assert_select_rjs assert_select_encoded assert_select_email assert_tag assert_no_tag
3596
- endif
3597
- elseif buffer.type_name('spec')
3598
- syn keyword rubyRailsTestMethod describe context it its specify shared_examples_for it_should_behave_like before after around subject fixtures controller_name helper_name
3599
- syn match rubyRailsTestMethod '\<let\>!\='
3600
- syn keyword rubyRailsTestMethod violated pending expect double mock mock_model stub_model
3601
- syn match rubyRailsTestMethod '\.\@<!\<stub\>!\@!'
3602
- if !buffer.type_name('spec-model')
3603
- syn match rubyRailsTestControllerMethod '\.\@<!\<\%(get\|post\|put\|delete\|head\|process\|assigns\)\>'
3604
- syn keyword rubyRailsTestControllerMethod integrate_views
3605
- syn keyword rubyRailsMethod params request response session flash
3606
- syn keyword rubyRailsMethod polymorphic_path polymorphic_url
3607
- endif
3608
- endif
3609
- if buffer.type_name('task')
3610
- syn match rubyRailsRakeMethod '^\s*\zs\%(task\|file\|namespace\|desc\|before\|after\|on\)\>\%(\s*=\)\@!'
3611
- endif
3612
- if buffer.type_name('model-awss')
3613
- syn keyword rubyRailsMethod member
3614
- endif
3615
- if buffer.type_name('config-routes')
3616
- syn match rubyRailsMethod '\.\zs\%(connect\|named_route\)\>'
3617
- syn keyword rubyRailsMethod match get put post delete redirect root resource resources collection member nested scope namespace controller constraints
3618
- endif
3619
- syn keyword rubyRailsMethod debugger
3620
- syn keyword rubyRailsMethod alias_attribute alias_method_chain attr_accessor_with_default attr_internal attr_internal_accessor attr_internal_reader attr_internal_writer delegate mattr_accessor mattr_reader mattr_writer superclass_delegating_accessor superclass_delegating_reader superclass_delegating_writer
3621
- syn keyword rubyRailsMethod cattr_accessor cattr_reader cattr_writer class_inheritable_accessor class_inheritable_array class_inheritable_array_writer class_inheritable_hash class_inheritable_hash_writer class_inheritable_option class_inheritable_reader class_inheritable_writer inheritable_attributes read_inheritable_attribute reset_inheritable_attributes write_inheritable_array write_inheritable_attribute write_inheritable_hash
3622
- syn keyword rubyRailsInclude require_dependency
3623
-
3624
- syn region rubyString matchgroup=rubyStringDelimiter start=+\%(:order\s*=>\s*\)\@<="+ skip=+\\\\\|\\"+ end=+"+ contains=@rubyStringSpecial,railsOrderSpecial
3625
- syn region rubyString matchgroup=rubyStringDelimiter start=+\%(:order\s*=>\s*\)\@<='+ skip=+\\\\\|\\'+ end=+'+ contains=@rubyStringSpecial,railsOrderSpecial
3626
- syn match railsOrderSpecial +\c\<\%(DE\|A\)SC\>+ contained
3627
- syn region rubyString matchgroup=rubyStringDelimiter start=+\%(:conditions\s*=>\s*\[\s*\)\@<="+ skip=+\\\\\|\\"+ end=+"+ contains=@rubyStringSpecial,railsConditionsSpecial
3628
- syn region rubyString matchgroup=rubyStringDelimiter start=+\%(:conditions\s*=>\s*\[\s*\)\@<='+ skip=+\\\\\|\\'+ end=+'+ contains=@rubyStringSpecial,railsConditionsSpecial
3629
- syn match railsConditionsSpecial +?\|:\h\w*+ contained
3630
- syn cluster rubyNotTop add=railsOrderSpecial,railsConditionsSpecial
3631
-
3632
- " XHTML highlighting inside %Q<>
3633
- unlet! b:current_syntax
3634
- let removenorend = !exists("g:html_no_rendering")
3635
- let g:html_no_rendering = 1
3636
- syn include @htmlTop syntax/xhtml.vim
3637
- if removenorend
3638
- unlet! g:html_no_rendering
3639
- endif
3640
- let b:current_syntax = "ruby"
3641
- " Restore syn sync, as best we can
3642
- if !exists("g:ruby_minlines")
3643
- let g:ruby_minlines = 50
3644
- endif
3645
- syn sync fromstart
3646
- exe "syn sync minlines=" . g:ruby_minlines
3647
- syn case match
3648
- syn region rubyString matchgroup=rubyStringDelimiter start=+%Q\=<+ end=+>+ contains=@htmlTop,@rubyStringSpecial
3649
- syn cluster htmlArgCluster add=@rubyStringSpecial
3650
- syn cluster htmlPreProc add=@rubyStringSpecial
3651
-
3652
- elseif &syntax =~# '^eruby\>' || &syntax == 'haml'
3653
- syn case match
3654
- if classes != ''
3655
- exe 'syn keyword '.&syntax.'RailsUserClass '.classes.' contained containedin=@'.&syntax.'RailsRegions'
3656
- endif
3657
- if &syntax == 'haml'
3658
- exe 'syn cluster hamlRailsRegions contains=hamlRubyCodeIncluded,hamlRubyCode,hamlRubyHash,@hamlEmbeddedRuby,rubyInterpolation'
3659
- else
3660
- exe 'syn cluster erubyRailsRegions contains=erubyOneLiner,erubyBlock,erubyExpression,rubyInterpolation'
3661
- endif
3662
- exe 'syn keyword '.&syntax.'RailsHelperMethod '.s:gsub(s:helpermethods(),'<%(content_for|select)\s+','').' contained containedin=@'.&syntax.'RailsRegions'
3663
- exe 'syn match '.&syntax.'RailsHelperMethod "\<select\>\%(\s*{\|\s*do\>\|\s*(\=\s*&\)\@!" contained containedin=@'.&syntax.'RailsRegions'
3664
- exe 'syn match '.&syntax.'RailsHelperMethod "\<\%(content_for?\=\|current_page?\)" contained containedin=@'.&syntax.'RailsRegions'
3665
- exe 'syn keyword '.&syntax.'RailsMethod debugger logger polymorphic_path polymorphic_url contained containedin=@'.&syntax.'RailsRegions'
3666
- exe 'syn keyword '.&syntax.'RailsMethod params request response session headers cookies flash contained containedin=@'.&syntax.'RailsRegions'
3667
- exe 'syn match '.&syntax.'RailsViewMethod "\.\@<!\<\(h\|html_escape\|u\|url_encode\|controller\)\>" contained containedin=@'.&syntax.'RailsRegions'
3668
- if buffer.type_name('view-partial')
3669
- exe 'syn keyword '.&syntax.'RailsMethod local_assigns contained containedin=@'.&syntax.'RailsRegions'
3670
- endif
3671
- exe 'syn keyword '.&syntax.'RailsRenderMethod render contained containedin=@'.&syntax.'RailsRegions'
3672
- exe 'syn case match'
3673
- set isk+=$
3674
- exe 'syn keyword javascriptRailsFunction contained '.s:javascript_functions
3675
- exe 'syn cluster htmlJavaScript add=javascriptRailsFunction'
3676
- elseif &syntax == "yaml"
3677
- syn case match
3678
- " Modeled after syntax/eruby.vim
3679
- unlet! b:current_syntax
3680
- let g:main_syntax = 'eruby'
3681
- syn include @rubyTop syntax/ruby.vim
3682
- unlet g:main_syntax
3683
- syn cluster yamlRailsRegions contains=yamlRailsOneLiner,yamlRailsBlock,yamlRailsExpression
3684
- syn region yamlRailsOneLiner matchgroup=yamlRailsDelimiter start="^%%\@!" end="$" contains=@rubyRailsTop containedin=ALLBUT,@yamlRailsRegions,yamlRailsComment keepend oneline
3685
- syn region yamlRailsBlock matchgroup=yamlRailsDelimiter start="<%%\@!" end="%>" contains=@rubyTop containedin=ALLBUT,@yamlRailsRegions,yamlRailsComment
3686
- syn region yamlRailsExpression matchgroup=yamlRailsDelimiter start="<%=" end="%>" contains=@rubyTop containedin=ALLBUT,@yamlRailsRegions,yamlRailsComment
3687
- syn region yamlRailsComment matchgroup=yamlRailsDelimiter start="<%#" end="%>" contains=rubyTodo,@Spell containedin=ALLBUT,@yamlRailsRegions,yamlRailsComment keepend
3688
- syn match yamlRailsMethod '\.\@<!\<\(h\|html_escape\|u\|url_encode\)\>' contained containedin=@yamlRailsRegions
3689
- if classes != ''
3690
- exe "syn keyword yamlRailsUserClass ".classes." contained containedin=@yamlRailsRegions"
3691
- endif
3692
- let b:current_syntax = "yaml"
3693
- elseif &syntax == "html"
3694
- syn case match
3695
- set isk+=$
3696
- exe "syn keyword javascriptRailsFunction contained ".s:javascript_functions
3697
- syn cluster htmlJavaScript add=javascriptRailsFunction
3698
- elseif &syntax == "javascript" || &syntax == "coffee"
3699
- " The syntax file included with Vim incorrectly sets syn case ignore.
3700
- syn case match
3701
- set isk+=$
3702
- exe "syn keyword javascriptRailsFunction ".s:javascript_functions
3703
-
3704
- endif
3705
- endif
3706
- call s:HiDefaults()
3707
- endfunction
3708
-
3709
- function! s:HiDefaults()
3710
- hi def link rubyRailsAPIMethod rubyRailsMethod
3711
- hi def link rubyRailsARAssociationMethod rubyRailsARMethod
3712
- hi def link rubyRailsARCallbackMethod rubyRailsARMethod
3713
- hi def link rubyRailsARClassMethod rubyRailsARMethod
3714
- hi def link rubyRailsARValidationMethod rubyRailsARMethod
3715
- hi def link rubyRailsARMethod rubyRailsMethod
3716
- hi def link rubyRailsRenderMethod rubyRailsMethod
3717
- hi def link rubyRailsHelperMethod rubyRailsMethod
3718
- hi def link rubyRailsViewMethod rubyRailsMethod
3719
- hi def link rubyRailsMigrationMethod rubyRailsMethod
3720
- hi def link rubyRailsControllerMethod rubyRailsMethod
3721
- hi def link rubyRailsFilterMethod rubyRailsMethod
3722
- hi def link rubyRailsTestControllerMethod rubyRailsTestMethod
3723
- hi def link rubyRailsTestMethod rubyRailsMethod
3724
- hi def link rubyRailsRakeMethod rubyRailsMethod
3725
- hi def link rubyRailsMethod railsMethod
3726
- hi def link rubyRailsInclude rubyInclude
3727
- hi def link rubyRailsUserClass railsUserClass
3728
- hi def link rubyRailsUserMethod railsUserMethod
3729
- hi def link erubyRailsHelperMethod erubyRailsMethod
3730
- hi def link erubyRailsViewMethod erubyRailsMethod
3731
- hi def link erubyRailsRenderMethod erubyRailsMethod
3732
- hi def link erubyRailsMethod railsMethod
3733
- hi def link erubyRailsUserMethod railsUserMethod
3734
- hi def link erubyRailsUserClass railsUserClass
3735
- hi def link hamlRailsHelperMethod hamlRailsMethod
3736
- hi def link hamlRailsViewMethod hamlRailsMethod
3737
- hi def link hamlRailsRenderMethod hamlRailsMethod
3738
- hi def link hamlRailsMethod railsMethod
3739
- hi def link hamlRailsUserMethod railsUserMethod
3740
- hi def link hamlRailsUserClass railsUserClass
3741
- hi def link railsUserMethod railsMethod
3742
- hi def link yamlRailsDelimiter Delimiter
3743
- hi def link yamlRailsMethod railsMethod
3744
- hi def link yamlRailsComment Comment
3745
- hi def link yamlRailsUserClass railsUserClass
3746
- hi def link yamlRailsUserMethod railsUserMethod
3747
- hi def link javascriptRailsFunction railsMethod
3748
- hi def link railsUserClass railsClass
3749
- hi def link railsMethod Function
3750
- hi def link railsClass Type
3751
- hi def link railsOrderSpecial railsStringSpecial
3752
- hi def link railsConditionsSpecial railsStringSpecial
3753
- hi def link railsStringSpecial Identifier
3754
- endfunction
3755
-
3756
- function! rails#log_syntax()
3757
- if has('conceal')
3758
- syn match railslogEscape '\e\[[0-9;]*m' conceal
3759
- syn match railslogEscapeMN '\e\[[0-9;]*m' conceal nextgroup=railslogModelNum,railslogEscapeMN skipwhite contained
3760
- syn match railslogEscapeSQL '\e\[[0-9;]*m' conceal nextgroup=railslogSQL,railslogEscapeSQL skipwhite contained
3761
- else
3762
- syn match railslogEscape '\e\[[0-9;]*m'
3763
- syn match railslogEscapeMN '\e\[[0-9;]*m' nextgroup=railslogModelNum,railslogEscapeMN skipwhite contained
3764
- syn match railslogEscapeSQL '\e\[[0-9;]*m' nextgroup=railslogSQL,railslogEscapeSQL skipwhite contained
3765
- endif
3766
- syn match railslogRender '\%(^\s*\%(\e\[[0-9;]*m\)\=\)\@<=\%(Processing\|Rendering\|Rendered\|Redirected\|Completed\)\>'
3767
- syn match railslogComment '^\s*# .*'
3768
- syn match railslogModel '\%(^\s*\%(\e\[[0-9;]*m\)\=\)\@<=\u\%(\w\|:\)* \%(Load\%( Including Associations\| IDs For Limited Eager Loading\)\=\|Columns\|Count\|Create\|Update\|Destroy\|Delete all\)\>' skipwhite nextgroup=railslogModelNum,railslogEscapeMN
3769
- syn match railslogModel '\%(^\s*\%(\e\[[0-9;]*m\)\=\)\@<=SQL\>' skipwhite nextgroup=railslogModelNum,railslogEscapeMN
3770
- syn region railslogModelNum start='(' end=')' contains=railslogNumber contained skipwhite nextgroup=railslogSQL,railslogEscapeSQL
3771
- syn match railslogSQL '\u[^\e]*' contained
3772
- " Destroy generates multiline SQL, ugh
3773
- syn match railslogSQL '\%(^ \%(\e\[[0-9;]*m\)\=\)\@<=\%(FROM\|WHERE\|ON\|AND\|OR\|ORDER\) .*$'
3774
- syn match railslogNumber '\<\d\+\>%'
3775
- syn match railslogNumber '[ (]\@<=\<\d\+\.\d\+\>\.\@!'
3776
- syn region railslogString start='"' skip='\\"' end='"' oneline contained
3777
- syn region railslogHash start='{' end='}' oneline contains=railslogHash,railslogString
3778
- syn match railslogIP '\<\d\{1,3\}\%(\.\d\{1,3}\)\{3\}\>'
3779
- syn match railslogTimestamp '\<\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d\>'
3780
- syn match railslogSessionID '\<\x\{32\}\>'
3781
- syn match railslogIdentifier '^\s*\%(Session ID\|Parameters\)\ze:'
3782
- syn match railslogSuccess '\<2\d\d \u[A-Za-z0-9 ]*\>'
3783
- syn match railslogRedirect '\<3\d\d \u[A-Za-z0-9 ]*\>'
3784
- syn match railslogError '\<[45]\d\d \u[A-Za-z0-9 ]*\>'
3785
- syn match railslogError '^DEPRECATION WARNING\>'
3786
- syn keyword railslogHTTP OPTIONS GET HEAD POST PUT DELETE TRACE CONNECT
3787
- syn region railslogStackTrace start=":\d\+:in `\w\+'$" end="^\s*$" keepend fold
3788
- hi def link railslogEscapeMN railslogEscape
3789
- hi def link railslogEscapeSQL railslogEscape
3790
- hi def link railslogEscape Ignore
3791
- hi def link railslogComment Comment
3792
- hi def link railslogRender Keyword
3793
- hi def link railslogModel Type
3794
- hi def link railslogSQL PreProc
3795
- hi def link railslogNumber Number
3796
- hi def link railslogString String
3797
- hi def link railslogSessionID Constant
3798
- hi def link railslogIdentifier Identifier
3799
- hi def link railslogRedirect railslogSuccess
3800
- hi def link railslogSuccess Special
3801
- hi def link railslogError Error
3802
- hi def link railslogHTTP Special
3803
- endfunction
3804
-
3805
- " }}}1
3806
- " Mappings {{{1
3807
-
3808
- function! s:BufMappings()
3809
- nnoremap <buffer> <silent> <Plug>RailsAlternate :<C-U>A<CR>
3810
- nnoremap <buffer> <silent> <Plug>RailsRelated :<C-U>R<CR>
3811
- nnoremap <buffer> <silent> <Plug>RailsFind :<C-U>REfind<CR>
3812
- nnoremap <buffer> <silent> <Plug>RailsSplitFind :<C-U>RSfind<CR>
3813
- nnoremap <buffer> <silent> <Plug>RailsVSplitFind :<C-U>RVfind<CR>
3814
- nnoremap <buffer> <silent> <Plug>RailsTabFind :<C-U>RTfind<CR>
3815
- if g:rails_mappings
3816
- if !hasmapto("<Plug>RailsFind")
3817
- nmap <buffer> gf <Plug>RailsFind
3818
- endif
3819
- if !hasmapto("<Plug>RailsSplitFind")
3820
- nmap <buffer> <C-W>f <Plug>RailsSplitFind
3821
- endif
3822
- if !hasmapto("<Plug>RailsTabFind")
3823
- nmap <buffer> <C-W>gf <Plug>RailsTabFind
3824
- endif
3825
- if !hasmapto("<Plug>RailsAlternate")
3826
- nmap <buffer> [f <Plug>RailsAlternate
3827
- endif
3828
- if !hasmapto("<Plug>RailsRelated")
3829
- nmap <buffer> ]f <Plug>RailsRelated
3830
- endif
3831
- if exists("$CREAM")
3832
- imap <buffer> <C-CR> <C-O><Plug>RailsFind
3833
- imap <buffer> <M-[> <C-O><Plug>RailsAlternate
3834
- imap <buffer> <M-]> <C-O><Plug>RailsRelated
3835
- endif
3836
- endif
3837
- " SelectBuf you're a dirty hack
3838
- let v:errmsg = ""
3839
- endfunction
3840
-
3841
- " }}}1
3842
- " Database {{{1
3843
-
3844
- function! s:extractdbvar(str,arg)
3845
- return matchstr("\n".a:str."\n",'\n'.a:arg.'=\zs.\{-\}\ze\n')
3846
- endfunction
3847
-
3848
- function! s:app_dbext_settings(environment) dict
3849
- if self.cache.needs('dbext_settings')
3850
- call self.cache.set('dbext_settings',{})
3851
- endif
3852
- let cache = self.cache.get('dbext_settings')
3853
- if !has_key(cache,a:environment)
3854
- let dict = {}
3855
- if self.has_file("config/database.yml")
3856
- let cmdb = 'require %{yaml}; File.open(%q{'.self.path().'/config/database.yml}) {|f| y = YAML::load(f); e = y[%{'
3857
- let cmde = '}]; i=0; e=y[e] while e.respond_to?(:to_str) && (i+=1)<16; e.each{|k,v|puts k.to_s+%{=}+v.to_s}}'
3858
- let out = self.lightweight_ruby_eval(cmdb.a:environment.cmde)
3859
- let adapter = s:extractdbvar(out,'adapter')
3860
- let adapter = get({'mysql2': 'mysql', 'postgresql': 'pgsql', 'sqlite3': 'sqlite', 'sqlserver': 'sqlsrv', 'sybase': 'asa', 'oracle': 'ora'},adapter,adapter)
3861
- let dict['type'] = toupper(adapter)
3862
- let dict['user'] = s:extractdbvar(out,'username')
3863
- let dict['passwd'] = s:extractdbvar(out,'password')
3864
- if dict['passwd'] == '' && adapter == 'mysql'
3865
- " Hack to override password from .my.cnf
3866
- let dict['extra'] = ' --password='
3867
- else
3868
- let dict['extra'] = ''
3869
- endif
3870
- let dict['dbname'] = s:extractdbvar(out,'database')
3871
- if dict['dbname'] == ''
3872
- let dict['dbname'] = s:extractdbvar(out,'dbfile')
3873
- endif
3874
- if dict['dbname'] != '' && dict['dbname'] !~ '^:' && adapter =~? '^sqlite'
3875
- let dict['dbname'] = self.path(dict['dbname'])
3876
- endif
3877
- let dict['profile'] = ''
3878
- if adapter == 'ora'
3879
- let dict['srvname'] = s:extractdbvar(out,'database')
3880
- else
3881
- let dict['srvname'] = s:extractdbvar(out,'host')
3882
- endif
3883
- let dict['host'] = s:extractdbvar(out,'host')
3884
- let dict['port'] = s:extractdbvar(out,'port')
3885
- let dict['dsnname'] = s:extractdbvar(out,'dsn')
3886
- if dict['host'] =~? '^\cDBI:'
3887
- if dict['host'] =~? '\c\<Trusted[_ ]Connection\s*=\s*yes\>'
3888
- let dict['integratedlogin'] = 1
3889
- endif
3890
- let dict['host'] = matchstr(dict['host'],'\c\<\%(Server\|Data Source\)\s*=\s*\zs[^;]*')
3891
- endif
3892
- call filter(dict,'v:val != ""')
3893
- endif
3894
- let cache[a:environment] = dict
3895
- endif
3896
- return cache[a:environment]
3897
- endfunction
3898
-
3899
- function! s:BufDatabase(...)
3900
- if exists("s:lock_database") || !exists('g:loaded_dbext') || !exists('b:rails_root')
3901
- return
3902
- endif
3903
- let self = rails#app()
3904
- let s:lock_database = 1
3905
- if (a:0 && a:1 > 1)
3906
- call self.cache.clear('dbext_settings')
3907
- endif
3908
- if (a:0 > 1 && a:2 != '')
3909
- let env = a:2
3910
- else
3911
- let env = s:environment()
3912
- endif
3913
- if (!self.cache.has('dbext_settings') || !has_key(self.cache.get('dbext_settings'),env)) && (a:0 ? a:1 : 0) <= 0
3914
- unlet! s:lock_database
3915
- return
3916
- endif
3917
- let dict = self.dbext_settings(env)
3918
- for key in ['type', 'profile', 'bin', 'user', 'passwd', 'dbname', 'srvname', 'host', 'port', 'dsnname', 'extra', 'integratedlogin']
3919
- let b:dbext_{key} = get(dict,key,'')
3920
- endfor
3921
- if b:dbext_type == 'PGSQL'
3922
- let $PGPASSWORD = b:dbext_passwd
3923
- elseif exists('$PGPASSWORD')
3924
- let $PGPASSWORD = ''
3925
- endif
3926
- unlet! s:lock_database
3927
- endfunction
3928
-
3929
- call s:add_methods('app', ['dbext_settings'])
3930
-
3931
- " }}}1
3932
- " Abbreviations {{{1
3933
-
3934
- function! s:selectiveexpand(pat,good,default,...)
3935
- if a:0 > 0
3936
- let nd = a:1
3937
- else
3938
- let nd = ""
3939
- endif
3940
- let c = nr2char(getchar(0))
3941
- let good = a:good
3942
- if c == "" " ^]
3943
- return s:sub(good.(a:0 ? " ".a:1 : ''),'\s+$','')
3944
- elseif c == "\t"
3945
- return good.(a:0 ? " ".a:1 : '')
3946
- elseif c =~ a:pat
3947
- return good.c.(a:0 ? a:1 : '')
3948
- else
3949
- return a:default.c
3950
- endif
3951
- endfunction
3952
-
3953
- function! s:TheCWord()
3954
- let l = s:linepeak()
3955
- if l =~ '\<\%(find\|first\|last\|all\|paginate\)\>'
3956
- return s:selectiveexpand('..',':conditions => ',':c')
3957
- elseif l =~ '\<render\s*(\=\s*:partial\s*=>\s*'
3958
- return s:selectiveexpand('..',':collection => ',':c')
3959
- elseif l =~ '\<\%(url_for\|link_to\|form_tag\)\>' || l =~ ':url\s*=>\s*{\s*'
3960
- return s:selectiveexpand('..',':controller => ',':c')
3961
- else
3962
- return s:selectiveexpand('..',':conditions => ',':c')
3963
- endif
3964
- endfunction
3965
-
3966
- function! s:AddSelectiveExpand(abbr,pat,expn,...)
3967
- let expn = s:gsub(s:gsub(a:expn ,'[\"|]','\\&'),'\<','\\<Lt>')
3968
- let expn2 = s:gsub(s:gsub(a:0 ? a:1 : '','[\"|]','\\&'),'\<','\\<Lt>')
3969
- if a:0
3970
- exe "inoreabbrev <buffer> <silent> ".a:abbr." <C-R>=<SID>selectiveexpand(".string(a:pat).",\"".expn."\",".string(a:abbr).",\"".expn2."\")<CR>"
3971
- else
3972
- exe "inoreabbrev <buffer> <silent> ".a:abbr." <C-R>=<SID>selectiveexpand(".string(a:pat).",\"".expn."\",".string(a:abbr).")<CR>"
3973
- endif
3974
- endfunction
3975
-
3976
- function! s:AddTabExpand(abbr,expn)
3977
- call s:AddSelectiveExpand(a:abbr,'..',a:expn)
3978
- endfunction
3979
-
3980
- function! s:AddBracketExpand(abbr,expn)
3981
- call s:AddSelectiveExpand(a:abbr,'[[.]',a:expn)
3982
- endfunction
3983
-
3984
- function! s:AddColonExpand(abbr,expn)
3985
- call s:AddSelectiveExpand(a:abbr,'[:.]',a:expn)
3986
- endfunction
3987
-
3988
- function! s:AddParenExpand(abbr,expn,...)
3989
- if a:0
3990
- call s:AddSelectiveExpand(a:abbr,'(',a:expn,a:1)
3991
- else
3992
- call s:AddSelectiveExpand(a:abbr,'(',a:expn,'')
3993
- endif
3994
- endfunction
3995
-
3996
- function! s:BufAbbreviations()
3997
- command! -buffer -bar -nargs=* -bang Rabbrev :call s:Abbrev(<bang>0,<f-args>)
3998
- " Some of these were cherry picked from the TextMate snippets
3999
- if g:rails_abbreviations
4000
- let buffer = rails#buffer()
4001
- " Limit to the right filetypes. But error on the liberal side
4002
- if buffer.type_name('controller','view','helper','test-functional','test-integration')
4003
- Rabbrev pa[ params
4004
- Rabbrev rq[ request
4005
- Rabbrev rs[ response
4006
- Rabbrev se[ session
4007
- Rabbrev hd[ headers
4008
- Rabbrev coo[ cookies
4009
- Rabbrev fl[ flash
4010
- Rabbrev rr( render
4011
- Rabbrev ra( render :action\ =>\
4012
- Rabbrev rc( render :controller\ =>\
4013
- Rabbrev rf( render :file\ =>\
4014
- Rabbrev ri( render :inline\ =>\
4015
- Rabbrev rj( render :json\ =>\
4016
- Rabbrev rl( render :layout\ =>\
4017
- Rabbrev rp( render :partial\ =>\
4018
- Rabbrev rt( render :text\ =>\
4019
- Rabbrev rx( render :xml\ =>\
4020
- endif
4021
- if buffer.type_name('view','helper')
4022
- Rabbrev dotiw distance_of_time_in_words
4023
- Rabbrev taiw time_ago_in_words
4024
- endif
4025
- if buffer.type_name('controller')
4026
- Rabbrev re( redirect_to
4027
- Rabbrev rea( redirect_to :action\ =>\
4028
- Rabbrev rec( redirect_to :controller\ =>\
4029
- Rabbrev rst( respond_to
4030
- endif
4031
- if buffer.type_name() ==# 'model' || buffer.type_name('model-arb')
4032
- Rabbrev bt( belongs_to
4033
- Rabbrev ho( has_one
4034
- Rabbrev hm( has_many
4035
- Rabbrev habtm( has_and_belongs_to_many
4036
- Rabbrev co( composed_of
4037
- Rabbrev va( validates_associated
4038
- Rabbrev vb( validates_acceptance_of
4039
- Rabbrev vc( validates_confirmation_of
4040
- Rabbrev ve( validates_exclusion_of
4041
- Rabbrev vf( validates_format_of
4042
- Rabbrev vi( validates_inclusion_of
4043
- Rabbrev vl( validates_length_of
4044
- Rabbrev vn( validates_numericality_of
4045
- Rabbrev vp( validates_presence_of
4046
- Rabbrev vu( validates_uniqueness_of
4047
- endif
4048
- if buffer.type_name('db-migration','db-schema')
4049
- Rabbrev mac( add_column
4050
- Rabbrev mrnc( rename_column
4051
- Rabbrev mrc( remove_column
4052
- Rabbrev mct( create_table
4053
- Rabbrev mcht( change_table
4054
- Rabbrev mrnt( rename_table
4055
- Rabbrev mdt( drop_table
4056
- Rabbrev mcc( t.column
4057
- endif
4058
- if buffer.type_name('test')
4059
- Rabbrev ase( assert_equal
4060
- Rabbrev asko( assert_kind_of
4061
- Rabbrev asnn( assert_not_nil
4062
- Rabbrev asr( assert_raise
4063
- Rabbrev asre( assert_response
4064
- Rabbrev art( assert_redirected_to
4065
- endif
4066
- Rabbrev :a :action\ =>\
4067
- " hax
4068
- Rabbrev :c :co________\ =>\
4069
- inoreabbrev <buffer> <silent> :c <C-R>=<SID>TheCWord()<CR>
4070
- Rabbrev :i :id\ =>\
4071
- Rabbrev :o :object\ =>\
4072
- Rabbrev :p :partial\ =>\
4073
- Rabbrev logd( logger.debug
4074
- Rabbrev logi( logger.info
4075
- Rabbrev logw( logger.warn
4076
- Rabbrev loge( logger.error
4077
- Rabbrev logf( logger.fatal
4078
- Rabbrev fi( find
4079
- Rabbrev AR:: ActiveRecord
4080
- Rabbrev AV:: ActionView
4081
- Rabbrev AC:: ActionController
4082
- Rabbrev AD:: ActionDispatch
4083
- Rabbrev AS:: ActiveSupport
4084
- Rabbrev AM:: ActionMailer
4085
- Rabbrev AO:: ActiveModel
4086
- Rabbrev AE:: ActiveResource
4087
- endif
4088
- endfunction
4089
-
4090
- function! s:Abbrev(bang,...) abort
4091
- if !exists("b:rails_abbreviations")
4092
- let b:rails_abbreviations = {}
4093
- endif
4094
- if a:0 > 3 || (a:bang && (a:0 != 1))
4095
- return s:error("Rabbrev: invalid arguments")
4096
- endif
4097
- if a:0 == 0
4098
- for key in sort(keys(b:rails_abbreviations))
4099
- echo key . join(b:rails_abbreviations[key],"\t")
4100
- endfor
4101
- return
4102
- endif
4103
- let lhs = a:1
4104
- let root = s:sub(lhs,'%(::|\(|\[)$','')
4105
- if a:bang
4106
- if has_key(b:rails_abbreviations,root)
4107
- call remove(b:rails_abbreviations,root)
4108
- endif
4109
- exe "iunabbrev <buffer> ".root
4110
- return
4111
- endif
4112
- if a:0 > 3 || a:0 < 2
4113
- return s:error("Rabbrev: invalid arguments")
4114
- endif
4115
- let rhs = a:2
4116
- if has_key(b:rails_abbreviations,root)
4117
- call remove(b:rails_abbreviations,root)
4118
- endif
4119
- if lhs =~ '($'
4120
- let b:rails_abbreviations[root] = ["(", rhs . (a:0 > 2 ? "\t".a:3 : "")]
4121
- if a:0 > 2
4122
- call s:AddParenExpand(root,rhs,a:3)
4123
- else
4124
- call s:AddParenExpand(root,rhs)
4125
- endif
4126
- return
4127
- endif
4128
- if a:0 > 2
4129
- return s:error("Rabbrev: invalid arguments")
4130
- endif
4131
- if lhs =~ ':$'
4132
- call s:AddColonExpand(root,rhs)
4133
- elseif lhs =~ '\[$'
4134
- call s:AddBracketExpand(root,rhs)
4135
- elseif lhs =~ '\w$'
4136
- call s:AddTabExpand(lhs,rhs)
4137
- else
4138
- return s:error("Rabbrev: unimplemented")
4139
- endif
4140
- let b:rails_abbreviations[root] = [matchstr(lhs,'\W*$'),rhs]
4141
- endfunction
4142
-
4143
- " }}}1
4144
- " Settings {{{1
4145
-
4146
- function! s:Set(bang,...)
4147
- let c = 1
4148
- let defscope = ''
4149
- for arg in a:000
4150
- if arg =~? '^<[abgl]\=>$'
4151
- let defscope = (matchstr(arg,'<\zs.*\ze>'))
4152
- elseif arg !~ '='
4153
- if defscope != '' && arg !~ '^\w:'
4154
- let arg = defscope.':'.opt
4155
- endif
4156
- let val = s:getopt(arg)
4157
- if val == '' && !has_key(s:opts(),arg)
4158
- call s:error("No such rails.vim option: ".arg)
4159
- else
4160
- echo arg."=".val
4161
- endif
4162
- else
4163
- let opt = matchstr(arg,'[^=]*')
4164
- let val = s:sub(arg,'^[^=]*\=','')
4165
- if defscope != '' && opt !~ '^\w:'
4166
- let opt = defscope.':'.opt
4167
- endif
4168
- call s:setopt(opt,val)
4169
- endif
4170
- endfor
4171
- endfunction
4172
-
4173
- function! s:getopt(opt,...)
4174
- let app = rails#app()
4175
- let opt = a:opt
4176
- if a:0
4177
- let scope = a:1
4178
- elseif opt =~ '^[abgl]:'
4179
- let scope = tolower(matchstr(opt,'^\w'))
4180
- let opt = s:sub(opt,'^\w:','')
4181
- else
4182
- let scope = 'abgl'
4183
- endif
4184
- let lnum = a:0 > 1 ? a:2 : line('.')
4185
- if scope =~ 'l' && &filetype != 'ruby'
4186
- let scope = s:sub(scope,'l','b')
4187
- endif
4188
- if scope =~ 'l'
4189
- call s:LocalModelines(lnum)
4190
- endif
4191
- let var = s:sname().'_'.opt
4192
- let lastmethod = s:lastmethod(lnum)
4193
- if lastmethod == '' | let lastmethod = ' ' | endif
4194
- " Get buffer option
4195
- if scope =~ 'l' && exists('b:_'.var) && has_key(b:_{var},lastmethod)
4196
- return b:_{var}[lastmethod]
4197
- elseif exists('b:'.var) && (scope =~ 'b' || (scope =~ 'l' && lastmethod == ' '))
4198
- return b:{var}
4199
- elseif scope =~ 'a' && has_key(app,'options') && has_key(app.options,opt)
4200
- return app.options[opt]
4201
- elseif scope =~ 'g' && exists("g:".s:sname()."_".opt)
4202
- return g:{var}
4203
- else
4204
- return ""
4205
- endif
4206
- endfunction
4207
-
4208
- function! s:setopt(opt,val)
4209
- let app = rails#app()
4210
- if a:opt =~? '[abgl]:'
4211
- let scope = matchstr(a:opt,'^\w')
4212
- let opt = s:sub(a:opt,'^\w:','')
4213
- else
4214
- let scope = ''
4215
- let opt = a:opt
4216
- endif
4217
- let defscope = get(s:opts(),opt,'a')
4218
- if scope == ''
4219
- let scope = defscope
4220
- endif
4221
- if &filetype != 'ruby' && (scope ==# 'B' || scope ==# 'l')
4222
- let scope = 'b'
4223
- endif
4224
- let var = s:sname().'_'.opt
4225
- if opt =~ '\W'
4226
- return s:error("Invalid option ".a:opt)
4227
- elseif scope ==# 'B' && defscope == 'l'
4228
- if !exists('b:_'.var) | let b:_{var} = {} | endif
4229
- let b:_{var}[' '] = a:val
4230
- elseif scope =~? 'b'
4231
- let b:{var} = a:val
4232
- elseif scope =~? 'a'
4233
- if !has_key(app,'options') | let app.options = {} | endif
4234
- let app.options[opt] = a:val
4235
- elseif scope =~? 'g'
4236
- let g:{var} = a:val
4237
- elseif scope =~? 'l'
4238
- if !exists('b:_'.var) | let b:_{var} = {} | endif
4239
- let lastmethod = s:lastmethod(lnum)
4240
- let b:_{var}[lastmethod == '' ? ' ' : lastmethod] = a:val
4241
- else
4242
- return s:error("Invalid scope for ".a:opt)
4243
- endif
4244
- endfunction
4245
-
4246
- function! s:opts()
4247
- return {'alternate': 'b', 'controller': 'b', 'gnu_screen': 'a', 'model': 'b', 'preview': 'l', 'task': 'b', 'related': 'l', 'root_url': 'a'}
4248
- endfunction
4249
-
4250
- function! s:Complete_set(A,L,P)
4251
- if a:A =~ '='
4252
- let opt = matchstr(a:A,'[^=]*')
4253
- return [opt."=".s:getopt(opt)]
4254
- else
4255
- let extra = matchstr(a:A,'^[abgl]:')
4256
- return filter(sort(map(keys(s:opts()),'extra.v:val')),'s:startswith(v:val,a:A)')
4257
- endif
4258
- return []
4259
- endfunction
4260
-
4261
- function! s:BufModelines()
4262
- if !g:rails_modelines
4263
- return
4264
- endif
4265
- let lines = getline("$")."\n".getline(line("$")-1)."\n".getline(1)."\n".getline(2)."\n".getline(3)."\n"
4266
- let pat = '\s\+\zs.\{-\}\ze\%(\n\|\s\s\|#{\@!\|%>\|-->\|$\)'
4267
- let cnt = 1
4268
- let mat = matchstr(lines,'\C\<Rset'.pat)
4269
- let matend = matchend(lines,'\C\<Rset'.pat)
4270
- while mat != "" && cnt < 10
4271
- let mat = s:sub(mat,'\s+$','')
4272
- let mat = s:gsub(mat,'\|','\\|')
4273
- if mat != ''
4274
- silent! exe "Rset <B> ".mat
4275
- endif
4276
- let mat = matchstr(lines,'\C\<Rset'.pat,matend)
4277
- let matend = matchend(lines,'\C\<Rset'.pat,matend)
4278
- let cnt += 1
4279
- endwhile
4280
- endfunction
4281
-
4282
- function! s:LocalModelines(lnum)
4283
- if !g:rails_modelines
4284
- return
4285
- endif
4286
- let lbeg = s:lastmethodline(a:lnum)
4287
- let lend = s:endof(lbeg)
4288
- if lbeg == 0 || lend == 0
4289
- return
4290
- endif
4291
- let lines = "\n"
4292
- let lnum = lbeg
4293
- while lnum < lend && lnum < lbeg + 5
4294
- let lines .= getline(lnum) . "\n"
4295
- let lnum += 1
4296
- endwhile
4297
- let pat = '\s\+\zs.\{-\}\ze\%(\n\|\s\s\|#{\@!\|%>\|-->\|$\)'
4298
- let cnt = 1
4299
- let mat = matchstr(lines,'\C\<rset'.pat)
4300
- let matend = matchend(lines,'\C\<rset'.pat)
4301
- while mat != "" && cnt < 10
4302
- let mat = s:sub(mat,'\s+$','')
4303
- let mat = s:gsub(mat,'\|','\\|')
4304
- if mat != ''
4305
- silent! exe "Rset <l> ".mat
4306
- endif
4307
- let mat = matchstr(lines,'\C\<rset'.pat,matend)
4308
- let matend = matchend(lines,'\C\<rset'.pat,matend)
4309
- let cnt += 1
4310
- endwhile
4311
- endfunction
4312
-
4313
- " }}}1
4314
- " Detection {{{1
4315
-
4316
- function! s:app_source_callback(file) dict
4317
- if self.cache.needs('existence')
4318
- call self.cache.set('existence',{})
4319
- endif
4320
- let cache = self.cache.get('existence')
4321
- if !has_key(cache,a:file)
4322
- let cache[a:file] = self.has_file(a:file)
4323
- endif
4324
- if cache[a:file]
4325
- sandbox source `=self.path(a:file)`
4326
- endif
4327
- endfunction
4328
-
4329
- call s:add_methods('app',['source_callback'])
4330
-
4331
- function! RailsBufInit(path)
4332
- let firsttime = !(exists("b:rails_root") && b:rails_root == a:path)
4333
- let b:rails_root = a:path
4334
- if !has_key(s:apps,a:path)
4335
- let s:apps[a:path] = deepcopy(s:app_prototype)
4336
- let s:apps[a:path].root = a:path
4337
- endif
4338
- let app = s:apps[a:path]
4339
- let buffer = rails#buffer()
4340
- " Apparently rails#buffer().calculate_file_type() can be slow if the
4341
- " underlying file system is slow (even though it doesn't really do anything
4342
- " IO related). This caching is a temporary hack; if it doesn't cause
4343
- " problems it should probably be refactored.
4344
- let b:rails_cached_file_type = buffer.calculate_file_type()
4345
- if g:rails_history_size > 0
4346
- if !exists("g:RAILS_HISTORY")
4347
- let g:RAILS_HISTORY = ""
4348
- endif
4349
- let path = a:path
4350
- let g:RAILS_HISTORY = s:scrub(g:RAILS_HISTORY,path)
4351
- if has("win32")
4352
- let g:RAILS_HISTORY = s:scrub(g:RAILS_HISTORY,s:gsub(path,'\\','/'))
4353
- endif
4354
- let path = fnamemodify(path,':p:~:h')
4355
- let g:RAILS_HISTORY = s:scrub(g:RAILS_HISTORY,path)
4356
- if has("win32")
4357
- let g:RAILS_HISTORY = s:scrub(g:RAILS_HISTORY,s:gsub(path,'\\','/'))
4358
- endif
4359
- let g:RAILS_HISTORY = path."\n".g:RAILS_HISTORY
4360
- let g:RAILS_HISTORY = s:sub(g:RAILS_HISTORY,'%(.{-}\n){,'.g:rails_history_size.'}\zs.*','')
4361
- endif
4362
- call app.source_callback("config/syntax.vim")
4363
- if expand('%:t') =~ '\.yml\.example$'
4364
- setlocal filetype=yaml
4365
- elseif expand('%:e') =~ '^\%(rjs\|rxml\|builder\)$'
4366
- setlocal filetype=ruby
4367
- elseif firsttime
4368
- " Activate custom syntax
4369
- let &syntax = &syntax
4370
- endif
4371
- if expand('%:e') == 'log'
4372
- nnoremap <buffer> <silent> R :checktime<CR>
4373
- nnoremap <buffer> <silent> G :checktime<Bar>$<CR>
4374
- nnoremap <buffer> <silent> q :bwipe<CR>
4375
- setlocal modifiable filetype=railslog noswapfile autoread foldmethod=syntax
4376
- if exists('+concealcursor')
4377
- setlocal concealcursor=nc conceallevel=2
4378
- else
4379
- silent %s/\%(\e\[[0-9;]*m\|\r$\)//ge
4380
- endif
4381
- setlocal readonly nomodifiable
4382
- $
4383
- endif
4384
- call s:BufSettings()
4385
- call s:BufCommands()
4386
- call s:BufAbbreviations()
4387
- " snippetsEmu.vim
4388
- if exists('g:loaded_snippet')
4389
- silent! runtime! ftplugin/rails_snippets.vim
4390
- " filetype snippets need to come last for higher priority
4391
- exe "silent! runtime! ftplugin/".&filetype."_snippets.vim"
4392
- endif
4393
- let t = rails#buffer().type_name()
4394
- let t = "-".t
4395
- let f = '/'.RailsFilePath()
4396
- if f =~ '[ !#$%\,]'
4397
- let f = ''
4398
- endif
4399
- runtime! macros/rails.vim
4400
- silent doautocmd User Rails
4401
- if t != '-'
4402
- exe "silent doautocmd User Rails".s:gsub(t,'-','.')
4403
- endif
4404
- if f != ''
4405
- exe "silent doautocmd User Rails".f
4406
- endif
4407
- call app.source_callback("config/rails.vim")
4408
- call s:BufModelines()
4409
- call s:BufMappings()
4410
- return b:rails_root
4411
- endfunction
4412
-
4413
- function! s:SetBasePath()
4414
- let self = rails#buffer()
4415
- if self.app().path() =~ '://'
4416
- return
4417
- endif
4418
- let transformed_path = s:pathsplit(s:pathjoin([self.app().path()]))[0]
4419
- let add_dot = self.getvar('&path') =~# '^\.\%(,\|$\)'
4420
- let old_path = s:pathsplit(s:sub(self.getvar('&path'),'^\.%(,|$)',''))
4421
- call filter(old_path,'!s:startswith(v:val,transformed_path)')
4422
-
4423
- let path = ['app', 'app/models', 'app/controllers', 'app/helpers', 'config', 'lib', 'app/views']
4424
- if self.controller_name() != ''
4425
- let path += ['app/views/'.self.controller_name(), 'public']
4426
- endif
4427
- if self.app().has('test')
4428
- let path += ['test', 'test/unit', 'test/functional', 'test/integration']
4429
- endif
4430
- if self.app().has('spec')
4431
- let path += ['spec', 'spec/models', 'spec/controllers', 'spec/helpers', 'spec/views', 'spec/lib', 'spec/requests', 'spec/integration']
4432
- endif
4433
- let path += ['app/*', 'vendor', 'vendor/plugins/*/lib', 'vendor/plugins/*/test', 'vendor/rails/*/lib', 'vendor/rails/*/test']
4434
- call map(path,'self.app().path(v:val)')
4435
- call self.setvar('&path',(add_dot ? '.,' : '').s:pathjoin([self.app().path()],path,old_path))
4436
- endfunction
4437
-
4438
- function! s:BufSettings()
4439
- if !exists('b:rails_root')
4440
- return ''
4441
- endif
4442
- let self = rails#buffer()
4443
- call s:SetBasePath()
4444
- let rp = s:gsub(self.app().path(),'[ ,]','\\&')
4445
- if stridx(&tags,rp.'/tmp/tags') == -1
4446
- let &l:tags = rp . '/tmp/tags,' . &tags . ',' . rp . '/tags'
4447
- endif
4448
- if has("gui_win32") || has("gui_running")
4449
- let code = '*.rb;*.rake;Rakefile'
4450
- let templates = '*.'.join(s:view_types,';*.')
4451
- let fixtures = '*.yml;*.csv'
4452
- let statics = '*.html;*.css;*.js;*.xml;*.xsd;*.sql;.htaccess;README;README_FOR_APP'
4453
- let b:browsefilter = ""
4454
- \."All Rails Files\t".code.';'.templates.';'.fixtures.';'.statics."\n"
4455
- \."Source Code (*.rb, *.rake)\t".code."\n"
4456
- \."Templates (*.rhtml, *.rxml, *.rjs)\t".templates."\n"
4457
- \."Fixtures (*.yml, *.csv)\t".fixtures."\n"
4458
- \."Static Files (*.html, *.css, *.js)\t".statics."\n"
4459
- \."All Files (*.*)\t*.*\n"
4460
- endif
4461
- call self.setvar('&includeexpr','RailsIncludeexpr()')
4462
- call self.setvar('&suffixesadd', ".rb,.".join(s:view_types,',.'))
4463
- let ft = self.getvar('&filetype')
4464
- if ft =~ '^\%(e\=ruby\|[yh]aml\|javascript\|coffee\|css\|s[ac]ss\|lesscss\)$'
4465
- call self.setvar('&shiftwidth',2)
4466
- call self.setvar('&softtabstop',2)
4467
- call self.setvar('&expandtab',1)
4468
- if exists('+completefunc') && self.getvar('&completefunc') == ''
4469
- call self.setvar('&completefunc','syntaxcomplete#Complete')
4470
- endif
4471
- endif
4472
- if ft == 'ruby'
4473
- call self.setvar('&define',self.define_pattern())
4474
- " This really belongs in after/ftplugin/ruby.vim but we'll be nice
4475
- if exists('g:loaded_surround') && self.getvar('surround_101') == ''
4476
- call self.setvar('surround_5', "\r\nend")
4477
- call self.setvar('surround_69', "\1expr: \1\rend")
4478
- call self.setvar('surround_101', "\r\nend")
4479
- endif
4480
- elseif ft == 'yaml' || fnamemodify(self.name(),':e') == 'yml'
4481
- call self.setvar('&define',self.define_pattern())
4482
- elseif ft =~# '^eruby\>'
4483
- if exists("g:loaded_allml")
4484
- call self.setvar('allml_stylesheet_link_tag', "<%= stylesheet_link_tag '\r' %>")
4485
- call self.setvar('allml_javascript_include_tag', "<%= javascript_include_tag '\r' %>")
4486
- call self.setvar('allml_doctype_index', 10)
4487
- endif
4488
- if exists("g:loaded_ragtag")
4489
- call self.setvar('ragtag_stylesheet_link_tag', "<%= stylesheet_link_tag '\r' %>")
4490
- call self.setvar('ragtag_javascript_include_tag', "<%= javascript_include_tag '\r' %>")
4491
- call self.setvar('ragtag_doctype_index', 10)
4492
- endif
4493
- elseif ft == 'haml'
4494
- if exists("g:loaded_allml")
4495
- call self.setvar('allml_stylesheet_link_tag', "= stylesheet_link_tag '\r'")
4496
- call self.setvar('allml_javascript_include_tag', "= javascript_include_tag '\r'")
4497
- call self.setvar('allml_doctype_index', 10)
4498
- endif
4499
- if exists("g:loaded_ragtag")
4500
- call self.setvar('ragtag_stylesheet_link_tag', "= stylesheet_link_tag '\r'")
4501
- call self.setvar('ragtag_javascript_include_tag', "= javascript_include_tag '\r'")
4502
- call self.setvar('ragtag_doctype_index', 10)
4503
- endif
4504
- endif
4505
- if ft =~# '^eruby\>' || ft ==# 'yaml'
4506
- " surround.vim
4507
- if exists("g:loaded_surround")
4508
- " The idea behind the || part here is that one can normally define the
4509
- " surrounding to omit the hyphen (since standard ERuby does not use it)
4510
- " but have it added in Rails ERuby files. Unfortunately, this makes it
4511
- " difficult if you really don't want a hyphen in Rails ERuby files. If
4512
- " this is your desire, you will need to accomplish it via a rails.vim
4513
- " autocommand.
4514
- if self.getvar('surround_45') == '' || self.getvar('surround_45') == "<% \r %>" " -
4515
- call self.setvar('surround_45', "<% \r -%>")
4516
- endif
4517
- if self.getvar('surround_61') == '' " =
4518
- call self.setvar('surround_61', "<%= \r %>")
4519
- endif
4520
- if self.getvar("surround_35") == '' " #
4521
- call self.setvar('surround_35', "<%# \r %>")
4522
- endif
4523
- if self.getvar('surround_101') == '' || self.getvar('surround_101')== "<% \r %>\n<% end %>" "e
4524
- call self.setvar('surround_5', "<% \r -%>\n<% end -%>")
4525
- call self.setvar('surround_69', "<% \1expr: \1 -%>\r<% end -%>")
4526
- call self.setvar('surround_101', "<% \r -%>\n<% end -%>")
4527
- endif
4528
- endif
4529
- endif
4530
- endfunction
4531
-
4532
- " }}}1
4533
- " Autocommands {{{1
4534
-
4535
- augroup railsPluginAuto
4536
- autocmd!
4537
- autocmd User BufEnterRails call s:RefreshBuffer()
4538
- autocmd User BufEnterRails call s:resetomnicomplete()
4539
- autocmd User BufEnterRails call s:BufDatabase(-1)
4540
- autocmd User dbextPreConnection call s:BufDatabase(1)
4541
- autocmd BufWritePost */config/database.yml call rails#cache_clear("dbext_settings")
4542
- autocmd BufWritePost */test/test_helper.rb call rails#cache_clear("user_assertions")
4543
- autocmd BufWritePost */config/routes.rb call rails#cache_clear("named_routes")
4544
- autocmd BufWritePost */config/environment.rb call rails#cache_clear("default_locale")
4545
- autocmd BufWritePost */config/environments/*.rb call rails#cache_clear("environments")
4546
- autocmd BufWritePost */tasks/**.rake call rails#cache_clear("rake_tasks")
4547
- autocmd BufWritePost */generators/** call rails#cache_clear("generators")
4548
- autocmd FileType * if exists("b:rails_root") | call s:BufSettings() | endif
4549
- autocmd Syntax ruby,eruby,yaml,haml,javascript,coffee,railslog if exists("b:rails_root") | call s:BufSyntax() | endif
4550
- autocmd QuickFixCmdPre *make* call s:push_chdir()
4551
- autocmd QuickFixCmdPost *make* call s:pop_command()
4552
- augroup END
4553
-
4554
- " }}}1
4555
- " Initialization {{{1
4556
-
4557
- map <SID>xx <SID>xx
4558
- let s:sid = s:sub(maparg("<SID>xx"),'xx$','')
4559
- unmap <SID>xx
4560
- let s:file = expand('<sfile>:p')
4561
-
4562
- if !exists('s:apps')
4563
- let s:apps = {}
4564
- endif
4565
-
4566
- " }}}1
4567
-
4568
- let &cpo = s:cpo_save
4569
-
4570
- " vim:set sw=2 sts=2: