从 vim 向父 tmux 会话发送命令

leo*_*leo 7 script bash vim lynx tmux

我在 tmux 中有一个带有 vim 和 Lynx 的拆分窗口设置。我正在尝试构建一个脚本,以便我可以向 vim 发送自定义命令,该命令将保存我正在处理的脚本,将焦点切换到 Lynx 窗格,刷新 Lynx 页面,然后切换回 vim 窗格。

是否有执行此操作的现有脚本?如果没有,构建此脚本的最佳方法是什么?

Chr*_*sen 13

您可能可以使用 Vim:!命令运行tmux send-keys将 Control-R 发送到您的另一个窗格。由于send-keys可以将击键发送到任何窗格(不仅仅是活动窗格),您甚至不需要来回切换活动窗格。

这是一个 Vim 映射(你可以把它放在你的.vimrc或者只是将它粘贴到:提示中来尝试):

:map <Leader>rl :w<Bar>execute 'silent !tmux send-keys -t bottom C-r'<Bar>redraw!<C-M>
Run Code Online (Sandbox Code Playgroud)

这将\rl键序列(<Leader>默认为\,但可以自定义)映射到以下 Vim 命令序列(以 分隔<Bar>;参见:help map_bar):

  1. 将当前缓冲区写入其文件。
  2. 运行tmux命令将 Control-R 发送到底部窗格。
    我们execute在这里使用是为了不将下一个 Vim 命令 ( redraw) 作为:!shell 命令的一部分。
    我们使用silent前缀命令来避免“按 ENTER 继续”提示。如果您想要提示或想要查看命令的输出(例如tmux命令不起作用,并且您想要查看它是否给出错误消息),则
    可以省略。slient:!
  3. 重新绘制屏幕。
    这通常会在“Press ENTER”提示之后发生,但我们用silent.

我手头没有lynx,但根据我搜索“lynx reload”(即用户指南的“重新加载文件并刷新显示”),Control-R 似乎是重新加载键。

此外bottom,还有其他指定目标窗格的方法(在tmux手册页中搜索“target-pane” ):

  • .+1, .-1: 下一个,此窗口中的上一个窗格
  • topbottomleftrighttop/bottomleft/ 的组合right
    (即bottom-left
  • %42( tmux 1.5+):%来自目标窗格的 TMUX_PANE 环境变量的 - 前缀窗格编号

    如果您的 Lynx 窗格并不总是与您的 Vim 实例在同一个tmux窗口中,那么最后一种形式可能会很方便。在启动 Lynx 之前,将 TMUX_PANE 的值保存到一个临时文件中,然后读取该文件以形成目标窗格参数:

    # before running Lynx (anytime really, but "before" is usually scriptable)
    echo "$TMUX_PANE" > /tmp/my-lynx-pane
    
    # in the Vim :! command in the mapping:
    tmux send-keys -t "$(cat /tmp/my-lynx-pane)" C-r
    
    Run Code Online (Sandbox Code Playgroud)