utils 0.0.67 → 0.0.68

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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: