9 27 2008

Vim在终端里中键粘贴问题

Published by muzuiget at 8:55 下午 under Vim

在Ubunut有个非常好使的功能,也就是选中一段文字,在别的地方按鼠标中键就能粘贴了,独立于快捷键Ctrl+C,Ctrl+V,那个剪贴板,或者说系统有2个剪贴板吧。刚才看书测试代码发现vim的一个很诡异的问题。

书上列出得脚本代码,我看得是电子版,我一般就是鼠标选中,然后在终端了运行vim,中键,然后保存退出加运行权限测试,发现代码老是跟书的结果不一样。如果用Ctrl+C复制,然后在vim里用“”+p”来粘贴却没有问题。奇怪啊,通过对比,前一个方法,代码开头那个变量名前面少了一个字符,导致结果不同了。

为什么vim会无端端把开头字符吃掉,用gedit中键粘贴同样的代码,没问题,在gvim里中键粘贴也没有问题,在终端命令行上粘贴也没问题,唯独在终端上运行vim中键粘贴才有问题。Google了一下,第一条就有答案,可能在终端上的vim对鼠标行为跟GUI的不同,粘贴的文本当成普通模式下的按键命令运行了,不信粘贴

this is a test text

看看,变成

s is a test text

所以最后粘贴得到的代码是第一个进入插入模式按键(比如“i”“a”)后的代码,之前一大堆代码少了没留意开头少了一个字母。

不知道算不算是bug,不过也不是大问题,注意一下就好了,切换到gvim或插入模式再中键粘贴。

6 Responses to “Vim在终端里中键粘贴问题”

  1. fvwmneton 06 10 2008 at 7:36 下午

    set paste

  2. muzuigeton 07 10 2008 at 8:03 下午

    @fvwmnet
    原来针对这种问题还有这个选项,Vim倒想得挺周到的。

  3. justsoron 13 10 2008 at 6:34 下午

    TO 楼主:
    应该切换到插入模式再粘贴才对,就像手动输入这么一句,也要先进入插入模式。楼主是把在其它的编辑器的习惯带到这里来了。

    另外 paste mode 应该只是disable了一些indent相关的设置,所以set paste也不会对楼主的问题有任何帮助。但粘贴一些已经格式化过(缩进等)的文档,特别是代码的时候,set paste特别有用。

    我常用的快捷键,在paste和正常模式下切换,status line会有提示。
    “Paste&&nopaste. Function and key map
    let PASTE=0
    :function Paste_mode_switch() abort
    : if g:PASTE==1
    : set nopaste
    : let g:PASTE=0
    : echo “in normal/nopaste mode”
    : else
    : set paste
    : let g:PASTE=1
    : echo “in Paste mode(disable indent related configuration)”
    : endif
    :endfunction
    nmap :call Paste_mode_switch()
    set pastetoggle=

  4. justsoron 13 10 2008 at 6:50 下午

    倒,怎么F3被吃掉了。

    最简单的办法
    :set pastetoggle=(F3)
    把圆括号()换为尖括号”"

    然后在insert mode时会有提示
    – INSERT (paste) –

  5. muzuigeton 14 10 2008 at 2:55 下午

    @justsor
    开始我挺郁闷的,如果不用“set paste”,粘贴确实会把缩进好的文本搞乱,根据你的提示,我也设置了一个键位映射,谢谢你的指教。
    PS:可能是WordPress过滤了尖括号,但可以分别用“&lt;”和“&gt;”代码来表示“<”和“>”。

  6. froonson 14 11 2008 at 3:42 下午

    这很正常吧,不是编辑模式还要粘贴?

Trackback URI | Comments RSS

Leave a Reply