在 Vim 中同时写入两个寄存器
Posted
技术标签:
【中文标题】在 Vim 中同时写入两个寄存器【英文标题】:Write to two registers at the same time in Vim 【发布时间】:2012-12-20 10:39:12 【问题描述】:我正在使用:
set clipboard=unnamed
这样剪切和复制的选择会转到*
寄存器,该寄存器方便地链接到x
剪贴板(我使用的是Linux)。
我也想将它放在+
寄存器中,以便在其他应用程序中同时获得鼠标中键粘贴和 Ctrl-V 相同的结果。我想这可能与xclip
和xclip -selection c
之间的区别有关。
目前我的解决方法是:
noremap Y "+y
这样我就可以通过Yy
将当前行复制到+
寄存器,然后在某些应用程序中使用 Ctlr-V。但是我得提前想好我是用鼠标还是Ctrl-V。
有没有办法让+
和*
寄存器在我拉动或用鼠标选择一些文本时具有相同的值?
【问题讨论】:
可能类似于noremap Y ygv"+y
的内容,将其复制到unnamed
剪贴板,然后将其保存到+
剪贴板。
如果这对您有用,请说出来,以便我将其放入答案中,您可以接受。 :)
所以,有趣的是, :map Y "+ygvy 有效,但反过来不行.. 你认为我可以将它映射到 y 吗?我怎样才能使它与鼠标选择一起工作也一样(即只选择一些文本,不按任何东西,然后用这两种方法粘贴到其他地方?
这当然很有趣。哈哈。我会把这个放在一个答案中。 :)
【参考方案1】:
我想你想要
:set clipboard+=unnamed,unnamedplus
来自帮助:
unnamedplus 使用剪贴板的“未命名”标志的变体 注册 '+' (|quoteplus|) 而不是注册 '*' 除 yank 之外的所有操作。 Yank 应复制文本 进入寄存器“+”,当“未命名”时也进入“*” 包括在内。
请注意,您需要一个相当新的 Vim 7.3(补丁级别 151?)来获取此选项值。
【讨论】:
哇!好一个英戈! @elmanuelito 如果可行的话可能会选择这个。 :) @ingo karkat,对不起,它似乎对我不起作用,我可能做错了。我做一个简单的 yy 或 dd 或 x,然后 :reg 和 "+ 和 "* 是不同的。我的 .vimrc 是空的,除了你的命令。 --- 我的 vim 版本:Vi IMproved 7.3(2010 年 8 月 15 日,2012 年 11 月 22 日 15:42:28 编译)包含的补丁:1-547 --- 这是我的剪贴板变量:clipboard=autoselect,exclude:cons\|linux ,未命名的,未命名的加号 我的 vim 可能太旧了,你确认吗? 版本应该没问题,但exclude:...
部分必须排在最后,如帮助中所述!
谢谢!排除确实放置得很糟糕。我没有在剪贴板帮助中找到未命名的加号和排除项。。到目前为止,它似乎做了我想要的,所以我会接受!【参考方案2】:
开箱即用,您可以安装autocutsel
,它可以同步两个剪贴板。
【讨论】:
这似乎是个好主意!虽然我认为如果我们需要添加一个额外的应用程序,它可能会不太有用,知道我的意思吗? 嘿 romainl,我不反对外部应用程序的想法,但我尝试过但没有成功。在 vim 之上,我尝试了 geany。 “autocutsel -s PRIMARY”似乎将 Ctrl-C 选择传播到“鼠标寄存器”和“Ctrl-V”之一。但相反的没有奏效。使用 vim,当使用鼠标粘贴时,某些东西会起作用,但在其他应用程序中使用某些 ctrl-V(或右键单击粘贴)则不会。我尝试了没有选项的“autocutsel”,也没有成功。我在两者之间关闭了 X-apps,但没有关闭 x-server @eduan、autocutsel
,或者更确切地说,它提供的同步功能,可以在任何地方使用。除了 Vim 之外,我还使用了很多程序,并且让所有“粘贴”方法粘贴相同的东西确实很有用。
@romainl 啊,我明白了。好吧,我想我肯定会检查出来。 :)
嗯,对不起。我已经让它运行了很长时间,我认为它像宣传的那样工作,但事实并非如此。但是我运行了另一个程序,它以可靠的方式运行:Glippy。此外,set clipboard^=unnamedplus
应该做你想做的事,但它并不是在每个版本中都可用,所以 YMMV。【参考方案3】:
正如 cmets 中所讨论的,这里有一个解决方案:
vnoremap Y ygv"+y
但是这不起作用,只能反过来:
vnoremap Y "+ygvy
它的作用如下:
noremap Y
:映射到 Y 键,使用键绑定的默认行为。 :h noremap
"+y
:拉入+
寄存器。gv
:重新选择以前的视觉选择。y
:正常拉入*
寄存器(在 Linux 中) )。
很高兴能够帮助您解决问题。 :)
【讨论】:
@elmanuelito 记住接受答案,这样这个问题实际上就结束了。 :) 嗨,Eduan,对不起,但经过一些测试,它并不像预期的那样。我真的很希望这两个寄存器总是相等的。诸如将“y”映射到执行此操作的vim函数之类的东西。使用我以前的解决方法,我可以做“Yy”或“Yi”。使用您的解决方案,它仅适用于选择。抱歉,我之前没看到。并且必须用“y”而不是“Y”来做到这一点,并且让它也只适用于鼠标选择...... @elmanuelito 如果它只适用于选择,那么可能值得在noremap
之前添加v
,我编辑了答案以反映这一点。稍后当我可以使用 Vim 访问计算机时,我将尝试烘焙一个简单的函数来执行此操作,同时您可以使用以前的解决方案。 :)
@elmanuelito 我只需要一点信息。我想你会使用y<motion>
对吗?
我的主要用途是:yy , yi 最后,做出选择然后按y以上是关于在 Vim 中同时写入两个寄存器的主要内容,如果未能解决你的问题,请参考以下文章