Homelab 搭建手记(11)Kitty 与 Zellij:远程终端配置与中文输入排障
创建于 2026-09-14
更新于 2026-09-14
科技
homelab
kitty
zellij
xfce
fcitx5
xrdp
5219 字 · 约 18 分钟

前言

开发环境集中到实验室的迷你主机之后,我既通过 SSH 工作,也会从 Windows 远程桌面连接 Debian 的 XFCE。编辑器之外,终端里还会同时开着编程助手、构建命令和日志,逐渐需要把终端的字体、分屏、复制粘贴和中文输入整理一下。

Homelab 搭建手记(4)开发工具配置 已经介绍过 Zellij 的会话管理。这次在图形桌面中换用 Kitty,由它负责终端显示和桌面交互,Zellij 继续负责工作会话。配置过程中,字体和输入法各遇到了一些问题;尤其是中文输入,第一次补好环境变量后,后来从 Windows 重连远程桌面又出现了相同症状。

下面记录这套配置,以及顺着启动环境找到问题的过程。文中的桌面输入法部分对应 Debian + XFCE + X11,Kitty 排查时的版本为 0.41.1。

一、Kitty 和 Zellij 各负责什么

Kitty 本身也能分屏、开标签页,但我已经在使用 Zellij,没有必要再维护两套窗口组织习惯。实际分工如下:

层次 负责的事情
Kitty 字体、终端显示、窗口大小、鼠标与剪贴板、连接桌面输入法
Zellij 会话、标签页、分屏、焦点切换
Shell 和 TUI 程序 命令执行、编辑、编程助手和日志查看

因此,我隐藏了 Kitty 标签栏,把分屏操作留给 Zellij。SSH 连接时则可以直接附加到服务器上的 Zellij 会话,不要求另一台电脑也安装 Kitty。

从 Windows 通过 RDP 使用 Kitty 时,Kitty 运行在 Debian 桌面里,走的是远程 XFCE 会话的显示和输入法环境。这与 Windows 本地终端通过 SSH 连接服务器是两种入口,排查中文输入时要先分清。

二、字体与基础配置

2.1 安装并确认终端类型

在 Debian 中安装 Kitty:

bash
1
2
sudo apt install kitty kitty --version

从桌面打开 Kitty 后,在里面检查终端类型:

bash
1
2
echo "$TERM" infocmp xterm-kitty >/dev/null && echo 'kitty terminfo OK'

纯 Kitty 中的终端类型通常是 xterm-kitty。进入 Zellij 后,里面的终端类型可能不同,不需要为了统一显示而强行覆盖 TERM

2.2 选择字体

当时系统的 monospace 字体匹配到了 Noto Sans Mono CJK SC。它能承担中文显示,但我还想让 Shell 提示符和开发工具中的图标显示完整,于是选择了 JetBrainsMono Nerd Font Mono 作为主字体。

已安装相应字体后,可以在 Kitty 窗口里运行字体选择器:

bash
1
kitten choose-fonts

这里有一个实际遇到的小问题:在 XFCE Terminal 中启动字体选择界面时,Enter 的识别出现异常,换到 Kitty 内运行就正常了。因此 Kitty 自己的交互式工具,我直接放在 Kitty 中操作。

当前 ~/.config/kitty/kitty.conf 开头保留了字体选择器生成的配置:

conf
1
2
3
font_family family='JetBrainsMono Nerd Font Mono' postscript_name=JetBrainsMonoNFM-Regular bold_font auto italic_font auto

字体名称取决于实际安装版本,使用选择器生成的结果即可。中文则先沿用字体回退机制,没有额外写一长串字符范围映射。

可以用简单的输出区分字体问题与输入法问题:

bash
1
printf '%s\n' 'English 0123456789' '中文显示:你好世界' '框线:┌──┬──┐'

如果已有中文能正常显示,而按拼音没有候选词,接下来应查输入法;反过来,出现方框或缺字才需要继续看字体。

2.3 把日常设置放进 local.conf

我的 kitty.conf 保留了较完整的配置注释,末尾通过这一行加载个人设置:

conf
1
include local.conf

日常调整放在同目录的 ~/.config/kitty/local.conf,避免每次都在长配置文件中寻找修改位置。下面是当前设置中的主要部分:

conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
font_size 12.0 cursor_shape block cursor_blink_interval 0.5 scrollback_lines 10000 wheel_scroll_multiplier 3.0 window_padding_width 6 remember_window_size yes initial_window_width 1200 initial_window_height 800 tab_bar_style hidden enable_audio_bell no visual_bell_duration 0.0 shell_integration enabled term xterm-kitty

这部分主要是让窗口和滚动行为符合自己的习惯。已有配置时只合并需要的项,不必用整份示例替换;修改前可以给配置目录留一份副本。Kitty 配置文档

bash
1
cp -a ~/.config/kitty ~/.config/kitty.bak-$(date +%Y%m%d-%H%M%S)

三、复制粘贴与 Zellij 的键盘分工

3.1 先在纯 Kitty 中检查剪贴板

我的鼠标和剪贴板设置如下:

conf
1
2
3
copy_on_select clipboard mouse_map right press ungrabbed paste_from_clipboard clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask

选中文字后复制到剪贴板;没有被内部程序抓取的右键事件用于粘贴。read-clipboard-ask 则保留程序读取剪贴板时的询问。Kitty 配置文档

需要注意,进入 Zellij 或其他启用了鼠标处理的 TUI 后,鼠标事件可能先交给内部程序。遇到右键不再粘贴,先退回纯 Kitty 比较,再用 Ctrl+Shift+V 检查键盘粘贴,避免把事件被截获误判成整个剪贴板失效。

我当时也遇到过粘贴测试命令识别异常的情况。排查时用一小段普通文本更直接,不必上来就粘贴包含大量转义字符和框线的长命令。普通文本正常后,再看具体 TUI 的行为。

3.2 会话交给 Zellij

沿用之前已经安装的 Zellij,常用入口只有几个:

bash
1
2
3
4
5
6
7
8
# 新建有名称的工作会话 zellij -s development # 查看已有会话 zellij list-sessions # 重新附加 zellij attach development

会话名称按项目或工作用途区分,切换设备后更容易找到。暂时离开时使用 Detach,不要把退出会话当成断开连接。会话能否保留还取决于服务器上的进程是否继续运行,主机关机不会把运行中的任务原样保存下来。Zellij 命令文档

当前 Zellij 配置还启用了:

kdl
1
2
support_kitty_keyboard_protocol true support_kitty_graphics_protocol true

这些项保存在 ~/.config/zellij/config.kdl 中。使用其他版本时,先核对该版本是否识别这些选项;键盘协议与图形协议也各有用途,开启图形支持不等于修复键盘输入。

我没有在 Kitty 中再大量绑定 Ctrl 组合键,以免同一个按键同时落到 Kitty、Zellij 和内部编辑器的操作上。碰到快捷键冲突时,按照“纯 Kitty → Zellij → 具体程序”的顺序比较,比同时修改三层映射更容易定位。

四、中文能显示,为什么输入不了

4.1 少的是 GLFW_IM_MODULE

第一次遇到 Kitty 无法输入中文时,桌面的 Fcitx5 环境已经配置好了。检查结果中,GTK、Qt 和 XIM 相关变量都有值,但 Kitty 使用的变量为空:

text
1
2
3
4
5
XMODIFIERS=@im=fcitx GTK_IM_MODULE=fcitx QT_IM_MODULE=fcitx GLFW_IM_MODULE= XDG_SESSION_TYPE=x11

在同一个桌面会话中,用下面的命令打开新 Kitty 窗口后,中文输入恢复:

bash
1
env GLFW_IM_MODULE=ibus kitty

这里的 ibus 指 Kitty 接入的输入法接口,实际提供输入法的仍然是 Fcitx5 的 IBus 兼容前端,不需要因为这个变量值就换掉 Fcitx5 或再启动一个 ibus-daemon。Fcitx5 项目中的说明

4.2 写进桌面启动环境

Homelab 搭建手记(6)Debian Xfce 与 XRDP 同用户并发会话配置 中已经整理过输入法配置。当前 `~/.profile` 保留以下内容:
bash
1
2
3
4
export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx export GLFW_IM_MODULE=ibus

本机的 /etc/xrdp/startwm.sh 会读取 ~/.profile,再启动远程 XFCE 会话。Fcitx5 则由桌面自动启动项运行,不在 .profile 中反复启动 daemon。

这个变量需要在 Kitty 启动前进入环境。仅在 Kitty 已经启动的 Shell 中执行 export,改变的是 Shell 及之后启动的子进程,无法倒过来修改外层 Kitty 的启动环境。类似地,也不要把 Kitty 配置中的子进程 env 设置当成它自身输入法初始化的替代入口。

如果暂时不想退出桌面,用前面的 env GLFW_IM_MODULE=ibus kitty 打开一个新窗口即可。这样只影响这次启动,不打断其他窗口中的工作。

五、RDP 重连后再次出现中文输入问题

5.1 文件已经改了,会话却还是旧的

后来从 Windows 远程桌面连接时,Kitty 又出现了无法输入中文的情况。检查 .profile,那行 GLFW_IM_MODULE=ibus 明明还在;博客里也有相同配置。

这次我继续检查正在运行的 XFCE 进程,而不只看配置文件。当时的结果是:

检查项 结果
远程 XFCE 会话启动时间 9 月 1 日
.profile 修改时间 9 月 3 日
远程 XFCE 进程中的 GLFW_IM_MODULE 缺失
Fcitx5 进程 正在运行
该会话 D-Bus 上的 IBus 接口 存在

因此,问题落在了远程会话的环境继承上:配置文件在会话启动之后才修改,重连又回到了原来的桌面,从菜单启动的应用仍然继承旧环境。

5.2 如何检查实际进程环境

先找 XFCE 会话的 PID 和启动时间:

bash
1
2
pgrep -a xfce4-session ps -C xfce4-session -o pid,lstart,comm

同一用户有多个桌面时,要通过 DISPLAY 区分。选中实际的远程会话 PID 后,只读取相关变量:

bash
1
2
3
# 将 12345 替换为待检查的 XFCE 会话 PID tr '\0' '\n' < /proc/12345/environ \ | grep -E '^(DISPLAY|GLFW_IM_MODULE|GTK_IM_MODULE|QT_IM_MODULE|XMODIFIERS)='

检查 Kitty 本身时,也可以对实际的 Kitty PID 做同样的读取。在一个已经加载过配置的终端里执行 echo "$GLFW_IM_MODULE",只说明该 Shell 的值,不足以代表桌面启动器和外层 Kitty 的环境。

5.3 断开连接与注销桌面

关闭 Windows 远程桌面窗口通常只是断开 RDP 连接。为了保留正在工作的桌面,这台机器会复用原来的 XFCE 会话,因此重新连接不会自动重新读取 .profile

让新环境用于整个桌面,需要先保存工作,从 XFCE 的退出菜单中选择注销,再重新连接。注销会结束当前桌面中的应用,不能当成普通断线操作。若手头还有任务,就先使用显式带变量的新 Kitty 窗口,等合适的时候再注销。

这与上一篇 Homelab 搭建手记(9)全局代理下的内网访问与桌面应用配置 中的桌面代理问题有相似之处:文件里的配置最终要进入实际启动的进程,菜单入口、终端入口和旧会话不一定拥有同一份环境。

六、日常使用时保留的分工

整理完这些配置,我把字体、剪贴板和窗口习惯留在 Kitty 中,把会话与分屏交给 Zellij。中文输入则由远程 XFCE 会话启动的 Fcitx5 提供,Kitty 通过 GLFW_IM_MODULE=ibus 接入。

以后出现输入异常,先看中文能否显示,再比较纯 Kitty 和 Zellij 内部的表现;如果只在远程桌面里出现,就检查会话和进程实际继承的环境。对长期不注销的开发桌面来说,这一步很容易被漏掉。

参考

手机扫码阅读
本文作者: 有次元袋的 tiger
本文链接: https://www.superheaoz.top/2026/09/42233/
版权声明: 本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 我的个人天地