我想在 shell 中设置一些东西,以便仅使用 shell(没有 X)即可获得类似 IDE 的体验。我最接近的方法是使用 tmux,一个窗格中使用 vim,另一个窗格中使用命令行。这样我就可以从 vim.w !bash
运行一行。
但这对我来说并不令人满意,因为环境在单独运行的命令之间不会持续存在。
如果我运行:
var1=FOO
进而
echo $var1
每次使用.w !bash
,FOO
都不会被回显。
我真正想要做的是浏览一个窗格中的文本文件,并使用快捷方式将一行发送到另一个窗格中的终端,作为该终端会话的一部分。实现此目的的正确工具组合是什么?我知道可以配置 emacs 来使用其自己的终端仿真器执行类似操作,但我想要一个与常规工具(例如安装程序)配合使用的解决方案。
编辑:tmux select-copy-paste 不是那么糟糕,但仍然有点尴尬。
答案1
sh
带有、vim
和tmux
、快速且粗略的概念验证的原型解决方案。
您的.w !bash
程序运行bash
并将当前行发送到其标准输入。让我们bash
用一个脚本替换它,该脚本将其标准输入中的一行插入到 中的不同窗格中tmux
。
这是基本脚本:
#!/bin/sh
pane="$(tmux list-panes -F '#{pane_active} #D' | awk '$1==0 {print $2;exit}')"
IFS= read -r line
tmux send-keys -l -t "$pane" "$line"
tmux send-keys -t "$pane" 'C-j'
该程序的简要说明:
- 识别不活动的窗格。
- 从标准输入读取一行。
- 将该行发送到窗格,就像它是键入的一样。
- 发送Enter到窗格。
将其另存为trun
,使其可执行并可通过访问$PATH
。现在,如果您有两个窗格tmux
并在其中一个窗格中运行trun
,然后输入一行并点击Enter,则该行将被注入到另一个窗格中。
代替vim
invoke .w !bash
,.w !trun
它应该可以工作。将其绑定到一个键以方便访问。
笔记:
- 该脚本不会检查是否恰好有两个窗格。
- 该脚本并不关心目标窗格中运行什么;它只发送密钥。