在启用 set mouse=a 的情况下复制 Vim 外部的文本
Posted
技术标签:
【中文标题】在启用 set mouse=a 的情况下复制 Vim 外部的文本【英文标题】:Copying text outside of Vim with set mouse=a enabled 【发布时间】:2011-06-04 05:40:29 【问题描述】:启用set mouse=a
后,复制到 Vim 内部的文本不会粘贴到 Vim 外部。有人知道解决这个问题的方法吗?
在这里,用鼠标选择文本会打开可视模式并禁用弹出菜单中的Copy
选项:
【问题讨论】:
如果你的 vim 是用+clipboard
和 mouse=a
编译的,你将能够在不使用终端弹出菜单的情况下从 vim 复制/粘贴。您可以使用vim --version
检查clipboard
是否启用。
@Jezz 值得澄清 A)mouse=a
不是编译选项,它是 vimrc 中的东西 B) 当 vim 使用 +clipboard
编译时,它允许您在 :set number
开启时复制/粘贴,并且无需复制/粘贴数字,尽管您可能仍然需要进行一些映射 C) 不必自己重新编译 VIM,它可能在 vim 中的某些包管理器上由任何操作系统支持.. 在 osx 上, brew 的 vim 有它,而 osx 的默认 vim 没有。我的回答提到了这个 re osx。
也许安装xsel
也适合你,你可以用编辑器或鼠标选择文本并点击ctrl+c
复制文本,顺便说一下对于neovim,github.com/neovim/neovim/issues/7945#issuecomment-361970165
【参考方案1】:
一个值得添加的好解决方法:
可以使用GPM
守护进程,它是a cut and paste utility and mouse server for virtual consoles
。它将提供跨所有虚拟控制台的功能!
复制粘贴操作可以由<CTRL-C>/<CTRL-V>
完成。
sudo apt-get install gpm
MAN pages of GPM
【讨论】:
【参考方案2】:另外值得一提的是,通过set mouse=nvi
,在进行选择时,然后按:
<ESC>
,您会将鼠标选择复制到主选择剪贴板(相当于"*y
)。
参考:help mouse
这种方法的主要优点是如果你有多个垂直分割,它只会从当前缓冲区中选择。使用主要答案中提到的<Shift>
,在这种情况下,将同时从所有 3 个文件中复制,这并不是人们想要、期望或需要的。
【讨论】:
【参考方案3】:将set clipboard=unnamed
添加到您的.vimrc
。所以它会使用剪贴板寄存器 '*' 而不是未命名的寄存器来进行所有 yank、delete、change 和 put 操作(注意它不仅会影响鼠标)。
寄存器“*”的行为取决于您的平台以及您的vim
的编译方式(或者如果您使用neovim
)。
如果不起作用,您可以尝试使用set clipboard=unnamedplus
,但此选项仅在 X11 系统(以及 gvim)上有意义。
【讨论】:
【参考方案4】:在进行视觉选择后使用 "、+、y。无论如何,您不应该使用终端的复制命令,因为那样复制终端看到的内容而不是实际内容。这是这样做的:
",+ 告诉 Vim 使用名为+
的寄存器进行下一次删除、拉拽或放置操作。名为 +
的寄存器是一个特殊寄存器,它是X11 剪贴板寄存器。(在其他系统上,你会使用 *
代替,我认为,请参阅 :help clipboard
和 :help x11-selection
)
y 是 yank 命令,它告诉 Vim 将选择放入先前命名的寄存器中。
你可以这样映射它:
:vmap <C-C> "+y
然后用鼠标突出显示某些内容并按 Control-C 复制它。
此功能仅在 Vim 使用 +xterm_clipboard
选项编译时有效。运行vim --version
看看是否有。
【讨论】:
或者"*y
取决于操作系统。
成功了!但是,组合非常复杂,实际上是 4 个按钮。可能我需要映射另一个,同时使用另一个答案的“shift”方式。
映射工作也非常好:) 现在我不知道我应该将你们的哪个答案标记为已接受:)
对我来说,这是一个比接受的答案更好的解决方案,因为使用这种方法,行号不会被复制。
+clipboard
怎么样?那么+clipboard
和xterm_clipboard
关闭呢?【参考方案5】:
在选择复制和粘贴时按住 shift 对我有用
【讨论】:
这是the accepted answer 所说的。为了感谢用户 - 一旦您拥有这样的声誉,您就可以为他们的帖子投票。【参考方案6】:编译 vim 时使用的编译设置是问题的一部分。 vim --version
显示这些。
在 OSX 中,默认的 vim 有 -clipboard
但你需要 +clipboard
在 osx 上,您可以并且显然通常应该使用 macvim。你可以做brew cask install macvim
那个有+clipboard
。
你将拥有两个 vim。
~$ ls -l /usr/bin/vim <--- default vim
-rwxr-xr-x 1 root wheel 1745984 15 Jul 2017 /usr/bin/vim
~$ ls -l /usr/local/bin/vim <-- macvim, installed recently via that mentioned brew line.
lrwxr-xr-x 1 apple admin 42 16 May 23:32 /usr/local/bin/vim -> /Applications/MacVim.app/Contents/bin/mvim
~$
运行 vim 将运行 macvim 'cos /usr/local/bin
应该在路径中的 /usr/bin
之前,尽管您可以检查 which vim
。
运行 vim(运行 macvim)很好,但您可能希望将 vi 映射到 macvim '因为否则运行 vi 将停留在默认 vim!您可以使用 ln 重写或删除(使用 rm)并重新创建 vi 符号链接。并且要在没有“不允许操作”错误的情况下执行此操作,您必须(暂时)禁用 SIL。https://apple.stackexchange.com/questions/208478/how-do-i-disable-system-integrity-protection-sip-aka-rootless-on-macos-os-x。
macvim 有+clipboard
如vim --version
所示
这是一个有效的~/.vim/vimrc
,只有所需的行。
:set mouse=a
:map <leader>c "+y
:map <leader>v "+p
默认的领导键是反斜杠。
我读了一个建议,应该使用领导键..(当然控制已经使用了很多键,所以建议不要使用控制。我不知道这是否也适用于命令键,但无论如何)。
使用提到的映射,\c
将执行 "+y
,这将从称为 + 的寄存器复制到剪贴板。而\v
将从称为 + 的寄存器中粘贴。
所以这是在窗口之间工作的复制/粘贴。
另一个操作系统可能需要"*
而不是"+
【讨论】:
两个 vim 都有-xterm_clipboard
。也许+xterm_clipboard
在某种程度上会有所帮助,但对这个解决方案并不重要。【参考方案7】:
我不小心解释了如何关闭set mouse=a
,当我重新阅读问题并发现 OP 一开始不想关闭它时。无论如何,对于任何搜索如何集中关闭鼠标 (set mouse=
) 的人,我在这里留下我的答案的参考:https://unix.stackexchange.com/a/506723/194822
【讨论】:
【参考方案8】:嗯... 按住 Shift 然后单击鼠标右键
【讨论】:
【参考方案9】:您可以在 vim 命令行中使用 :set mouse&
来启用使用鼠标选择的文本的复制/粘贴。然后,您可以简单地使用鼠标中键或 shiftinsert 来粘贴它。
【讨论】:
然后,当您拥有:set number
时,它会突出显示数字。所以不太好。所以你撤消了set mouse=a
所做的好事【参考方案10】:
在 OSX 上使用 fn 而不是 shift。
【讨论】:
使用option
密钥为我工作,这在 MacOS 主机上等效于 alt
密钥。它是 debian9 上的远程终端。在远程的/etc/vim/vimrc
中添加set mouse=a
/ set mouse=r
均无效。【参考方案11】:
在 .vimrc 中使用 set mouse=r
代替 set mouse=a
【讨论】:
但它禁用滚动 请说出原因。乍一看,这似乎与完全禁用鼠标模式基本相同,这不是问题的重点。 @Mikel 对,看看我的回答,还有 Josh Lee 的回答可能会有所帮助 不幸的是,如果启用,这也会复制行号。【参考方案12】:另一个 OSX-Mac 选项是取消选中 View->Allow Mouse Reporting
(或按 ⌘-R 切换它。)这允许您在鼠标交互和鼠标选择之间切换,这在选择和复制/粘贴一些位时可能很有用因为您不必按住修饰键即可。
带有行号的多行注释:
我通常启用行号,因此如果您选择多行,这也会复制行号。如果您想复制多行而没有行号,请使用:set nonu
禁用数字,然后您可以在复制完成后:set nu
重新启用它们。
【讨论】:
【参考方案13】:在用鼠标选择的同时按 shift。这将使鼠标选择的行为就像 mouse=a
未启用一样。
注意:这个技巧也适用于“中间按钮粘贴”:如果你想粘贴在外面选择的 vim 文本,点击中间按钮的同时按 shift .只需确保在执行此操作时激活了插入模式(您可能还想:set paste
以避免意外影响)。
OS X (Mac): 选择时按住 alt/option (source)
【讨论】:
好的,这确实是解决方案。但是,如果您想选择很多超出屏幕范围的代码怎么办? (然后你必须同时滚动和选择) 还有一个使用块选择的选项,按 ctrl + shift + 鼠标左键开始块选择。鼠标中键将复制的内容粘贴到其他窗口。 如果您有行号(如屏幕截图所示),那么在 Mac OS X 上使用 ALT 选择时,行号也会被复制。在这种情况下,最好在选择块选择模式时使用 ALT + CMD,这样您就可以避免选择数字。 对于 Mac 终端,在 OS X 10.11 El Capitan 之后,Fn
键是正确的方法。即(启用mouse=a
)在按下Fn
键的同时选择文本,然后使用CMD + C 复制并粘贴到您想要的任何位置。
我不知道这个答案怎么会有这么多赞成票。如果你启用了鼠标支持to avoid copying line numbers,那么这个建议完全没用。【参考方案14】:
在 ESC 模式下,当设置 mouse=a 时,使用鼠标选择文本。这将启用 vim 中的可视模式。然后,您可以按“y”拉出选定的文本,按“p”将其粘贴到您想要的任何位置。这只发生在 vim 中。
【讨论】:
不,当您在 vim 之外粘贴时,这将不起作用【参考方案15】:如果您使用的是 Putty 会话,那么它会自动复制选择。 如果我们在 vim 中使用了“set mouse=a”选项,使用 Shift+鼠标拖动选择会自动选择文本。 需要检查 X-term。
【讨论】:
【参考方案16】:在 Ubuntu 中,可以在使用 Shift 键高亮显示的文本上使用 VIM 中的 X-Term 复制和粘贴绑定(Ctrl-Shift-C 和 Ctrl-Shift-V)。
【讨论】:
以上是关于在启用 set mouse=a 的情况下复制 Vim 外部的文本的主要内容,如果未能解决你的问题,请参考以下文章