vim的paste

args posted @ 2011年9月13日 14:08 in vim with tags vim 折腾 , 2557 阅读

今天群里突然讨论起vim来,我当然兴致勃勃的跟着参与。

有人抱怨说vim的copy&paste很莫名其妙。复制的时候如果内容带换行vim的行为会很奇怪。比如:

1
2
3
-----file1.txt-------

a
b
c
------file2.txt--------

如果在windows的gvim下复制file1的第二行,也就是2^y的话,在file2下paste产生的情况是:

a
2
b
c

的确很奇怪,不过分析行为,可以立即确定这是windows下的paste映射成了P,也就是向前黏贴。

如果只用p呢?那么情况就变为

a
b
2
c

这当然符合我们的预期,不过有的时候我想要产生这样的结果怎么办?

a
b2

c

在vim下折腾发现,如果行末带换行,paste的行为会以行为单位进行黏贴,比如p就会把要拷贝的内容插入到当前行下面,而P则插入到上面。而行不带换行,则会插入到行内光标处的前后。也就是vim对不同的内容会产生不同的paste行为,那么如何改变默认的行为呢?

为了这个问题一下午就搭进去了@_@

总结出来的结论就是vim用寄存器来保存拷贝的内容,当使用y命令的时候vim会根据当前的动作设置寄存器的类型。寄存器一共有三种类型,c(字符型) l(行型)b(块型),比如用V复制的行会导致相应寄存器变为l型,而v会导致寄存器变c型。不同的类型就导致前面不同的黏贴行为。

下面是几个相关的函数,regset,getregtype,getreg,通过他们就能动态的改变寄存器的类型,从而产生符合自己要求的行为。

期间群里一位大大发了个地址,才知道vim是寄存在googlecode上的,以后也可以比较方便的翻阅source的change啦~

  • 无匹配

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter