寻呼机(减) - 获取当前滚动位置?

时间:2013-04-13 23:34:49

标签: shell unix tmux pager less-unix

我正在使用tmux编写脚本输出的显示(好吧,它只是程序git diff):一旦检测到文件系统更改,shell脚本就会执行tmux send-keys q enter C-l "git diff" enter刷新git diff视图。

您可能会认为这类似于iTerm's coprocesses提供的功能。

问题是,我想在刷新时滚动回到它所处的相同位置。

使用tmux的原因之一是窗口实际上是一个完全正常的交互式终端会话,可以正常交互以滚动查看完整输出。

但我想以某种方式获得滚动位置。

假设我想实际对终端窗口本身的文本内容进行计算,就像iTerm2的协同进程一样,但是我可以在Linux上使用它(通过ssh)。 tmux能提供这种能力吗?

2 个答案:

答案 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服务器几次,哈哈)。