個人Vim配置

個人Vim配置

前言

爲何選擇vim?

曾經我也是一個小白,使用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

個人觀點是,本身一行一行寫本身的配置文件纔會深刻學會Vim。若是一開始就用配置好的,那和直接使用IDE沒有太大的差異。知道配置文件每一行幹了些什麼,不懂就搜,想加功能想改功能就動手,最後這就是一份你的配置文件。相信每一個Vim大牛都是這樣作的。一樣的,個人Vim配置也會不斷更新,可能會持續n年也不必定。而這也是爲何個人文章標題起名如此。windows

原則

個人Vim配置有必定的原則,遵循原則纔會讓配置不會超出本身的控制瀏覽器

  1. 插件能用輕量級的就不用複雜的
  2. 非須要的功能不會添加
  3. 儘可能消耗更少的資源
  4. 配色必定不能忍
  5. 儘量的作到一鍵配置

正文

配色

說得多還不如先看看整體的配色,配色我採用了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

.vimrc文件下載
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
相關文章
相關標籤/搜索