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.
- data/VERSION +1 -1
- data/bin/edit +3 -1
- data/lib/utils/editor.rb +14 -0
- data/lib/utils/version.rb +1 -1
- data/utils.gemspec +3 -3
- metadata +3 -74
- data/lib/utils/config/vim/after/syntax/haml.vim +0 -9
- data/lib/utils/config/vim/after/syntax/html.vim +0 -11
- data/lib/utils/config/vim/autoload/Align.vim +0 -1029
- data/lib/utils/config/vim/autoload/AlignMaps.vim +0 -330
- data/lib/utils/config/vim/autoload/ctrlp/bookmarkdir.vim +0 -139
- data/lib/utils/config/vim/autoload/ctrlp/buffertag.vim +0 -238
- data/lib/utils/config/vim/autoload/ctrlp/changes.vim +0 -96
- data/lib/utils/config/vim/autoload/ctrlp/dir.vim +0 -90
- data/lib/utils/config/vim/autoload/ctrlp/line.vim +0 -63
- data/lib/utils/config/vim/autoload/ctrlp/mixed.vim +0 -83
- data/lib/utils/config/vim/autoload/ctrlp/mrufiles.vim +0 -119
- data/lib/utils/config/vim/autoload/ctrlp/quickfix.vim +0 -62
- data/lib/utils/config/vim/autoload/ctrlp/rtscript.vim +0 -49
- data/lib/utils/config/vim/autoload/ctrlp/tag.vim +0 -112
- data/lib/utils/config/vim/autoload/ctrlp/undo.vim +0 -154
- data/lib/utils/config/vim/autoload/ctrlp/utils.vim +0 -72
- data/lib/utils/config/vim/autoload/ctrlp.vim +0 -1772
- data/lib/utils/config/vim/autoload/rails.vim +0 -4570
- data/lib/utils/config/vim/autoload/rubycomplete.vim +0 -801
- data/lib/utils/config/vim/autoload/sqlcomplete.vim +0 -741
- data/lib/utils/config/vim/autoload/vimball.vim +0 -750
- data/lib/utils/config/vim/colors/flori.vim +0 -116
- data/lib/utils/config/vim/compiler/coffee.vim +0 -68
- data/lib/utils/config/vim/compiler/eruby.vim +0 -40
- data/lib/utils/config/vim/compiler/ruby.vim +0 -67
- data/lib/utils/config/vim/compiler/rubyunit.vim +0 -34
- data/lib/utils/config/vim/doc/Decho.txt +0 -372
- data/lib/utils/config/vim/doc/coffee-script.txt +0 -116
- data/lib/utils/config/vim/doc/ctrlp.txt +0 -1113
- data/lib/utils/config/vim/doc/fugitive.txt +0 -257
- data/lib/utils/config/vim/doc/rails.txt +0 -1022
- data/lib/utils/config/vim/doc/xml-plugin.txt +0 -226
- data/lib/utils/config/vim/ftdetect/coffee.vim +0 -8
- data/lib/utils/config/vim/ftdetect/eco.vim +0 -1
- data/lib/utils/config/vim/ftdetect/ragel.vim +0 -2
- data/lib/utils/config/vim/ftdetect/ruby.vim +0 -17
- data/lib/utils/config/vim/ftdetect/slim.vim +0 -2
- data/lib/utils/config/vim/ftplugin/coffee.vim +0 -221
- data/lib/utils/config/vim/ftplugin/eruby.vim +0 -100
- data/lib/utils/config/vim/ftplugin/ruby.vim +0 -260
- data/lib/utils/config/vim/ftplugin/xml.vim +0 -941
- data/lib/utils/config/vim/indent/IndentAnything_html.vim +0 -35
- data/lib/utils/config/vim/indent/coffee.vim +0 -338
- data/lib/utils/config/vim/indent/eruby.vim +0 -77
- data/lib/utils/config/vim/indent/javascript.vim +0 -116
- data/lib/utils/config/vim/indent/ruby.vim +0 -377
- data/lib/utils/config/vim/indent/slim.vim +0 -75
- data/lib/utils/config/vim/plugin/AlignMapsPlugin.vim +0 -242
- data/lib/utils/config/vim/plugin/AlignPlugin.vim +0 -41
- data/lib/utils/config/vim/plugin/Decho.vim +0 -592
- data/lib/utils/config/vim/plugin/IndentAnything.vim +0 -675
- data/lib/utils/config/vim/plugin/bufexplorer.vim +0 -1144
- data/lib/utils/config/vim/plugin/cecutil.vim +0 -508
- data/lib/utils/config/vim/plugin/ctrlp.vim +0 -61
- data/lib/utils/config/vim/plugin/fugitive.vim +0 -2041
- data/lib/utils/config/vim/plugin/lusty-explorer.vim +0 -1509
- data/lib/utils/config/vim/plugin/rails.vim +0 -339
- data/lib/utils/config/vim/plugin/rubyextra.vim +0 -193
- data/lib/utils/config/vim/plugin/surround.vim +0 -628
- data/lib/utils/config/vim/plugin/taglist.vim +0 -4546
- data/lib/utils/config/vim/plugin/test/IndentAnything/test.js +0 -131
- data/lib/utils/config/vim/plugin/vimballPlugin.vim +0 -40
- data/lib/utils/config/vim/syntax/Decho.vim +0 -101
- data/lib/utils/config/vim/syntax/coffee.vim +0 -217
- data/lib/utils/config/vim/syntax/eco.vim +0 -62
- data/lib/utils/config/vim/syntax/eruby.vim +0 -73
- data/lib/utils/config/vim/syntax/javascript.vim +0 -246
- data/lib/utils/config/vim/syntax/ragel.vim +0 -165
- data/lib/utils/config/vim/syntax/ruby.vim +0 -367
- data/lib/utils/config/vim/syntax/slim.vim +0 -117
- 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:
|