![]()
vim是编辑器中的神器,但是因为学习曲线比较陡,界面也仿佛从石器时代穿越,广大fashion的前端工作者们难免对其有距离感。其实vim最大的萌点有两个,其一是百科全书般的文本编辑功能,其二是可以随意定制,满足任何与编辑器相关的需求和偏好,比如下面这张便是我在macbook pro上运行vim的截图,不仅语法高亮可以冒充TextMate,功能也几乎一致。
首先是做一个初始化配置脚本,在我的OSX10.5里是是~/.vimrc文件,这里只列出一些需要补充进去的设置:
- "设置语法高亮的配色,在GUI界面里使用我自定义的yytextmate.vim
- if has("gui_running")
- colorscheme yytextmate
- else
- colorscheme slate
- endif
- "查找编码的规则(vim7默认都用utf-8,打开包含gbk字符的文件会出现乱码)
- set fileencodings=utf-8,ucs-bom,gb18030,gbk,gb2312,cp936
- "GUI界面里的字体,默认有抗锯齿
- set guifont=Monaco:h12:cANSI
- "行间距,如果默认值太小,代码会非常纠结
- set linespace=4
- "用<>调整缩进时的长度
- set shiftwidth=4
- "制表符的长度,统一为4个空格的宽度
- set tabstop=4
- "初始窗口的宽度
- set columns=195
- "初始窗口的高度
- set lines=45
- "初始窗口的位置
- winpos 52 42
- "显示行号
- set number
- "行号栏的宽度
- set numberwidth=4
- "禁止自动换行
- set nowrap
- "在输入命令时列出匹配项目,也就是截图底部的效果
- set wildmenu
- "显示光标位置
- set ruler
- "分割窗口时保持相等的宽/高
- set equalalways
- "匹配括号的规则,增加针对html的<>
- set matchpairs=(:),{:},[:],<:>
- "让退格,空格,上下箭头遇到行首行尾时自动移到下一行(包括insert模式)
- set whichwrap=b,s,<,>,[,]
- "取消自动备份
- set nobackup
- "保存关闭文件之前保留一个备份
- set writebackup
- "js语法高亮脚本的设置
- let g:javascript_enable_domhtmlcss=1
- "设置自定义的<leader>快捷键
- let mapleader=","
- let g:mapleader=","
- """"""""""""""""""""""""""""""
- " bufExplorer插件的设置
- """"""""""""""""""""""""""""""
- let g:bufExplorerSortBy='mru'
- let g:bufExplorerSplitRight=0
- let g:bufExplorerSplitVertical=1 .
- let g:bufExplorerSplitVertSize = 30
- let g:bufExplorerUseCurrentWindow=1
- autocmd BufWinEnter \[Buf\ List\] setl nonumber
- """"""""""""""""""""""""""""""
- " winManager插件的设置
- """"""""""""""""""""""""""""""
- let g:winManagerWindowLayout = "BufExplorer,FileExplorer|TagList"
- let g:winManagerWidth = 30
- let g:defaultExplorer = 0
- nmap <silent> <leader>wm :WMToggle<cr>
- """"""""""""""""""""""""""""""
- " netrw插件的快捷键
- """"""""""""""""""""""""""""""
- let g:netrw_winsize = 30
- nmap <silent> <leader>fe :Sexplore!<cr>
- """"""""""""""""""""""""""""""
- " NERDTree插件的快捷键
- """"""""""""""""""""""""""""""
- nmap <silent> <leader>nt :NERDTree<cr>
- "把常用的ctrl快捷键映射到苹果键上(只保留cmd+c/cmd+v/cmd+z原有的功能)
- map <D-y> <C-y>
- map <D-e> <C-e>
- map <D-f> <C-f>
- map <D-b> <C-b>
- map <D-u> <C-u>
- map <D-d> <C-d>
- map <D-w> <C-w>
- map <D-r> <C-r>
- map <D-o> <C-o>
- map <D-i> <C-i>
- map <D-g> <C-g>
- map <D-p> <C-p>
- map <D-n> <C-n>
- map <D-a> <C-a>
- cmap <D-d> <C-d>
2009.6.7更新:最新的vimrc和其他脚本已经上传到google code的项目仓库里了
=================步骤二的分割线===================
然后在个人配置目录里添加语法高亮脚本(~/.vim/syntax/),其中html和css可以直接把vim7自带的脚本复制出来($VIMRUNTIME/syntax/),js的脚本则推荐用这个:
JavaScript syntax : Better JavaScrirpt syntax support
包含更多的关键字以及自动折叠代码的功能,也能在html文件内支持js语法高亮,需要注意的是如果要支持dom方法的关键字,需要在.vimrc里设置一个全局变量javascript_enable_domhtmlcss
我还用了这里的html.vim。
=================步骤三的分割线===================
接下来就可以对照着syntax脚本,给每个语法组设置颜色,配色脚本需要放到~/.vim/colors/里,然后在.vimrc里用colorscheme命令选定。colors脚本只需要一个,因为syntax脚本末尾都会把自定义的语法组链接到标准语法组,比如:
- HiLink javaScriptDocComment Comment
所以只需要定义一套针对标准语法组的配色方案,再通过修改syntax脚本里来调整相应语言的配色。我尝试过针对不同文件类型使用不同的配色方案,发现相当麻烦,需要在切换/打开/关闭缓冲区和窗口的时候都用colorscheme重置配色:
- autocmd BufNewFile,BufRead,BufEnter,WinEnter,FileType *.html,*.htm colorscheme delek
而且colorscheme会影响整个窗口(一个vim进程实例),如果在窗口内同时分割显示了几个文件,即使文件类型不同,也会同时改变颜色……
我平时最喜欢TextMate的Blackboard主题(大概是因为里面有橙色罢XD),在Aptana上也仿制过(配置文件:yytextmate.col),这次是直接在vim的slate主题基础上修改出来的,比vim.org上面那个blackboard.vim要更完善~
我的colors脚本:yytextmate.vim
我调整过的syntax脚本:javascript.vim, html.vim
=================步骤四的分割线===================
按照由外向内的顺序,现在该折腾功能了,首先是缩进插件,vim也自带有智能缩进功能,需要开启autoindent和smartindent参数,但是在编辑js代码的时候效果很不好,对于python这种靠缩进活命的语言就更不能忍了,因此至少需要装以下三个插件:
IndentAnything : Write indentations or enhance existing indentations without writing code
Javascript Indentation : Indentation for Javascript
indent/python.vim : An alternative indentation script for python
第一个放到~/.vim/plugin/里,后两个放在~/.vim/indent/里
=================步骤五的分割线===================
接下来终于要来实现TextMate最重要的功能了,TextMate之所以被称作地上最贵麦上最强的编辑器,就是因为支持大量可以通过tab或其他快捷键发动的强力Bundles,这些Bundles可以分为两种类型,一种是针对编辑器的内容执行指令(称作command),比如直接执行shell脚本,压缩js代码,对html转义,格式化JSON,编译swf等等,而指令界面是vim的核心,不但可以直接执行shell命令,也可以通过设置键位映射和宏,把复杂的操作绑定成简单的快捷键,因此这类功能原本就是vim的强项。
另一种类型的Bundles主要用来帮助程序员快速开发,通过简短的缩写+tab键直接生成所需的代码模板(称作snippet),然后依然用tab在模板中需要改动的位置之间跳转,整个过程不需要鼠标定位,非常高效,是一种比大型IDE里常见的”code hinting”更实用的智能补全功能。
snipMate : TextMate-style snippets for Vim
上面这个非常“新”的插件让vim也具备了同样的功能,而且几乎是跟TextMate完全兼容的移植,比如这是从TextMate里取出的snippet源码:
- ${1:class_name}.prototype.${2:method_name} = function(${3:first_argument}) {
- ${0:// body...}
- };
${}标签是代码插入后可以通过tab跳转的“可编辑”位置,其中的序号表示跳转顺序,冒号后的字符是默认内容。这段代码只要在前面加上snippet proto就可以直接放进~/.vim/snippets/javascript.snippets里,通过proto
把常见的程序结构抽象成snippet可以节省很多重复输入,比如这是我定义的一个module模式:
- snippet module
- /**
- * ${5:Describe what this module does}
- * @param {object} ${6:paramName}
- */
- var ${1:classname} = (function(){
- var $1Object = {
- ${2:privateMethod1}: function(){
- },
- ${3:privateMethod2}: function(){
- }
- };
- return function(opt){
- var publicObj = {
- options: {},
- $2: $1Object.$2,
- $3: $1Object.$3${4:,}
- };
- $.extend(publicObj.options, opt);
- return publicObj;
- };
- })();
修改过程中会看到$1,$2,$3自动更新成你键入的名字。
我修改过的完整javascript.snippets:http://code.google.com/p/yy-vimscript/source/browse/trunk/snippets/javascript.snippets
实际上还有一个比较老牌的插件也致力于实现同样的snippet功能:
snippetsEmu : An attempt to emulate TextMate’s snippet expansion
但是它支持的模板语法比TextMate差很多,跟上面相同的prototype模板要通过这种形式定义:
- let st = g:snip_start_tag
- let et = g:snip_end_tag
- let cd = g:snip_elem_delim
- exec "Snippet proto ".st."className".et.".prototype.".st."methodName".et." = function(".st.et.")<CR>{<CR>".st.et."<CR>};<CR>".st.et
缩进容易出错,不支持用序号设定跳转顺序,安装过程也比snipMate繁复,所以被我毫不留恋的淘汰了……
为了实现更广泛的智能补全,还需要一个必装插件:
SuperTab continued. : Do all your insert-mode completion with Tab.
SuperTab让任意字符都可以通过tab补全,比较取巧的是,它会在缓冲区的上下文中寻找匹配的词来补全,因此不需要附带很庞大的API数据。
=================步骤六的分割线===================
下一步需要增强的是文件/项目管理,vim虽然自带一个FileExplorer(直接编辑一个目录时会调用它,比如:e .),还有上面提到过的wildmenu的强力辅助,但是与常见的GUI编辑器和IDE相比,仍然不太直观,因此以下插件值得一装:
The NERD tree : A tree explorer plugin for navigating the filesystem
我最喜欢的文件导航工具,设置了快捷键,nt直接在侧面打开
bufexplorer : Buffer Explorer / Browser
缓冲区导航
winmanager : A windows style IDE for Vim 6.0
把bufexploer和FileExplorer集成在左侧,类似IDE的效果,这个功能不足以让我放弃NERDTree……而且这个插件似乎很久没更新了,连支持Vim7的版本都没有,但是很多人喜欢,所以也推荐一下……
TaskList.vim : Eclipse like task list
实现Eclipse的任务列表
project.tar.gz : Organize/Navigate projects of files
项目导航工具,不过没有Eclipse好用,需要写配置脚本,跟TextMate那种拖来拖去的drawer就更不能比了……
=================步骤七的分割线===================
最后推荐的插件都是开发工具:
vcscommand.vim : CVS/SVN/SVK/git integration plugin
SVN/git管理工具,这个是必备罢。没有GUI菜单,不过快捷键也很方便,而且VimDiff是很棒的比较工具
javaScriptLint.vim : Displays JavaScript Lint warnings in the quickfix error window
看仔细啦~这个不是道格拉斯老爷子的JSLint,那个东西虽然强大(以前没觉得,最近在《代码之美》里看到道格拉斯老爷子描述了“递归下降分析”+“运算符优先级技术”的动态语言解释器,才知道原来JSLint和JSON parser只是老爷子晒技术的承载体……),但是由于把规范约束在一个JS的安全子集上,适用面不广,设置起来也麻烦,在实际开发工作中未必实用。而这个Lint就很中规中矩,当然也没自己折腾解释器啦,直接用了Mozilla的js引擎,安装也很方便,提供一个conf文件可以设置警告条件。这个vim插件装上后,保存js文件时都会自动校验代码并显示一个提示信息窗口。
matchit : extended % matching for HTML, LaTeX, and many other languages
vim里的%命令可以在嵌套字符之间跳转(比如括号和引号,我在上面的.vimrc文件里增加了html的<>),这个插件将它的功能扩展到嵌套标签和语句
To be continue…

不错,推荐你使用一下一下exVim, 或许能够帮你解决更多类似的问题 http://code.google.com/p/exvim/
:)
回复
thx!
回复
最喜欢VIM,试试看
回复
哪你是用Textmate还是VIM呢?两个东西一起用,操作会混乱
回复
写东西都用vim,我的目的就是让vim使用起来跟textmate一样舒服XD
回复
自己的经验, vim中tab不能多开, 最多2个. 否则和buffer一起使用, 会彻底混乱的.
vim写js/html一直快不起来. 尤其是html, 调试还是个问题.
web开发还是coda之类ide来得好
回复
我觉得tab可以当作类似mac桌面Spaces的东西,而buffer就只是任务管理器~概念很清晰~
写html要找到合适的插件,有的插件帮倒忙,比如我用过一个把tab都改成了自动匹配位置和移动……
Coda我用过一段时间,修改缩进的时候很麻烦,只是管理项目和文件的时候方便,对代码编辑的效率似乎没任何帮助……
回复
强帖留名
回复
能否写个windows下的教程…..
回复
windows下基本上差别不大
回复
….配色文件能不能共享一下?
回复
好吧,我承认没有仔细看清楚
回复
”
# “初始窗口的宽度
# set columns=195
# “初始窗口的高度
# set lines=45
”
这个部分我觉得同样添加:
“if has(”gui_running”) || has (”gui_macvim”)”条件比较好,象我经常在bash下面用vi编辑配置文件,一用vi或者vim命令终端也跟着放大了。
回复
如果直接编辑在 .gvimrc 就不会影响 bash 下的 vim 了
回复
[…] Dexter.Yy: 面向前端开发者和TextMate粉丝的vim配置 […]
回复
赞一个,真是不错。
一直感觉MacVIM不大好配置。而且Mac下的中文输入法也不那么舒服,所以在Mac下一直没怎么认真配过这个。
回复
gvim用那个 _vimrc 配置文件,vim菜单都成了乱码,不知道怎么正确配置,请指导下..偶是VIM菜鸟..
回复
你说的gvim是指linux里的么,我把mac里的.vimrc和.vim直接复制到ubuntu里用,没发现什么问题,你看看你用的vimrc是不是google code的最新版:http://code.google.com/p/yy-vimscript/source/browse/trunk/vimrc
有针对linux做一些修改,比如字体:
if MySys() == “mac”
set guifont=TextMate_Regular:h13
set guifontwide=Hei_Regular:h13
elseif MySys() == “linux”
set guifont=Monospace
endif
还有一些GUI的配置只适用于MacVim,比如:
if has(”gui_macvim”)
set guioptions-=T “egmrt
回复
我用的是 Windows 下面的 gvim, 用的配置文件是 google code 中的最新版, 完全替换_vimrc后, 就杯具了, 菜单, 工具栏全部都是乱码..
回复
找到原因, gvim 是中文版的, 配置文件中有一句 set encoding=utf-8, 直接导致乱码…注释之…再次感谢YY的回复
回复
我擦,搜索vim的textmate配色方案竟然搜索到你这里了…特地拜一下。
回复
macvim的左边的那个列目录你是怎么实现的呀
回复