new essay: fix-term-color-for-alacritty

This commit is contained in:
leafee98 2023-03-17 20:10:22 +08:00
parent 9c4f4ecdbd
commit ff3827d2ea
2 changed files with 38 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

View file

@ -0,0 +1,38 @@
---
title: "修复 Alacritty 颜色不正常的问题"
date: 2023-03-17T18:47:57+08:00
tags: []
categories: []
weight: 50
show_comments: true
draft: false
---
在使用 alacritty 通过 ssh 连接到服务器的时候出现了很奇妙的现象,在一个服务器中颜色显示完全正确,另一个则明显不是期望的颜色,最后终于发现是因为一个服务器中少了一个 ncurses-term 的包,顺便大致了解了一下终端颜色显示的一些相关知识。
<!--more-->
首先我服务器的环境是 Debian 11所使用的 shell 是 zsh 并使用了 prezto 框架,使用的主题是默认的 sorin 主题,所以提示符应该是有颜色的。
然后描述一下问题shell 的颜色出现了一些偏差,如提示符不再有颜色,而且使用退格键反而会输入一个空格,但是在 shell 的缓冲区中是已经删掉该字符的,所以不会导致输入的变化,只在显示和缓冲区之间存在不一致。
另一个比较奇怪的现象是 alacritty 的颜色存在问题,但是 Konsole 却没有任何问题,在测试后发现 Konsole 固定使用 `xterm-256color` 作为 `TERM` 环境变量的值,而 alacritty 则是在检测系统环境以后选择了使用 `alacritty` 作为 `TERM` 的值。
后来发现了 `infocmp` 命令了解到颜色相关的东西,并且 `TERM` 如果是 `xterm-256color` 那么实际上是指定 `/usr/share/terminfo/x/xterm-256color`,如果是 `alacritty` 则是 `/usr/share/terminfo/a/alacritty`,在 Debian 中,这些文件由 ncurses-term 包提供。
如果实在不想安装包或者自己的发行版没有找到类似的包,把 `TERM` 设置为 `xterm-256color` 也能通过“撒谎”来得到程序的颜色支持,下面展示一下这种方法:
![](./env-term.png)
如果不能通过设定的 `TERM` 的值找到对应的定义文件zsh 会在更改此变量时报错
```
$ export TERM=non-exists
zsh: can't find terminal definition for non-exists
```
## 知识总结
- 终端程序会根据 `TERM` 变量去 `/usr/share/terminfo` 下寻找特定的定义文件
- 一些程序会将自己固定设置为 `xterm-256color` 来获取颜色支持,并避免因为 terminfo 定义文件的缺失导致的不兼容性
- `infocmp` 可以展示当前的 `terminfo` 的细节,或者比较多个 `terminfo` 的细节