1

我想制作一个样式命令/宏来将我当前的未命名的 yank 寄存器(或者如果我必须的话,一个特定的)粘贴到一个外部命令中。

我当前的用例是将行发送到剪贴板。尽管将来我想使用相同的技术将文本发送到其他程序。

对于剪贴板,作为 Mac 用户,我通常只会将其添加*到剪贴板,但我也是 Tmux 用户,所以这不起作用。我必须改为使用该reattach-to-user-namespace命令。我想要发生的事情是将 yank 寄存器通过管道输出到reattach-to-user-namespace -l bash -c pbcopy.

4

2 回答 2

0

正如 romainl 所说,通过将命名空间命令放在 tmux.conf 中,您不需要这样做,但如果您确实想将寄存器的内容通过管道传输到外部命令,您可以使用getreg()它来检索其内容并exe执行命令。例如...

:exe "!pipereg ".getreg('"')." | pbcopy"
于 2012-10-22T23:13:50.850 回答
0

如果您通过reattach-to-user-namespace包装器启动您的 shell(正如我在包装器文档中所描述的那样),它们的所有子级都将附加到用户引导命名空间,因此您不必在对 (eg)pbcopypbpaste.

或者,您可以通过包装器只运行您的 Vim 实例,以使其(及其子级)访问引导命名空间。那样的话,你应该可以使用*寄存器(如果你有使用该+clipboard特性编译的 Vim 7.3,即除了 OS X 附带的之外几乎任何版本的 Vim)。

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或来使用它"aF3(即带有寄存器前缀,就像任何其他使用寄存器的正常模式命令一样)。

于 2012-10-23T10:11:30.777 回答