公司的开发环境比较自由,没有要求使用统一软件和配置之类的,我选 择了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的方法,重点不外乎两个:
- 整合编译和调试功能
- 整合自动补全功能
结果,用vim写了一段时间的代码之后,我发现这两个功能其实很鸡肋:vim的 自动补全一直是短板,无论插件写得多好,补全的质量都显得弱弱的,从 长长的补全列表里选一项还不如直接到定义里找来得快;而编译功能很好 办,加一个自己的命令或者设一下compiler和makeprg一般就ok;至于调 试,我只能说实在不是vim适合干的事情,用tmux在旁边开个窗口干你想 干的事情还比较靠谱……所以,网上的各种IDE配置方法也很鸡肋。
其实真正重要的特性是项目管理和文件组织,因为同时在改的文 件多了以后,每次找一个文件都要敲一长串路径是很可怕的事情,到最后 你会发现自己一直在敲路径和文件名……
针对这个问题,我最初用的是project插件,结果发现目录结构清楚
是清楚,但是有多个项目的时候找文件很悲剧,特别是在同一个代码库的
不同branch里,只能用/
之类的查找命令,一不小心就窜到别的项目去
了;更悲剧的是,project的窗口用鼠标操作比键盘操作还方便,在命令
行下情何以堪啊……后来想试一下声名远播的NerdTree,看见琳琅满
目的选项我就直接放弃了……
最后机缘巧合之下我发现了CtrlP这个好东西,一装上就马上感觉被 它拯救了,而且突然明白,目录结构神马的都是浮云;CtrlP有以下几个 很重要的特性:
- 方便,窗口会自动切换,只要按
C-p
再直接输入文件名就可以开始搜索; - 聪明,文件名不是完全匹配,而是可以跳过各种字符,例如找
some_long_file_name.c
可以直接输入somefilec
; - 搜索顶层路径根据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
文件,另外我还装了numbers和snipmate,
还挺好用的,强烈推荐~
" 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" |