Vim for Python & Normal Plugins & Vundle & YCM

  • 部分转载自: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.com
Normal 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 -pipe
Linking: gcc -arch i386 -arch x86_64 -o vim -lncurses
  • 在这一步,你要确保已经满足以下两点要求:
  • Vim编辑版本应该大于7.3。
  • 支持Python语言。在所选编辑器的功能中,确保你看到了+python。
  • 如果满足上述要求,接下来可以安装Vim扩展了。如果不满足,则需要安装/升级。

安装

  • Debian或Ubuntu系统,可以使用下面的代码:
sudo apt-get remove vim-tiny
apt-get update
apt-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

安装
加载插件
  • 将所有的插件都写成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   eclim
Python      Jedi
Go          Gocode
C#          OmniSharp
JavaScript  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_build
cd ycm_build;
  • 下一步生成makefile,这一步很重要,有点复杂。
  • 如果不需要C族语言的语义支持,在ycm_build目录下执行:
cmake -G "Unix Makefiles" . ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
cmake -G "Unix Makefiles" -DUSE_SYSTEM_LIBCLANG=ON ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
make 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和declaration
nnoremap <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
" 设置在下面几种格式的文件上屏蔽ycm
let 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 key
function! 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 ""
endfunction

au BufEnter * exec "inoremap <silent> " . g:UltiSnipsExpandTrigger . " <C-R>=g:UltiSnips_Complete()<cr>"

" Expand snippet or return
let g:ulti_expand_res = 1
function! Ulti_ExpandOrEnter()
    call UltiSnips#ExpandSnippet()
    if g:ulti_expand_res
        return ''
    else
        return "\<return>"
endfunction

" Set <space> as primary trigger
inoremap <return> <C-R>=Ulti_ExpandOrEnter()<CR>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值