公司的开发环境比较自由,没有要求使用统一软件和配置之类的,我选 择了vim.

从前有个文本编辑器……

它叫vi,读作/ˈviːˈaɪ/,最初的版本在1976年发布……那是龙、骑士 和魔法师的年代,一群住在山洞里的术士召唤了一只叫Unix的怪物, 各种混乱和灾难也随之而生;而vi,也几乎是和这只怪物同时诞生的, 人们传说它有着不可思议的力量,但凡亲眼见过它第一面的人,要么被 吓得魂飞魄散,要么获得魔力成为了强大的魔法师……

好吧我编不下去了。

我想说的其实是vim. 虽然vim算是vi的克隆版,但是除了作者不同外, 它们两个也可以算是两个完全不同的编辑器了,只不过刚好vim带了一个 兼容vi的工作模式而已。vim的大部分常用功能都是vi根本没有的,vim 比vi更现代化、更实用。vi只是单纯的编辑工具,而把vim叫做文本编辑 器的话就有点冒犯vim的意思了……

想学vi的同学,放弃吧,那东西是将近40年前写出来的;要学就去学vim, 并且随时确定一下自己真的是在学vim……

作为IDE的神话

网上盛传各种将vim搭建成IDE的方法,重点不外乎两个:

  1. 整合编译和调试功能
  2. 整合自动补全功能

结果,用vim写了一段时间的代码之后,我发现这两个功能其实很鸡肋:vim的 自动补全一直是短板,无论插件写得多好,补全的质量都显得弱弱的,从 长长的补全列表里选一项还不如直接到定义里找来得快;而编译功能很好 办,加一个自己的命令或者设一下compiler和makeprg一般就ok;至于调 试,我只能说实在不是vim适合干的事情,用tmux在旁边开个窗口干你想 干的事情还比较靠谱……所以,网上的各种IDE配置方法也很鸡肋。

其实真正重要的特性是项目管理文件组织,因为同时在改的文 件多了以后,每次找一个文件都要敲一长串路径是很可怕的事情,到最后 你会发现自己一直在敲路径和文件名……

针对这个问题,我最初用的是project插件,结果发现目录结构清楚 是清楚,但是有多个项目的时候找文件很悲剧,特别是在同一个代码库的 不同branch里,只能用/之类的查找命令,一不小心就窜到别的项目去 了;更悲剧的是,project的窗口用鼠标操作比键盘操作还方便,在命令 行下情何以堪啊……后来想试一下声名远播的NerdTree,看见琳琅满 目的选项我就直接放弃了……

最后机缘巧合之下我发现了CtrlP这个好东西,一装上就马上感觉被 它拯救了,而且突然明白,目录结构神马的都是浮云;CtrlP有以下几个 很重要的特性:

  1. 方便,窗口会自动切换,只要按C-p再直接输入文件名就可以开始搜索;
  2. 聪明,文件名不是完全匹配,而是可以跳过各种字符,例如找 some_long_file_name.c可以直接输入somefilec
  3. 搜索顶层路径根据VCS软件的信息自动确定,“项目”概念和VCS代码库 对应,不需要手工配置和干预。

基本上这是个安装后可以直接开始用的傻瓜插件,而且用起来异常顺手, 绝对是居家旅行必备工具——这才是写代码的软件应该有的功能!别忙着又 编译又调试神马的,拜托先把写代码这个最基本的功能干好了再说……

所以呀,用vim当IDE只是个神话,看不见摸不着;vim最擅长的还是编辑 文字,编译调试什么的让专业的make/编译器/调试器去干吧,最多封装一 层薄薄的命令让自己拍起来方便点,大家都"Do one thing and do it well"是最好的。

字体和颜色

从以前到现在我都迷恋深色背景的配色主题,因为浅色的背景看久了晃 瞎眼睛……以前用的是oceandeep,后来觉得某些高亮的配色太暗了, 换成了现在用的wombat,在gvim下显示的颜色对比度刚好,不会 太刺眼又不会太模糊;不过无论oceandeep还是wombat,在终端下对比 度都太强了,所以终端下的vim用的是default配色。

对于字体,我以前是很无所谓的,觉得只要是等宽的就可以;但是在试 过Inconsolata之后,就开始觉得其他编辑器和等宽字体都是在耍 流氓——特别是不区分0(零)和O(欧)的字体。

我的.vimrc

附上我自己的.vimrc文件,另外我还装了numberssnipmate, 还挺好用的,强烈推荐~

" Setting up Vundle
set nocp
filetype off
set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" Let Vundle manage Vundle
" Required by Vundle doc.
Bundle "gmarik/vundle"
Bundle "Yggdroot/indentLine"
Bundle "myusuf3/numbers.vim"
Bundle "airblade/vim-gitgutter"
Bundle "bling/vim-airline"
Bundle "kien/ctrlp.vim"
Bundle "msanders/snipmate.vim"
Bundle "klen/python-mode"
Bundle "vim-scripts/slimv.vim"
Bundle "jimenezrick/vimerl"
Bundle "chriskempson/vim-tomorrow-theme"
Bundle "vim-scripts/Wombat"
function! MySys()
return "linux"
endfunction
" UI options
set visualbell
set mouse=a
set laststatus=2
"set statusline=%(%F%(\ [%Y%M]%)%)%<%=%(\ %l.%02c/%L\ (%p%%)\ %)
set wildmenu
set pastetoggle=<F3>
function! ChangeCursorLine()
if has("gui_running")
set cursorline
hi CursorLine guibg=Grey30
hi CursorColumn guibg=Grey30
endif
endfunction
" It won't work if I set these directly, so I used an event callback instead
autocmd! ColorScheme * call ChangeCursorLine()
if has("gui_running")
if MySys() == "linux"
set gfn=Inconsolata\ for\ Powerline\ 13
elseif MySys() == "windows"
set gfn=Inconsolata:h13
endif
set guioptions=aegit
colorscheme Tomorrow-Night
else
set background=dark
colorscheme Tomorrow-Night
endif
" editing options
set shiftwidth=4
set tabstop=4
set expandtab
set smarttab
set cindent
set autoindent
set scrolloff=7
set ignorecase
set incsearch
set hlsearch
set showmatch
set fileencoding=utf-8
set fileencodings=utf-8,gbk,big5,shift-jis,euc-kr,latin-1
set foldmethod=marker
set nowrap
function! SmarterFoldText()
let text = foldtext()
let idx = match(text, "^+-\\+[ \t]*[0-9]\\+.\\+:[ \t]*$")
if idx >= 0
let line = getline(v:foldstart + 1)
return text . line . " "
else
return text
endif
endfunction
set foldtext=SmarterFoldText()
" misc options
filetype on
filetype plugin on
filetype indent on
syntax on
set nu
" key mappings
let mapleader=","
let g:mapleader=","
noremap <C-j> <C-W>j
noremap <C-k> <C-W>k
noremap <C-h> <C-W>h
noremap <C-l> <C-W>l
nnoremap H ^
nnoremap L $
noremap <leader>tn :tabnew %<cr>
noremap <leader>te :tabedit
noremap <leader>tc :tabclose<cr>
noremap <leader>tm :tabmove
noremap <leader>to :tabonly<cr>
noremap <M-1> 1gt
noremap <M-2> 2gt
noremap <M-3> 3gt
noremap <M-4> 4gt
noremap <M-5> 5gt
noremap <M-6> 6gt
noremap <M-7> 7gt
noremap <M-8> 8gt
noremap <M-9> 9gt
noremap <M-0> 10gt
noremap <leader>t2 :set shiftwidth=2<cr>
noremap <leader>t4 :set shiftwidth=4<cr>
noremap <leader>hl :set hlsearch<cr>
noremap <leader>nl :nohl<cr>
noremap <leader>cw :cw<cr>
noremap <leader>cn :cn<cr>
noremap <leader>cp :cp<cr>
noremap <leader>y "+y
noremap <leader>p "+p
noremap <leader>P "+P
noremap <leader>x "+x
noremap <leader>d "+d
noremap <leader>ve :vsplit $MYVIMRC<cr>
noremap <leader>vs :source $MYVIMRC<cr>
noremap <c-c> <esc>
""""""""" plugin settings """""""""
" airline
if has("gui_running")
let g:airline_powerline_fonts=1
endif
" indentLine
let g:indentLine_color_gui='#404040'
let g:indentLine_color_term=239
" python-mode
let g:pymode_lint_checker="pyflakes,pep8"
view raw .vimrc hosted with ❤ by GitHub