如何将yank寄存器发送到外部命令

时间:2012-10-22 20:04:23

标签: macos vim tmux

我想创建一个样式命令/宏来粘贴我当前未命名的yank寄存器(如果必须的话,还是特定的一个)到外部命令。

我目前的用例是将线路发送到剪贴板。虽然将来我想使用相同的技术将文本发送到其他程序。

对于剪贴板,作为Mac用户,我通常只会将*添加到我的剪贴板,但我也是Tmux用户,所以这不起作用。我必须使用reattach-to-user-namespace命令。我想要发生的是将yank注册号输出到reattach-to-user-namespace -l bash -c pbcopy

2 个答案:

答案 0 :(得分:0)

如romainl所述,通过将命令空间命令放在tmux.conf中,您不需要执行此操作,但如果您确实希望将寄存器的内容通过管道传输到外部命令,则可以使用{{1}检索其内容并getreg()执行命令。例如......

exe

答案 1 :(得分:0)

如果你通过reattach-to-user-namespace包装器启动shell(正如我在包装器的文档中所描述的那样),他们所有的孩子都将被附加到用户引导程序命名空间,因此你不必在你的shell中使用它个人致电(例如)pbcopypbpaste

或者,您可以通过包装器运行Vim的实例,以使其(及其子级)访问引导程序命名空间。这样,您应该能够使用*寄存器(如果您使用+clipboard功能编译Vim 7.3,即除了OS X附带的Vim之外几乎任何Vim版本。)< / p>

reattach-to-user-namespace vim …
# use "* inside Vim to access the OS X clipboard.

如果你真的想避免运行包装器,除了需要它的最终进程(例如pbcopy),那么你可以使用Vim的system()函数。这也是您通常将一些内部到Vim数据发送到任何(非交互式)外部命令的方式:

:call system('reattach-to-user-namespace pbcopy', getreg(''))

您可能希望将其打包为新命令(以便您可以更轻松地将其用于不同的寄存器):

command -bar -register Pbcopy call system('reattach-to-user-namespace pbcopy', getreg(<q-reg>))

这个新命令可以像这样使用(参数是寄存器名称):

:Pbcopy "
:Pbcopy a

您可以更进一步,制作一个调用命令的映射:

nnoremap <F3> :<C-u>execute 'Pbcopy ' . v:register<CR>

您可以通过键入 F3 a F3 来使用它(即使用寄存器前缀,如任何其他寄存器使用,普通模式命令。)