zoukankan      html  css  js  c++  java
  • 解决vim中鼠标右键无法复制的问题

    转:http://www.cnblogs.com/jianyungsun/archive/2011/03/19/1988855.html

    这是我的vim配置文件:jeffy-vim-v2.4.tar

    添加了ctrl+c和ctrl+v,实现与系统剪贴板的交互,添加了F12在paste和nopaste之间切换。

    Vim作为最好用的文本编辑器之一,使用vim来编文档,写代码实在是很惬意的事情。每当学会了vim的一个新功能,就会很大地提高工作效率。有人使用vim几十年,还没有完全掌握vim的功能,这也说明了vim的强大。而这样何尝不是一件好事呢,只要有的学习,就有的提高。

    最近使用Vim来写博客,发现在Vim中粘贴Python代码后,缩进就全乱了。仔细研究了以下,原来是自动缩进的缘故,于是做如下设置: 

    :set noai nosi

    取消了自动缩进和智能缩进,这样粘贴就不会错行了。但在有的vim中不行,还是排版错乱。

    后来发现了更好用的设置:

    :set paste

    进入paste模式以后,可以在插入模式下粘贴内容,不会有任何变形。这个真是灰常好用,情不自禁看了一下帮助,发现它做了这么多事:

    • textwidth设置为0
    • wrapmargin设置为0
    • set noai
    • set nosi
    • softtabstop设置为0
    • revins重置
    • ruler重置
    • showmatch重置
    • formatoptions使用空值

    下面的选项值不变,但却被禁用:

    • lisp
    • indentexpr
    • cindent

    怪不得之前只设置noai和nosi不行,原来与这么多因素有关!

    但这样还是比较麻烦的,每次要粘贴的话,先set paste,然后粘贴,然后再set nopaste。有没有更方便的呢?你可能想到了,使用键盘映射呀,对。我们可以这样设置::

    :map <F10> :set paste<CR>
    :map <F11> :set nopaste<CR>

    这样在粘贴前按F10键启动paste模式,粘贴后按F11取消paste模式即可。其实,paste有一个切换paste开关的选项,这就是pastetoggle。通过它可以绑定快捷键来激活/取消 paste模式。比如::

    :set pastetoggle=<F11>

    这样减少了一个快捷键的占用,使用起来也更方便一些。

    但,这是最方便的吗?Vimer们对高效的追求永无止境。还有其他更好地方法吗?

    你可能想到了,vim寄存器。对,使用vim寄存器 “+p 粘贴即可。根本不用考虑是否自动缩进,是否paste模式,直接原文传递!:

    "+p

    nmap <C-v> "+p

    要说vim寄存器,就要从vim文件间的复制粘贴说起。

    Vim中,若要复制当前行,普通模式下按 yy 即可,在要粘贴的地方按 p 。这是vim将复制内容保存到了自己的寄存器中的缘故。如果在其他地方执行yy,新的内容将覆盖掉原寄存器中内容。如果想保存原寄存器中内容而同时增加新的内容呢?这时就要在yy前增加标签了。标签以双引号开始,跟着的是标签名称,可以是数字0-9,也可以是26个字母,然后就是复制操作,这样就把复制内容保存到该标签寄存器里。通过下面命令显示所有寄存器内容::

    :reg

    其中注意两个特殊的寄存器:”* 和 “+。这两个寄存器是和系统相通的,前者关联系统选择缓冲区,后者关联系统剪切板。通过它们可以和其他程序进行数据交换。

    备注:

    若寄存器列表里无”* 或 “+ 寄存器,则可能是由于没有安装vim的图形界面所致。Debian/Ubuntu下可以通过安装vim-gnome解决。

    $ sudo apt-get install vim-gnome

    选择缓冲区和系统剪切板啥子区别?让我们继续研究。

    选择缓冲区和剪切板

    不同于Windows,Linux系统里存在两个剪切板:一个叫做选择缓冲区(X11 selection buffer),另一个才是剪切板(clipboard)。

    选择缓冲区是实时的,当使用鼠标或键盘选择内容时,内容已经存在于选择缓冲区了,这或许就是选择缓冲区的由来吧。

    使用下面的命令查看选择缓冲区的内容::

    $ xclip -out

    如果没有xclip命令,Debian/Ubuntu下可以通过如下命令安装::

    $ sudo apt-get install xclip

    可以使用鼠标中键或键入Shift+Insert来粘贴选择缓冲区的内容。但对于有些GUI程序,比如gedit,只能通过鼠标中键调用选择缓冲区的内容,使用Shift+Insert的话,调用的是剪切板的内容。

    剪切板和Windows的剪切板类似,在选择文字内容后,执行Ctrl + c或在菜单里选择‘复制’的话,这时内容才存放到剪切板里。

    使用下面的命令查看剪切板的内容::

    $ xclip -out -sel clipboard

    而使用剪切板的内容,则是Ctrl+v。 但在有些情况下,比如gnome-terminal,不能直接使用Ctrl+c,Ctrl+v,这时就要用Shift+Ctrl+c,Shift+Ctrl+v代替。

    原格式粘贴

    好了,了解了选择缓冲区和剪切板,下面就是实现保留格式粘贴的完美解决方案:

    • 方案一:
    1. 选择文本内容
    2. vim普通模式下按 “*p 将选择缓冲区中内容粘贴进来
    • 方案二:
    1. 复制文件内容
    2. vim普通模式下按 “+ p 将剪切板内容粘贴进来

    这时,如果要复制的内容也是vim编辑器中的内容,那么如何复制才更方便呢?

    vim中的复制

    vim有一个可视模式(Visual Mode),在此模式下可以选择区域。可以在普通模式下键入v进入可视模式,也可以个性化一点,键入V进入行可视模式,或者键入Ctrl+v进入列可视模式。这时移动光标就可以选择内容了。注意这时被选内容已经实时保存于选择缓冲区了,当然你也可以键入”+y将此内容也保存到剪切板里,或者”ay将内容保存到标签为a的寄存器中。但要知道,只有前两个中的内容可以在其他程序中使用,而a寄存器中的内容只能在该vim编辑器内使用。

    也可以通过鼠标来复制。这里首先要打开鼠标模式。:

    :set mouse=a

    这样在普通模式下可以直接使用鼠标选择区域复制到选择缓冲区。但这种情况下不能复制到剪切板。

    若要使用鼠标复制内容到剪切板,则需要做如下设置::

    :set mouse=v

    这种情况下,除了可以像上面一样直接使用鼠标选择区域复制到选择缓冲区以外,还可以在右键菜单中选择“复制”来保存到剪切板里。但新问题又出来了。若显示行号,也会将行号一并选择。你会想到,这好办呀,如果不需要行号的话,在复制前,先执行set nonu来取消行号显示呗。

    其实没必要这样,如果不需要复制行号的话,用在可视模式下用键盘来选择不就可以吗?

    并且,从上面的讨论,我们不难得出,使用选择缓冲区比使用剪切板要方便的多,可以节省很多步骤。

    所以,最终我们得到了vim文件间复制粘贴的完美方案,文件传输的中转使用选择缓冲区。

    vim文件间复制粘贴完美方案

    1. 在~/.vimrc中增加如下一行::

      set mouse=v
    2. 复制内容到选择缓冲区。

      • 带行号时,使用鼠标选择内容区域。
      • 不要行号,使用 “*yny 复制n行或可视模式下选择。
    3. 将选择缓冲区中内容粘贴到vim文件:普通模式下按 “*p 。


    补充:

    设置vim中默认使用选择缓冲区寄存器 “*:

    set clipboard = unnamed

    则可以直接通过y,p和系统选择缓冲区进行数据交换。

    ======================================================================================

    这个问题的原因应该是你的vim修改了配置文件,增加了下面这一句

           set mouse=a;

        vi的三种模式:命令模式,插入模式,可视模式.鼠标可以启动于各种模式中:
    The mouse can be enabled for different modes:
    n       Normal mode
    v       Visual mode
    i       Insert mode
    c       Command-line mode
    h       all previous modes when editing a help file
    a       all previous modes
    r       for |hit-enter| and |more-prompt| prompt

        加了这句后,在vim中就开启了在所有模式下的鼠标右键功能,这样就屏蔽了鼠标右键的复制功能

        我在网上看了大部分人的解决办法都是注释掉set mouse=a这句或者将其值赋为空,这样确实可以用右键复制了,但是下次vim写代码时就没有鼠标点哪光标到哪的功能了。所以这个方法还不是一个很好的解决方法。

           其实在vim里面可以通过其自带的寄存器(通俗点就是剪切板)功能来实现我们需要的复制功能。

           我们可以在vim下面选中一段文字(需退出编辑模式) 然后输入y,这样就把当前选中的文字复制到vim的临时寄存器(*号寄存器)中了,再在我们需要粘贴的地方输入“*p就可以将临时寄存器中的内容粘贴进来(也可以直接按鼠标中键)。我们可以通过:reg命令查看寄存器中的内容。

            补充:

                   如果输入”1y 就是将选中的内容复制到1号寄存器,”2y就是将内容复制到2号寄存器,粘贴“寄存器号p,例如:”1p,“2p;其中有两个寄存器比较特殊,一个是*,另一个是+,*也就是我们上面说的寄存器,在选中文字的情况下,直接按y,默认复制到*寄存器。

           下面我们来说这个+寄存器,当我们需要将vim里面的内容复制到别的地方时,假如是word中,就不能通过”1p将寄存器复制到word下面,因为word没有1号寄存器这种东西,它只是在vim下存在,这时我们就需要用到+寄存器了,因为+寄存器是和系统剪贴板相通的,也就是复制到#号剪贴板的内容也会同时存在与系统剪切板内,这下,我们可以通过“+y现将内容复制到系统剪切板上,然后直接在word里面右键粘贴或者ctrl+v就行了。

    =======================================================================================

    鼠标事件有两种处理方式,程序处理和 X 处理。

    如果 X 负责处理,则是左键选择,中间粘贴。

    要让 vim 中由 X 负责处理,有两个方法:

    1. 按住 shift 键,然后选择,此时由 X 处理该选择,copy 选项就 enable 了。如果放掉shift键,则由 vim 处理该选择。
    2. 在 .vimrc 中设置 set mouse= (就是说清空),此时vim永远不再干涉鼠标选择,永远把处理权交给 X,这个时候鼠标就处于无模式编辑状态, 当然也能用鼠标来切换vim里面的tab窗口了,vim中的编辑光标也不会跟随鼠标了。

    ====================================================================================

    shift+v然后选中几行之后,在当前模式下输入:"+y ,然后就可以粘贴到其他系统中了。

    Note

    注意

    上面输入的是:引号 加号 y

    不过这不够快捷,于是想到不如绑定一个快捷键,在vim中有以下几种按键绑定的模式:

    Note

    键盘映射模式

    • map : 正常模式,可视化模式和运算符模式可用
    • nmap :正常模式可用
    • vmap :可视化模式可用
    • omap :运算符模式可用
    • map! :插入模式和命令行模式可用
    • imap :插入模式可用
    • cmap :命令行模式可用

    因此,我只需要用vmap来绑定我要用的快捷键,绑定了ctrl+c:

    vmap <c-c> "+y
    

    这样就可以在vim里写博客,然后复制出来了。

  • 相关阅读:
    Optional int parameter 'resourceState' is present but cannot be translated into a null value
    创建第一个react项目
    后台接收参数报错 Required String parameter 'id' is not present
    sql查询条件参数为空
    斐波那契数列
    Map获取key值
    Java8之集合排序
    Android学习笔记(4)----Rendering Problems(The graphics preview in the layout editor may not be accurate)
    LeetCode赛题395----Longest Substring with At Least K Repeating Characters
    LeetCode赛题394----Decode String
  • 原文地址:https://www.cnblogs.com/pengdonglin137/p/3485062.html
Copyright © 2011-2022 走看看