首页 > Linux > VIM复制粘贴的那些事

VIM复制粘贴的那些事

2011年9月7日 发表评论 阅读评论 16,122 人阅读过  

说起vim的复制粘贴一直是个比较困扰我的问题,之前一直用gvim,跟系统剪贴板之间的复制粘贴都没有问题,gvim毕竟还需要再开个窗口,麻烦,而且不如vim那样快捷,但vim里面最让我头痛的是复制粘贴问题,想把vim里面的内容复制到其它的地方貌似怎么也不行,粘贴进来的话免强可以,但格式可能会很乱,折腾来折腾去,今天先是发现了个往外复制比较蹩脚的办法:

:set mouse=v

这样鼠标就可以变成文本选择指针的样子,可以选择选择字体,然后点右键选复制,或者CTRL+SHIFT+C,但如果mouse=a这种模式下的话选择之后,右键的复制是灰色的,当然这种情况复制如果有行号的话行号也会被复制进去,所以在复制前先把行号关了,复制完再打开,这办法貌似也能凑合,但着实太不专业,而且太麻烦,远不如用gvim的“+y这种来得方便,“+y这个很多推友表示是可以的,但在我这里不可以,刚经@multiple1902指点,有可能是vim编译的问题。

查看了一下vim版本相关信息:

vim --version

发现clipboardxterm_clipboard这些选项都是不可使用的功能,这样看来果然是编译问题了,slackware讲求KISS,编译的时候没有加入该选项也可以理解,于是从vim官网svn上check下来源码(话说我为啥check下来的是7.2呢,难道7.3还没有stable…),重新编译。

编译的时候必须要选上的选项一个是–enable-multibyte,如果没加这个选项的话,中文应该就会乱码了。
另外关于剪贴板相关的选项,具体我也不清楚是哪一个,看了下几个相关的选项觉得最有可能是的是–enable-xim,只加了这两个选项之后编译完测试发现vim已经可以和系统剪贴板之间共享数据了,“+y可以使用了,世界一下子就清爽了很多,于是重新加完整选项编译:

./configure --prefix=/usr \
            --sysconfdir=/etc \
            --enable-tclinterp \
            --enable-pythoninterp \
            --enable-perlinterp \
            --enable-rubyinterp \
            --enable-cscope \
            --enable-multibyte \
            --enable-xim \
            --enable-gtk2-check \
            --enable-fontset \
            --with-x

OK,编译完成之后removepkg vim删掉之前slackware安装包中提供的vim,然后用makepkg打包安装,哎呀,说起包管理方式我还是最喜欢slackware的tgz包,虽然没有debian的apt那么华丽,但简洁就是美啊。

vim安装完之后已经可以用了,但存在一个问题,vim退出之后终端便会乱码,到网上搜了半天各种关于ubuntu下的解法,拿到slackware上来完全不适用,命令啦路径啦什么的根本找不到,最后搜到一个非常简单的解决办法,说是这个问题是因为gnome-terminal标题名称的不标准,我矁了一眼标题写着“终端”两个字,给出的解决办法是在前后各加一个空格,让系统让为它是英文,我直接把它改成了Terminal,然后再启动vim然后退出就没有问题了。

总算解决了我对于vim的怨念,一直以为是vim的问题,没想到竟然是slackware打包的问题。

原创文章,转载请注明: 转载自basic coder

本文链接地址: http://basiccoder.com/vim-copy-paste-related.html

分类: Linux 标签: ,
  1. 2011年9月7日16:58 | #1

    兩個原因了。
    一是 terminal emulator 的原因,猜測你用的是 gnome-terminal
    按下 CTRL+SHIFT+C 這樣的,只是 terminal emulator 的複製,所以選到哪裏複製到哪裏。vim 對於這種「複製」是不知情的。
    然後按下 CTRL+SHIFT+V 的話,也是 terminal emulator 的粘貼,只是把對應的按鍵序列傳遞給正在執行的程式。
    對於 vim 來說,也是不知情的。粘貼時,對於 vim 來說,僅僅是用戶按了一串鍵,所以就會出現一些「格式錯亂」的情況。
    舉個列子,如果開啓了自動縮進。那麼要讓
    for (int i=0; i<=10; i++){
    printf("hello\n");
    printf("world\n");
    }
    「粘貼」到 vim 中而格式正確的話。原來的文字必須是
    for (int i=0; i<=10; i++){
    printf("hello\n");
    printf("world\n");
    }
    才行,第一行,縮進 0+2 格,第二行,縮進 2+2 格,第三行,縮進 4+0 格,第四行,縮進 4-2 格。
    這樣在 vim 中就會顯示成「格式正確」了。

    二是 vim 的原因了,也就是要編譯進 X 的支援。才能使用 + 暫存器,用於讀寫 clipboard. 你已說到。

  2. 2011年9月7日17:02 | #2

    呃,這個 blog 系統的回覆功能太糟了,前面的空格都沒了。
    for (int i=0; i<=10; i++){
    printf(“hello\n”);
    printf(“world\n”);
    }

    然後

    for (int i=0; i<=10; i++){
    printf(“hello\n”);
    printf(“world\n”);
    }

  3. 2011年9月7日17:03 | #3

    算了,您把我的回覆刪了吧

  4. 2011年9月7日18:34 | #4

    @kandu
    没事,我明白你的意思,博客是wordpress搭的,评论回复确实不是很友好

  5. 2011年9月8日23:41 | #5

    vim在终端里用鼠标右键就可以复制粘贴

  6. 2011年9月26日09:53 | #6

    我用arch,clipboard和xterm_clipboard两个选项是可用的,但用”+P粘贴时中文会乱码,用”*P一切正常,为什么呢? :smile:

  7. Terry
    2011年12月16日00:27 | #7

    确实默认不是同一个剪贴板,但还是可以找到解决办法的。vim往外复制可以去掉行号后鼠标选择,鼠标中键粘贴到外部;外部内容复制到vim时需在vim中设置 set paste,否则会自动缩进,格式发生变化

  8. nick_lhy
    2011年12月21日20:13 | #8

    可以看看VIM的手册,VIM剪贴板有很多个,默认y复制的和系统见贴板不是一个,如果选择系统剪贴板就木有问题了

  9. 2012年4月16日16:49 | #9

    很好。不过对于ssh远程连接的还是没有办法,不知道有没有其他的手段

  10. nash635
    2012年6月5日00:35 | #10

    关于vim的粘贴格式变乱的问题,我一般直接敲 :set paste

  11. 2012年11月26日10:42 | #11

    粘帖格式错乱的问题,可以看这里:http://www.cbug.org/2012/07/23/vim-copy-paste.html

    粘帖出现乱码的问题,我也是今天才遇到,以前都是正常的,可能是升级了一次系统就这样了。

注意: 评论者允许使用'@user空格'的方式将自己的评论通知另外评论者。例如, ABC是本文的评论者之一,则使用'@ABC '(不包括单引号)将会自动将您的评论发送给ABC。使用'@all ',将会将评论发送给之前所有其它评论者。请务必注意user必须和评论者名相匹配(大小写一致)。