我正在寻找从 vim 向单独的 tmux 窗格发送命令的方法,我认为最简单的方法是 mkfifo 一个命名管道/tmp/cmds
并运行bash < /tmp/cmds
以监听要运行的命令。
然后我进行echo "echo \"hello world\" > /tmp/cmds"
测试,这只对一个命令有效,并且 xargs 立即关闭。有没有办法让它在多个命令后继续运行?
答案1
这与在交互式 shell 上运行 xargs 并以换行符终止没有什么不同,因此它将完成并退出。
你必须编写一个循环并针对来自 stdin 的每一行输入执行,例如
while :; 执行 xargs < /tmp/cmds; 完成
尚未测试,因此您可能需要进行调整。
答案2
如果有人好奇,下面是我用来从 vim 发送命令的脚本:
#!/bin/sh
FIFO=${1:-"/tmp/cmds"}
mkfifo $FIFO &> /dev/null
while :; do bash < $FIFO && echo "== OK ==" || echo "!! ERR !!"; done
这是一个向该管道发送命令的 vim 函数:
function! RCmd(cmd)
:silent! exe '!echo "cd ' . getcwd() . ' && ' . a:cmd . '" > /tmp/cmds'
:redraw!
endfunction
make
发送到窗口的映射<F4>
map <F4> :call RCmd("make")<CR>
玩得开心!