美文网首页vimMac OS开发工具集
Mac 下配置 Vim vundle 代码补全 YouCompl

Mac 下配置 Vim vundle 代码补全 YouCompl

作者: 木猫尾巴 | 来源:发表于2016-08-21 12:03 被阅读8776次

    [TOC]

    确定 Vim 版本满足支持

    如果你用的是 Mac OS X 自带的 vim 的话,那么肯定是不能满足需求的

    使用brew安装一个7.4版本的 vim,当然更好更好

    通过brew 来安装

    安装独立的vim替换掉OSX默认

    brew install mercurial 
    brew install vim
    

    打开高亮渲染

    ~/.vimrc 中配置

    set nonu
    syntax on
    

    修复 mac 下 vim 无法使用delete删除文本的问题

    ~/.vimrc 中配置

    " fix mac vim delete error, so as set backspace=indent,eol,start
    set backspace=2
    

    安装 Vundle

    它的使用方法很简单,安装一个插件只需要在.vimrc按照规则中添加 Plugin 的名称,某些需要添加路径,之后在 Vim 中使用:PluginInstall既可以自动化安装。

    • git 克隆 Vundle 工程到本地
    git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
    
    • 修改.vimrc配置 Plugins。在.vimrc文件中添加如下内容
    set nocompatible " be iMproved, required
    filetype off " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    
    " The following are examples of different formats supported.
    " Keep Plugin commands between vundle#begin/end.
    
    " All of your Plugins must be added before the following line
    call vundle#end() " required
    filetype plugin indent on " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    " Brief help
    " :PluginList - lists configured plugins
    " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    " see :h vundle for more details or wiki for FAQ
    " Put your non-Plugin stuff after this line
    

    保存后进入 vim 运行命令

    :PluginInstall
    

    vundle 命令

    # 安装插件
    :BundleInstall
    # 更新插件
    :BundleUpdate
    # 清除不需要的插件
    :BundleClean
    # 列出当前的插件
    :BundleList
    # 搜索插件
    :BundleSearch
    

    注意

    插件配置不要在 call vundle#end() 之前,不然插件无法生效
    如果配置错误,需要重新配置后,在vim中运行 :PluginInstall

    安装 YouCompleteMe

    使用 Vundle 安装 YouCompleteMe

    • .vimrc中添加如下内容 位置在call vundle#begin()call vundle#end()之间
    Bundle 'Valloric/YouCompleteMe'
    

    在vim中运行命令

    :BundleInstall
    

    编译 YouCompleteMe

    编译过程需要CMake

    brew install CMake
    
    • 带 C-family languages 语义支持的版本
    cd ~/.vim/bundle/YouCompleteMe 
    ./install.sh --clang-completer
    
    • 不带 C-family languages 语义支持的版本
    cd ~/.vim/bundle/YouCompleteMe
    ./install.sh
    
    • 带 C# 语义支持的版本
    cd ~/.vim/bundle/YouCompleteMe
    ./install.sh --omnisharp-completer
    
    • 带 Go 语言语义支持的版本
    cd ~/.vim/bundle/YouCompleteMe
    ./install.sh --gocode-completer
    

    配置 YCM

    在.vimrc中添加配置

    " 自动补全配置
    set completeopt=longest,menu "让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
    autocmd InsertLeave * if pumvisible() == 0|pclose|endif "离开插入模式后自动关闭预览窗口
    inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
    "上下左右键的行为 会显示其他信息
    inoremap <expr> <Down> pumvisible() ? "\<C-n>" : "\<Down>"
    inoremap <expr> <Up> pumvisible() ? "\<C-p>" : "\<Up>"
    inoremap <expr> <PageDown> pumvisible() ? "\<PageDown>\<C-p>\<C-n>" : "\<PageDown>"
    inoremap <expr> <PageUp> pumvisible() ? "\<PageUp>\<C-p>\<C-n>" : "\<PageUp>"
    
    "youcompleteme 默认tab s-tab 和自动补全冲突
    "let g:ycm_key_list_select_completion=['<c-n>']
    let g:ycm_key_list_select_completion = ['<Down>']
    "let g:ycm_key_list_previous_completion=['<c-p>']
    let g:ycm_key_list_previous_completion = ['<Up>']
    let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
    
    let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
    let g:ycm_min_num_of_chars_for_completion=2 " 从第2个键入字符就开始罗列匹配项
    let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
    let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
    nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntastic
    "nnoremap <leader>lo :lopen<CR> "open locationlist
    "nnoremap <leader>lc :lclose<CR> "close locationlist
    inoremap <leader><leader> <C-x><C-o>
    "在注释输入中也能补全
    let g:ycm_complete_in_comments = 1
    "在字符串输入中也能补全
    let g:ycm_complete_in_strings = 1
    "注释和字符串中的文字也会被收入补全
    let g:ycm_collect_identifiers_from_comments_and_strings = 0
    
    nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> " 跳转到定义处
    

    YCM 安装错误

    YouCompleteMe unavailable: dlopen...
    

    这是因为历史版本的python导致的,直接使用命令清空历史的python

    brew cleanup python
    brew cleanup python3
    brew cleanup python@2
    

    ctags

    用来遍历源代码文件生成tags文件,这些tags文件能被编辑器或其它工具用来快速查找定位源代码中的符号(tag/symbol),如变量名,函数名等

    Install Ctags

    brew update
    brew install ctags-exuberant
    

    Config ctags

    vi ~/.profile
    # add
    export PATH="/usr/local/bin:/usr/local/sbin:$PATH"
    source ~/.profile
    

    Use ctags

    ctags --help
    ctags --version
    ctags –R *
    
    • -R表示递归创建,也就包括源代码根目录(当前目录)下的所有子目录
    • *表示所有文件
    • 这条命令会在当前目录下产生一个tags文件,当用户在当前目录中运行vi/vim时,会自动载入此tags文件

    taglist

    taglist是一个用于显示定位程序中各种符号的插件,例如宏定义、变量名、结构名、函数名这些东西 我们将其称之为符号(symbols),而在taglist中将其称之为tag。显然,要想将程序文件中的tag显示出来,需要事先了解全部tag的信 息,并将其保存在一个文件中,然后去解析对应的tag文件。taglist做的仅仅是将tag文件中的内容解析完后显示在Vim上而已。tag扫描以及数 据文件的生成则是由ctags(Exuberant Ctags)这一工具完成的,所以在使用taglist之前,你的电脑需要装有ctags。

    Bundle 'taglist.vim'
    let Tlist_Ctags_Cmd='ctags'
    let Tlist_Show_One_File=1 "不同时显示多个文件的tag,只显示当前文件的
    let Tlist_WinWidt =28 "设置taglist的宽度
    let Tlist_Exit_OnlyWindow=1 "如果taglist窗口是最后一个窗口,则退出vim
    "let Tlist_Use_Right_Window=1 "在右侧窗口中显示taglist窗口
    let Tlist_Use_Left_Windo =1 "在左侧窗口中显示taglist窗口
    

    快捷键

    跳到光标下tag所定义的位置,用鼠标双击此tag功能也一样

    o 在一个新打开的窗口中显示光标下tag
    显示光标下tag的原型定义
    u 更新taglist窗口中的tag
    s 更改排序方式,在按名字排序和按出现顺序排序间切换
    x taglist窗口放大和缩小,方便查看较长的tag
    
    打开一个折叠,同zo
    将tag折叠起来,同zc
    打开所有的折叠,同zR
    = 将所有tag折叠起来,同zM
    [[ 跳到前一个文件
    ]] 跳到后一个文件
    q 关闭taglist窗口
    

    NERDTree

    NERDTree是一个用于浏览文件系统的树形资源管理
    它可以让你像使用finder一样在VIM中浏览文件系统并且打开文件或目录

    " NERDTree
    Bundle 'scrooloose/nerdtree'
    

    配置

    let NERDTreeWinPos='right'
    let NERDTreeWinSize=30
    map <F2> :NERDTreeToggle<CR>
    

    额外插件推荐

    " original repos on github
    Bundle 'kien/ctrlp.vim'
    Bundle 'sukima/xmledit'
    Bundle 'sjl/gundo.vim'
    Bundle 'jiangmiao/auto-pairs'
    Bundle 'klen/python-mode'
    Bundle 'Valloric/ListToggle'
    Bundle 'SirVer/ultisnips'
    Bundle 'Valloric/YouCompleteMe'
    Bundle 'scrooloose/syntastic'
    Bundle 't9md/vim-quickhl'
    " Bundle 'Lokaltog/vim-powerline'
    Bundle 'scrooloose/nerdcommenter'
    "..................................
    " vim-scripts repos
    Bundle 'YankRing.vim'
    Bundle 'vcscommand.vim'
    Bundle 'ShowPairs'
    Bundle 'SudoEdit.vim'
    Bundle 'EasyGrep'
    Bundle 'VOoM'
    Bundle 'VimIM'
    

    安装 mvim 代替vi

    brew install macvim
    

    使用 MacVim 替换系统自带的 Vim

    alias vim='mvim -v'
    

    本文还是使用独立的vim, 所以后面没介绍mvim的相关配置,另外mvim目前和很多插件不兼容

    相关文章

      网友评论

      • myworldher:inoremap <expr> <CR> pumvisible() ? "\<C-y>" : "\<CR>" "回车即选中当前项
        我这里这么设置好像没作用。按回车键后,没有任何变化,依然是选中提示相后的状态。
        木猫尾巴:可能是这个兼容问题的 issue

        https://github.com/Valloric/YouCompleteMe/issues/3030

        检查一下 vim 版本和 YCM 版本,在社区里面跟踪一下
      • twillight:您好,我在安装完YCM之后总会报错,Error detected while processing function youcompleteme#Enable[5]..<SNR>47_SetUpP
        ython:
        line 39:
        E887: Sorry, this command is disabled, the Python's site module could not be loa
        ded.
        这个该怎么解决呢
        木猫尾巴: @twillight 安装ycm参数不对 不支持这种
        天色渐晚_b967:楼主,您好;youcompleteme插件遇到过不能跳转到定义处的问题麽;
        在c++工程下,没法跳转;
        RuntimeError: Can't jump to definition.
        log:
        142 2017-06-14 18:08:11,518 - INFO - Received command request
        143 Traceback (most recent call last):
        144 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/bottle/bottle.py", line 861, in _handle
        145 return route.call(**args)
        146 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/bottle/bottle.py", line 1734, in wrapper
        147 rv = callback(*a, **ka)
        148 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/watchdog_plugin.py", line 109, in wrapper
        149 return callback( *args, **kwargs )
        150 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/hmac_plugin.py", line 72, in wrapper
        151 body = callback( *args, **kwargs )
        152 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/handlers.py", line 83, in RunCompleterCommand
        153 request_data ) )
        154 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/completers/completer.py", line 336, in OnUserCommand
        155 return command( self, request_data, arguments[ 1: ] )
        156 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/completers/cpp/clang_completer.py", line 121, in
        157 self._GoToDefinition( request_data ) ),
        158 File "/root/.vim/bundle/YouCompleteMe/third_party/ycmd/ycmd/../ycmd/completers/cpp/clang_completer.py", line 176, in _GoToDefinition
        159 raise RuntimeError( 'Can't jump to definition.' )
        160 RuntimeError: Can't jump to definition.
        木猫尾巴: @twillight 检查python依赖
      • Gxpzy:死活不提示,救救我吧 :joy: 836812350
      • 做你的小星星:我找不到那个.vimrc,楼主是在哪里找到的呢,我只有在test这个文件夹下面找到了vimrc这个文件
        木猫尾巴: @做你的小星星 在你的用户根目录创建一个,或者从模板拷贝一份

      本文标题:Mac 下配置 Vim vundle 代码补全 YouCompl

      本文链接:https://www.haomeiwen.com/subject/njtwsttx.html