将 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
我正在尝试使用 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