vim-addon-manager 是一个非常有用的插件,至少对我来说是这样的,看名字就知道是用来管理vim插件的,用它可以在vim里快速的安装其他插件,就像在linux里通过软件包管理工具安装软件那样方便。
不过我用这玩意的最大原因不是因为可以方便的安装插件,而是它可以让你把vim的每一个插件都放在一个独立的目录下,这样就不会和其他插件的文件混在一起了。
想想以前,要装个新vim插件,就是下载下来解压后往.vim目录里一扔,然后所有插件都混在一起,什么plugin了,autoload了,ftplugin了等各个目录里混杂着各种插件的文件,时间久了到底装了多少插件都不知道,想干净的删除一个插件要费老大力,因为删除plugin目录里的文件后可能在其他目录还有一些文件。
现在有了这个工具,我删掉了用了多年的.vim目录,重新整理了一下,每个插件一个单独目录,添加删除非常方便,哈哈。

这是以前的.vim目录,所有东西都混在一起

现在的,多干净,哈哈

所有插件都放在addons目录里,每个插件单独放在一个子目录中,这个addons目录的位置是可以配置在vimrc里的,这样再多插件也不会混乱啦,哈哈。
插件地址 http://www.vim.org/scripts/script.php?script_id=2905
具体如何配置使用可以看这个地址 http://github.com/MarcWeber/vim-addon-manager/blob/master/doc/vim-addon-manager.txt
无聊装了个neocomplcache试下,初步用下来感觉效果的确不错,不过要和 snipMate superTab zencoding插件和谐共存还是要设置一下。。。
首先如果你不需要让他自动启用 (不加 let g:NeoComplCache_EnableAtStartup = 1),或者不需要让他自动弹出提示 (加了 let g:NeoComplCache_DisableAutoComplete = 1),那似乎就不用设置什么了。
如果用了 zencoding.vim,那么vimrc里面不要有 let g:use_zen_complete_tag = 1 ,如果加了这句会使NeoComplCache自动启用那句没做用。。。
另外如果要 snipMate 和 superTab的话,也要修改下,因为snipMate为了与superTab兼容,在提示菜单弹出的时候是不会展开的,即使你修改了触发snipMate的热键也没用,他只会执行superTab的动作。。。
所以我就想把snipMate为了兼容superTab的代码去掉。
打开 ~/.vim/plugin/snipMate.vim 134行开始
134
135
136
137
138
139
140
| if pumvisible()
if exists('SuperTabKey')
call feedkeys(SuperTabKey) | return ''
endif
call feedkeys("\<esc>a", 'n')
call feedkeys("\<tab>") | return ''
endif |
---------------- 2010-08-22 更新 --------------
根据snipMate在github中的最新代码,从149行,开始,从新调整一下TriggerSnippet函数,并且下面再增加一个小函数
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
| fun! TriggerSnippet()
if exists('g:SuperTabMappingForward')
if g:SuperTabMappingForward == "<tab>"
let SuperTabKey = "\<c-n>"
elseif g:SuperTabMappingBackward == "<tab>"
let SuperTabKey = "\<c-p>"
endif
endif
if exists('g:snipPos') | return snipMate#jumpTabStop(0) | endif
let word = matchstr(getline('.'), '\S\+\%'.col('.').'c')
for scope in [bufnr('%')] + split(&ft, '\.') + ['_']
let [trigger, snippet] = s:GetSnippet(word, scope)
" If word is a trigger for a snippet, delete the trigger & expand
" the snippet.
if snippet != ''
if exists('g:loaded_neocomplcache')
let g:neocomplcache_disable_auto_complete = 1
inoremap <ESC> <ESC>:call SetNeocomplBack()<CR>
snoremap <ESC> <ESC>:call SetNeocomplBack()<CR>
endif
let col = col('.') - len(trigger)
sil exe 's/\V'.escape(trigger, '/\.').'\%#//'
return snipMate#expandSnip(snippet, col)
endif
endfor
if exists('SuperTabKey')
call feedkeys(SuperTabKey)
return ''
endif
return "\<tab>"
endf
fun! SetNeocomplBack()
let g:neocomplcache_disable_auto_complete = 0
inoremap <ESC> <ESC>
snoremap <ESC> <ESC>
endf |
-----------------------------------------------
这几句注释掉后就行了,不管是否兼容了,反正用了NeoComplCache自动提示,superTab的作用也体现不出多少了,主要是为了可以用tab键来选择提示菜单中的项目。
还有个办法不需要修改snipMate的代码就是修改superTab的热键,但是如果改掉的话那还能叫superTab不? 哈哈
这里也有个参考,不过他是把NeoComplCache的自动提示关闭了。
http://sinolog.it/?p=1399
更新 2010/3/14:
推荐使用原生vim脚本写的Zen coding插件,无须调用外部程序。
Zen Coding? 其实我看下来有点类似snippet的代码模板,用来提高编码效率,但是 Zen Coding 是针对html编写的,可以用一系列快捷的方式生成html代码,从而提高编码的效率,并且感觉还挺有乐趣的。
比如可以用类似css选择器的语法来快速生成html,输入 div#header.content > ul > li*3 > a 就可以生成下面的html代码
<div class="content" id="header">
<ul>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
<li>
<a href=""></a>
</li>
</ul>
</div>
介绍:
Zen Coding: A Speedy Way To Write HTML/CSS Code
里面有个 vimeo上的视频,需要翻墙看。。。
googlecode上有个zen-coding的项目,为一些编辑器开发了相关插件,不过似乎暂时没有Vim相关的插件。
我找到了另一个项目 Sparkup。
这是一个类似zen-coding的项目,主程序也是用Python开发,提供了一个vim的脚本。
使用方式也是很简单,下载后把sparkup这个文件放到用户目录下的bin目录里,然后按照里面vim/sparkup.vim里的注释来就行了。
也有视频演示,Youtube上的,所以也要翻墙 – -
如果是要在Windows下使用,我用py2exe将sparkup转换成exe了,然后把这个exe的所在目录加到环境变量里就能用了。
这个项目提供的那个vim脚本用起来要改vimrc,而且使用source方式,要考虑脚本的路径,我改了下,改成插件方式了,把下面的代码保存成 sparkup.vim 放到vim的plugin目录中就行。
还有我把快捷键改成 Ctrl + k 了,输入snippet后按下快捷键就能生成代码。
" Sparkup
" Installation:
" Put it in ~/.vim/plugin
"
autocmd FileType html,php call KeyMapping()
function! KeyMapping()
map <C-k> <Esc>:.!sparkup<Cr>:call SparkupNext()<Cr>
imap <C-k> <Esc>:.!sparkup<Cr>:call SparkupNext()<Cr>
"map <C-n> <Esc>:call SparkupNext()<Cr>
"imap <C-n> <Esc>:call SparkupNext()<Cr>
endfunction
function! SparkupNext()
" 1: empty tag, 2: empty attribute, 3: empty line
let n = search('><\/\|\(""\)\|^\s*$', 'Wp')
if n == 3
startinsert!
else
execute 'normal l'
startinsert
endif
endfunction
我的系统是 debian 桌面环境是 gnome,用 gvim 的时候菜单栏一直都不显示,虽然不影响平时使用,不过有时候想用某个不常用的命令,到菜单里面去找下也很方便的。
今天搜了下,找到个解决办法。
就是打开 ~/.gnome2/Vim ,里面原来的内容是
[Placement]
Dock=Toolbar\\0,0,0,0\\Menubar\\0,0,0,0
把第二行改成
Dock=Toolbar\\0,1,0,0\\Menubar\\0,0,0,0
这样就行了。
只要在 PYTHONPATH 中的程序,用Vim的时候就能够使用omni智能提示功能。
最近新学django,所以把用django-admin 生成的项目目录加入到PYTHONPATH,这样就能使用Vim的omni对这个项目里的模块实现代码提示功能了。
但是用了不久后,发现对某些模块操作时omni功能失效了- -,研究了一下发现是只要导入了django.db.models的模块,智能提示就会失效。
然后我在终端的python中单独导入django 的 models 模块,发现会有异常,原因是那个 django.db 里面会导入 django.conf.settings 对象,然后还会去设置他的属性,这一下就玩完了,因为那里面会检查系统的 DJANGO_SETTINGS_MODULE 值,可以在django/conf/__init__.py中的LazySettings这个类里看到,如果没的话就有异常了。
这个系统值应该是启动server的时候设置的,可以在manager.py里面看到。
这样一来肯定是由于Vim的python omni程序导入模块时一旦碰到异常就不继续了,所以智能提示失效了。
为此我在导入django的models时做了下处理
try:
from django.db import models
except ImportError:
from django.core import management
management.setup_environ(settings)
from django.db import models
哈哈,这样就好了,那个settings是当前项目中的settings模块。
要是有更好的办法欢迎提示阿。