2013-03-30 2 views
4

У меня есть + рубиновая версия vim 7.2 (также пробовала с 7.3 и настраиваемой скомпилированной версией), но я только получаю omnicomplete (ctrl-x ctrl-o) для работы в определенных случаях.vim omnicomplete с ruby ​​только частично работает

Например, если у меня есть

class MegaGreeter 
    attr_accessor :names 

    def initialize(names = "world") 
     @names = names 
     if @names.nil? 
      puts "hello #{@names}.each" 
     end 
    end 
end 

omnicomplete работает для .each, но не для .nil. Кроме того, он не будет автоматически заполнять ключевые слова attr_.

Я пробовал это с отключенными всеми моими плагинами, снова со всеми включенными. Я попробовал это также с плагином vim-ruby. Плагины, которые я установил, - AfterColors, CSApprox, surround, color_sample_pack, mimicpak, taglist.

У меня есть следующий раздел в моем .vimrc (я могу опубликовать весь .vimrc, если необходимо). Я также использую VIM для C++, JavaScript, и около 1/2 десятка других языков, так что есть omnicomplete вещи там для некоторых из них тоже:

" ============================ " 
" CTAGS/OMNICOMPLETE 
" ============================ " 

" map <ctrl>+F12 to generate ctags for current folder: 
map <C-F12> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> 
" add current directory's generated tags file to available tags 
set tags+=./projects/.tags 
" toggle list view 
map <F4> :TlistToggle<cr> 
" auto close omnicomplete options when exiting insert mode 
autocmd InsertLeave * if pumvisible() == 0|pclose|endif 
" configs for cpp 
let OmniCpp_MayCompleteDot = 1 " autocomplete with . 
let OmniCpp_MayCompleteArrow = 1 " autocomplete with -> 
let OmniCpp_MayCompleteScope = 1 " autocomplete with :: 
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert) 
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files 
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype (i.e. parameters) in popup window 

if has("win32") 
    let Tlist_Ctags_Cmd='c:\programs\ctags\ctags58\ctags.exe' 
else 
    if has("win32unix") 
    let Tlist_Ctags_Cmd='/usr/bin/ctags.exe' 
    else 
    if has("unix") 
     let Tlist_Ctags_Cmd='/usr/bin/ctags' 
    endif 
    endif 
endif 

" omnicomplete settings for the popout menu 
setlocal omnifunc=syntaxcomplete#Complete 
" makes list show longest matching item at top of list 
set completeopt=menuone,longest 
" makes enter select item 
inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" 
inoremap <expr> <Space> pumvisible() ? "\<C-y>" : "\<Space>" 
inoremap <expr> <.> pumvisible() ? "\<C-y>" : "\<.>" 
inoremap <expr> <S-CR> pumvisible() ? "\<C-n>\<C-y>" : "" 
"manual up/down with tab & shift+tab 
inoremap <expr> <Tab> pumvisible() ? "\<C-n>" : "\<Tab>" 
inoremap <expr> <S-Tab> pumvisible() ? "\<C-p>" : "" 
"allows for autoselect of first item in user complete list 
inoremap <expr> <C-n> pumvisible() ? '<C-n>' : '<C-n><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>' 
"allows autoselect of first item for omni complete 
inoremap <expr> <leader>' pumvisible() ? '<C-n>' : '<C-x><C-o><C-n><C-p><C-r>=pumvisible() ? "\<lt>Down>" : ""<CR>' 
" open omni completion menu closing previous if open and opening new menu without changing the text 
inoremap <expr> <C-Space> (pumvisible() ? (col('.') > 1 ? '<Esc>i<Right>' : '<Esc>i') : '') . 
      \ '<C-x><C-o><C-r>=pumvisible() ? "\<lt>C-n>\<lt>C-p>\<lt>Down>" : ""<CR>' 
" open user completion menu closing previous if open and opening new menu without changing the text 
inoremap <expr> <S-Space> (pumvisible() ? (col('.') > 1 ? '<Esc>i<Right>' : '<Esc>i') : '') . 
      \ '<C-x><C-n><C-r>=pumvisible() ? "\<lt>C-n>\<lt>C-p>\<lt>Down>" : ""<CR>' 

" autocomplete for commands; and put most likely at top using tab complete 
" (like windows cmd) 
set wildmenu 
set wildmode=list:longest 

" for ruby 
if has("autocmd") 
    filetype indent on 
    autocmd FileType cucumber,rspec,ruby set number 
    autocmd FileType ruby,eruby set omnifunc=rubycomplete#Complete 
    autocmd FileType ruby,eruby let g:rubycomplete_buffer_loading = 1 
    autocmd FileType ruby,eruby let g:rubycomplete_rails = 1 
    autocmd FileType ruby,eruby let g:rubycomplete_include_object = 1 
    autocmd FileType ruby,eruby let g:rubycomplete_include_objectspace = 1 
    autocmd FileType ruby,eruby let g:rubycomplete_classes_in_global = 1 
else 
    set autoindent 
endif 

" ruby requires bash --login; 
" This is to correct running cmd from vim via :! 
if has("unix") 
    set shell=/bin/bash\ -il 
endif 

"ruby end 

Итак, есть ли способ я могу получить полную поддержку для Ruby в omnicomplete, если да, то как? Или это самая большая проблема, которую может предложить для Ruby?

+2

Я надеюсь, что у кого-то есть реальный ответ для вас, но, по моему опыту, все решения по завершению в Vim не оправдались. Они не очень умны и, как правило, не являются контекстно-зависимыми. Они отлично работают для завершения на основе CTAGS и загруженных файлов, но не анализируют классы, чтобы найти подходящие методы. После того, как вы набрали что-то один раз в текущем сеансе или загрузили помеченный файл, они довольно хороши при общем завершении строки. Тем не менее, это не то же самое, что Java завершение в IDEA или что-то еще. –

+0

Попробуйте установить [vim-ruby] (https://github.com/vim-ruby/vim-ruby), а затем установите 'autocmd FileType ruby ​​set omnifunc = rubycomplete # Complete'. Я использую [neocomplete] (https://github.com/Shougo/neocomplete.vim), но настройка, связанная с этим, работает для меня очень хорошо - включая завершение для '.nil' и' .attr', как вы упомянули, были проблематичным. –

+0

Vim autocomplete, как правило, довольно слаб по сравнению с большинством IDE. В частности, с Ruby, потому что это динамический язык, и нет хороших библиотек автозаполнения. Самый близкий язык - Python, и единственный способ получить хорошее завершение - с помощью [jedi] (https://github.com/davidhalter/jedi), который [YouCompleteMe] (https://github.com/Valloric/YouCompleteMe) использует большой эффект. Короткий ответ заключается в том, что нет хорошего завершения Vim Ruby. Я рекомендую использовать YouCompleteMe в любом случае, потому что он невероятно быстрый и автоматически использует теги, по крайней мере. –

ответ

2

Vim auto-completion должно работать из коробки, я не знаю ни одного метода .nil, поэтому я не был бы уверен, что это настоящая проблема.

Однако в отношении к omnicompletion не завершает attr_reader и любит, то setlocal omnifunc=syntaxcomplete#Complete исправляет это, однако он должен пойти в ftplugin/ruby/my_custom_ruby_ftplugin.vim вместо того, чтобы просто в вашем vimrc, или в качестве альтернативы, если вы хотите, вы можете поместить эту команду Setl в пределах autocmd FileType ruby setl omnifunc=syntaxcompelete#Complete в вашем vimrc, и он должен работать так, как вы ожидаете.

Смежные вопросы