先安裝外掛程式管理工具 pathogen
建立目錄 ~/.vim/bundle/pathogen/autoload/
下載 pathogen.vim(https://github.com/tpope/vim-pathogen )至 ~/.vim/bundle/pathogen/autoload/
在 .vimrc 中加入下面兩行
runtime bundle/pathogen/autoload/pathogen.vim
execute pathogen#infect()
其他外掛程式下載解壓後, 都拷貝到 ~/.vim/bundle/ 目錄下即可
書籤外掛程式
https://github.com/huxiao/vim-bookmark
https://github.com/MattesGroeger/vim-bookmarks ( 這個外掛程式要配合 ctrlp 才好用 )
nmap <F2> mn
imap <F2> <ESC>mn
let g:bookmark_sign = '●'
let g:bookmark_disable_ctrlp = 1
外掛程式的基本用法:
mm 用於設定或者刪除一個書籤,或者使用命令 VbookmarkToggle
mn 用於跳轉到下一個書籤,或者使用命令 VbookmarkNext
mp 用於跳轉到前一個書籤,或者使用命令 VbookmarkPrevious
ma 用於顯示所有書籤
mc 刪除一個書籤
mx 刪除所有書籤
let g:vbookmark_bookmarkSaveFile = $HOME . '/.vimbookmark'
" 設定跳轉書籤的快速鍵
nmap <F2> mn
imap <F2> <ESC>:w<CR>mn
C++ STL 文法高亮外掛程式
https://github.com/octol/vim-cpp-enhanced-highlight
C++源檔案和標頭檔之間切換
https://github.com/derekwyatt/vim-fswitch
nmap <silent> <Leader>sw :FSHere<cr>
這樣,鍵入 ;sw 就能在實現 cpp 檔案和 h檔案間切換
另外一個是
https://github.com/vim-scripts/a.vim
:A switches to the header file corresponding to the current file being edited (or vise versa):AS splits and switches:AV vertical splits and switches:AT new tab and switches:AN cycles through matches:IH switches to file under cursor:IHS splits and switches:IHV vertical splits and switches:IHT new tab and switches:IHN cycles through matches<Leader>ih switches to file under cursor<Leader>is switches to the alternate file of file under cursor (e.g. on <foo.h> switches to foo.cpp)<Leader>ihn cycles through matches
nnoremap <leader>av :AV<CR>
nnoremap <leader>as :AS<CR>
快速開關注釋
https://github.com/scrooloose/nerdcommenter
常用操作:
<leader>cc,注釋當前選中文本,如果選中的是整行則在每行首添加 //,如果選中一行的部分內容則在選中部分前後添加分別 /、/;
<leader>cu,取消選中文字區塊的注釋。
也可以都調用 <leader>c<SPACE> ,它會根據是否有注釋而選擇來注釋還是取消注釋。
括弧引號自動補全
https://github.com/Raimondi/delimitMate
or
https://github.com/jiangmiao/auto-pairs
工程檔案瀏覽
https://github.com/scrooloose/nerdtree
將如下資訊加入.vimrc中:
" 使用 NERDTree 外掛程式查看工程檔案。設定快速鍵
nmap <F8> :NERDTreeToggle<CR>
" 設定NERDTree子視窗寬度let NERDTreeWinSize=32" 設定NERDTree子視窗位置let NERDTreeWinPos="right"" 顯示隱藏檔案let NERDTreeShowHidden=1" NERDTree 子視窗中不顯示冗餘協助資訊let NERDTreeMinimalUI=1" 刪除檔案時自動刪除檔案對應 bufferlet NERDTreeAutoDeleteBuffer=1
常用操作:斷行符號,開啟選中檔案;r,重新整理工程目錄檔案清單;I(大寫),顯示/隱藏隱藏檔案;m,出現建立/刪除/剪下/拷貝巨集指令清單。鍵入 <leader>fl 後,右邊子視窗為工程專案檔列表
ctags
從 http://ctags.sourceforge.net/ 下載原始碼包後,解壓縮產生原始碼目錄,然後進入原始碼根目錄執行./configure,然後執行make,編譯成功後執行make install
在 .vimrc 中加入以下設定
nmap<leader>R :!ctags -R<CR>
這樣, 在 VIM 中按 <leader> + r 就可以產生目前的目錄的 tags 檔案了
根據標頭檔中的函式宣告,自動產生 CPP 檔案中的空白函數體
ProtoDef (http://www.vim.org/scripts/script.php?script_id=2624 )
ProtoDef 需要依賴 perl , ctags 和 FSwitch(http://www.vim.org/scripts/script.php?script_id=2590 )
安裝好 ProtoDef 後, 在 .vimrc 中加入以下配置
" 設定 pullproto.pl 指令碼路徑let g:protodefprotogetter='~/.vim/bundle/protodef/pullproto.pl'" 成員函數的實現順序與聲明順序一致let g:disable_protodef_sorting=1
使用的時候, 先在源碼目錄使用 ctags -R 命令產生 tags 檔案; 然後在 .h 檔案中聲明類函數, 切換到同名 .cpp 檔案中後, 鍵入 <leader>PP 即可補全函數空白體
內容尋找
https://github.com/dyng/ctrlsf.vim
需要事先安裝 ack
sudo apt-get install ack-grep
安裝 ag
sudo apt-get install silversearcher-ag
https://github.com/rking/ag.vim
在 .vimrc 中加入以下配置
" 使用 ctrlsf.vim 外掛程式在工程內全域尋找游標所在關鍵字,設定快速鍵。快速鍵速記法:search in projectnnoremap <leader>sp :CtrlSF<CR>
noremap <leader>? :CtrlSF -R
nmap <F4> :CtrlSFToggle<CR>
noremap <leader>/ :silent execute("CtrlSF -R '\\b" . expand("<cword>") . "\\b'")<CR>
let g:ctrlsf_ackprg = 'ag' "設定 ctrlsf 使用 ag
" ag 快速鍵
noremap <leader>f :silent execute("Ag " . expand("<cword>"))<CR>
文法檢測
https://github.com/scrooloose/syntastic
在 .vimrc 中加入以下配置
let g:syntastic_error_symbol = '✗'
let g:syntastic_warning_symbol = ''
" 是否在開啟檔案時檢查
let g:syntastic_check_on_open=0
" 是否在儲存檔案後檢查
let g:syntastic_check_on_wq=1
內容替換
將完整配置資訊添加進 .vimrc 中:
" 替換函數。參數說明:" confirm:是否替換前逐一確認" wholeword:是否整詞匹配" replace:被替換字串function! Replace(confirm, wholeword, replace) wa let flag = '' if a:confirm let flag .= 'gec' else let flag .= 'ge' endif let search = '' if a:wholeword let search .= '\<' . escape(expand('<cword>'), '/\.*$^~[') . '\>' else let search .= expand('<cword>') endif let replace = escape(a:replace, '/\&~') execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update'endfunction" 不確認、非整詞"nnoremap <Leader>R :call Replace(0, 0, input('Replace '.expand('<cword>').' with: '))<CR>" 不確認、整詞nnoremap <Leader>rw :call Replace(0, 1, input('Replace '.expand('<cword>').' with: '))<CR>" 確認、非整詞"nnoremap <Leader>rc :call Replace(1, 0, input('Replace '.expand('<cword>').' with: '))<CR>" 確認、整詞"nnoremap <Leader>rcw :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>"nnoremap <Leader>rwc :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR>
檔案尋找
https://github.com/Yggdroot/LeaderF
修改外掛程式源碼,更改快速鍵為符合個人操作修改
leaderf/python/leaderf/cli.py 中
注釋下面4行代碼
elif equal(cmd, '<C-V>') or equal(cmd, '<S-Insert>'):
self._paste()
self._buildPattern()
yield '<Update>'
在下面這行代碼
elif equal(cmd, '<C-C>'):
yield '<Quit>'
後面加入下面兩行代碼
elif equal(cmd, '<C-P>'):
yield '<Quit>'
leaderf/python/leaderf/manager.py 中
修改 elif equal(cmd, '<C-]>'): 為 elif equal(cmd, '<C-V>'):
在 .vimrc 中加入下面配置
let g:Lf_ShortcutF = '<C-P>'
let g:Lf_CommandMap = {'<C-C>': ['<Esc>', '<C-C>']}
nmap <leader>m :LeaderfMru<CR>
imap <c-p> <ESC>:LeaderfFile<CR>
查看函數,結構體,變數列表
https://github.com/majutsushi/tagbar
" 設定標籤子視窗的寬度
let tagbar_width=32
" tagbar 子視窗中不顯示冗餘協助資訊
let g:tagbar_compact=1
// GO 語言配置
let g:tagbar_type_go = {
\ 'ctagstype' : 'go',
\ 'kinds' : [
\ 'p:package',
\ 'i:imports:1',
\ 'c:constants',
\ 'v:variables',
\ 't:types',
\ 'n:interfaces',
\ 'w:fields',
\ 'e:embedded',
\ 'm:methods',
\ 'r:constructor',
\ 'f:functions'
\ ],
\ 'sro' : '.',
\ 'kind2scope' : {
\ 't' : 'ctype',
\ 'n' : 'ntype'
\ },
\ 'scope2kind' : {
\ 'ctype' : 't',
\ 'ntype' : 'n'
\ },
\ 'ctagsbin' : 'gotags',
\ 'ctagsargs' : '-sort -silent'
\ }
// c++ 語言配置
" 設定 ctags 對哪些代碼元素產生標籤
let g:tagbar_type_cpp = { \ 'kinds' : [
\ 'd:macros:1',
\ 'g:enums',
\ 't:typedefs:0:0',
\ 'e:enumerators:0:0',
\ 'n:namespaces',
\ 'c:classes',
\ 's:structs',
\ 'u:unions',
\ 'f:functions',
\ 'm:members:0:0',
\ 'v:global:0:0',
\ 'x:external:0:0',
\ 'l:local:0:0'
\ ],
\ 'sro' : '::',
\ 'kind2scope' : {
\ 'g' : 'enum',
\ 'n' : 'namespace',
\ 'c' : 'class',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
nmap <F3> :TagbarToggle<CR>
工作清單
https://github.com/vim-scripts/TaskList.vim
這是一個非常有用的外掛程式,它能夠標記檔案中的 FIXME 、 TODO 等資訊,並將它們存放到一個工作清單當中,後面隨時可以通過Tasklist跳轉到這些標記的地方再來修改這些代碼,是一個十分方便實用的Todo list工具。
--help: 通常只需添加一個映射: map <leader>td <Plug>TaskList
多游標輸入
https://github.com/terryma/vim-multiple-cursors
在普通模式下,按下 Ctrl - n 開始進入可視模式並選中游標下的單詞,繼續按 Ctrl - n 選擇下一個相同的單詞,按下 Ctrl - p 往回選一個, Ctrl - x 則跳過下一個相同單詞. 按下 c 進行修改, 按下 <Esc> 退出
狀態列美化
https://github.com/itchyny/lightline.vim
或者 vim-airline
參見
http://blog.csdn.net/the_victory/article/details/50638810
"--------------------------------------------------------------------------
"vim-airline
"--------------------------------------------------------------------------
Plugin 'vim-airline'
let g:airline_theme="molokai"
"這個是安裝字型後 必須設定此項"
let g:airline_powerline_fonts = 1
" 關閉狀態顯示空白符號計數
let g:airline#extensions#whitespace#enabled = 0
let g:airline#extensions#whitespace#symbol = '!'
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
" 在 airline 的狀態列上顯示檔案的絕對路徑
let g:airline_section_c = "%{expand('%:p')}"
vim中整合shell
conque " 對中文的支援有問題
http://www.vim.org/scripts/script.php?script_id=2771
用法說明 https://code.google.com/archive/p/conque/wikis/Usage.wiki#3.1.8_Hide_start_messages
nmap <leader>sh :ConqueTermVSplit bash<CR>
let g:ConqueTerm_PyVersion = 2 " 原生 python 是 2.7,所以這裡設定成 2
let g:ConqueTerm_StartMessages = 0 "去掉煩人的警告
代碼自動格式化
https://github.com/sbdchd/neoformat
需要安裝 astyle, http://astyle.sourceforge.net/
astyle 的參數配置參見
http://blog.csdn.net/janepen/article/details/7022180
http://blog.chinaunix.net/uid-20662363-id-1904145.html
在 neoformat/auto/load/neoformat/formatters 中, 分別編輯 cpp.vim 和 c.vim 如下
cpp.vim
function! neoformat#formatters#cpp#enabled() abort
return ['astyle']
endfunction
function! neoformat#formatters#cpp#astyle() abort
return {
\ 'exe': 'astyle',
\ 'args': ['--style=allman', '-p', '-D', '--pad-header'],
\ 'stdin': 1,
\ }
endfunction
c.vim
function! neoformat#formatters#c#enabled() abort
return ['astyle']
endfunction
function! neoformat#formatters#c#astyle() abort
return {
\ 'exe': 'astyle',
\ 'args': ['--mode=c','--style=allman', '-p', '-D', '--pad-header'],
\ 'stdin': 1,
\ }
endfunction
.vimrc 中寫入如下配置
augroup fmt autocmd! autocmd BufWritePre * undojoin | Neoformataugroup END
自動儲存
https://github.com/vim-scripts/vim-auto-save" ====================================================== vim-auto-save let g:auto_save = 1 " 設定updatetime 值不可變,為預設的 200 "let g:auto_save_no_updatetime = 1 "let g:updatetime = 50 " 插入模式下不進行自動儲存 let g:auto_save_in_insert_mode = 0 " 儲存時不在狀態列提示儲存時間 "let g:auto_save_silent = 1
平滑滾動
https://github.com/yuttie/comfortable-motion.vim
快速編輯成對的括弧
https://github.com/tpope/vim-surround 在正常模式下, ds( 或者 ds) 刪除一對圓括弧, ds" 刪除一對雙引號, ds' 刪除一對單引號, ds[(或者ds]) 刪除一對中括弧, ds{ ( 或者 ds} ) 刪除一對大括弧 cs"( 是把一對 " 替換成 (
快速選擇
https://github.com/terryma/vim-expand-region " ====================================================== vim-expand-region vmap v <Plug>(expand_region_expand) vmap <C-v> <Plug>(expand_region_shrink)
匹配括弧
https://github.com/vim-scripts/matchit.zip
c++語法檢查
https://github.com/w0rp/ale
需要安裝 cppcheck : sudo apt install cppcheck 參考 http://blog.csdn.net/demorngel/article/details/69052789 " ====================================================== ale
let g:ale_set_loclist = 0
let g:ale_open_list = 1
let g:ale_keep_list_window_open = 1
"自訂error和warning表徵圖
let g:ale_sign_error = '✗'
let g:ale_sign_warning = ''
"在vim內建的狀態列中整合ale
let g:ale_statusline_format = ['✗ %d', ' %d', ' OK']
"顯示Linter名稱,出錯或警告等相關資訊
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
"普通模式下,sp前往上一個錯誤或警告,sn前往下一個錯誤或警告
nmap sp <Plug>(ale_previous_wrap)
nmap sn <Plug>(ale_next_wrap)
"<Leader>d查看錯誤或警告的詳細資料
nmap <Leader>d :ALEDetail<CR>
"設定狀態列顯示的內容
"set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}\ %{ALEGetStatusLine()}
"檔案內容發生變化時不進行檢查
"let g:ale_lint_on_text_changed = 'never'
"開啟檔案時不進行檢查
"let g:ale_lint_on_enter = 0
"對C/C++使用Clang進行語法檢查
"let g:ale_linters = {'c': 'clang'}
"let g:ale_c_clang_options = '-std=c11 -Wall'
"let g:ale_linters = {'c++': 'clang++'}
let g:ale_cpp_clangcheck_options = '-std=c++11 -Wall'
let g:ale_cpp_gcc_options = '-std=c++11 -Wall'
"關閉 golang 的文法檢測
"let g:ale_linters = {'go': ['gofmt']}
let g:ale_linters = {
\ 'c': ['clang'],
\ 'c++': ['clang++'],
\ 'go': ['go build', 'gofmt', 'go vet']
\}
" 開啟 golang 文法檢測
"let g:ale_linters = {'go': ['gometalinter', 'gofmt']}
vim-go
" ====================================================== vim-go 配置
let g:go_disable_autoinstall = 0 "禁止自動下載
let g:go_highlight_functions = 1
let g:go_highlight_methods = 1
let g:go_highlight_fields = 1
let g:go_highlight_types = 1
let g:go_highlight_operators = 1
let g:go_highlight_build_constraints = 1
let g:go_auto_type_info = 1
let g:go_fmt_command = "goimports"
let g:go_metalinter_autosave = 0
au FileType go nmap <F12> <Plug>(go-def)
au FileType go nmap <F5> <Plug>(go-run)
au FileType go nmap <leader>b <Plug>(go-build)
au FileType go nmap <leader>e <Plug>(go-rename)
au FileType go nmap <Leader>gd <Plug>(go-doc)
au FileType go nmap <Leader>s <Plug>(go-implements)
au FileType go nmap <Leader>r <Plug>(go-referrers)
"au FileType go nmap <Leader>t <Plug>(go-vet)