将 vim 上的一行发送到 tmux 中的另一个窗格或部分

Send a line on vim to another pane or section in tmux

我正在尝试使用 vim+tmux 设置在 R 中编写代码。

为此,我需要找到一种方法将线路(如果有动作则更好)发送到其他 tmux 窗格(或部分,如果可能)中的终端,即 运行ning R.

看起来是个简单的任务,但我对vim的变量或函数了解不多,而且我是tmux的新手。

通过一些研究,我发现了 tmux send-keys 命令,它看起来很有前途,所以我目前能够映射类似

的东西

:silent ! tmux send-keys -t 0:0.0 'print("test")' Enter

并且有效地 运行 是窗格“0:0.0”中的“打印”命令(我想总是打开一个同名的部分以便于参考)。不知道这是否有效,也不知道如何将 'print()' 替换为某些编辑器的文本。

最终目标是像 <localleader>rr 这样的键绑定到 运行 R 中的一行,<localleader>r[motion] 到 运行 动作,以及类似于 运行 选定的代码。

谢谢!

通过对 slime.vim 进行一些小的调整,您可以将以下文件放入 vim 插件目录(例如 $HOME/.vim/plugin

function Send_to_Pane(text)
  if !exists("g:tmux_target")
    call Tmux_Vars()
  end
  echo system("tmux send-keys -t " . g:tmux_target . " '" . substitute(a:text, "'", "'\\''", 'g') . "'")
endfunction

function Tmux_Pane_Names(A,L,P)
  return system("tmux list-panes -a | awk '/active/ {printf \"%s:%s\n\", , }' FS=:")
endfunction

function Tmux_Vars()
  if !exists("g:tmux_target")
    let g:tmux_target = "%1"
  end
  let g:tmux_target = input("session:window.pane> ", "%1", "custom,Tmux_Pane_Names")
endfunction

vmap <C-c><C-c> "ry :call Send_to_Pane(@r)<CR>
nmap <C-c><C-c> vip<C-c><C-c>
nmap <C-c>v :call Tmux_Vars()<CR>

现在,在 vim 中,如果您键入 <C-c><C-c>,当前段落将被发送到窗格(假设 vim 是在启用 textobjects 功能的情况下构建的).在可视模式下,将发送选定的文本。要仅发送当前行,您可以通过 V<C-c><C-c> 使用 linewise-visual。 (vim 并没有真正内置对行文本对象的支持,但有可用的插件。)

请注意,通过检查该窗格中进程 运行 中的 $TMUX_PANE,可以轻松确定目标窗格的正确值。您可以使用特定的目标,例如 0:2.1,但上面使用 %1 作为默认值。这可能是一个不好的默认使用。 YMMV