![折叠终端寻呼机](https://linux22.com/image/152742/%E6%8A%98%E5%8F%A0%E7%BB%88%E7%AB%AF%E5%AF%BB%E5%91%BC%E6%9C%BA.png)
概念:终端寻呼机,例如less
,交互式地“折叠”和“展开”输入文件(如 emacs 大纲模式)。折叠后,递归目录列表可能仅显示目录名称。展开后,就能看到完整的内容。
再举个例子
git log | pager
可能允许用户在查看每个提交的标题和详细信息之间进行交互切换。
pager xxx.c
可以折叠/展开函数,允许用户在仅查看函数定义和函数体之间切换。
显然,寻呼机需要被告知(或自行推断)它正在处理的内容的类型。
这样的程序存在吗?
答案1
将其放入名为“pager”的可执行文件中:
#! /usr/bin/env bash
TEMP=/tmp/file-$$.txt
trap "rm -f $TEMP" EXIT HUP INT TERM
echo '-*- outline -*-' > $TEMP
cat "$@" >> $TEMP
emacs $TEMP 0<&1
临时文本文件的第一行安排 emacs 进入大纲模式。然后cat
附加零个或多个指定文件。最后,编辑器允许通过您喜欢的模式查看输入文本,然后trap EXIT
清理临时文件。
零文件意味着从标准输入读取。
通常git log | pager
不会得到很好的支持,因为管道可能会干扰连接到键盘的标准输入。 (这种情况下的诊断是:“emacs:标准输入不是 tty”。)我们期望 stdout 将连接到终端,即pager
位于管道的末尾。鉴于此,0<&1
可以通过将 stdin 连接到 stdout 连接到的同一终端 pty 来从这种情况中恢复,从而允许成功的编辑会话。