NERDTree插件API小记

之前因为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正则环视优化vim-coloresque插件

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

vim缩进参考线

编辑缩进嵌套的文件时想找到对应的层级比较困难,写了一个函数,使用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>来设定。

效果如下:左侧的是缩进辅助线,右侧的是手动设置的列宽参照。

win平台配置vim-addon-manager

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

编译macvim支持ruby 2.0

默认从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目录下即可。

win平台编译64位gvim

接上篇:我编译的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

分享我编译的gvim7.4a BETA 64位版本(win平台)

看到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这个文件即可。

修改vim-zencoding对sass的支持

目前使用的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, ':', ': ', '') 保存再次打开即可。

解决ftplugin/ruby.vim Line 83 E484错误

自己用的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,暂时没发现修改后有什么问题。

错误截图:

自用的两个vim函数Tab/Space互转和Tab键补全

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>
" }}}