【问题标题】:How to send yank register to external command如何将 yank 寄存器发送到外部命令
【发布时间】:2012-10-22 20:04:22
【问题描述】:

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

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

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

【问题讨论】:

  • 该命令应该添加到您的~/.tmuxconf:不需要管道。我相当肯定 "*y 在工作时在我的 Mac 上的 tmux 中工作。
  • 不是重复的帖子。我正在尝试将 yank 寄存器输出到外部命令。这次我想要pbcopy。将来我也会使用相同的命令来管道到ruby

标签: macos vim tmux


【解决方案1】:

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

:exe "!pipereg ".getreg('"')." | pbcopy"

【讨论】:

    【解决方案2】:

    如果你通过 reattach-to-user-namespace 包装器启动你的 shell(正如我在包装器的文档中描述的那样),它们的所有子级都将附加到用户引导命名空间,因此你不必在单独的调用中使用它到(例如)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 来使用它(即带有寄存器前缀,例如任何其他使用寄存器的正常模式命令)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多