1. 程式人生 > >我是這樣用vim寫代碼的--插件篇

我是這樣用vim寫代碼的--插件篇

ide 功能 cal class 環境 開發 快捷鍵 odi ast

上一篇介紹了vim的簡單編輯方式。熟練掌握vim的基本操作後,還只是一個得心應手的文本編輯器,終究是比IDE要弱很多的。強大的vs中,代碼目錄樹,代碼跳轉,函數瀏覽,自動補全,代碼調試等功能才是我們舍棄文本編輯器擁抱IDE的核心原因。本篇將介紹本人長期依賴的插件,及基本使用方法,從而真正能夠完全用vim環境做開發。

首先要說明的是,自己手動管理插件是非常麻煩的一件事,在嘗試了一段痛苦的手動管理經歷後,我果斷清掉了本地的插件文件夾,開始使用Vundle,一個很方便的vim插件管理器。Vundle本身也是一個vim插件,只需要在vimrc裏面配置好即可方便的安裝、更新、刪除插件,非常好用。

Vundle的安裝請參考 https://github.com/VundleVim/Vundle.vim

安裝好之後,就可以隨心所欲添加github上的各種插件了。這裏推薦本人覺得非常必要且好用的幾個插件,並附上本人的配置項。

Nerdtree Plugin ‘scrooloose/nerdtree‘

文件目錄樹插件,打開目錄頁簽可以方便的瀏覽工程目錄,切換文件,創建、刪除和移動文件。

本人的特殊配置:

let g:NERDTreeChDirMode=2 該設置使得當前工作目錄與nerdtree的根目錄一致,這樣可以快速的切換工作目錄,配合後續插件設置,使得查找等操作更得心應手。

Nerdtree的使用很簡單,命令行輸入:NERDTree或者:NERDTreeToggle可打開關閉Nerdtree窗口,不過一般建議在vimrc中配置快捷鍵,本人使用Ctrl+n(首字母,好記)。在Nerdtree窗口中的移動,和在一般編輯窗口中一致。按下?鍵,則可以開關快速的幫助。這裏列一下最常用的快捷鍵。

u/shift+u 根目錄移到上層目錄,後者會保留當前根目錄為展開狀態。

shift+c 將當前目錄設為根節點。

shift+r 刷新當前根目錄,由於刷新根目錄也比較快,所以本人總是刷新根目錄。

enter 展開或折疊目錄,如果是文件則可以直接打開文件,比較符合直覺。

o/i/s 三個快捷鍵均是用於打開當前文件的。只是o是在上一個窗口顯示,i是縱向分窗口顯示,s是橫向分窗口顯示。在想要參考文件內容時,後兩個快捷鍵很有用。

有以上快捷鍵,基本上就能簡單使用Nerdtree了。

Ctrlp Plugin ‘ctrlpvim/ctrlp.vim‘

該插件實現了類似sublime的快速文件查找和跳轉。在工程較大時,用來跳轉文件非常方便。

let g:ctrlp_working_path_mode = ‘wa‘ 在工作目錄下的任一文件中使用ctrlp,都會搜索整個工作目錄下的文件,大型工程中可隨時查找工程目錄下其他文件。

let g:ctrlp_custom_ignore={
\ ‘dir‘: ‘\v[\/]\.(git|hg|svn)$‘,
\ ‘file‘: ‘\v\.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$‘,
\ }

ctrlp忽略目錄和文件,該項設置可根據自己項目需要設置。

ctrlp的快捷鍵非常好記,就是ctrl+p,按下後會跳出相應搜索窗口,輸入要搜索的文件名,回車即可打開文件。同樣ctrl+s,ctrl+v可以分割窗口打開。當有搜索到多個文件時,可使用ctrl+j/ctrl+k上下移動,選擇文件。

Taglist Plugin ‘vim-scripts/taglist.vim‘

標簽列表插件,可以快速查看當前文件的標簽,函數,變量等。

let Tlist_Show_One_File=1 每次只顯示一個文件的標簽,工程較大時,如果顯示所有文件的標簽打開會很慢。
let Tlist_Use_Right_Window=1 默認打開到窗口右側,由於nerdtree已經占用了左側窗口,taglist放到右側,避免沖突。
let Tlist_GainFocus_On_ToggleOpen=1 打開時光標放到taglist窗口,這樣打開後可以直接挪動光標到對應的標簽跳轉,也可以直接按q退出taglist窗口。
let Tlist_Close_On_Select=1 選中標簽後就關閉taglist窗口,個人喜好taglist只在要跳轉時出現。

由於vim文件內搜索非常方便,因此使用相對較少。回車即可打開,選擇相應的標簽,回車跳轉。

CtrlSF Plugin ‘dyng/ctrlsf.vim‘

看名字猜用途,就是全局搜索插件,配合一定的設置和快捷鍵,能到達到和vs中一樣的搜索體驗。該插件的安裝稍微麻煩一點,需要依賴ack或ag。針對windows有編譯好的版本可以直接使用 https://github.com/k-takata/the_silver_searcher-win32。將執行文件放到vim目錄下即可。

let g:ctrlsf_ackprg=‘ag‘ 據說ag效率更高一點

let g:ctrlsf_default_view_mode=‘compact‘ 默認設置下,ctrlsf的形態很像sublime的搜索,每個結果有前後部分上下文,個人更偏好vs式的預覽,這兩種模式也可以按M隨時切換。

let g:ctrlsf_auto_close=0 設置不自動關閉,搜索字符串不像搜標簽,經常需要點開看看。
let g:ctrlsf_case_sensitive=‘no‘ 大小寫不敏感,為了查詢更快速,默認設成大小寫不敏感搜索。
let g:ctrlsf_ignore_dir=[‘tags‘] 忽略部分目錄
let g:ctrlsf_default_root=‘cwd‘ 設置在當前工作目錄下搜索,和nerdtree一致。

以上配置,加上快捷鍵配置後,任意位置按下ctrl+f,即可全局搜索當前詞,也可刪掉當前內容,輸入要查找的內容(由於這種需求較少,所以沒有單獨設快捷鍵)。如搜索內容中間有空格之類的特殊字符,可在最外側用單引號包起來。

YouCompleteme Plugin ‘Valloric/YouCompleteMe‘

最難裝卻是最重要的插件,自動補全插件,沒有這個插件的情況下,vim自帶的neocomplete也能簡單用用,但確實沒有YCM強大。

let g:ycm_min_num_of_chars_for_completion=2 設置最少2個字符觸發補全
let g:ycm_semantic_triggers={
\ ‘c‘ : [‘->‘, ‘.‘],
\ ‘lua‘ : [‘.‘, ‘:‘],
\} 觸發語義分析的符號,基本上可以媲美vs,並且對lua等腳本語言也能有很好的補全效果。

該功能本人認為不需要快捷鍵,打幾個字母就會自動跳出提示。

以上就是本人日常工作中用到的所有插件了。最開始的時候,總覺得什麽插件都好,裝了一大堆插件,由於有些插件會有按鍵沖突之類的,一邊用一邊刪,最後就留下了以上幾個插件。一些項目特殊需要,可以自己寫一些簡單的vimscript函數,配上快捷鍵。使用了兩年下來,基本沒有覺得有什麽短缺的,完全能勝任編碼工作。文章最後貼上本人windows系統上的vimrc,可以參考酌情使用。

source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin

set diffexpr=MyDiff()
function MyDiff()
  let opt = ‘-a --binary ‘
  if &diffopt =~ ‘icase‘ | let opt = opt . ‘-i ‘ | endif
  if &diffopt =~ ‘iwhite‘ | let opt = opt . ‘-b ‘ | endif
  let arg1 = v:fname_in
  if arg1 =~ ‘ ‘ | let arg1 = ‘"‘ . arg1 . ‘"‘ | endif
  let arg2 = v:fname_new
  if arg2 =~ ‘ ‘ | let arg2 = ‘"‘ . arg2 . ‘"‘ | endif
  let arg3 = v:fname_out
  if arg3 =~ ‘ ‘ | let arg3 = ‘"‘ . arg3 . ‘"‘ | endif
  if $VIMRUNTIME =~ ‘ ‘
    if &sh =~ ‘\<cmd‘
      if empty(&shellxquote)
        let l:shxq_sav = ‘‘
        set shellxquote&
      endif
      let cmd = ‘"‘ . $VIMRUNTIME . ‘\diff"‘
    else
      let cmd = substitute($VIMRUNTIME, ‘ ‘, ‘" ‘, ‘‘) . ‘\diff"‘
    endif
  else
    let cmd = $VIMRUNTIME . ‘\diff‘
  endif
  silent execute ‘!‘ . cmd . ‘ ‘ . opt . arg1 . ‘ ‘ . arg2 . ‘ > ‘ . arg3
  if exists(‘l:shxq_sav‘)
    let &shellxquote=l:shxq_sav
  endif
endfunction

"vundle-----------------------------------------------------------------------
set nocompatible              " be iMproved, required
filetype off                  " required

" set the runtime path to include Vundle and initialize
set rtp+=$HOME/vimfiles/bundle/Vundle.vim/
call vundle#begin(‘$HOME/vimfiles/bundle/‘)

" let Vundle manage Vundle, required
Plugin ‘VundleVim/Vundle.vim‘
Plugin ‘scrooloose/nerdtree‘
let g:NERDTreeChDirMode=2
Plugin ‘vim-scripts/taglist.vim‘
let Tlist_Show_One_File=1
let Tlist_Use_Right_Window=1
let Tlist_GainFocus_On_ToggleOpen=1
let Tlist_Close_On_Select=1
Plugin ‘ctrlpvim/ctrlp.vim‘
let g:ctrlp_working_path_mode = ‘wa‘
let g:ctrlp_custom_ignore={
    \ ‘dir‘:  ‘\v[\/]\.(git|hg|svn)$‘,
    \ ‘file‘: ‘\v\.(exe|so|dll|xls|xlsx|doc|docx|meta|bytes|ppt|pptx)$‘,
    \ }
Plugin ‘vim-scripts/a.vim‘

Plugin ‘dyng/ctrlsf.vim‘
let g:ctrlsf_ackprg=‘ag‘
let g:ctrlsf_auto_close=0
let g:ctrlsf_case_sensitive=‘no‘
let g:ctrlsf_default_view_mode=‘compact‘
let g:ctrlsf_ignore_dir=[‘tags‘]
let g:ctrlsf_default_root=‘cwd‘

Plugin ‘Valloric/YouCompleteMe‘
let g:ycm_min_num_of_chars_for_completion=2
let g:ycm_semantic_triggers={
			\ ‘c‘ : [‘->‘, ‘.‘],
			\ ‘lua‘ : [‘.‘, ‘:‘],
			\}

" All of your Plugins must be added before the following line
call vundle#end()            " required
filetype plugin indent on    " required

"endvundle-----------------------------------------------------------------------

set backspace=2		" more powerful backspacing

set encoding=utf-8
set fileencodings=ucs-bom,utf-8,chinese

set langmenu=zh_CN.UTF-8
let $LANG=‘zh_CN.UTF-8‘

source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim

colorscheme desert
syntax enable
syntax on

set lines=50 columns=200 linespace=1
set background=dark
set guifont=consolas:h11:cANSI

set foldenable
set foldmethod=manual

set tabstop=4
set shiftwidth=4
set softtabstop=4
set autoindent

set noundofile
set nobackup
set noswapfile
set ignorecase

set hlsearch
set incsearch
set showmatch
set wildmenu

set ruler

set laststatus=2

set number

set exrc
set secure

set cursorline

set tags=tags;

"set guioptions-=m  "menu bar
set guioptions-=T  "toolbar
set guioptions-=r  "scrollbar
set guioptions-=L

map <silent> <C-j> :resize+5<CR>
map <silent> <C-k> :resize-5<CR> 
map <silent> <C-h> :vertical resize-5<CR>
map <silent> <C-l> :vertical resize+5<CR>

map <silent> <C-Up> :resize-5<CR>
map <silent> <C-Down> :resize+5<CR> 
map <silent> <C-Left> :vertical resize-5<CR>
map <silent> <C-Right> :vertical resize+5<CR>
map <silent> <C-tab> :tabn<CR>

map <silent> <C-n> :NERDTreeToggle<CR>
map <silent> <C-m> :TlistToggle<CR>

nmap <C-f> <Plug>CtrlSFCwordPath
vmap <C-f> <Plug>CtrlSFVwordPath

"open folder of current file
function Folder()
	silent exec "!explorer " . expand("%:h")
endfunction
nmap <silent> <S-e> :call Folder()<CR>

  

我是這樣用vim寫代碼的--插件篇