之前因为vim上的TFS插件一直不好使,自己写了一个简单的插件在vim上签出TFS源文件。为了在NERDTree上面集成了菜单功能,研究了下NERDTree插件。年底忙里偷闲整理了一些关于NERDTree的知识点,分享出来。
1. 添加NERDTree文件菜单
在vim插件目录创建一个nerdtree_plugin文件夹,在其中新建vim脚本文件,使用NERDTreeAddMenuItem函数添加一项按钮项。参数格式:
{'text': 'menu text', 'shortcut': 'short key', 'callback':'callback function name'}
示例:
call NERDTreeAddMenuItem({ 'text': 'TFS Check (o)ut', 'shortcut': 'o', callback': 'TFSCheckoutCallback' })
2. 获取当前文件节点
let currentNode = g:NERDTreeFileNode.GetSelected()
3.获取文件路径
let currentFile = currentNode.path._strForGlob()
4.更新文件状态
cal currentNode.path.refresh()
cal NERDTreeRender()
# 当我们通过currentNode.path.refresh() 可以刷新文件节点,之后通过NERDTreeRender重绘获得更新。当通过操作修改了文件的属性后需要通过此操作更新文件状态。
附插件git地址:https://github.com/thinkjs/TFSCheckout
NERDTree FileNode参考:https://github.com/scrooloose/nerdtree/blob/5.0.0/lib/nerdtree/tree_file_node.vim
NERDTree Pathp参考:https://github.com/scrooloose/nerdtree/blob/5.0.0/lib/nerdtree/path.vim
NERDTree Public API参考:https://github.com/scrooloose/nerdtree/blob/5.0.0/plugin/NERD_tree.vim#L164
vim-coloresque是一款高亮插件,将css/sass/less中的颜色用背景色高亮出来方便预览。用了一段时间发现代码补全一定程度上受影响,自己对插件进行了一些优化,修改后git地址:https://github.com/thinkjs/vim-coloresque。
看插件github上的issue,插件中对isk这个选项的设置影响了补全,全并且影响了vim全局的keyword识别,直接注释掉isk+=-、isk+=#、 isk+=# 解决了补全问题但针对colorDict的高亮识别又发生错误,例如样式名为 .red或.common-red-btn,此处的red会被高亮。作者使用"\<"单词边界来识别colorDict,修改isk以后单词边界识别出错高亮出错,想到用正则表达式来调整此处的colorDict匹配。
匹配规则如下:
1. 前字符为行首或空白或:(冒号)
2. 后字符为行尾或空白或;(分号)
正则如下:
'\(^\|\s\|:\)\@<=\c'._color.'\($\|\s\|;\)\@='
vim中使用@<=作逆序环视、@=做顺序环视(vim中使用:h @<=查看详细介绍),修改后效果不错,符合我的应用场景。diff代码如下:
From f162c7a118caba4af655741feeae11720329bb4e Mon Sep 17 00:00:00 2001 From: leaf Date: Wed, 21 Jan 2015 16:27:40 +0800 Subject: [PATCH] remove "isk" change, improve color dict regexp --- after/syntax/css/vim-coloresque.vim | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/after/syntax/css/vim-coloresque.vim b/after/syntax/css/vim-coloresque.vim index c80a9a5..b60f863 100644 --- a/after/syntax/css/vim-coloresque.vim +++ b/after/syntax/css/vim-coloresque.vim @@ -122,9 +122,9 @@ function! s:VimCssInit(update) if a:update==1 call s:ClearMatches() endif - :set isk+=- - :set isk+=# - :set isk+=. + " :set isk+=- + " :set isk+=# + " :set isk+=. if len(keys(b:color_pattern))>0 call s:RestoreColors() @@ -301,7 +301,10 @@ function! s:AdditionalColors() "let w:colorDictRegExp = '\(' for _color in keys(w:colorDict) "let w:colorDictRegExp.='\<'._color.'\>\|' - call s:MatchColorValue(strpart(w:colorDict[tolower(_color)], 1), '\<\c'._color.'\>') + " old + " call s:MatchColorValue(strpart(w:colorDict[tolower(_color)], 1), '\<\c'._color.'\>') + " new regexp + call s:MatchColorValue(strpart(w:colorDict[tolower(_color)], 1), '\(^\|\s\|:\)\@<=\c'._color.'\($\|\s\|;\)\@=') endfor "let w:colorDictRegExp=strpart(w:colorDictRegExp, 0, len(w:colorDictRegExp)-2).'\)\c' endfunction -- 1.7.11.1
编辑缩进嵌套的文件时想找到对应的层级比较困难,写了一个函数,使用cc选项设定一条辅助线,标识到指定的缩进层级。代码如下:
" -------------------------------------------------- " [参考线切换] {{{ " -------------------------------------------------- fu! ReferenceLine(t) if exists('w:ccnum') let ccnum=w:ccnum elsei exists('b:ccnum') let ccnum=b:ccnum else let ccnum=0 en let oldcc=ccnum " let ccc=&cc " ec oldcc let ccc=','.&cc.',' " add/sub if a:t=='add' || a:t=='sub' " check old cc if match(ccc, ','.oldcc.',')<0 let oldcc=0 let ccnum=0 en " step let csw=&sw if a:t=='add' let ccnum=ccnum + csw elsei a:t=='sub' let ccnum=ccnum - csw if ccnum < 0 | let ccnum=0 | en en if oldcc > 0 | let ccc=substitute(ccc, ','.oldcc.',', ',', '') | en let ccc=ccc.ccnum " ec ccc " ec ccnum let ccc=substitute(ccc, '^0,\|,0,\|,0$', ',', 'g') let ccc=substitute(ccc, '^,\+\|,\+$', '', 'g') " ec ccc let w:ccnum=ccnum let b:ccnum=ccnum exec "setl cc=".ccc " del elsei a:t=='del' let ccc=substitute(ccc, ','.oldcc.',', ',', '') let ccc=substitute(ccc, '^,\+\|,\+$', '', 'g') " ec ccc let w:ccnum=0 let b:ccnum=0 exec "setl cc=".ccc en endf nn <silent> <A-u> :call ReferenceLine('sub')<CR> nn <silent> <A-o> :call ReferenceLine('add')<CR> " }}}
使用方法:
Alt+o 增加参考线、Alt+u 减少参考线,最后两行是键映射,可以按照需求自行修改。
设定参考线后,如果想要设定cc做列宽参照,请使用set cc+=<num>来设定。
vim-addon-manager是一款功能非常强大的vim插件管理工具,但其依赖git, hg, svn, curl, unzip等工具在win平台配置较繁琐,一直没在win平台中使用这种方案。这两天在试着在win平台配置,分享一下配置过程。
1. 依赖程序
1.1 git 主页 http://msysgit.github.io/
下载地址:https://github.com/msysgit/msysgit/releases/download/Git-1.9.2-preview20140411/Git-1.9.2-preview20140411.exe
1.2 svn 主页 http://www.sliksvn.com/
下载地址:http://www.sliksvn.com/pub/Slik-Subversion-1.8.9-x64.msi
1.3 hg 主页 http://mercurial.selenic.com/
下载地址:http://mercurial.selenic.com/release/windows/Mercurial-3.0.exe
msysgit包中带有curl以及unzip等工具
2. 添加环境变量
编辑vim配置文件($VIM/.vimrc)为vim指定相关环境变量(将C:\Program Files替换成自己的安装路径)
if(has('win32') && match($PATH,'SlikSvn')<0) let $PATH=$PATH.';C:\Program Files\SlikSvn\bin;C:\Program Files\Mercurial;C:\Program Files\Git\bin' en
3. 下载vim-addon-manager并配置
从https://github.com/MarcWeber/vim-addon-manager 获取源代码到插件目录,在vimrc中添加配置。
附官方建议配置:
fun! SetupVAM() let c = get(g:, 'vim_addon_manager', {}) let g:vim_addon_manager = c let c.plugin_root_dir = expand('$HOME', 1) . '/.vim/vim-addons' " most used options you may want to use: " let c.log_to_buf = 1 " let c.auto_install = 0 let &rtp.=(empty(&rtp)?'':',').c.plugin_root_dir.'/vim-addon-manager' if !isdirectory(c.plugin_root_dir.'/vim-addon-manager/autoload') execute '!git clone --depth=1 git://github.com/MarcWeber/vim-addon-manager ' \ shellescape(c.plugin_root_dir.'/vim-addon-manager', 1) endif call vam#ActivateAddons([], {'auto_install' : 0}) endfun call SetupVAM() VAMActivate matchit.zip vim-addon-commenting
不建议将所有配置内容都放在vimrc中,向大家推荐我整理的vim配置分割方案:http://zshou.i11r.com/posts/39266.html
默认从https://code.google.com/p/macvim/下载的macvim是ruby1.8的支持,某些插件不好使,折腾了下编译一个支持ruby2.0的版本。
1. 获取macvim源代码
git clone https://github.com/b4winckler/macvim.git
2. 设置CC环境变量
export CC=clang
3. 配置及编译
./configure --with-features=huge \ --enable-rubyinterp \ --enable-pythoninterp \ --enable-cscope \ --with-macarchs=x86_64 \ --with-compiledby=user@domain
make
编译后的文件在src/MacVim/build/Release目录下,将MacVim.app复制到/Applications目录下即可。
接上篇:我编译的gvim7.4a BETA 64位版本(win平台)
1. 安装visualstudio 2012,hg
2. 获取源代码
hg clone https://vim.googlecode.com/hg/ vim
hg update v7-4a
3. 源代码修改
启用非等宽字体支持,修改该项后可使用微软雅黑字体。
编辑 vim/src/os_mswin.c 查找
/* Ignore non-monospace fonts without further ado */ if ((ntm->tmPitchAndFamily & 1) != 0) return 1;
注释即该段代码即可。
关微软雅黑字体:
vim显示非等宽字体是有bug的所以关掉了。汉字都是方块字全部等宽的,在开启非等宽字体支持后我们可以用微软雅黑显示汉字。在vimrc中添加如下配置:
set gfw=youyuan:h10.5:cGB2312
4. 编译
打开vs命令提示行
切换到源码目录
编译命令:
nmake -f Make_mvc.mak PYTHON=C:\Python27 DYNAMIC_PYTHON=yes PYTHON_VER=27 MBYTE=yes USERNAME=leftcold USERDOMAIN=gmail.com GUI=yes
说明:将USERNAME USERDOMAIN修改为你的邮箱名、邮箱域,可以定制vim中编译人信息。将GUI选项修改为no可以编译命令行版本。PYTHON为自己的python安装路径,将PYTHON选项去掉,编译的将是不带python支持的版本。
参考链接:https://groups.google.com/forum/#!topic/vim_dev/N8jzif4e9L8
http://nootn.com/blog/Tool/22/
https://github.com/asins/vim
看到vim已经放出7.4a BETA版了,下载源码自己编译了一份64位的,添加了python支持、修正等宽字体(可以使用微软雅黑)。
下载地址:http://pan.baidu.com/share/link?shareid=3835585554&uk=590772501#dir/path=%2Fpub%2Fvim%2Fgvim7.4
下载vim74a_m_all.zip这个文件即可。
目前使用的zencoding(git仓库版本)已经增加了对sass的支持,但支持不够完美,例如输入 pos:a ,展开以后是 position:absolute。这样的代码是无法编译通过的,sass中要求:(冒号)后面必须有空格,也就是position: absolute这样的结果。只需要很简单的修改就可以。
具体方法如下:
修改 autoload/zencoding/lang/sass.vim 在 let text = substitute(text, '\s*;\ze\(\${[^}]\+}\)\?\(\n\|$\)', '', 'g') Lline:60 行后面添加一行 let text = substitute(text, ':', ': ', '') 保存再次打开即可。
自己用的vim是从源上获取的代码自行编译的x64位版本,版本号是7.3-712。在编辑haml、rb等文件时就报出ftplugin/ruby.vim E484错误。看了下ruby.vim是调用system命令取ruby路径时报错。解决方法,在vimrc中添加一行:
let g:ruby_path = ""
当检测到有g:ruby_path这个变量时,就不会调用system命令取ruby路径。ruby.vim 中仅 72-94行用到了s:ruby_path,暂时没发现修改后有什么问题。
错误截图:
1. Tab和Space转换函数,expandtab和rettab的组合运用。命令:ToTab,:ToSpace分别转换当前文件到tab缩进和space缩进。
" -------------------------------------------------- " [空格与制表切换] {{{ " -------------------------------------------------- fu! ToggleTab(t) if a:t == 'tab' setl noet ret! elsei a:t == 'space' setl et ret en endf com! -nargs=0 ToSpace call ToggleTab('space') com! -nargs=0 ToTab call ToggleTab('tab') " }}}
2. Tab键补全,这个是以前网上的配置里面摘出来的。用惯了Tab键补全,C-p、C-n实在不习惯。函数做了简单的判断,在字母后面为补全,其它地方为Tab键。后面了加一个Shift+Tab的强制Tab键映射,在任何情况下都能键入tab。
" -------------------------------------------------- " [自动完成函数] {{{ " -------------------------------------------------- " 自动完成 fu! InsertTabWrapper() let col=col('.')-1 return (!col || getline('.')[col-1] !~ '\k') ? "\<TAB>" : "\<C-P>" endf " 映射键 ino <TAB> <C-R>=InsertTabWrapper()<CR> " 强制TAB键 ino <S-TAB> <C-R>="\<TAB>"<CR> " }}}