轉眼間,Vim 已用了十年。
從一開始的抵觸、不解,到隨之而來的習慣、喜歡,再到近幾年編輯器層出不窮的盛況下對 Sublime Text 等短暫的嘗試,以及最後即如今的迴歸,這是一個複雜的過程。
目前,我對 Vim 仍停留在配置和使用階段,並無爲它開發過任何插件。但願接下來十年,能爲它作一些貢獻。
Vim 是一個難學難上手,即便熟悉了也會讓你痛並快樂着的那種編輯器。要教別人用 Vim,就更是難上加難了。javascript
從 如何評價GitHub準備推出下一代文本編輯器Xray? 一文,能夠看到時下很多編輯器的嘗試。軟件行業發展到今天,編輯器遠遠沒有達到一個完美的境界,包括 Vim,這自己就是一件很難以想象的事情。html
最最基本的一些設置,位於 vimrc 的開頭。java
" 首先設置 mapleader,後面鍵盤映射隨時要用 " 基本上全部自定義的快捷鍵都以這個字符打頭,好比映射`,w`爲`:w` let mapleader = "," let g:mapleader = "," " 不兼容 Vi,最大限度使用新特性 set nocompatible " 寫入文件時,不作備份 set nobackup set nowritebackup " 不用交換文件 set noswapfile " 保存文件的快捷鍵 nmap <leader>w :w!<CR> " 移除 Windows 文件結尾的 `^M` noremap <leader>m :%s/<C-V><C-M>//ge<CR> " 從新打開文件時,恢復上一次遊標位置 " 經過View能夠記住不少設置,好比高亮當前行、折行等等,可是每每比較讓人費解 set viewoptions=cursor " 只記住遊標 au BufWinLeave ?* mkview au VimEnter ?* silent loadview " 檢測文件編碼時,優先考慮 UTF-8 set fileencodings=utf-8,ucs-bom,gbk,gb2312,big5,latin1 " 不一樣平臺,設置不一樣的行尾符,即 EOL " 注意:在 Mac 平臺,也是 unix 優先;自 OS X 始,行尾符與 Unix 一致, " 都是 `\n` 而不是 `\r` if has("win32") set fileformats=dos,unix,mac else set fileformats=unix,mac,dos endif " 在斷行、合併(join)行時,針對多字節字符(好比中文)的優化處理 set formatoptions+=mM
目前主要使用 morhetz/gruvbox
,本文全部截圖都是 gruvbox
的效果。
配色方案能夠經過插件安裝,這裏先跳過,會有另外一篇文章專門介紹插件。python
set background=dark syntax enable colorscheme gruvbox au BufEnter * :syntax sync fromstart
" 採用 C 風格的縮進,適用於大多數語言 " 細節調整見下面的 `cinoptions` " 你也能夠嘗試 smartindent 和 autoindent set cindent " 細節調整,主要爲了適應 Google C++ Style " t0: 函數返回類型聲明不縮進 " g0: C++ "public:" 等聲明縮進一個字符 " h1: C++ "public:" 等聲明後面的語句縮進一個字符 " N-s: C++ namespace 裏不縮進 " j1: 合理的縮進 Java 或 C++ 的匿名函數,應該也適用於 JS set cinoptions=t0,g1,h1,N-s,j1
讓製表符智能一些。程序員
set smarttab
對程序員來講,用製表符仍是用空格,足以引起一場戰爭。
美劇《硅谷》中,Richard 由於不能接受女朋友用空格縮進而斷然與之分手。
下面的設置並不優雅,各人需求不同,需作相應調整。django
" 先設置缺省狀況,而後根據不一樣文件類型再次從新設置 set expandtab | set tabstop=4 | set shiftwidth=4 " Python, CSS, etc. " 對 C/C++ 等,製表符和縮進都是兩個空格 au FileType c,cpp,html,htmldjango,lua,javascript,nsis \ set expandtab | set tabstop=2 | set shiftwidth=2 " Makefile 必須保留製表符,且習慣上佔八個空格 " 不過,這年頭誰還會寫 Makefile? au FileType make set noexpandtab | set tabstop=8 | set shiftwidth=8
除了縮進,另外一個深具爭議的話題就是 80列 限制。vim
雖然如今顯示器大了不少,有些語言習慣上仍然遵照這一規則。緩存
經過設置 textwidth
,Vim 能夠幫咱們在輸入時或用gq
格式化時自動斷行。markdown
我發現,用 gq
格式化註釋特別方便,超長的註釋會自動從新排版,以保證不越過指定的長度。app
目前,我僅對 C/C++/Python/Vim 作這種限制。
au FileType c,cpp,python,vim set textwidth=80
通常若是設定了寬度限制,最好能畫一條豎線以警示。
設置 colorcolumn
便可。甚至能夠設置爲多列,好比 "81,101"。
我是全部文件類型都顯示這麼一條線。
set colorcolumn=81
一般代碼不需折行,前面有些語言設置了寬度限制就更不須要了。
實際操做下來,純文本、Markdown、XML 等比較須要折行,由於它們經常一行太長了。
au FileType text,markdown,html,xml set wrap " 折行時,以單詞爲界,以避免切斷單詞 set linebreak " 折行後的後續行,使用與第一行相同的縮進 set breakindent
" 即便在終端,也儘可能啓用鼠標 if has("mouse") | set mouse=a | endif " 顯示輸入中的命令,對 gqq/gcc 這種多個字符的命令特別有用 set showcmd " 下面幾個不解釋,自行查看幫助 set scrolloff=7 set wildmenu set wildmode="list:longest" set ruler " 命令行高度爲兩行 set cmdheight=2 " 永遠顯示行號 " 另有比較酷的相對行號(`relativenumber`),雖然我用不習慣 set number set lazyredraw " 切換緩存時不用保存 set hidden " 輸入模式下,退格鍵能夠退一切字符 set backspace=eol,start,indent set whichwrap+=<,>,h,l
高亮不想要的空格,好比行尾。
" See [http://vim.wikia.com/wiki/Highlight_unwanted_spaces] " - highlight trailing whitespace in red " - have this highlighting not appear whilst you are typing in insert mode " - have the highlighting of whitespace apply when you open new buffers highlight ExtraWhitespace ctermbg=red guibg=red match ExtraWhitespace /\s\+$/ autocmd BufWinEnter * match ExtraWhitespace /\s\+$/ autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/ autocmd InsertLeave * match ExtraWhitespace /\s\+$/ autocmd BufWinLeave * call clearmatches() " for performance
高亮當前行。
set cursorline
不過,我通常不用,由於閃爍的遊標就已經很清楚了。
首先,搜索時忽略大小寫(ignorecase
)。可是,若是搜索模式裏有大寫字母,就再也不忽略大小寫(smartcase
)。
set ignorecase set smartcase
即時顯示匹配結果(incsearch
),並高亮全部結果(hlsearch
)。
set incsearch set hlsearch map <silent> <leader><CR> :nohlsearch<CR>
替換時,缺省啓用g
標誌,即,同一行裏的全部匹配都會被替換。
set gdefault
切換窗口的鍵盤映射:
map <C-j> <C-W>j map <C-k> <C-W>k map <C-h> <C-W>h map <C-l> <C-W>l
以及,直接用方向鍵切換緩存的鍵盤映射:
map <right> :bn<CR> map <left> :bp<CR> map <up> :bf<CR> map <down> :bl<CR>
當前日期、時間、文件名這些內容,用縮寫來輸入是再方便不過了。
固然,縮寫自己的名字不能太常見,下面這些都以 x 打頭,通常不會出如今正常的文本中。
iabbrev xname <YouName> " 改爲你本身的名字 iabbrev xmail <YouEmail> " 改爲你本身的電郵 iabbrev xfile <c-r>=expand("%:t")<CR> if exists("*strftime") iabbrev xdate <c-r>=strftime("%Y-%m-%d")<CR> " 當前日期 iabbrev xtime <c-r>=strftime("%H:%M:%S")<CR> " 當前時間 endif
前面用戶界面一節已經提到如何高亮行尾空格,下面設置能夠刪除行尾空格。
# 這個函數經過替換命令刪除行尾空格 func! DeleteTrailingWS() exec "normal mz" %s/\s\+$//ge exec "normal `z" endfunc " 保存時自動刪除行尾空格 au BufWrite * :call DeleteTrailingWS() map <leader>W :call DeleteTrailingWS()<CR> " 移除只包含空格的行裏的空格(有點繞口) " 貌似有了前面的函數,這個就沒有什麼必要了 map <F3> :%s/\s*$//g<CR>:noh<CR>''<CR>
配置是無窮無盡的,是樂趣也是包袱。
這篇文章,並非個人 Vim 配置的所有,而個人 Vim 配置,也常常性的在變。
此外,我主要寫 C++ 和 Python,可能並不適合你。可是道理是同樣的,老是免不了折騰。
因此,沒有現成適用於全部人的配置,都是在別人的基礎上不斷收集和改進而成。
爲了不文章太長,經常使用插件的介紹就另起一篇吧。
<全文完>