首先曬一張個人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' 複製代碼