我在 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
):
- 将当前缓冲区写入其文件。
- 跑过tmux命令将 Control-R 发送到底部‡窗格。
我们使用execute
以便下一个 Vim 命令 (redraw
) 不被视为:!
shell 命令的一部分。
我们使用silent
前缀命令以避免出现“按 ENTER 继续”提示。如果
您slient
想要提示或想要查看命令的输出:!
(例如tmux命令不起作用,并且您想查看它是否给出错误消息)。 - 重新绘制屏幕。
这通常会在“按 ENTER”提示后发生,但我们使用 来抑制它silent
。
†我没有山猫但根据我对“lynx reload”的搜索,Control-R 似乎是重新加载键(即“重新加载文件并刷新显示”请参阅用户指南)。
‡此外bottom
,还有其他指定目标窗格的方法(在tmux手册页):
.+1
,.-1
:此窗口中的下一个、上一个窗格top
、、、、以及/与/的组合bottom
(left
即 )right
top
bottom
left
right
bottom-left
%42
(tmux1.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)。