12

我从 Vim 外部复制文本。⌘V 在其他应用程序中粘贴文本没有问题。在 MacVim 中,它不起作用。

在插入模式下,什么都不会出现。在正常模式下,我得到E353: Nothing in register +. set clipboard=unnamed开启或关闭时会发生这种情况。

奇怪的是,这以前有效。怎么了?

4

1 回答 1

28

如果您使用tmux并且有时您最初是通过命令行程序启动MacVimmvim,那么您可能会遇到提示我编写reattach-to-user-namespace命令的问题。

我的猜测是剪贴板访问在以前的情况下有效,因为您碰巧通过“普通”GUI 方法(例如,dock、Finder、Spotlight 等)启动了MacVim 。在您退出先前的MacVim实例并通过(例如)从tmux会话内部重新启动它之后,剪贴板后来变得无法访问。mvim

核心问题是在某些上下文中启动的程序(即在tmux会话中)最终会进入一个拒绝它们访问某些服务的环境(例如 OS X 粘贴板)。

首次发布是这里重要的一次。mvim由-in- tmux启动的新窗口(即使没有上面链接的包装程序)应该可以访问剪贴板,只要MacVim之前是“通过 GUI”启动的(也许仍然有一些MacVim窗口打开,或者你有MacVim配置为即使没有打开窗口也能继续运行)。相应地,要重新获得对剪贴板的访问权,您需要关闭所有现有的MacVim窗口,退出应用程序,然后以可以访问剪贴板的方式重新启动它(例如,通过 GUI 或“内部”包装器)。

一旦你安装了上面链接的包装程序(它也可以通过 MacPorts 和 Homebrew 获得),你可以使用一个命令reattach-to-user-namespace mvim来确保如果它最终启动一个新的MacVim实例,那么这个新实例将可以访问剪贴板. 您可以使用别名、shell 函数或脚本来确保始终“包装”<code>mvim。

其他几个命令也受益于“包装”(pbpaste, pbcopy, nohup, launchctl(取决于您使用的子命令)),因此您可能希望“包装”整个 shell 而不是单个命令。“包装器”修改的进程环境部分由子进程继承,因此“包装”您的 shell 将影响您从中运行的大多数命令。如果您使用的是tmux,您可以将您的配置default-command为自动“包装”您的默认tmux shell:

set-option -g default-command "reattach-to-user-namespace -l zsh"
于 2013-05-21T03:49:27.013 回答