我从Vim外面复制文本。其他应用中的⌘V可以毫无问题地粘贴文本。在MacVim中,它不起作用。
在插入模式下,不显示任何内容。在普通模式下,我得到E353: Nothing in register +
。当set clipboard=unnamed
开启或关闭时会发生这种情况。
奇怪的是,这之前就有用了。怎么了?
答案 0 :(得分:28)
如果您正在使用 tmux ,有时您最初通过mvim
命令行程序启动 MacVim ,那么您可能会遇到提示我的问题写reattach-to-user-namespace
command。
我的猜测是剪贴板访问在以前的场合工作,因为您碰巧通过“普通”GUI方法启动了 MacVim (例如Dock, Finder ,Spotlight,等等。)。在退出 MacVim 的先前实例并从 tmux 会话中通过(例如)mvim
重新启动后,剪贴板后来变得无法访问。
核心问题是在某些上下文中(即在 tmux 会话中)启动的程序最终会导致拒绝访问某些服务的环境(例如OS X粘贴板)。
初始发布是重要的一个。 mvim
- in- tmux 启动的新窗口(即使没有上面链接的包装器程序)只要先前启动了 MacVim ,就可以访问剪贴板“通过GUI”(可能还有一些 MacVim 窗口打开,或者你可能已配置 MacVim ,即使没有打开窗口也能继续运行)。相应地,要重新获得对剪贴板的访问权限,您需要关闭所有现有的 MacVim 窗口,退出应用程序,然后以可访问剪贴板的方式重新启动它(例如,通过GUI,或“在“包装器”里面。
一旦安装了上面链接的包装程序(它也可以通过MacPorts和Homebrew提供),您可以使用reattach-to-user-namespace mvim
之类的命令来确保如果它最终启动一个新的 MacVim 实例,然后该新实例将有权访问剪贴板。您可以使用别名,shell函数或脚本来确保始终“换行”mvim
。
其他几个命令也受益于“换行”(pbpaste
,pbcopy
,nohup
,launchctl
(取决于您使用的子命令)),因此您可以想要“包装”整个shell而不是单个命令。 “包装器”修改的进程环境的位由子进程继承,因此“包装”shell将影响从中运行的大多数命令。如果您使用的是 tmux ,则可以将default-command
配置为自动“包装”您的默认 tmux shell:
set-option -g default-command "reattach-to-user-namespace -l zsh"