首先晒一张个人vim截图,基本IDE有的功能都能实现了,虽然在平常工做里仍是IDE用的多,可是做为一个开发者,少不了折腾的心。html
vim
,做为与emacs
齐名的编辑器,无需更多溢美之词,因为学习曲线陡峭,可是学会之人,无不表示其方便,vim
操做的简洁,熟练使用后,造成的肌肉习惯让写代码成为享受。在学会基本的vim
使用以后,每一个人都会走向使用插件的道路,或者使用业界流行的插件,或者本身造轮子,这么多的插件在过去管理很是混乱,幸运的是咱们有了插件管理器Vundle
,下面正式从Vundle
带你打造实用的vim工做环境。python
在正式引入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 ~
进入当前用户主目录,.vimrc
是vim
的设置文件,咱们后面会添加不少设置在里面,若是没改过设置,可能一开始不存在,总之咱们使用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
在我上面的图的右侧,显示出相似于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
查看详细文档
这个大名鼎鼎的插件在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最复杂的部分就在于它的安装,老是会出现很多问题,下面咱们将详细描述正确的安装方式:
:echo has('python') || has('python3')
,若是显示1,则知足,不然你就要安装支持Python的vim版本;#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上命令相同
复制代码
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可以解析你的代码,这样它才能给出智能的语义分析。 有两种方式,自动生成的编译数据库或者手动添加编译标志。
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
定义跳转
.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无异了。
使用通常IDE都会在侧面生成一个当前文件的结构图,就不说sublime里面还有个文件缩略图,那么在vim里咱们也能添加这么一个tagbar,让咱们在处理一个文件时,快速定位到函数变量,对代码了如指掌。可是使用TagBar
以前先确保已经有ctags
。
#Linux
sudo apt-get install ctags
#MacOS
brew install ctags
复制代码
安装
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这个插件能够支持搜索。 安装
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/j
,Ctrl+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 复制代码
这个工具主要用来加强状态栏的,显示更多的信息,文件格式,当前状态,路径
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' 复制代码