Adam's

adam@debian:~$ cat /dev/random

Archive for the ‘vim’ tag

用Vundle管理Vim插件

with 5 comments

一直以来, 管理Vim插件对我来说都是个困扰, 安装, 更新和卸载, 一个比一个麻烦. 我也尝试过很多插件管理工具, 但是都不如意, 直至遇到了Vundle.

Vundle利用git, 插件的git repo以及vim-scripts维护的GitHub repo, 自动安装, 更新和卸载插件. 它把这些繁杂的工作变得简单, 甚至, 成为一种享受.

Vundle的安装同样方便, 只需要执行:

git clone http://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

然后将下列代码加入vimrc中即可.
(插件名字由git repo决定, 可以在http://vim-scripts.org/vim/scripts.html页面中查找)

set nocompatible    " be iMproved
filetype off    " required!

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()

" let Vundle manage Vundle
" required!
Bundle 'gmarik/vundle'

" vim-scripts repos
Bundle 'vim-plugin-foo'
Bundle 'vim-plugin-bar'

filetype plugin indent on    " required!

然后, 安装插件:

:BundleInstall

更新插件:

:BundleInstall!

卸载不在列表中的插件:

:BundleClean

就是这么简单, 方便. Enjoy it!

Written by adam8157

December 26th, 2011 at 10:11 pm

Posted in Tips

Tagged with , ,

在中科大关于Vim的演讲

with 7 comments

上周末受朋友邀请, 去中科大讲了下Vim相关的东西. 感谢熊老师和USTC LUG的各位同学的安排和组织.

Slides改自林佑安的VIM Hacks, 遵循Creative Commons 3.0协议, 可从此处下载.

PS: roylez关于ZSH的Slides在此: http://roylez.heroku.com/2011/12/12/ustc-zsh-speech.html

Written by adam8157

December 13th, 2011 at 3:36 pm

Posted in Blah,Linux

Tagged with , ,

Vim和BOM

with 2 comments

最近发现个怪现象, 从Vim中复制的文本(xsel的方式)和实际文本有点点区别, 会在头部加几个不可见的字节(0xEF 0xBB 0xBF), 粘贴到别的程序里有时会引发错误.

查了下, 原来这几个字节是Unicode的BOM(Byte order mark), 用来标记UTF-16和UTF-32编码文件的字节序, UTF-8并不需要. 但因为这个文件我曾经用Windows的记事本保存过, 它自作聪明地加了个BOM, 而Vim识别到文件有BOM就会自动打开bomb这个选项(具体解释请看Vim中bomb和fileencodings的帮助), so…

于是, 这样, 然后保存就好了:

:set nobomb

小提示, 查看当前bomb是否打开可以这样:

:set bomb?

Written by adam8157

February 17th, 2011 at 4:32 pm

Posted in Linux,Tips

Tagged with ,

用vim处理svn的conflicts

without comments

半年之前就用vimdiff取代了svn的diff(传送门), 但是冲突处理没能用vim实现, 一直耿耿于怀, 这几天终于忍不住收拾了下.

svn处理merge是用的diff3, 顺利合并就返回0, 合并错误就给出选项询问如何解决. 传统的外部工具处理方式也是从这里hook, 比如kdiff3, 先合并, 顺利合并就往下走, 合并错误就出一个用于merging的界面给你编辑, 手动处理后返回0退出.

但是vim并没有实现diff3, 所以hook这里并不合适. 还好, 1.5版的svn引入了交互式的冲突解决方式, 其中有用外部工具处理冲突的”l”. 和你写diff3的wrapper脚本不同的是, 这个只有在diff3不能顺利处理合并的时候才会启动, 容易处理得多, 只需要写个很简单的脚本, 然后将svn配置里的merge-tool-cmd指向它就好.

#!/bin/sh

# Configure your favorite merge program here.
MERGE="vim -d"

if [ -z $2 ]
then
	echo ERROR: This script expects to be called by subversion
	exit 1
fi

# Subversion provides the paths we need as the first, second, third
# and fourth parameters.
BASE=${1}
THEIRS=${2}
MINE=${3}
MERGED=${4}

# Call the merge command (change the following line to make sense for
# your merge program).
$MERGE $MERGED -c ":diffsplit $MINE" -c ":vertical diffsplit $THEIRS" \
	-c ":vertical diffsplit $BASE"

# Return an errorcode of 0 on successful merge, 1 if unresolved conflicts
# remain in the result.  Any other errorcode will be treated as fatal.
exit 0

Enjoy it.

Written by adam8157

January 24th, 2011 at 7:37 pm

Posted in Coding,Tips

Tagged with , ,

用Vim批量重命名

with 6 comments

今天发现了一个好玩儿的东西, Vim的插件, renamer.

使用方法很简单, 只要在目标文件夹下打开Vim, :Renamer就可以了, 它会把当前文件夹下的所有文件名放到Vim的buffer中, 然后你想怎么改怎么改, 改完了用:Ren使其生效.

我很喜欢这个插件, 同时推荐Vi控和键盘控试一下, 相信你不会后悔的.

PS: 据说, Emacs中dired的Immediate Edit File Names是一样的东西.

Written by adam8157

November 14th, 2010 at 8:39 pm

Posted in Tips

Tagged with , ,

Vim选项的Toggle

with 2 comments

今天想给Vim添加个Toggle行号显示的快捷键, 但自己写出来的函数怎么看怎么丑.

最后试着查了下手册, 结果再一次被Vim的强大震惊:

:se[t] {option}?        Show value of {option}. 显示该选项当前值

:se[t] {option}!   or
:se[t] inv{option}      Toggle option: Invert value. {not in Vi} 反转该选项的值

一行就搞定了…

" Toggle display line number
nnoremap <F10> :set number! number?<CR>

Written by adam8157

July 2nd, 2010 at 4:42 pm

Posted in Tips

Tagged with

vim中单个文件多个备份的实现

with 6 comments

经常备份绝对是个好习惯, 一个救过我很多次的好习惯.

编辑器我只用vim, vim也有自动备份的功能, 但是存在一个问题: vim默认一个文件只对应一个备份, 所以你只能回退一次, 再之前的版本就看不到了. 这是不够用的, 也是不可容忍的, 状况随时会发生, 我们需要对一个文件保存多个备份, 最好每次修改就备份一次, 而且都保存下来.

当然, vim有基于git等版本控制系统的备份插件, 个人觉得有点小题大做了, 有点麻烦, 而且使得vim的配置和插件目录显得臃肿, 跨平台能力也不强.

我的方案是靠vim自己来实现, 每次修改就保存一个备份, 备份的文件名中包含修改的时间以方便识别. 下面是我的配置: 1, 打开备份功能; 2, 设置备份目录; 3, 每次写缓冲之前设置备份文件的后缀格式为当前的”.月-日-时-分”. 默认后缀是”~”, 不存在变化, 所以只对应一个备份. 像我这样配置后, 最后的效果会类似这样: foo.c.5-15-17-30, foo.c.5-16-01-25.

" Turn backup on
set backup

" Set backup directory
set backupdir=$HOME/.vim/backup

" Keep more backups for one file
autocmd BufWritePre * let &backupext = strftime(".%m-%d-%H-%M")

最后, 我想说, 完了, 谢谢.

Written by adam8157

May 15th, 2010 at 7:23 pm

Posted in Tips

Tagged with ,

关于SVN的外部diff工具

without comments

公司的项目用的SVN, 也还好, 虽然慢点. 但是它的diff和merge实在是human-unreadable.

还好, SVN可以使用外部的diff工具, 例如vimdiff, 只要写个下面那样的脚本, 然后将svn的config中diff-cmd指向它就好.

另外关于diff3, 我的理解刚开始和svn的merge不同, svn实际上是将两个版本的差异变化实施到当前版本. 我想用vimdiff来实现, 最后cat合并后的本地版本以满足svn的要求, 但是一直有问题, 还差点在生产中出状况, 而且这个用的也不多, 所以暂时放下. 有那位大侠实现了vimdiff作为svn的diff3-cmd, 请一定告诉我, 联系方式见About.

#!/bin/sh

# Configure your favorite diff program here.
DIFF="vimdiff"

if [ -z $2 ]
then
    echo ERROR: This script expects to be called by subversion
    exit 1
fi

# Subversion provides the paths we need as the sixth and seventh
# parameters.
LEFT=${6}
RIGHT=${7}

# Call the diff command (change the following line to make sense for
# your merge program).
#$DIFF --left $LEFT --right $RIGHT
$DIFF $LEFT $RIGHT

# Return an errorcode of 0 if no differences were detected, 1 if some were.
# Any other errorcode will be treated as fatal.
exit 0

Written by adam8157

May 3rd, 2010 at 12:40 pm

Posted in Coding,Tips

Tagged with , ,

Vim配合xsel访问剪贴板

with 4 comments

有点累了, 明天还要去南湖, 但是还是贴一篇上来吧, 毕竟后天上班是要把博客通知各位同事的, 没有技术文章全是唠叨哪行啊?

话说我一直在虚拟终端下用vim的, 但是有个问题, 普通版本的vim无法访问中键和系统剪贴板, 这也不是大问题, 鼠标选就是了, 但是有时候需要和虚拟机交互, 要知道我这连leafpad都没装, 所有的编辑工作全是vim, 为了这么点事把vim的图形库装上实在是让我不爽.

好在, 有xsel, 用它配合vim就能访问中键和系统剪贴板, 洁癖狂和折腾狂再一次胜利了.

代码放在后面, 可以看到, 我把它们伪装成了*和+寄存器, 但是功能和原版的有差别, 只能先yank再复制到剪贴板, paste没问题. 至于为什么不用xclip, xclip会因为detach在关闭vim后失效, xsel却能避免, 虽然会产生一个错误log, 但是把这个log指向/dev/null就好.

PS: 各位大仙如果知道如何简单将区块传给命令而不是叹号filter这种形式, 一定告诉我.

" Use xsel to access the x clipboard
if $DISPLAY != '' && executable('xsel')
	nnoremap <silent> "*y :'[,']!xsel -i -p -l /dev/null<CR>u
	nnoremap <silent> "*p :r!xsel -p<CR>
	nnoremap <silent> "+y :'[,']!xsel -i -b -l /dev/null<CR>u
	nnoremap <silent> "+p :r!xsel -b<CR>
endif

——–Better Way——–

" Use xsel to access the X clipboard
if $DISPLAY != '' && executable('xsel')
	nnoremap <silent> "*y :'[,']w !xsel -i -p -l /dev/null<CR>
	nnoremap <silent> "*p :r!xsel -p<CR>
	nnoremap <silent> "+y :'[,']w !xsel -i -b -l /dev/null<CR>
	nnoremap <silent> "+p :r!xsel -b<CR>
endif

Written by adam8157

May 2nd, 2010 at 2:18 pm

Posted in Linux,Tips

Tagged with , ,