vim进阶 | 使用插件打造实用vim工做环境

首先晒一张个人vim截图,基本IDE有的功能都能实现了,虽然在平常工做里仍是IDE用的多,可是做为一个开发者,少不了折腾的心。html

myvim

vim,做为与emacs齐名的编辑器,无需更多溢美之词,因为学习曲线陡峭,可是学会之人,无不表示其方便,vim操做的简洁,熟练使用后,造成的肌肉习惯让写代码成为享受。在学会基本的vim使用以后,每一个人都会走向使用插件的道路,或者使用业界流行的插件,或者本身造轮子,这么多的插件在过去管理很是混乱,幸运的是咱们有了插件管理器Vundle,下面正式从Vundle带你打造实用的vim工做环境。python

Vundle

在正式引入Vundle以前,让咱们作一些准备工做 因为咱们的许多插件要从github下载,因此确保本机安装了git, 具体能够自行Google。 其次确保本机上的vim版本>7.4, 能够运行vim --version查看当前机器上的vim版本,个人就显示:linux

VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Dec  6 2016 12:07:41)
复制代码

若是没有安装vim,或者版本低于7.4均可以运行下面的命令安装或更新: MacOSgit

brew update
brew install vim
复制代码

Linuxgithub

apt-get install vim   # ubuntu
yum install vim       # centos
复制代码

vim问题解决后,咱们就进入主题,介绍下Vundle, Vundle是vim的一款插件管理器,Vundle可让你在配置文件中管理插件,而且很是方便的查找、安装、更新或者删除插件。 还能够帮你自动配置插件的执行路径和生成帮助文件。这里还介绍另一个插件管理器,提个名字,pathogen,有兴趣能够自行研究,可是相比于Vundle,仍是弱一线的,因此咱们只介绍最好的。数据库

运行下面命令安装Vundle:json

git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bundle/Vundle.vim
复制代码

而后在咱们的.vimrc 中添加设置,通常.vimrc在咱们的用户主目录下, cd ~进入当前用户主目录,.vimrcvim的设置文件,咱们后面会添加不少设置在里面,若是没改过设置,可能一开始不存在,总之咱们使用vim .vimrc建立或者打开该文件,并添加如下:ubuntu

set nocompatible              " required filetype off " required
dd
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
call vundle#end() " required
filetype plugin indent on    " required 复制代码

而后在 vim中运行:PluginInstall便可(或者在 Bash 中运行vim +PluginInstall +qall)。之后只须要在添加一行Plugin 'xxx'并运行:PluginInstall便可自动安装插件。vim

NERDTree

在我上面的图的右侧,显示出相似于IDE中的目录树,有了目录树能够更清晰地查看项目的结构,这里就使用了一个叫作NERDTree的插件。centos

安装 因为上面咱们介绍了Vundle,那么NERDTree的安装也水到渠成:

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'gmarik/Vundle.vim'
Plugin 'scrooloose/nerdtree'
call vundle#end() " required
filetype plugin indent on    " required 复制代码

咱们增长了scrooloose/nerdtree,只须要github repo的做者名和项目名就能够了,执行PluginInstal,插件就能够安装完成。 咱们在.vimrc中再添加一下设置:

" NERDTree config " open a NERDTree automatically when vim starts up
autocmd vimenter * NERDTree
"open a NERDTree automatically when vim starts up if no files were specified autocmd StdinReadPre * let s:std_in=1 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif "open NERDTree automatically when vim starts up on opening a directory
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | endif
"map F2 to open NERDTree map <F2> :NERDTreeToggle<CR> "close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
复制代码

上面咱们设置了自动打开NERDTree,直接输入vim会打开NERDTree,打开一个目录也会打开NERDTree,当文件都关闭只有NERDTree时自动退出,同时也设置快捷键F2来自由切换打开或者关闭NERDTree。

下面咱们再说一下NERDTree中的一些操做方法

窗格跳转 通常NERDTree会把界面分红左右两个窗格,那么在窗格之间跳转咱们可使用<C+W><C+W>(这个意思表明连续按两次Ctrl+W),顺便普及下,当咱们桌面窗格很是多时,在vim中咱们能够横向纵向打开多个窗格,那咱们也能够经过<C+W><C+h/j/k/l>来执行左/下/上/右的跳转。在每一个窗格,咱们均可以输入:q或者:wq关闭该窗格。

下面还列有一些在目录树中的进阶操做

key 描述
o 打开文件,目录或者书签,和咱们在对应节点上按回车键一个效果
go 打开文件,可是光标仍然停留在目录中
t 在新的tab上打开选定的节点
T 与t相同,可是光标仍然停留在目录中
i 在新窗格中打开文件
gi 和i 相同,可是光标仍然停留在目录中
s 在水平窗格打开一个文件
gs 和s相同,可是光标仍然停留在目录中
A 放大NERDTree窗口
p 跳到根节点
P 跳转到当前节点的父节点
K 跳转到当前目录的第一个节点
J 跳转到当前目录的最后一个节点
u 把上层目录设置为根节点
C 设置当前节点为root节点

还有更多的快捷键,help nerdtree查看详细文档

YouCompleteMe

YCM

这个大名鼎鼎的插件在github上已经有一万多星了,足以证实其受欢迎程度,在此以前我曾经尝试过多款补齐插件,可是都没有YCM智能,咱们依旧使用Vundle安装YCM,添加这个Plugin:

Plugin 'Valloric/YouCompleteMe'
复制代码

可是当vim打开一个文件时,会报错:

The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM core library not detected; you need to compile YCM before using it. Follow the instructions in the documentation
复制代码

YCM最复杂的部分就在于它的安装,老是会出现很多问题,下面咱们将详细描述正确的安装方式

  1. 确保你的vim版本是7.4以上的,这个咱们在本文的一开始部分就已经说明了,若是不是你还能够经过源码安装,固然vim8.0都出了,你也能够选择它,其次确认你的vim是否支持python2和python3的脚本。能够在vim中执行::echo has('python') || has('python3'),若是显示1,则知足,不然你就要安装支持Python的vim版本;
  2. 安装YCM,使用Vundle安装,这一步咱们已经说过了。
  3. 这一步对于须要支持C语系的语义支持的人很重要,你须要下载libclang,CLang是开源的C/C++/Objective-C/Objective-C++编译器,YCM使用clang来支持强大的语义分析,这样给出的补齐或者跳转更加精确,可是要使用最新的libclang版本,至少3.9以上的。官方下载地址,能够选择下载二进制文件,也能够从源码编译,不过编译真的很慢,建议直接下二进制,注意系统。
#for ubuntu14.04
wget http://releases.llvm.org/3.9.0/clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
#for macOS
wget http://releases.llvm.org/3.9.0/clang+llvm-3.9.0-x86_64-apple-darwin.tar.xz
复制代码

下载后解压:

xz -d  clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04.tar.xz
tar -xvf clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04.tar
#MacOS上命令相同
复制代码
  1. 下一步,咱们须要编译一个ycm_core的库给YCM用,这样它就能够快速语义分析产生补全或者函数变量快速跳转了。首先咱们须要安装cmake来生成makefiles文件:
#ubuntu
 sudo apt-get install cmake  
#macOS
brew install cmake 
复制代码

其次,须要安装Python头文件:

sudo apt-get install python-dev python3-dev 
#mac上应该已经默认安装了
复制代码

咱们默认你已经使用Vundle安装了YCM在~/.vim/bundle/YouCompleteMe中了。 下面咱们建立一个目录用来编译:

cd ~
mkdir ycm_build
cd ycm_build
复制代码

咱们先 生成makefiles文件,若是不关心对C系语言支持的话:

cmake -G " Unix Makefiles" ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
复制代码

固然,咱们都已经下载了Clang3.9了,最好这样:

#将下载的clang移到一个本身建的llvm目录中
mkdir -p ycm_temp/llvm_root_dir
mv ~/clang+llvm-3.9.0-x86_64-linux-gnu-ubuntu-14.04/* ~/ycm_temp/llvm_root_dir/
cd  ycm_build
cmake -G "Unix Makefiles" -DUSE_SYSTEM_BOOST=ON -DPATH_TO_LLVM_ROOT=~/ycm_temp/llvm_root_dir ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp
复制代码

这样就会基于最新的clang生成makefiles文件,再下一步就能够编译了:

cmake --build . --target ycm_core --config Release
复制代码

这样就差很少安装完了,固然这仅仅对C系语言进行了语义支持,若是须要支持别的语言,须要自行查看官方教程

使用教程: 要使用YCM的强大功能,就须要给libclang提供你项目的编译标志(compile flags),也就是让libclang可以解析你的代码,这样它才能给出智能的语义分析。 有两种方式,自动生成的编译数据库或者手动添加编译标志。

  1. 自动生成: 最简单的方式就是使用你本身项目的编译工具生成一个编译数据的数据库,如前面咱们使用的CMake,固然不少时候咱们在Linux下使用的都是Gun Make,咱们就须要下载一个Bear的工具,下载源码后安装:
cmake <Bear源码目录>
make all
make install # to install
make check   # to run tests
make package # to make packages
复制代码

而后回到你的工程,bear make整个工程, 会生成compile_commands.json文件,YCM就是利用这个文件作语义分析,使用CMake的话就不须要借助Bear,只须要在编译时添加-DCMAKE_EXPORT_COMPILE_COMMANDS=ON或者在CMakeLists.txt添加上set( CMAKE_EXPORT_COMPILE_COMMANDS ON来把生成的编译数据库信息拷贝到根目录。 2. 手动添加 若是没法自动生成上述文件,咱们使用一个.ycm_extra_conf.py的模块,去根据你的文件名,就能够自动给出一些编译选项,让YCM知道如何解析你的代码,在~/.vim/bundle/YouCompleteMe/cpp/ycm/.ycm_extra_conf.py中提供了默认的模板, 通常咱们会自定义它的flags数组,而后拷贝一份到~目录中,由于YCM老是在当前目录,或者递归上层目录,找到一个可用的.ycm_extra_conf.py

定义跳转

  • 跳转到定义GoToDefinition
  • 跳转到声明GoToDeclaration
  • 以及二者的合体GoToDefinitionElseDeclaration 在.vimrc中能够定义快捷键:
nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>gf :YcmCompleter GoToDefinition<CR>
nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR>
复制代码

<leader>键能够自定义,有个很火的Space-vim建议定义为空格let mapleader="\<Space>",这样咱们在函数上按空格键加gg,就能够实现跳转了。 YCM还支持语义诊断:

let g:ycm_error_symbol = '>>'
let g:ycm_warning_symbol = '>*'
复制代码

这样,不合法的语句,在行首会显示错误,基本和IDE无异了。

TagBar

使用通常IDE都会在侧面生成一个当前文件的结构图,就不说sublime里面还有个文件缩略图,那么在vim里咱们也能添加这么一个tagbar,让咱们在处理一个文件时,快速定位到函数变量,对代码了如指掌。可是使用TagBar以前先确保已经有ctags

#Linux
sudo apt-get install ctags
#MacOS
brew install ctags
复制代码

tagbar

安装

Plugin 'majutsushi/tagbar'
复制代码

再运行安装命令,而后在.vimrc中这样设置:

" Tagbar let g:tagbar_width=35 let g:tagbar_autofocus=1 let g:tagbar_left = 1 nmap <F3> :TagbarToggle<CR> 复制代码

这样经过按F3就能够调出TagBar的窗格。

Ctrap

在一开始的图中,个人下窗格是专门用来搜索文件的,使用Ctrap这个插件能够支持搜索。 安装

Plugin 'ctrlpvim/ctrlp.vim'
复制代码

执行完安装命令:PluginInstall后,咱们作一些设置:

" 打开ctrlp搜索 let g:ctrlp_map = '<leader>ff' let g:ctrlp_cmd = 'CtrlP' " 至关于mru功能,show recently opened files
map <leader>fp :CtrlPMRU<CR>
"set wildignore+=*/tmp/*,*.so,*.swp,*.zip " MacOSX/Linux" let g:ctrlp_custom_ignore = { \ 'dir': '\v[\/]\.(git|hg|svn|rvm)$', \ 'file': '\v\.(exe|so|dll|zip|tar|tar.gz)$', \ } "\ 'link': 'SOME_BAD_SYMBOLIC_LINKS',
let g:ctrlp_working_path_mode=0
let g:ctrlp_match_window_bottom=1
let g:ctrlp_max_height=15
let g:ctrlp_match_window_reversed=0
let g:ctrlp_mruf_max=500
let g:ctrlp_follow_symlinks=1
复制代码

这样你能够空格+ff启用搜索,空格+fp显示最近打开文件,在文件列表里上下移动都用Ctrl+k/jCtrl+p/n来在输入的搜索历史上下切换,更多能够查看:help ctrlp-commands。搜索默认用的是grep,如今谁都知道ag效率更高更快,因此若是想切换搜索的工具能够这么改:

if executable('ag')
  " Use Ag over Grep set grepprg=ag\ --nogroup\ --nocolor " Use ag in CtrlP for listing files.
  let g:ctrlp_user_command = 'ag %s -l --nocolor -g ""'
  " Ag is fast enough that CtrlP doesn't need to cache let g:ctrlp_use_caching = 0 endif 复制代码

vim-powerline

这个工具主要用来加强状态栏的,显示更多的信息,文件格式,当前状态,路径

Plugin 'Lokaltog/vim-powerline'
let g:Powerline_symbols = 'fancy'
set encoding=utf-8 
set laststatus=2
复制代码

其它的一些设置

配色 对于颜值控来讲,一个好看的色彩搭配也能让工做愉悦很多。个人主题配色是solarized ,也能够用Vundle安装。而后直接设置:

syntax enable
set background=dark
colorscheme solarized
复制代码

一些基本设置

"========================================== "General  
"========================================== " history存储长度。  
set history=1000         
"检测文件类型 filetype on " 针对不一样的文件类型采用不一样的缩进格式    
filetype indent on                 
容许插件    
filetype plugin on  
启动自动补全  
filetype plugin indent on  
"兼容vi模式。去掉讨厌的有关vi一致性模式,避免之前版本的一些bug和局限 set nocompatible set autoread " 文件修改以后自动载入。  
set shortmess=atI       " 启动的时候不显示那个援助索马里儿童的提示 " 取消备份。  
"urn backup off, since most stuff is in SVN, git et.c anyway... set nobackup set nowb set noswapfile "贴时保持格式  
set paste  
"- 则点击光标不会换,用于复制 set mouse-=a " 在全部的模式下面打开鼠标。  
set selection=exclusive    
set selectmode=mouse,key  
  
" No annoying sound on errors " 去掉输入错误的提示声音  
set noerrorbells  
set novisualbell  
set t_vb=  
set tm=500    
  
"========================================== " show and format  
"========================================== "显示行号:  
set number  
set nowrap                    " 取消换行。 "为方便复制,用<F6>开启/关闭行号显示:  
nnoremap <F6> :set nonumber!<CR>:set foldcolumn=0<CR>  

"括号配对状况 set showmatch " How many tenths of a second to blink when matching brackets  
set mat=2  
  
"设置文内智能搜索提示 " 高亮search命中的文本。  
set hlsearch            
" 搜索时忽略大小写 set ignorecase " 随着键入即时搜索  
set incsearch  
" 有一个或以上大写字母时仍大小写敏感 set smartcase " 代码折叠  
set foldenable  
" 折叠方法 " manual    手工折叠  
" indent 使用缩进表示折叠 " expr      使用表达式定义折叠  
" syntax 使用语法定义折叠 " diff      对没有更改的文本进行折叠  
" marker 使用标记进行折叠, 默认标记是 {{{ 和 }}} set foldmethod=syntax " 在左侧显示折叠的层次  
"set foldcolumn=4 set tabstop=4 " 设置Tab键的宽度        [等同的空格个数]  
set shiftwidth=4  
set expandtab                " 将Tab自动转化成空格 [须要输入真正的Tab键时,使用 Ctrl+V + Tab] " 按退格键时能够一次删掉 4 个空格  
set softtabstop=4  
  
set ai "Auto indent set si "Smart indent  
  
"========================================== " status  
"========================================== "显示当前的行号列号:  
set ruler  
"在状态栏显示正在输入的命令 set showcmd " Set 7 lines to the cursor - when moving vertically using j/k 上下滚动,始终在中间  
set so=7    
"set cursorline " 突出显示当前行    
复制代码

因为篇幅问题,再推荐其它一些好用的插件

" Improved C++ STL syntax highlighting Plugin 'STL-improved' " recommend fetch it from https://github.com/tczengming/autoload_cscope.vim.git which support c and cpp
Plugin 'tczengming/autoload_cscope.vim'

Plugin 'CmdlineComplete'
Plugin 'xptemplate'

" Ultimate auto completion system for Vim Plugin 'neocomplcache' Plugin 'genutils' Plugin 'lookupfile' " Fast file navigation
Plugin 'wincent/Command-T'

" Preview the definition of variables or functions in a preview window Plugin 'autopreview' " Echo the function declaration in the command line for C/C++
Plugin 'echofunc.vim'

" Under linux need exec 'dos2unix ~/.vim/bundle/QFixToggle/plugin/qfixtoggle.vim' Plugin 'Toggle' Plugin 'Color-Sampler-Pack' Plugin 'txt.vim' Plugin 'mru.vim' Plugin 'YankRing.vim' Plugin 'tpope/vim-surround.git' Plugin 'DoxygenToolkit.vim' Plugin 'tczengming/headerGatesAdd.vim' Plugin 'ShowMarks' Plugin 'Lokaltog/vim-powerline' 复制代码
相关文章
相关标签/搜索