斜体在除 less(1) 之外的所有语言中都适用

斜体在除 less(1) 之外的所有语言中都适用

我关注(并修改了)这篇 Reddit 帖子使斜体在 Terminal.app 和 tmux(1) 中正常工作。

斜体字

命令

echo -e "\e[3mfoo\e[23m"

输出(斜体)在常规终端会话和 tmux 会话中。

在这两者中,命令序列

vim README.md
i*foo*<Esc>

编辑文件并以斜体README.md显示文本。*foo*

除了更少

在 tmux 中,less(1) 使用斜体显示所有“强调”的行(例如提示)。

在 tmux 之外,没有雪茄。less 将使用“正常”反向突出显示来显示强调的线条。

问题

为什么在常规会话和 tmux 之间观察到的行为差别不大,但其他程序却没有差别?

我怎样才能让 less 的行为更加统一?

相关信息

  • TERM: 两者任xterm-256colortmux-256color
  • xterm-256colortmux-256color定义:
# A xterm-256color based TERMINFO that adds the escape sequences for italic.
#
# Install:
#
#   tic xterm-256color.terminfo
#
# Usage:
#
#   export TERM=xterm-256color
#
xterm-256color|xterm with 256 colors and italic,
        sitm=\E[3m, ritm=\E[23m,
        use=xterm-256color,
# A tmux-256color based TERMINFO that adds the escape sequences for italic.
#
# Install:
#
#   tic tmux-256color.terminfo
#
# Usage:
#
#   export TERM=tmux-256color
#
tmux-256color|tmux with 256 colors and italic,
        sitm=\E[3m, ritm=\E[23m,
        use=screen-256color,
  • sitm并且ritm两个 s 中的序列TERM
    • sitm=\E[3m
    • ritm=\E[23m
  • vimscript 斜体:
if $TERM =~# '\v(xterm|tmux)-256color' || has('gui_running')
  if has('osx')
    let &t_ZH = "\e[3m"
    let &t_ZR = "\e[23m"
  endif
endif

答案1

我预计使用 smso 的会更少,而不是 sitm。您已从将 smso 设置为 SGR 3 的 screen-256color 派生出 tmux-256color:

$ infocmp screen-256color|grep smso
    smkx=\E[?1h\E=, smso=\E[3m, smul=\E[4m, tbc=\E[3g,

这意味着您将在 tmux 中获得斜体。 smso 在 screen-256color 中为 SGR 3 的原因是 screen 不支持斜体,而是使用 SGR 3 进行反转(我认为这现在可能已经改变,但我不确定)。

但是 xterm-256color 的 smso 已设置为 SGR 7:

$ infocmp xterm-256color|grep smso
    smir=\E[4h, smkx=\E[?1h\E=, smm=\E[?1034h, smso=\E[7m,

这意味着您将在 tmux 之外获得 standout(反向)。

因此,要解决这个问题,请修改您的 terminfo 条目,将 smso 一致地设置为您喜欢的 xterm-256color 和 tmux-256color(斜体或反转)。

我假设你已经拥有了这个,因为你在 tmux 中使用斜体,但请确保你在 .tmux.conf 中将默认终端设置为 tmux-256color,否则 tmux 将模拟屏幕并发送 smso 而不是 sitm 用于斜体。

答案2

使用-r( --raw-control-chars) 或-R( --RAW-CONTROL-CHARS) 选项less使其解释特殊字符而不是转义它们。-R应该只解释\E[...m序列,而-r解释所有内容。

要始终启用该选项,请将环境变量设置$LESS-R

相关内容