曾經我也是一個小白,使用Dev-C++來學習C++語言,使用Visual Studio開發工程,它們都被稱爲IDE(Integrated development environment)。可是,逐漸的,我漸漸意識到,你只能遵循它制定的一系列的流程來開發程序,自定義程度不高,並且大型的IDE消耗計算資源嚴重。html
後來,我認識到了編輯和編譯應該是一個分開的過程,便轉戰到了文本編輯器,選擇Sublime Text。Sublime優秀的UI界面,優秀的快捷鍵,擁有插件系統,着實讓我着迷。它的初始環境即可直接上手,它的默認配色Monokai讓人看得很舒服。python
可是,離開Sublime選擇Vim的緣由有三點,一是Sublime依賴於圖形化界面,二是Sublime移動光標須要移動右手使用方向鍵,三是Sublime編輯遠程文件要麼藉助工具要麼常常傳輸。至此,我終於理解了那個古老的梗。git
世界上只有三種程序員,一種是使用Vim的,一種是使用Emacs的,還有一種是其餘程序員
而這篇博文也是放置於效率分類下github
加個小彩蛋:我實驗室的Boss愛用Emacs,咱們互視爲異教徒,我說「你的手指會變形的」,他說「程序員誰的手指不變形」,我「......[冷漠]」vim
個人觀點是,本身一行一行寫本身的配置文件纔會深刻學會Vim。若是一開始就用配置好的,那和直接使用IDE沒有太大的差異。知道配置文件每一行幹了些什麼,不懂就搜,想加功能想改功能就動手,最後這就是一份你的配置文件。相信每一個Vim大牛都是這樣作的。一樣的,個人Vim配置也會不斷更新,可能會持續n年也不必定。而這也是爲何個人文章標題起名如此。windows
個人Vim配置有必定的原則,遵循原則纔會讓配置不會超出本身的控制瀏覽器
說得多還不如先看看整體的配色,配色我採用了vim自帶的desert主題,在這個基礎上加了一點自定義併發
從左往右提及好了,左側我添加了一個目錄樹,使用的是scrooloose/nerdtree
的插件,而且綁定了<leader>q
來啓動和隱藏目錄樹,使用起來仍是蠻方便的app
中間的配色我刻意挑了一個黑色的主題。我不喜歡那種慘淡的白色,函數名和命名空間是白色就和變量名看起來沒有區分度了,所以搜了很久,找到了octol/vim-cpp-enhanced-highlight
插件能知足這個需求,修改了一下它的顏色。彈出菜單的顏色我也本身修改了。顏色都採用了暗色調的color,確保不會刺眼,同時也能將不一樣的元素區分出來。set t_Co=256 " Enable status bar color
很重要。
頂部和底部採用的是比較出名的vim-airline/vim-airline
插件,以及其相應的vim-airline/vim-airline-themes
,主題我選擇了let g:airline_theme='luna'
,而且啓用了powerline字體,也就是你能看到的三角形符號
由於還在不斷的修改中,將來可能會考慮把配色作成插件易於安裝吧,目前的安裝方式比較麻煩
插件管理上我選用了Vundle,目前一款比較流行的Vim插件管理器,基本上我只使用github上的vim插件
一直以來我對於那種秀配置不講按鍵綁定的文章比較反感,除非你一個鍵都沒改
模式 | 按鍵 | 映射 | 功能 | 說明 |
---|---|---|---|---|
全局 | , |
leader |
<leader> |
leader鍵是vim中的一個特殊鍵 |
正常 | j |
gj |
下一行 | 視覺上往下移動(行太長致使分行時) |
正常 | k |
gk |
上一行 | 視覺上往上移動(行太長致使分行時) |
正常 | <leader>w |
:w<CR> |
快速保存 | 沒有權限保存的時候也是不行的 |
正常 | <leader>q |
:bd<CR>:q<CR> |
快速退出 | 前提全部buffer都保存了,防止意外 |
正常 | K |
:bnext<CR> |
切換到右邊的buffer | 仿照Vimuim的標籤切換 |
正常 | J |
:bprevious<CR> |
切換到左邊的buffer | 仿照Vimuim的標籤切換 |
正常 | <leader>bn |
:enew<CR> |
新開一個buffer | buffer new |
正常 | <leader>bd |
:bd<CR> |
關閉當前buffer | buffer delete |
正常 | 空格鍵 |
smooth_scroll |
向下平滑滾動 | 避免思惟跳躍,仿照Chrome的設定 |
正常 | 減號鍵 |
smooth_scroll |
向上平滑滾動 | 避免思惟跳躍 |
編輯 | Ctrl + b |
方向鍵-左 |
向左移動一個字符 | 仿照Bash的控制方式 |
編輯 | Ctrl + f |
方向鍵-右 |
向右移動一個字符 | 仿照Bash的控制方式 |
編輯 | Ctrl + e |
Home鍵 |
跳到行首 | 仿照Bash的控制方式 |
編輯 | Ctrl + a |
End鍵 |
跳到行尾 | 仿照Bash的控制方式 |
編輯 | Tab鍵 |
方向鍵-下 |
選擇下一個候選詞 | 可連續按 |
編輯 | Esc鍵 |
Ctrl + 回車 |
清除菜單 | 無 |
可視化 | // |
y/<C-R>"<CR> |
快速搜索 | 須要先選擇內容 |
其實能夠看出我是比較喜歡統一各大軟件的按鍵方式的,主要是可讓本身不用記憶太多,快捷鍵是效率的主要生產力,因此終端、編輯器、瀏覽器這三大離不開的軟件,我都會盡量地去統一它們的按鍵
上面提到的平滑滾動我使用了lucasicf/vim-smooth-scroll
的插件,其實這個插件來自出名的terryma
之手,可是若是連續平滑滾動,會連續觸發致使控制卡死。而lucasicf
修復了這個bug併發送了PR,不知道爲何terryma
大神一直沒有理=。=
還有,我想要仿照Chrome使用Shift + 空格鍵來平滑向上滾動,而後我嘗試了不少種方法,並不能捕獲Shift + Space
的狀態,若是有大神能作到求教
Vim畢竟是寫代碼的利器,自動補全括號特別實用且重要,這裏我簡單的使用了一個插件jiangmiao/auto-pairs
在Sublime中惟一讓我留念的就是多光標編輯了,做爲被這個裝逼大法寵壞的我,沒有它感受斷了一臂。多虧了terryma大神將這一功能移植到了vim中,聽說,這仍是大神在一次航班途中寫出來的,我只能打出666並默默地比了一個❤~
插件名稱terryma/vim-multiple-cursors
。在Visual模式下選中所須要改的內容,按Ctrl + n能夠選中下一個,而後按下c進入編輯狀態,編輯完,Esc,完美
Sublime還有一個功能是Ctrl + p能夠打開文件,這一方式一樣也有插件在vim中ctrlpvim/ctrlp.vim
。更重要的是,該插件一樣支持模糊搜索。
scrooloose/nerdcommenter
是一個優秀的插件,默認的註釋方式是<leader>c<Space>
,能夠在註釋和非註釋直接切換。同時,配合Ctrl + v的塊選擇,可以快速選中本身想要註釋的行,而後<leader>c<Space>
快速批量註釋
在自動補全的領域下,最好的無疑是YouCompleteMe
插件了,然而我並無使用。首先該插件的調用程序太多,消耗資源太多,安裝也麻煩,一次安裝終身受用這種藉口不能做爲不簡化安裝的理由。其次,語義化補全對我來講沒有太大的需求,只須要能把變量和函數提示並補全就行了
而Vim在新版中已經原生添加了自動補全的功能。利用按下Ctrl + x, Ctrl + o觸發, Ctrl + n, Ctrl + p選擇菜單。可是這樣未免太麻煩不優雅,我利用了一款插件vim-scripts/AutoComplPop
,它可以自動彈出補全菜單,使用起來效果還不錯。不過它偶爾有一些小bug,我本身還能忍,若是你不喜歡再尋求一款更好的自動補全吧
在格式控制的範疇下,我將製表符都轉義成了空格,而且在保存的時候自動把行尾的空格都去掉了,這是符合優秀編碼規範的格式,但願仍是能保持。
有一點,不少人沒注意到的,Git管理的文件建議保留文件末尾的一個空行,特地提一下,我沒有加入到vim自動添加空行,由於不是全部的文件都被Git管理,無故的空行可能會致使一些未知的錯誤。全部建議手動添加。
假設你都理解了vim的基礎操做,其餘的一些配置我也有相應的註釋,參考了http://amix.dk/vim/vimrc.html,不愧是被譽爲教科書般的vim配置,真是優秀。
閱讀.vimrc文件,能開拓你不少的思路,但願能找到你喜歡的
參照https://github.com/VundleVim/Vundle.vim,下載Vundle管理器到指定目錄
將對應的文件放置在你的家目錄~
下
~ ├── .vimrc └── .vim ├── bundle │ └── Vundle.vim └── colors └── desert.vim
打開Vim,使用:PluginInstall
便可
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Vundle """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' Plugin 'jiangmiao/auto-pairs' Plugin 'scrooloose/nerdtree' Plugin 'ctrlpvim/ctrlp.vim' " Plugin 'terryma/vim-smooth-scroll' Plugin 'lucasicf/vim-smooth-scroll' Plugin 'vim-scripts/AutoComplPop' Plugin 'terryma/vim-multiple-cursors' Plugin 'scrooloose/nerdcommenter' Plugin 'vim-airline/vim-airline' Plugin 'vim-airline/vim-airline-themes' Plugin 'octol/vim-cpp-enhanced-highlight' Plugin 'vim-python/python-syntax' " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required " Put your non-Plugin stuff after this line """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => General """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Sets how many lines of history VIM has to remember set history=700 " Set to auto read when a file is changed from the outside set autoread " ignore case when searching unless exists one upper case set ignorecase set smartcase " Realtime searching set incsearch " hight light searching set hlsearch " No annoying sound on errors set noerrorbells set novisualbell set t_vb= set tm=500 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => VIM user interface """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Set 7 lines to the cursor - when moving vertically using j/k set so=7 " Turn on the WiLd menu set wildmenu " Ignore compiled files set wildignore=*.o,*~,*.pyc "Always show number set number "Always show current position set ruler " Height of the command bar set cmdheight=2 " A buffer becomes hidden when it is abandoned set hid " Configure backspace so it acts as it should act set backspace=eol,start,indent set whichwrap+=<,>,h,l " Set cmd show set showcmd """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Colors and Fonts """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Enable syntax highlighting syntax enable " Set colorscheme set background=dark colorscheme desert " Set utf8 as standard encoding and en_US as the standard language set encoding=utf8 " Use Unix as the standard file type set ffs=unix,dos,mac " Enable status bar color set t_Co=256 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Files, backups and undo """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Turn backup off, since most stuff is in SVN, git et.c anyway... set nobackup set nowb set noswapfile """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Text, tab and indent related """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Use spaces instead of tabs set expandtab " Be smart when using tabs ;) set smarttab " 1 tab == 4 spaces set shiftwidth=4 set tabstop=4 " Linebreak on 500 characters set lbr set tw=500 " Intelligence indent set ai "Auto indent set si "Smart indent set wrap "Wrap lines """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Moving around, tabs, windows and buffers """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Return to last edit position when opening files (You want this!) autocmd BufReadPost * \ if line("'\"") > 0 && line("'\"") <= line("$") | \ exe "normal! g`\"" | \ endif " Remember info about open buffers on close set viminfo^=% """""""""""""""""""""""""""""" " => Status line """""""""""""""""""""""""""""" " Always show the status line set laststatus=2 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Editing mappings """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " With a map leader it's possible to do extra key combinations " like <leader>w saves the current file let mapleader = "," let g:mapleader = "," " Toggle paste mode set pastetoggle=<leader>p " Treat long lines as break lines (useful when moving around in them) map j gj map k gk " Fast saving nmap <leader>w :w<CR> " Fast quit nmap <leader>q :bufdo bd<CR>:q<CR> " Fast open file tree map <leader>t :NERDTreeToggle<CR> " Fast Tab use noremap <silent> K :bnext<CR> noremap <silent> J :bprevious<CR> noremap <silent> <leader>bn :enew<CR> noremap <silent> <expr> <leader>bd \ len(filter(range(1, bufnr('$')), 'buflisted(v:val)')) >= 2 ? \ ":bp\|bd #<CR>" : ":bd<CR>" " Smooth page scroll nnoremap <silent> = :call smooth_scroll#down(&scroll, 25, 2)<CR> nnoremap <silent> - :call smooth_scroll#up(&scroll, 25, 2)<CR> nnoremap <silent> <Space> :call smooth_scroll#down(&scroll, 25, 2)<CR> " Move in insert mode imap <C-b> <Left> imap <C-f> <Right> imap <C-e> <End> imap <C-a> <Home> imap <M-f> <C-o>w imap <M-b> <C-o>b " Clear highlight color nnoremap <Esc> :noh<Return><Esc> nnoremap <Esc>^[ <Esc>^[ " Popup menu select inoremap <silent> <expr> <Tab> pumvisible() ? "\<Down>" : "\<Tab>" inoremap <silent> <expr> <ESC> pumvisible() ? "\<C-E>" : "\<ESC>" " Visual Mode Search vnoremap // y/<C-R>"<CR> """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Function, Command """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " Delete trailing white space on save, useful for Python and CoffeeScript ;) func! DeleteTrailingWS() exe "normal mz" %s/\s\+$//ge exe "normal `z" endfunc autocmd BufWrite * :call DeleteTrailingWS() " Auto open file tree if enter 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 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " => Plugin Setting """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " NERDcommenter let g:NERDSpaceDelims=1 let g:NERDCommentEmptyLines=1 let g:NERDDefaultAlign='left' " Vim Airline themes let g:airline_theme='luna' let g:airline_powerline_fonts=1 let g:airline#extensions#tabline#enabled=1 " Vim Cpp Highlight let g:cpp_class_scope_highlight=1 let g:cpp_member_variable_highlight=1 let g:cpp_experimental_simple_template_highlight=1 let g:cpp_concepts_highlight=1 " Vim Python Highlight let python_highlight_all=1