关于 LESS_TERMCAP_* 变量的文档?

ans*_*elm 55 less colors man termcap terminal

在设置一堆这些变量时,我使用 less 查看的联机帮助页中看到了这些漂亮的颜色。它们是什么意思,文档在哪里?这是由less还是termcap解释的?

截屏

手册页的 ss

Gil*_*il' 64

Termcap是一个 Less 用来访问终端的库。Termcap 在很大程度上已经过时,已被Terminfo取代,但 Terminfo 为应用程序提供了 Termcap 兼容接口。Less 满足于 Termcap 界面并使用它。

Termcap 库是对终端设施的描述。每个设施都由一个两个字母(或更一般地两个字符)的代码标识。例如,hc识别硬拷贝终端(即打印机,而不是屏幕);co是列数;md开始显示粗体文本。每个功能都有一个值,可以是布尔值(如hc)、整数(如co)或字符串(如md)。许多字符串是转义序列,应用程序可以发送到终端以达到某种效果。

为什么要转义序列?因为终端和应用程序之间的接口是一个字符流(更准确地说,每个方向一个字符流:一个用于用户输入,一个用于输出显示)。当应用程序向终端写入字符时,通常会显示该字符。一些字符有不同的行为:它们是控制字符,可以执行诸如移动光标、切换显示属性等操作。命令比控制字符多得多,因此大多数命令都可以通过转义序列访问,转义序列以一个特殊字符(通常是转义字符,因此得名)。

例如,当Less 想要显示一些粗体文本时,它会查找md功能的值。这是一个字符串,Less 将其写入终端。终端将此字符串识别为转义序列,并调整其内部状态,以便后续字符以粗体显示。

在硬件终端的早期,不同的品牌有不同的转义序列和能力;发明了 Termcap 数据库和接口,这样应用程序就不必知道每个终端模型。现在大多数终端仿真器都具有非常相似的功能,但是 Termcap 或 Terminfo 数据库对于处理细微的差异仍然很有用。

LESS_TERMCAP_*变量可以在环境或中设置.lesskey文件。它为 Less 提供了终端功能的替代值。当Less 想要使用终端功能时,比如切换到粗体,它首先检查是否有一个LESS_TERMCAP_md变量。如果这个变量存在,Less 使用它的值作为转义序列来切换到粗体。如果不是,则使用来自 Termcap 数据库的值。此机制允许用户覆盖 Less 的 Termcap 数据库设置。

最有用的LESS_TERMCAP_*设置是转义序列。您可以将属性映射到不同的属性。您可以使用该tput命令在系统的TermcapTerminfo数据库中查找当前终端的能力值。如果您不介意依赖于终端,则可以直接使用转义序列。例如,当指示以粗体显示时,此设置告诉 Less 以粗体红色显示:

LESS_TERMCAP_md=$(tput md; tput AF 1)
Run Code Online (Sandbox Code Playgroud)

或者如果您的tput命令不支持 Termcap 名称:

LESS_TERMCAP_md=$(tput bold; tput setaf 1)
Run Code Online (Sandbox Code Playgroud)

Man 使用一些非常简单的格式发送 Less 文本,这些格式只能表示粗体和斜体。此外,Less 内部使用了各种格式化功能,例如突出显示搜索结果和在底部显示模式行。以下是 Less 使用的一些转义序列(我只列出了重新映射合理有用的功能):

termcap terminfo  
ks      smkx      make the keypad send commands
ke      rmkx      make the keypad send digits
vb      flash     emit visual bell
mb      blink     start blink
md      bold      start bold
me      sgr0      turn off bold, blink and underline
so      smso      start standout (reverse video)
se      rmso      stop standout
us      smul      start underline
ue      rmul      stop underline
Run Code Online (Sandbox Code Playgroud)

要以彩色显示输出,请使用setaf功能(或AF使用 Termcap)。

文档LESS_TERMCAP_*中没有提到这些设置LESS。我可以提供的最佳参考是我在此处的回答

  • 谢谢。我还简要地查看了less 的源代码,发现当你将LESS_TERMCAP_DEBUG 设置为something 然后打开man 时,你可以看到类似手册页的源代码以及所有使用的功能标签。使您可以更轻松地决定要将它们设置为什么。 (10认同)
  • @bobbogo 简单的作业不需要它。例如 `export VAR="$(…)"` 是必需的(尽管有些 shell 给予 `export` 特殊处理并且不需要引号),但是对于赋值,右侧隐式是双倍的引。请参阅 https://unix.stackexchange.com/questions/68694/when-is-double-quoting-necessary (2认同)

Ste*_*nny 5

吉尔斯的回答很好,但这让我很好奇:

Termcap 已基本过时,已被 Terminfo 取代

  1. 如果 Termcap 已过时,我想切换到 Terminfo

  2. 我也想放弃 Termcap,因为我发现了一个错误。假设你在你的~/.profile或类似的地方放了一个 termcap 变量:

    export LESS_TERMCAP_so=$(printf '\33[5;30;43m')
    export LESS_TERMCAP_se=$(printf '\33[m')
    
    Run Code Online (Sandbox Code Playgroud)

    之后,如果您输入set,Termcap 变量会弄乱您的颜色输出。

要切换到 Terminfo,您可以创建一个文件xterm-pretty.ti

xterm-pretty|xterm with pretty colors,
# exit standout mode
  rmso=\e[m,
# begin standout mode
  smso=\e[5;30;43m,
# similar terminal
  use=xterm,
Run Code Online (Sandbox Code Playgroud)

编译并安装文件:

tic xterm-pretty.ti
Run Code Online (Sandbox Code Playgroud)

将行添加到~/.profile或类似:

TERM=xterm-pretty
Run Code Online (Sandbox Code Playgroud)