Подтвердить что ты не робот

Взлом rails.vim для работы с Padrino

Недавно я клонировал rails.vim(vim-rails), надеясь изменить его для работы с проектами Padrino.

В настоящее время я пытаюсь заставить команду Rcontroller искать не только в приложениях/контроллерах (идеально подходит для рельсов), но и в любой папке проекта, которая имеет подпапку под названием "контроллеры". Поэтому, когда я набираю Rcontroller в командном режиме и нажимаю вкладку, я должен иметь возможность переходить через admin/controllers/base.rb, admin/controllers/accounts.rb, app/controllers/events.rb и т.д. Это позволит пользователям плагина перейти к контроллерам в "subapp" приложение Падрино. например PADRINO_ROOT/admin

Текущая функция controllerList, похоже, справляется с этой автозавершением, и вот что я до сих пор (только слегка измененный из исходного источника)

function! s:controllerList(A,L,P)
  let con = padrino#app().relglob("*/controllers/","**/*",".rb") 
  call map(con,'s:sub(v:val,"_controller$","")')
  return s:autocamelize(con,a:A)  
endfunction

Я добавил подстановочный знак перед каталогом контроллеров, но это дает такие результаты, как

  • Rcontroller ers/base
  • Rcontroller ers/sessions
  • Rcontroller s/events

для последнего, похоже, что происходит нечто странное со строковыми строками или перекрытием...

В идеале я хотел бы получить его до такой степени, что ввод Rcontroller admin<TAB> должен привести к автозавершению до Rcontroller admin/controllers/accounts.rb. Аналогично, Rcontroller app<TAB> должно привести к Rcontroller app/controllers/events.rb

Код для функции viewList имеет нечто похожее на это, и его код выглядит следующим образом:

 function! s:viewList(A,L,P)
   let c = s:controller(1)
   let top = padrino#app().relglob("app/views/",s:fuzzyglob(a:A))
   call filter(top,'v:val !~# "\\~$"')
   if c != '' && a:A !~ '/'
     let local = padrino#app().relglob("app/views/".c."/","*.*[^~]")
     return s:completion_filter(local+top,a:A)
   endif
   return s:completion_filter(top,a:A)
 endfunction

У кого-нибудь есть предложения? Спасибо заранее.

4b9b3361

Ответ 1

Вероятно, вы хотите, чтобы полный путь выглядел следующим образом:

**/controllers/**/*.rb

который globs как "смотрится под любым каталогом для каталога, называемого контроллерами, затем смотри где-нибудь под ним для файла, заканчивающегося на .rb"

Глядя на другие способы использования "relglob", я могу только догадываться о том, как он должен работать, но я предполагаю следующее:

  • Первый параметр - это "какой каталог следует искать"
  • второй параметр - "как размножать каталоги оттуда"
  • третий параметр - это "фактические файлы, которые будут соответствовать"

исходя из этого предположения, я предполагаю, что:

padrino#app().relglob("app/","**/controllers/**/*",".rb") 

Предостережение: это основано на моем понимании glob, а не vim или relglob отрегулируйте в соответствии с фактическим использованием.

Примечание: добавлено "приложение/" в предположении, что вы вряд ли захотите вносить вкладки через любые контроллеры под вендором/плагином или поставщиком/драгоценными камнями. Это может быть не так, и в этом случае не стесняйтесь изменить его на "."