Vim for Python & Normal Plugins & Vundle & YCM

来源:互联网 发布:ug编程可疑几何体 编辑:程序博客网 时间:2024/06/06 00:44
  • 部分转载自:here
  • YCM 安装here
  • YCM安装here
    因为许多Unix衍生系统已经预装了Vim,我们首先要确认编辑器是否成功安装:

vim 查看版本

  • vim –version 或 vim –version | grep python
  • 如果已经安装了,你应该看到类似下面的文字:
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Nov  5 2014 21:00:28)Compiled by root@apple.comNormal version without GUI.  Features included (+) or not (-):-arabic +autocmd -balloon_eval -browse +builtin_terms +byte_offset +cindent-clientserver -clipboard +cmdline_compl +cmdline_hist +cmdline_info +comments-conceal +cryptv +cscope +cursorbind +cursorshape +dialog_con +diff +digraphs-dnd -ebcdic -emacs_tags +eval +ex_extra +extra_search -farsi +file_in_path+find_in_path +float +folding -footer +fork() -gettext -hangul_input +iconv+insert_expand +jumplist -keymap -langmap +libcall +linebreak +lispindent+listcmds +localmap -lua +menu +mksession +modify_fname +mouse -mouseshape-mouse_dec -mouse_gpm -mouse_jsbterm -mouse_netterm -mouse_sysmouse+mouse_xterm +multi_byte +multi_lang -mzscheme +netbeans_intg -osfiletype+path_extra -perl +persistent_undo +postscript +printer -profile +python/dyn-python3 +quickfix +reltime -rightleft +ruby/dyn +scrollbind +signs+smartindent -sniff +startuptime +statusline -sun_workshop +syntax +tag_binary+tag_old_static -tag_any_white -tcl +terminfo +termresponse +textobjects +title -toolbar +user_commands +vertsplit +virtualedit +visual +visualextra +viminfo+vreplace +wildignore +wildmenu +windows +writebackup -X11 -xfontset -xim -xsmp -xterm_clipboard -xterm_save   system vimrc file: "$VIM/vimrc"     user vimrc file: "$HOME/.vimrc"      user exrc file: "$HOME/.exrc"  fall-back for $VIM: "/usr/share/vim"Compilation: gcc -c -I. -D_FORTIFY_SOURCE=0 -Iproto -DHAVE_CONFIG_H -arch i386 -arch x86_64 -g -Os -pipeLinking: gcc -arch i386 -arch x86_64 -o vim -lncurses
  • 在这一步,你要确保已经满足以下两点要求:
  • Vim编辑版本应该大于7.3。
  • 支持Python语言。在所选编辑器的功能中,确保你看到了+python。
  • 如果满足上述要求,接下来可以安装Vim扩展了。如果不满足,则需要安装/升级。

安装

  • Debian或Ubuntu系统,可以使用下面的代码:
sudo apt-get remove vim-tinyapt-get updateapt-get install vim

验证安装

  • 确保你已经安装了7.3版本以上、支持Python的Vim编辑器。你可以再次运行vim –version进行确认。如果你想知道Vim中使用的Python版本,你可以在编辑器中运行:python import sys; print(sys.version)。
2.7.6 (default, Sep  9 2014, 15:04:36)[GCC 4.2.1 Compatible Apple LLVM 6.0 (clang-600.0.39)]
  • 这行命令会输出你的编辑器当前的Python版本。如果报错,那么你的编辑器就不支持Python语言,需要重装或重新编译。
  • Vim编辑器安装完成后,我们来看看如何将其设置为Python开发的强大环境。

Python代码缩进

  • 当然,想要代码折叠功能根据缩进情况正常工作,那么你就会希望自己的缩进是正确的。这里,Vim的自带功能无法满足,因为它实现不了定义函数之后的自动缩进。我们希望Vim中的缩进能做到以下两点:
  • 首先,缩进要符合PEP8标准。
  • 其次,更好地处理自动缩进。

PEP8

  • 要支持PEP8风格的缩进,请在.vimrc文件中添加下面的代码:
au BufNewFile,BufRead *.py\ set tabstop=4\ set softtabstop=4\ set shiftwidth=4\ set textwidth=79\ set expandtab\ set autoindent\ set fileformat=unix
  • 这些设置将让Vim中的Tab键就相当于4个标准的空格符,确保每行代码长度不超过80个字符,并且会以unix格式储存文件,避免在推送到Github或分享给其他用户时出现文件转换问题。
  • 对于全栈开发,你可以设置针对每种文件类型设置au命令
au BufNewFile,BufRead *.js, *.html, *.css\ set tabstop=2\ set softtabstop=2\ set shiftwidth=2
  • 对于我的jvim来说,这些都已经在其他地方实现了,只不过没有对与全栈配置,以后用到了再配置吧

自动缩进 indentpython.vim

  • 自动缩进有用,但是在某些情况下(比如函数定义有多行的时候),并不总是会达到你想要的效果,尤其是在符合PEP8标准方面。我们可以利用indentpython.vim插件,来解决这个问题:
Plugin 'vim-scripts/indentpython.vim'

Vundle

  • github地址
  • 部分转载自:http://foocoder.com/blog/mei-ri-vimcha-jian-kai-pian-zhi-vundle.html/

安装

  • git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  • 添加guthub上的代码
  • 最新版的在github主页上有介绍,推荐使用Plugin,等这个不能用了,就换成最新版吧

加载插件

  • 将所有的插件都写成plugin ‘user/repo’即可。vundle会从该库中去取。
  • 如果未加’/’,则默认从vim script: https://github.com/vim-scripts/ 去取 还可以加上非github库:
  • Plugin ‘git://git.wincent.com/command-t.git’
  • 或者本地文件
  • Plugin ‘file///path/from/root/to/plugin’

Vundle命令

  • :BundleList 列举出列表中(.vimrc中)配置的所有插件
  • :BundleInstall 安装列表中全部插件
  • :pluginInstall 安装插件,新版
  • :BundleInstall! 更新列表中全部插件
  • :BundleSearch foo 查找foo插件
  • :BundleSearch! foo 刷新foo插件缓存
  • :BundleClean 清除列表中没有的插件
  • :BundleClean! 清除列表中没有的插件
  • :BundleUpdate 更新插件
  • :PluginSearch foo 搜索插件

YCM

  • 这里介绍YCM安装,但配置文件是在cpp.vim中的
  • YCM和其它Vim插件的安装有些不同,可能需要折腾一下。之所以安装稍微会麻烦些,是因为YCM 后端调用 libclang(以获取AST,当然还有其他语言的语义分析库)、前端由 C++ 开发(以提升补全效率)、外层由 python 封装(以成为 vim 插件),它可能是安装最复杂的 vim 插件了。YCM是Client-sever架构的,Vim这部分的YCM只是很小的一个客户端,与具有大量逻辑和功能的ycmd HTTP+JSON交互。server在你开启或关闭Vim是自动开启或关闭。
  • 其它自动补全的插件基本上是基于文本的,也就是说它们基本上是使用正则去猜。区别于其它Vim的自动补全插件,YCM基于语义引擎(比如C家族的libclang)提供了语义补全,是通过分析源文件,经过语法分析之后进行补全。对于C家族的语言这种基于语义的自动补全依赖于clang/llvm,其他语言 ,会调用vim设置的omnifunc来匹配,可以查看github
Java/Ruby   eclimPython      JediGo          GocodeC#          OmniSharpJavaScript  Tern for Vim
  • YCM不是基于前缀补全的,而是子序列,所以输入 abc 可以补全 xaybgc,它对于大小写的补全也非常智能。对于C家族的语言和Python支持跳转到定义处。此外还可以对文件路径进行补全,和ultisnips也很好结合

完全安装 可以直接跳到 Ubuntu Linux X64 超快安装

  • 如果用Vundle更新YCM,yum_support_lib库API改变了,YCM会提醒你重新编译它
确保Vim版本至少是7.3.584,并且支持python2脚本。
  • 在Vim中输入:version可以查看版本。如果版本已经高于7.4了,那么OK。版本是7.3。那么继续往下看,看到包含版本:1-Z,如果Z小于584就需要重装了。Ubuntu的话可以通过PPA安装高版本的。否则就要从源码编译安装了。
  • 查看是否支持python2:进入vim,命令:echo has(‘python’),输出为1,则表示支持。如果为0,则需要重新编译安装vim,在编译时添加python支持。
通过Vundle安装YCM
  • 在你的vimrc中添加Plugin ‘Valloric/YouCompleteMe’,然后执行:PluginInstall
安装clang
  • 如果不需要对C家族的语言进行语义补全支持,则跳过这一步。
  • 下载最新版的libclang。Clang是一个开源编译器,能够编译C/C++/Objective-C/Objective-C++。Clang提供的libclang库是用于驱动YCM对这些语言的语义补全支持。YCM需要版本至少为3.6的libclang,但是理论上3.2+版本也行。也可以使用系统libclang,如果确定是3.3版本或者更高。推荐下载官网的二进制文件。确保选对适合自己系统的包。
编译YCM需要的ycm_support_libs库。YCM的C++引擎通过这些库来获取更快的补全速度
  • 需要cmake,如果未安装,安装之:sudo apt-get install build-essential cmake(也可以下载安装http://www.cmake.org/cmake/resources/software.html)。确保python头文件已安装:sudo apt-get install python-dev。假设你已经通过Vundle装好YCM了,那么它应该位于~/.vim/bundle/YouCompleteMe。
  • 我们新建一个目录用来放置编译文件,并切换到此目录下
cd ~mkdir ycm_buildcd ycm_build;
  • 下一步生成makefile,这一步很重要,有点复杂。
  • 如果不需要C族语言的语义支持,在ycm_build目录下执行:
cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cppcmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cppmake ycm_core
  • 如果需要C族语言的语义支持,还得分几种情况(不写c++ 的忽略):
假如你从llvm的官网下载了LLVM+Clang,然后解压到:~/ycm_temp/llvm_root_dir (该目录下有 bin, lib, include 等文件夹),然后执行:cmake -G "Unix Makefiles" -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp如果想用系统的libclang:cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp如果想用自定义的libclang:cmake -G "Unix Makefiles" -DEXTERNAL_LIBCLANG_PATH=/path/to/libclang.so . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp。/path/to/libclang.so这部分填入你自己的路径。makefiles生成后执行:make ycm_support_libs
  • 我是从llvm网站下载的二进制文件,安装的,安装过程中也没遇到什么问题

Ubuntu Linux X64 超快安装

  • 最好还是完整安装,这种快速安装未必适合所有人。安装之前,同样也要确定满足以上所述的vim版本、python支持等条件。和上面一样使用Vundle安装YCM,安装CMake和python头文件
  • 编译YCM,如果需要对C-family的语义支持:
cd ~/.vim/bundle/YouCompleteMe./install.sh --clang-completer
  • 如果不需要对C-family的语义支持:
cd ~/.vim/bundle/YouCompleteMe./install.sh
  • 如果需要支持C#,添加 –omnisharp-complete。如果需要支持Go添加 –gocode-completer

配置

  • 通用的语义补全用法:
  • 可以使用Ctrl+Space来触发补全。
  • C族语义补全引擎的使用:
  • YCM使用TAB键接受补全,一直按TAB则会循环所有的匹配补全项。shift+TAB则会反向循环。注意:如果使用控制台Vim(非GVim或MacVim等),控制台不会将shift+Tab传递给Vim,因此会无反应,需要重新映射按键。此外,如果同时使用ultisnaps,可能会有冲突,需要进行一些设置。可以使用Ctrl+Space来触发补全,不过会和输入法冲突,也需要设置。
  • YCM会寻找当前打开的文件的同级目录下或上级目录中的ycm_extra_conf.py这个文件,找到后会加载为Python模块,且只加载一次。YCM调用该模块中的FlagsForFile方法。该模块必须提供带有编译当前文件的必要信息的这个方法。需要修改.ycm_extra_conf.py文件中的flags部分,使用-isystem添加系统的头文件进行解析,使用-I添加第三方的头文件进行解析,在flags部分后添加如下内容:
'-isystem','/usr/include','-isystem','/usr/include/c++/','-isystem','/usr/include/i386-linux-gnu/c++'
  • 如果要让其对C++标准库补全生效,还要把配置文件中的这几行(从try到pass这4行)注释掉:
# NOTE: This is just for YouCompleteMe; it's highly likely that your project# does NOT need to remove the stdlib flag. DO NOT USE THIS IN YOUR# ycm_extra_conf IF YOU'RE NOT 100% SURE YOU NEED IT.try:  final_flags.remove( '-stdlib=libc++' )except ValueError:  pass
  • 最好先把YCM作者提供的模板备份一下再做改动,然后将改动好的文件就放在原来的位置,作为全局的ycm_extra_conf.py,这样平时写个小Cpp的程序就不需要再单独创建一个。要使之生效,需要在.vimrc里面设置YCM相应的选项,此选项会在下面配置部分详细说明。对于特定的工程,将其拷贝到工程文件夹下,然后在这基础上再修改。不用担心工程文件夹下的ycm_extra_conf.py会和全局的冲突,因为开启vim之后,ycm会现在工程文件夹下搜索该文件,此处的配置文件优先级最高。
  • 使用命令:YcmDiags可以打开location-list查看警告和错误信息。
  • 一份很详细的配置文件
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>"nnoremap <F8> :YcmForceCompileAndDiagnostics<CR>    "force recomile with syntastic"设置跳转的快捷键,可以跳转到definition和declarationnnoremap <leader>gc :YcmCompleter GoToDeclaration<CR>nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>" nnoremap <leader>lo :lopen<CR>    "open locationlist" nnoremap <leader>lc :lclose<CR>   "close locationlist"设置全局配置文件的路径let g:ycm_global_ycm_extra_conf = '~/.vim/data/ycm/.ycm_extra_conf.py'" 不显示开启vim时检查ycm_extra_conf文件的信息let g:ycm_confirm_extra_conf=0" 开启基于tag的补全,可以在这之后添加需要的标签路径let g:ycm_collect_identifiers_from_tags_files=1"注释和字符串中的文字也会被收入补全let g:ycm_collect_identifiers_from_comments_and_strings = 0" 输入第2个字符开始补全let g:ycm_min_num_of_chars_for_completion=2" 禁止缓存匹配项,每次都重新生成匹配项let g:ycm_cache_omnifunc=0" 开启语义补全let g:ycm_seed_identifiers_with_syntax=1"在注释输入中也能补全let g:ycm_complete_in_comments = 1"在字符串输入中也能补全let g:ycm_complete_in_strings = 1" 设置在下面几种格式的文件上屏蔽ycmlet g:ycm_filetype_blacklist = {      \ 'tagbar' : 1,      \ 'nerdtree' : 1,      \}"youcompleteme  默认tab  s-tab 和 ultisnips 冲突let g:ycm_key_list_select_completion = ['<Down>']let g:ycm_key_list_previous_completion = ['<Up>']" 修改对C函数的补全快捷键,默认是CTRL + space,修改为ALT + ;let g:ycm_key_invoke_completion = '<M-;>'"不查询ultisnips提供的代码模板补全,如果需要,设置成1即可let g:ycm_use_ultisnips_completer=0" SirVer/ultisnips 代码片断" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.let g:UltiSnipsExpandTrigger="<tab>"let g:UltiSnipsJumpForwardTrigger="<tab>"let g:UltiSnipsJumpBackwardTrigger="<s-tab>"let g:UltiSnipsListSnippets="<c-e>""定义存放代码片段的文件夹,使用自定义和默认的,将会的到全局,有冲突的会提示let g:UltiSnipsSnippetDirectories=["bundle/vim-snippets/UltiSnips"]" 参考https://github.com/Valloric/YouCompleteMe/issues/36#issuecomment-62941322" 解决ultisnips和ycm tab冲突,如果不使用下面的办法解决可以参考" https://github.com/Valloric/YouCompleteMe/issues/36#issuecomment-63205056的配置" begin" let g:ycm_key_list_select_completion=['<C-n>', '<Down>']" let g:ycm_key_list_previous_completion=['<C-p>', '<Up>']" let g:UltiSnipsExpandTrigger="<Tab>"" let g:UltiSnipsJumpForwardTrigger="<Tab>"" let g:UltiSnipsJumpBackwardTrigger="<S-Tab>"" end" UltiSnips completion function that tries to expand a snippet. If there's no" snippet for expanding, it checks for completion window and if it's" shown, selects first element. If there's no completion window it tries to" jump to next placeholder. If there's no placeholder it just returns TAB keyfunction! g:UltiSnips_Complete()    call UltiSnips#ExpandSnippet()    if g:ulti_expand_res == 0        if pumvisible()            return "\<C-n>"        else            call UltiSnips#JumpForwards()            if g:ulti_jump_forwards_res == 0               return "\<TAB>"            endif        endif    endif    return ""endfunctionau BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"" Expand snippet or returnlet g:ulti_expand_res = 1function! Ulti_ExpandOrEnter()    call UltiSnips#ExpandSnippet()    if g:ulti_expand_res        return ''    else        return "\<return>"endfunction" Set <space> as primary triggerinoremap <return> <C-R>=Ulti_ExpandOrEnter()<CR>
0 0