我正在使用tmux编写脚本输出的显示(好吧,它只是程序git diff
):一旦检测到文件系统更改,shell脚本就会执行tmux send-keys q enter C-l "git diff" enter
刷新git diff
视图。
您可能会认为这类似于iTerm's coprocesses提供的功能。
问题是,我想在刷新时滚动回到它所处的相同位置。
使用tmux的原因之一是窗口实际上是一个完全正常的交互式终端会话,可以正常交互以滚动查看完整输出。
但我想以某种方式获得滚动位置。
假设我想实际对终端窗口本身的文本内容进行计算,就像iTerm2的协同进程一样,但是我可以在Linux上使用它(通过ssh)。 tmux能提供这种能力吗?
答案 0 :(得分:1)
我不确定是否使用脚本捕获此内容,但less -N
将显示行号。
-jn
或--jump-target=n
可以跳转到某个位置。
答案 1 :(得分:0)
关于iTerm的coprocesses,
tmux
有一个命令pipe-pane
,可用于将shell命令的输入和输出传递给-t
指定的目标窗格的输出和输入。
所以如果我有一个shell程序,例如~/script.sh
:
#!/usr/bin/env bash
while read line; do
if [[ "$line" = "are you there?"* ]]; then
echo "echo yes"
fi
done
请注意,read line
将读取打印到窗格的每一行,即提示符。
我可以将它的stdin和stdout连接到my-session:my-window
中的窗格0,如下所示:
tmux pipe-pane -IO -t my-session:my-window.0 "~/script.sh"
然后在提示符下键入echo are you there?
,它会响应:
$ echo are you there?
are you there?
$ echo yes
yes
小心使用-IO
,因为它很容易引起反馈循环(在试验此功能时我不得不杀死tmux服务器几次,哈哈)。