@@ -281,7 +281,11 @@ function! s:lastmethod(...)
281281 return rails#buffer ().last_method (a: 0 ? a: 1 : line (" ." ))
282282endfunction
283283
284- function ! s: readable_last_format (start ) dict abort
284+ function ! s: readable_format (start ) dict abort
285+ let format = matchstr (self .getline (a: start ), ' \%(:formats *=>\|\<formats:\) *\[\= *[:'' "]\zs\w\+' )
286+ if format !=# ' '
287+ return format
288+ endif
285289 if self .type_name (' view' )
286290 let format = fnamemodify (self .path (),' :r:e' )
287291 if format == ' '
@@ -302,21 +306,14 @@ function! s:readable_last_format(start) dict abort
302306 let line -= 1
303307 endwhile
304308 endif
305- return " "
309+ return self . type_name ( ' mailer ' ) ? ' text ' : ' html '
306310endfunction
307311
308- function ! s: format (... )
309- let format = rails#buffer ().last_format (a: 0 > 1 ? a: 2 : line (" ." ))
310- return format == # ' ' && a: 0 ? a: 1 : format
312+ function ! s: format ()
313+ return rails#buffer ().format (line (' .' ))
311314endfunction
312315
313- call s: add_methods (' readable' ,[' end_of' ,' last_opening_line' ,' last_method_line' ,' last_method' ,' last_format' ,' define_pattern' ])
314-
315- let s: view_types = split (' rhtml,erb,rxml,builder,rjs,mab,liquid,haml,dryml,mn,slim' ,' ,' )
316-
317- function ! s: viewspattern ()
318- return ' \%(' .join (s: view_types ,' \|' ).' \)'
319- endfunction
316+ call s: add_methods (' readable' ,[' end_of' ,' last_opening_line' ,' last_method_line' ,' last_method' ,' format' ,' define_pattern' ])
320317
321318function ! s: controller (... )
322319 return rails#buffer ().controller_name (a: 0 ? a: 1 : 0 )
@@ -937,7 +934,7 @@ function! s:BufCommands()
937934 command ! - buffer - bar -nargs =? -complete =customlist ,s: Complete_environments Rdbext :call s: BufDatabase (2 ,<q-args> )|let b: dbext_buffer_defaulted = 1
938935 endif
939936 let ext = expand (" %:e" )
940- if ext = ~ s: viewspattern ()
937+ if RailsFilePath () = ~ ' \<app/views/ '
941938 " TODO: complete controller names with trailing slashes here
942939 command ! - buffer - bar - bang -nargs =? - range -complete =customlist ,s: controllerList Rextract :<line1> ,<line2> call s: Extract (<bang> 0 ,<f-args> )
943940 endif
@@ -1870,7 +1867,7 @@ function! s:RailsFind()
18701867
18711868 " UGH
18721869 let buffer = rails#buffer ()
1873- let format = s: format (' html ' )
1870+ let format = s: format ()
18741871
18751872 let res = s: findit (' \v\s*<require\s*\(=\s*File.dirname\(__FILE__\)\s*\+\s*[:' ." '" .' "](\f+)>.=' ,expand (' %:h' ).' /\1' )
18761873 if res != " " |return res .(fnamemodify (res ,' :e' ) == ' ' ? ' .rb' : ' ' )|endif
@@ -2587,6 +2584,60 @@ function! s:observerEdit(cmd,...)
25872584 call s: EditSimpleRb (a: cmd ," observer" ,a: 0 ? a: 1 : s: model (1 )," app/models/" ," _observer.rb" )
25882585endfunction
25892586
2587+ function ! s: dotcmp (i1, i2)
2588+ return strlen (s: gsub (a: i1 ,' [^.]' , ' ' )) - strlen (s: gsub (a: i2 ,' [^.]' , ' ' ))
2589+ endfunc
2590+
2591+ let s: view_types = split (' rhtml,erb,rxml,builder,rjs,haml' ,' ,' )
2592+
2593+ function ! s: readable_resolve_view (name,... ) dict abort
2594+ let name = a: name
2595+ let pre = ' app/views/'
2596+ if name !~# ' /'
2597+ let controller = self .controller_name (1 )
2598+ if controller != ' '
2599+ let name = controller.' /' .name
2600+ endif
2601+ endif
2602+ if name = ~# ' \.\w\+\.\w\+$' || name = ~# ' \.\%(' .join (s: view_types ,' \|' ).' \)$'
2603+ return pre .name
2604+ else
2605+ for format in [' .' .self .format (a: 0 ? a: 1 : 0 ), ' ' ]
2606+ let found = self .app ().relglob (' ' , ' app/views/' .name.format.' .*' )
2607+ call sort (found, s: function (' s:dotcmp' ))
2608+ if ! empty (found)
2609+ return found[0 ]
2610+ endif
2611+ endfor
2612+ endif
2613+ return ' '
2614+ endfunction
2615+
2616+ function ! s: readable_resolve_layout (name, ... ) dict abort
2617+ let name = a: name
2618+ if name == # ' '
2619+ let name = self .controller_name (1 )
2620+ endif
2621+ if name !~# ' /'
2622+ let name = ' layouts/' .name
2623+ endif
2624+ let view = self .resolve_view (name, a: 0 ? a: 1 : 0 )
2625+ if view == # ' ' && a: name == # ' '
2626+ let view = self .resolve_view (' layouts/application' , a: 0 ? a: 1 : 0 )
2627+ endif
2628+ return view
2629+ endfunction
2630+
2631+ call s: add_methods (' readable' , [' resolve_view' , ' resolve_layout' ])
2632+
2633+ function ! s: findview (name)
2634+ return rails#buffer ().resolve_view (a: name , line (' .' ))
2635+ endfunction
2636+
2637+ function ! s: findlayout (name)
2638+ return rails#buffer ().resolve_layout (a: name , line (' .' ))
2639+ endfunction
2640+
25902641function ! s: viewEdit (cmd,... )
25912642 if a: 0 && a: 1 = ~ ' ^[^!#:]'
25922643 let view = matchstr (a: 1 ,' [^!#:]*' )
@@ -2605,65 +2656,26 @@ function! s:viewEdit(cmd,...)
26052656 if view !~ ' /'
26062657 return s: error (" Cannot find view without controller" )
26072658 endif
2608- let file = " app/views/ " . view
2609- let found = s: findview ( view )
2659+ let found = rails#buffer (). resolve_view ( view , line ( ' . ' ))
2660+ let djump = a: 0 ? matchstr ( a: 1 , ' !.*\|#\zs.*\|:\zs\d*\ze\%(:in\)\=$ ' ) : ' '
26102661 if found != ' '
2611- let dir = fnamemodify (rails#app ().path (found),' :h' )
2612- if ! isdirectory (dir )
2613- if a: 0 && a: 1 = ~ ' !'
2614- call mkdir (dir ,' p' )
2615- else
2616- return s: error (' No such directory' )
2617- endif
2618- endif
26192662 call s: edit (a: cmd ,found)
2620- elseif file = ~ ' \.\w\+$'
2621- call s: findedit (a: cmd ,file )
2663+ call s: djump (djump )
2664+ elseif a: 0 && a: 1 = ~# ' !'
2665+ call s: edit (a: cmd ,' app/views/' .view )
2666+ call s: djump (djump )
26222667 else
2623- let format = s: format (rails#buffer ().type_name (' mailer' ) ? ' text' : ' html' )
2624- if glob (rails#app ().path (file .' .' .format).' .*[^~]' ) != ' '
2625- let file .= ' .' . format
2626- endif
26272668 call s: findedit (a: cmd ,file )
26282669 endif
26292670endfunction
26302671
2631- function ! s: findview (name)
2632- let self = rails#buffer ()
2633- let name = a: name
2634- let pre = ' app/views/'
2635- if name !~# ' /'
2636- let controller = self .controller_name (1 )
2637- if controller != ' '
2638- let name = controller.' /' .name
2639- endif
2640- endif
2641- if name = ~# ' \.\w\+\.\w\+$' || name = ~# ' \.' .s: viewspattern ().' $'
2642- return pre .name
2643- else
2644- for format in [' .' .s: format (' html' ), ' ' ]
2645- for type in s: view_types
2646- if self .app ().has_file (pre .name.format.' .' .type )
2647- return pre .name.format.' .' .type
2648- endif
2649- endfor
2650- endfor
2651- endif
2652- return ' '
2653- endfunction
2654-
2655- function ! s: findlayout (name)
2656- return s: findview (" layouts/" .(a: name == ' ' ? ' application' : a: name ))
2657- endfunction
2658-
26592672function ! s: layoutEdit (cmd,... )
2660- if a: 0
2673+ if a: 0 && a: 1 = ~# ' /'
2674+ return s: viewEdit (a: cmd ,a: 1 )
2675+ elseif a: 0
26612676 return s: viewEdit (a: cmd ," layouts/" .a: 1 )
26622677 endif
2663- let file = s: findlayout (s: controller (1 ))
2664- if file == " "
2665- let file = s: findlayout (" application" )
2666- endif
2678+ let file = s: findlayout (' ' )
26672679 if file == " "
26682680 let file = " app/views/layouts/application.html.erb"
26692681 endif
@@ -3022,10 +3034,7 @@ function! s:readable_related(...) dict abort
30223034 let lastmethod = self .last_method (a: 1 )
30233035 if self .type_name (' controller' ,' mailer' ) && lastmethod != " "
30243036 let root = s: sub (s: sub (s: sub (f ,' /application%(_controller)=\.rb$' ,' /shared_controller.rb' ),' /%(controllers|models|mailers)/' ,' /views/' ),' %(_controller)=\.rb$' ,' /' .lastmethod)
3025- let format = self .last_format (a: 1 )
3026- if format == ' '
3027- let format = self .type_name (' mailer' ) ? ' text' : ' html'
3028- endif
3037+ let format = self .format (a: 1 )
30293038 if glob (self .app ().path ().' /' .root.' .' .format.' .*[^~]' ) != ' '
30303039 return root . ' .' . format
30313040 else
@@ -3062,8 +3071,6 @@ function! s:readable_related(...) dict abort
30623071 endif
30633072 elseif self .type_name (' controller' )
30643073 return s: sub (s: sub (f ,' /controllers/' ,' /helpers/' ),' %(_controller)=\.rb$' ,' _helper.rb' )
3065- " elseif self.type_name('helper')
3066- " return s:findlayout(s:controller())
30673074 elseif self .type_name (' model-arb' )
30683075 let table_name = matchstr (join (self .getline (1 ,50 )," \n " ),' \n\s*self\.table_name\s*=\s*[:"'' ]\zs\w\+' )
30693076 if table_name == ' '
@@ -3216,17 +3223,14 @@ function! s:Extract(bang,...) range abort
32163223 else
32173224 let curdir = fnamemodify (RailsFilePath (),' :h' )
32183225 endif
3219- let curdir = rails_root." /" .curdir
3220- let dir = fnamemodify (file ," :h" )
3221- let fname = fnamemodify (file ," :t" )
3222- if fnamemodify (fname," :e" ) == " "
3223- let name = fname
3224- let fname .= " ." .matchstr (expand (" %:t" ),' \.\zs.*' )
3225- elseif fnamemodify (fname," :e" ) !~ ' ^' .s: viewspattern ().' $'
3226- let name = fnamemodify (fname," :r" )
3227- let fname .= " ." .ext
3228- else
3229- let name = fnamemodify (fname," :r:r" )
3226+ let curdir = rails_root.' /' .curdir
3227+ let dir = fnamemodify (file ,' :h' )
3228+ let fname = fnamemodify (file ,' :t' )
3229+ let name = matchstr (file , ' ^[^.]*' )
3230+ if fnamemodify (fname, ' :e' ) == ' '
3231+ let fname .= matchstr (expand (' %:t' ),' \..*' )
3232+ elseif fnamemodify (fname, ' :e' ) !=# ext
3233+ let fname .= ' .' .ext
32303234 endif
32313235 let var = " @" .name
32323236 let collection = " "
0 commit comments