【问题标题】:pager (less) -- get current scroll position?pager (less) -- 获取当前滚动位置?
【发布时间】:2013-04-06 07:45:13
【问题描述】:

我正在使用 tmux 编写脚本输出的显示(嗯,它只是程序 git diff):一旦检测到文件系统更改,shell 脚本就会执行 tmux send-keys q enter C-l "git diff" enter,它可以有效地刷新 @987654324 @ 看法。

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

问题是,我希望它在刷新时滚动回原来的位置。

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

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

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

【问题讨论】:

    标签: shell unix tmux pager less-unix


    【解决方案1】:

    我不确定是否要使用脚本捕获此内容,但less -N 将显示行号。 而-jn--jump-target=n 可以跳转到某个位置。

    【讨论】:

    • 酷,谢谢。对于我的实际实现,我实际上已经放弃了 less,现在我疯狂地使用 tmux 来获得鼠标滚动。
    • @StevenLu 愿意分享您的具体做法吗?
    • 基本上就像我在问题中描述的那样,我现在强制 git diff 不要使用less。这种方式鼠标滚动在(可能嵌套的)tmux缓冲区中自动工作
    • 我回到了这个话题,我不得不用来操作嵌套的 tmux 会话的体操是无法管理的,面对 tmux 本身的发展更是如此。我现在正在考虑要么实现我自己的增强少,要么类似地在它周围包裹一个操纵器。
    【解决方案2】:

    关于 iTerm 的协同进程,

    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 将读取打印到窗格的每一行,即提示符。

    我可以将其标准输入和标准输出连接到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 服务器几次,哈哈)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多