我从 Vim 外部复制文本。⌘V 在其他应用程序中粘贴文本没有问题。在 MacVim 中,它不起作用。
在插入模式下,什么都不会出现。在正常模式下,我得到E353: Nothing in register +
. set clipboard=unnamed
开启或关闭时会发生这种情况。
奇怪的是,这以前有效。怎么了?
如果您使用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"