首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有ruby的vim omnicomplete仅部分有效

带有ruby的vim omnicomplete仅部分有效
EN

Stack Overflow用户
提问于 2013-03-30 23:40:16
回答 1查看 1.7K关注 0票数 4

我有一个vim 7.2的+ruby版本(也尝试了7.3和自定义编译版本),但我只在某些情况下使用omnicomplete (ctrl-x ctrl-o)。

例如,如果我有

代码语言:javascript
复制
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 )。我还在C++、JavaScript和大约1/2打的其他语言上使用VIM,所以其中一些语言也有完整的东西:

代码语言: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

那么,有没有一种方法可以让我在omnicomplete中获得对Ruby的完全支持,如果是这样的话?或者,这是omnicomplete为Ruby提供的最多的功能吗?

EN

回答 1

Stack Overflow用户

发布于 2014-04-02 16:23:23

Vim自动完成应该是开箱即用的,我不知道有什么方法.nil,所以我不确定这是不是一个真正的问题。

然而,对于没有完成attr_reader之类的所有功能,setlocal omnifunc=syntaxcomplete#Complete会修复它,但是它应该放在ftplugin/ruby/my_custom_ruby_ftplugin.vim中,而不仅仅是你的vimrc中,或者如果你喜欢,你可以把setl命令放在你的vimrc中的autocmd FileType ruby setl omnifunc=syntaxcompelete#Complete中,然后它应该会像你期望的那样工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15720313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档