【问题标题】:terminal escape sequences for fonts字体的终端转义序列
【发布时间】:2012-11-16 04:36:17
【问题描述】:

我想开发什么: 可以同时使用至少 2 种字体的终端。我将使用一种字体用于 shell 输入行,另一种字体用于命令输出。例如:

user@host$ ls /home 用户 用户 1 用户 2 用户 3

为什么: 更易读的终端/shell

如何:我有问题。可能 shell 需要生成一些新的转义序列。终端需要加载不同的字体并处理这些序列。从哪儿开始?如何定义新的转义序列,标准在哪里?

未来:也许有人想和我一起参与这个项目?

【问题讨论】:

  • 我不是 100% 确定,但我认为这也需要您的终端仿真器提供一些东西。 shell转义可能会提供简单的粗体/斜体/下划线,但字体更改看起来很困难。
  • 你已经可以使用彩色提示了……而且,我从来没有注意到“终端/shell”不是“可读的”。
  • anishsane:如果我们可以在 shell 命令行中使用“no monospace”字体,在所有输出中使用“monospace”,将会显着改善外观。
  • gniourf_gniourf:你从来没有迷失在终端输出中吗?颜色很好,特别是如果没有过度使用。但我们的眼睛和大脑更善于识别细微的形状差异。无论如何,如果我们可以改变终端字体的颜色、斜体、下划线,为什么不完全实现改变字体的功能呢?
  • 一个指针:bash 并没有真正特别对待提示和用户的输入;提示只是写入标准错误(可以通过重定向 shell 的标准错误来观察)。您的外壳不一定要这样做;它可以写入第三个内部文件描述符(这当然会默认为终端,如标准错误和标准输出)。然后你可以将任何你喜欢的终端控制字符写入这个专用的提示文件描述符,问题就减少到有一个可以正确解释它们的终端模拟器。

标签: linux bash shell terminal


【解决方案1】:

控制序列的标准几乎是XTerm source code 中的Xterm 控制序列文档ctlseqs.ms。 (您可以使用命令 groff -ms -Tps ctlseqs.ms | ps2pdf - ctlseqs.pdf 将其转换为 PDF,尽管 -ms 选项在 Ubuntu 12.04 上似乎已损坏)。

XTerm 已经支持控制序列来更改字体,但同时适用于整个终端。打开 xterm 并在你的 shell 中输入——

echo -e "\033[?35h\033]50;#+1^G\033\\" # aka CSI ? 35 h OSC 50 ; #+1 BEL ST

整个终端的字体应该改变。这个控制序列实际上也支持 True-Type 字体的名称;见第 21 页。

如果您想更改现有终端以支持更改内联字体,您可以 欢迎选择ctrlseqs.ms 中尚未分配的几乎所有控制序列并使用它们。但是,为现有功能选择类似于控制序列的新控制序列是个好主意。

下一步是获取现有终端的源代码并开始挖掘。你现在用什么终端? Konsolegnome-terminal 的源代码可能会比 XTerm 更容易使用。

【讨论】:

  • 大部分时间我都在使用 urxvt。我可能会从那里开始。但是 gnome-terminal 拥有大量受众(初学者用户),所以这将是我的第二个目标。
  • "如果您想更改现有终端以支持更改内联字体,欢迎您选择几乎所有尚未在 ctrlseqs.ms 中分配的控制序列" Err.. No。已经定义了现有的序列来执行此操作。它们是 SGR 10(重置为默认字体)和 SGR 11 到 SGR 19 以选择替代字体。
【解决方案2】:

有一个交换字体的标准顺序。

SGR 11

也称为

CSI 11m
ESC [ 11m

同样

SGR 10

将切换回默认字体。

然而,正如已经评论的那样,几乎没有终端实际上​​支持这一点。使用其他渲染属性可能会更好,例如粗体/下划线/斜体。虽然注意也没有多少终端支持斜体。

供参考

SGR 1   = bold
SGR 4   = underline
SGR 3   = italics

【讨论】:

  • 谢谢!根据wikipedia SGR 从 11 到 19 是替代字体。也许某些终端已经准备好 -fontN 支持。顺便说一句,这个link 说 SGR 用于更改字符集。不是字体。
  • 也许一开始可以很容易地向终端添加新字体,例如 urxvt...在 X 窗口中更改字体应该不是什么大问题...
  • pangoterm/libvterm 已经完全支持这一点。另见launchpad.net/pangoterm,特别是leonerds-code.blogspot.co.uk/2011/09/…中的截图
【解决方案3】:

如果您只对不同的字体属性(而不是不同的字体)感到满意,如果您使用 zsh,您甚至可以在不编写自己的终端仿真器的情况下实现类似的东西。您只需设置您的 shell 以发出正确的转义序列,以在提示前后和命令执行之前设置正确的终端属性(斜体、粗体、颜色等)。

假设您使用 Xterm 并希望您的提示为粗体,键入的命令行为斜体,命令输出为正常。

然后设置如下所示:

# bold is \e[1m and italics is \e[3m , \e[0m resets the attributes
PS1=$'\e[1m'$PS1$'\e[0;3m' # I assume you have set PS1 already
function reset-terminal-attributes { printf '\e[0m'; }
autoload add-zsh-hook
add-zsh-hook preexec reset-terminal-attributes

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2014-09-26
    • 1970-01-01
    • 2011-05-22
    相关资源
    最近更新 更多