Skip to content

Commit 0677854

Browse files
committed
Use absolute paths for views and assets
This gets us a lot closer to being able to drop the app root from 'path'.
1 parent 59b358c commit 0677854

File tree

1 file changed

+26
-14
lines changed

1 file changed

+26
-14
lines changed

autoload/rails.vim

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,11 @@ function! s:app_path(...) dict
123123
endfunction
124124

125125
function! s:app_has_path(path) dict
126-
return getftime(self.path(a:path)) != -1
126+
if a:path =~# '\%(^\|:\)[\/]'
127+
return getftime(a:path) != -1
128+
else
129+
return getftime(self.path(a:path)) != -1
130+
endif
127131
endfunction
128132

129133
function! s:app_has_file(file) dict
@@ -2150,6 +2154,11 @@ function! s:findfromview(func,repl)
21502154
return s:findit('\s*\%(<%\)\==\=\s*\<\%('.a:func.'\)\s*(\=\s*[@:'."'".'"]\(\f\+\)\>['."'".'"]\=\s*\%(%>\s*\)\=',a:repl)
21512155
endfunction
21522156

2157+
function! s:findasset(path, ext, pre, post) abort
2158+
let asset = rails#app().resolve_asset(a:path, a:ext)
2159+
return len(asset) ? asset : rails#app().path(a:pre . a:path . a:post)
2160+
endfunction
2161+
21532162
function! s:RailsFind()
21542163
if filereadable(expand("<cfile>"))
21552164
return expand("<cfile>")
@@ -2162,10 +2171,12 @@ function! s:RailsFind()
21622171
let ssext = ['css', 'css.*', 'scss', 'sass']
21632172
if buffer.type_name('stylesheet')
21642173
let res = s:findit('^\s*\*=\s*require\s*["'']\=\([^"'' ]*\)', '\1')
2165-
if res != ""|return rails#app().resolve_asset(res, ssext)."\napp/assets/stylesheets/".res.".css"|endif
2174+
if !empty(res)
2175+
return s:findasset(res, ssext, "app/assets/stylesheets/", ".css")
2176+
endif
21662177
let res = s:findit('^\s*@import\s*\%(url(\)\=["'']\=\([^"'' ]*\)', '\1')
21672178
if res != ""
2168-
let base = expand('%:h')
2179+
let base = expand('%:p:h')
21692180
let rel = s:sub(res, '\ze[^/]*$', '_')
21702181
for ext in ['css', 'css.scss', 'css.sass', 'scss', 'sass']
21712182
for name in [res.'.'.ext, res.'.'.ext.'.erb', rel.'.'.ext, rel.'.'.ext.'.erb']
@@ -2185,7 +2196,9 @@ function! s:RailsFind()
21852196
let jsext = ['js', 'js.*', 'jst', 'jst.*', 'coffee']
21862197
if buffer.type_name('javascript')
21872198
let res = s:findit('^\s*//=\s*require\s*["'']\=\([^"'' ]*\)', '\1')
2188-
if res != ""|return rails#app().resolve_asset(res, jsext)."\napp/assets/javascripts/".res.".js"|endif
2199+
if !empty(res)
2200+
return s:findasset(res, jsext, "app/assets/javascript/", ".js")
2201+
endif
21892202
return expand("<cfile>")
21902203
endif
21912204

@@ -2281,17 +2294,17 @@ function! s:RailsFind()
22812294

22822295
let res = s:findfromview('image[_-]\%(\|path\|url\)\|\%(path\|url\)_to_image','\1')
22832296
if res != ""
2284-
return rails#app().resolve_asset(res)."\npublic/images/".res
2297+
return s:findasset(res, [], 'public/images/', '')
22852298
endif
22862299

22872300
let res = s:findfromview('stylesheet[_-]\%(link_tag\|path\|url\)\|\%(path\|url\)_to_stylesheet','\1')
22882301
if res != ""
2289-
return rails#app().resolve_asset(res, ssext)."\npublic/stylesheets/".res.".css"
2302+
return s:findasset(res, ssext, 'public/stylesheets/', '.css')
22902303
endif
22912304

22922305
let res = s:sub(s:findfromview('javascript_\%(include_tag\|path\|url\)\|\%(path\|url\)_to_javascript','\1'),'/defaults>','/application')
22932306
if res != ""
2294-
return rails#app().resolve_asset(res, jsext)."\npublic/javascripts/".res.".js"
2307+
return s:findasset(res, jsext, 'public/javascripts/', '.js')
22952308
endif
22962309

22972310
if buffer.type_name('controller', 'mailer')
@@ -2859,7 +2872,6 @@ let s:view_types = split('rhtml,erb,rxml,builder,rjs,haml',',')
28592872

28602873
function! s:readable_resolve_view(name, ...) dict abort
28612874
let name = a:name
2862-
let pre = 'app/views/'
28632875
if name !~# '/'
28642876
let controller = self.controller_name(1)
28652877
let found = ''
@@ -2874,13 +2886,13 @@ function! s:readable_resolve_view(name, ...) dict abort
28742886
if name =~# '/' && !self.app().has_path(fnamemodify('app/views/'.name, ':h'))
28752887
return ''
28762888
elseif name =~# '\.[[:alnum:]_+]\+\.\w\+$' || name =~# '\.\%('.join(s:view_types,'\|').'\)$'
2877-
return pre.name
2889+
return self.app().path('app/views/'.name)
28782890
else
28792891
for format in ['.'.self.format(a:0 ? a:1 : 0), '']
28802892
let found = self.app().relglob('', 'app/views/'.name.format.'.*')
28812893
call sort(found, s:function('s:dotcmp'))
28822894
if !empty(found)
2883-
return found[0]
2895+
return self.app().path(found[0])
28842896
endif
28852897
endfor
28862898
endif
@@ -2907,9 +2919,9 @@ function! s:app_resolve_asset(name, ...) dict abort
29072919
let path = join(map(paths, 'escape(v:val, " ,")'), ',')
29082920
let exact = findfile(a:name, path)
29092921
if !empty(exact)
2910-
return exact
2922+
return fnamemodify(exact, ':p')
29112923
endif
2912-
if a:0
2924+
if a:0 && !empty(a:1)
29132925
for candidate in map(split(globpath(path, a:name . '.*'), "\n"), 'fnamemodify(v:val, ":p")')
29142926
for ext in a:1
29152927
let pat = '[\\/]'.s:gsub(s:gsub(a:name.'.'.ext, '\.', '\\.'), '\*', '.*') . '\%(\.erb\)\=$'
@@ -2925,7 +2937,7 @@ endfunction
29252937
call s:add_methods('readable', ['resolve_view', 'resolve_layout'])
29262938
call s:add_methods('app', ['resolve_asset'])
29272939

2928-
function! s:findview(name)
2940+
function! s:findview(name) abort
29292941
return rails#buffer().resolve_view(a:name, line('.'))
29302942
endfunction
29312943

@@ -3179,7 +3191,7 @@ function! s:findedit(cmd,files,...) abort
31793191
if len(files) == 1
31803192
let file = files[0]
31813193
else
3182-
let file = get(filter(copy(files),'rails#app().has_file(s:sub(v:val,"#.*|:\\d*$",""))'),0,get(files,0,''))
3194+
let file = get(filter(copy(files),'rails#app().has_path(s:sub(v:val,"#.*|:\\d*$",""))'),0,get(files,0,''))
31833195
endif
31843196
if file =~ '[#!]\|:\d*\%(:in\)\=$'
31853197
let djump = matchstr(file,'!.*\|#\zs.*\|:\zs\d*\ze\%(:in\)\=$')

0 commit comments

Comments
 (0)