tmux:发送并执行其他窗格中突出显示的代码

tmux:发送并执行其他窗格中突出显示的代码

我想要有两个 tmux 窗格 - 第一个可以包含多个程序之一(通常但不总是 vim),第二个将有一个 R、python 或 bc 中的交互式会话。

这两个窗格并不总是显示相同的系统 - 通常我会在系统 A 上运行 tmux,在其中一个窗格中执行某些操作,然后将第二个窗格 ssh 连接到系统 B 并运行交互式会话R/Python/bc 在那里。

我的目标是能够突出显示第一个窗格中的某些内容,并将其发送到另一个窗格中并执行。

我知道 tmux 可以在窗格之间复制/粘贴。我知道 tmux 可以将特定命令发送到另一个窗格,并以回车键结束,以便执行它。但是我可以让它将“我在第一个窗格中突出显示的内容”发送到第二个窗格,然后以输入字符结束以执行吗?

(换句话说,我正在尝试模拟 IDE 的行为,您可以在其中突出显示一段代码并单击“运行”。我希望专门使用 tmux 而不是特殊的 vim 插件来执行此操作,因为有时我将在第一个窗格中使用 vim 以外的其他东西。)

答案1

我相信您可以通过以下方式实现您所追求的目标:

1)进入复制模式(前缀[)

2)选择一些文本(最有可能的 v(isual select)/y(ank)

3)通过将其发送到另一个窗格tmux paste-buffer -t [left/right]

这是我刚刚概述的概念证明:

给定当前目录中名为 foo.rb 的 Ruby 脚本:

# foo.rb
x = "hello there"
puts x

...和两个窗格,垂直分割(左侧的 bash/右侧的 irb 会话),如果您运行cat foo.rb,进入复制模式,提取文件的内容,然后tmux paste-buffer -t right从左侧窗格运行,您应该在右侧看到以下输出窗格:

λ irb
2.5.1 :001 > x = "hello there"
 => "hello there"
2.5.1 :002 > puts x
hello there
 => nil

从那里,您可以编写 shell 脚本和/或连接键绑定,以防止您必须键入 out/recall tmux paste-buffer -t [left/right]

paste-buffer 应该还为您处理“以 Enter 结尾”。来自 tmux 手册页的paste-buffer条目:

输出时,粘贴缓冲区中的任何换行 (LF) 字符都将替换为分隔符,默认情况下为回车 (CR)。

如果默认分隔符由于某种原因不起作用,您还可以使用 指定分隔符paste-buffer -s ...

答案2

(虽然迟到了,但仍然)这里有一个 vim 插件,它完全可以满足您的需求:jpalardy/vim-slime

答案3

对于稍后通过 Google 搜索的人,这里是我的 .tmux.conf 中经过完全调整的最终行(受到 pdoherty926 对我的问题的回答的启发)。

通过这种按键绑定组合,我可以将其减少到两次击键:F5 从我按 F5 时光标所在的位置开始复制,F6 完成复制并执行另一个窗格中的代码:

# These are lines that anybody using vim-like copy/paste will have
set-window-option -g mode-keys vi
bind P paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection
# These are the lines that make F5/F6 do their thing
bind-key -n F5 copy-mode \; send-keys v
bind-key -n F6 send-keys y \; paste-buffer -t %1 \; send-keys -t %1 C-m

我这样做的原因是因为你不能直接绑定开始选择和复制选择命令 - 例如“bind-key -n F5 copy-mode \; begin-selection”不起作用,但如果我绑定“ v”在复制模式下开始选择(标准的类似 vim 的绑定),然后在进入复制模式后让 F5 执行“send-keys v”,这确实有效。

如果您碰巧使用配置为处理中继鼠标单击的 ssh 会话,您还可以添加以下内容:

setw -g mode-mouse on
set -g mouse-select-window on

有了这些行(除了上面的行之外),现在您所要做的就是用鼠标突出显示代码并按 F6 运行它。 (如果您需要绕过 tmux 的鼠标点击抓取,而这些行位于 .tmux.conf 中,只需在单击时按住 Shift 键即可。)

相关内容