vim omnicomplete с ruby только частично работает
У меня есть +ruby версия vim 7.2 (также пробованная с 7.3 и пользовательской скомпилированной версией), но я получаю только omnicomplete (ctrl-x ctrl-o) для работы в определенных случаях.
Например, если у меня есть
class MegaGreeter
attr_accessor :names
def initialize(names = "world")
@names = names
if @names.nil?
puts "hello #{@names}.each"
end
end
end
всевозможные работы для .each
, но не для .nil
, Кроме того, он не будет автоматически завершать любой attr_
ключевые слова.
Я попробовал это с отключенными всеми моими плагинами, снова со всеми их включенными. Я попробовал это также с плагином vim-ruby. Я установил следующие плагины: AfterColors, CSApprox, Surround, color_sample_pack, mimicpak, taglist.
У меня есть следующий раздел в моем.vimrc (я могу опубликовать весь.vimrc, если это необходимо). Я также использую VIM для C++, JavaScript и еще с полдюжины других языков, так что для некоторых из них есть множество неполных вещей:
" ============================ "
" 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?
1 ответ
Автозаполнение Vim должно работать из коробки, я не знаю ни одного метода .nil
так что я не был бы уверен, если это реальная проблема.
Тем не менее, что касается полного завершения attr_reader
а лайки setlocal omnifunc=syntaxcomplete#Complete
исправляет это, однако это должно идти в ftplugin/ruby/my_custom_ruby_ftplugin.vim
вместо того, чтобы просто в вашем vimrc, или, если хотите, вы можете поместить эту команду setl в autocmd FileType ruby setl omnifunc=syntaxcompelete#Complete
в вашем vimrc, и тогда он должен работать так, как вы ожидаете.