转眼间,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,可能并不适合你。可是道理是同样的,老是免不了折腾。
因此,没有现成适用于全部人的配置,都是在别人的基础上不断收集和改进而成。
为了不文章太长,经常使用插件的介绍就另起一篇吧。
<全文完>