从 vim 向父 tmux 会话发送命令

从 vim 向父 tmux 会话发送命令

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

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

答案1

你也许可以使用 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>

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

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

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

此外bottom,还有其他指定目标窗格的方法(在tmux手册页):

  • .+1, .-1:此窗口中的下一个、上一个窗格
  • top、、、、以及/与/的组合bottomleft即 )righttopbottomleftright
    bottom-left
  • %42tmux1.5+):%来自目标窗格的 TMUX_PANE 环境变量的带前缀的窗格编号

    如果你的 Lynx 窗格并不总是在同一个tmux窗口作为 Vim 实例。在启动 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
    

答案2

您应该从 tslime.vim 插件开始,该插件与手动选择的 tmux 会话交互并向其发送缓冲区。您将编写一个几乎相同的插件;但是,您不会发送缓冲区,而是发出命令(请参阅 man 1 tmux)。

tslime.vim @ vimscripts

相关内容