适用于 Zellij 0.44+ / Termius (iOS/Android) 连接 Linux SSH 服务器的场景。 目标:在手机小屏幕、触控键盘、高延迟网络下获得最佳终端复用体验。
| 痛点 | 解决方案 |
|---|---|
| 手机屏幕小,像素寸土寸金 | 关闭面板边框 (pane_frames false),使用紧凑布局 (compact) |
| Termius 字体渲染有限 | 启用简化 UI (simplified_ui true),禁用花式下划线 |
| 触控键盘按 Ctrl+b 不顺手 | 改用 Ctrl+a 作为 tmux 前缀 |
| 弱光/户外环境辨识度差 | 使用 Dracula 高对比度主题 |
| SSH 断连丢失会话 | on_force_close "detach" 自动分离,重连即恢复 |
| 触控选择文本不便 | 开启鼠标模式 + 选中即复制 |
文件路径:~/.config/zellij/config.kdl
// ── Mobile Termius Optimizations ──────────────────────────────────────
pane_frames false // 禁用面板边框,节省屏幕空间
simplified_ui true // 简化 UI,不依赖特殊字体符号
default_layout "compact" // 紧凑布局:单行 compact-bar 替代 tab-bar + status-bar
theme "dracula" // 高对比度主题
mouse_mode true // 开启鼠标/触控支持
copy_on_select true // 选中文本松手即复制
styled_underlines false // 禁用花式下划线(Termius 不完整支持)
show_startup_tips false // 关闭启动提示
show_release_notes false // 关闭版本更新提示
scroll_buffer_size 5000 // 适当缩小回滚缓冲区,节省内存
default_mode "normal" // 默认普通模式
on_force_close "detach" // SSH 断连时自动分离会话(而非退出)
keybinds clear-defaults=true {
locked {
bind "Ctrl g" { SwitchToMode "normal"; }
}
pane {
bind "left" { MoveFocus "left"; }
bind "down" { MoveFocus "down"; }
bind "up" { MoveFocus "up"; }
bind "right" { MoveFocus "right"; }
bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; }
bind "d" { NewPane "down"; SwitchToMode "normal"; }
bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; }
bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; }
bind "h" { MoveFocus "left"; }
bind "i" { TogglePanePinned; SwitchToMode "normal"; }
bind "j" { MoveFocus "down"; }
bind "k" { MoveFocus "up"; }
bind "l" { MoveFocus "right"; }
bind "n" { NewPane; SwitchToMode "normal"; }
bind "p" { SwitchFocus; }
bind "Ctrl p" { SwitchToMode "normal"; }
bind "r" { NewPane "right"; SwitchToMode "normal"; }
bind "s" { NewPane "stacked"; SwitchToMode "normal"; }
bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; }
bind "z" { TogglePaneFrames; SwitchToMode "normal"; }
}
tab {
bind "left" { GoToPreviousTab; }
bind "down" { GoToNextTab; }
bind "up" { GoToPreviousTab; }
bind "right" { GoToNextTab; }
bind "1" { GoToTab 1; SwitchToMode "normal"; }
bind "2" { GoToTab 2; SwitchToMode "normal"; }
bind "3" { GoToTab 3; SwitchToMode "normal"; }
bind "4" { GoToTab 4; SwitchToMode "normal"; }
bind "5" { GoToTab 5; SwitchToMode "normal"; }
bind "6" { GoToTab 6; SwitchToMode "normal"; }
bind "7" { GoToTab 7; SwitchToMode "normal"; }
bind "8" { GoToTab 8; SwitchToMode "normal"; }
bind "9" { GoToTab 9; SwitchToMode "normal"; }
bind "[" { BreakPaneLeft; SwitchToMode "normal"; }
bind "]" { BreakPaneRight; SwitchToMode "normal"; }
bind "b" { BreakPane; SwitchToMode "normal"; }
bind "h" { GoToPreviousTab; }
bind "j" { GoToNextTab; }
bind "k" { GoToPreviousTab; }
bind "l" { GoToNextTab; }
bind "n" { NewTab; SwitchToMode "normal"; }
bind "r" { SwitchToMode "renametab"; TabNameInput 0; }
bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; }
bind "Ctrl t" { SwitchToMode "normal"; }
bind "x" { CloseTab; SwitchToMode "normal"; }
bind "tab" { ToggleTab; }
}
resize {
bind "left" { Resize "Increase left"; }
bind "down" { Resize "Increase down"; }
bind "up" { Resize "Increase up"; }
bind "right" { Resize "Increase right"; }
bind "+" { Resize "Increase"; }
bind "-" { Resize "Decrease"; }
bind "=" { Resize "Increase"; }
bind "H" { Resize "Decrease left"; }
bind "J" { Resize "Decrease down"; }
bind "K" { Resize "Decrease up"; }
bind "L" { Resize "Decrease right"; }
bind "h" { Resize "Increase left"; }
bind "j" { Resize "Increase down"; }
bind "k" { Resize "Increase up"; }
bind "l" { Resize "Increase right"; }
bind "Ctrl n" { SwitchToMode "normal"; }
}
move {
bind "left" { MovePane "left"; }
bind "down" { MovePane "down"; }
bind "up" { MovePane "up"; }
bind "right" { MovePane "right"; }
bind "h" { MovePane "left"; }
bind "Ctrl h" { SwitchToMode "normal"; }
bind "j" { MovePane "down"; }
bind "k" { MovePane "up"; }
bind "l" { MovePane "right"; }
bind "n" { MovePane; }
bind "p" { MovePaneBackwards; }
bind "tab" { MovePane; }
}
scroll {
bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "normal"; }
bind "Alt down" { MoveFocus "down"; SwitchToMode "normal"; }
bind "Alt up" { MoveFocus "up"; SwitchToMode "normal"; }
bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "normal"; }
bind "e" { EditScrollback; SwitchToMode "normal"; }
bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "normal"; }
bind "Alt j" { MoveFocus "down"; SwitchToMode "normal"; }
bind "Alt k" { MoveFocus "up"; SwitchToMode "normal"; }
bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "normal"; }
bind "s" { SwitchToMode "entersearch"; SearchInput 0; }
}
search {
bind "c" { SearchToggleOption "CaseSensitivity"; }
bind "n" { Search "down"; }
bind "o" { SearchToggleOption "WholeWord"; }
bind "p" { Search "up"; }
bind "w" { SearchToggleOption "Wrap"; }
}
session {
bind "a" {
LaunchOrFocusPlugin "zellij:about" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
bind "c" {
LaunchOrFocusPlugin "configuration" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
bind "l" {
LaunchOrFocusPlugin "zellij:layout-manager" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
bind "Ctrl o" { SwitchToMode "normal"; }
bind "p" {
LaunchOrFocusPlugin "plugin-manager" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
bind "s" {
LaunchOrFocusPlugin "zellij:share" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
bind "w" {
LaunchOrFocusPlugin "session-manager" {
floating true
move_to_focused_tab true
}
SwitchToMode "normal"
}
}
shared_except "locked" {
bind "Alt +" { Resize "Increase"; }
bind "Alt -" { Resize "Decrease"; }
bind "Alt =" { Resize "Increase"; }
bind "Alt [" { PreviousSwapLayout; }
bind "Alt ]" { NextSwapLayout; }
bind "Alt f" { ToggleFloatingPanes; }
bind "Ctrl g" { SwitchToMode "locked"; }
bind "Alt i" { MoveTab "left"; }
bind "Alt n" { NewPane; }
bind "Alt o" { MoveTab "right"; }
bind "Alt p" { TogglePaneInGroup; }
bind "Alt Shift p" { ToggleGroupMarking; }
bind "Ctrl q" { Quit; }
}
shared_except "locked" "move" {
bind "Ctrl h" { SwitchToMode "move"; }
}
shared_except "locked" "session" {
bind "Ctrl o" { SwitchToMode "session"; }
}
shared_except "locked" "scroll" {
bind "Alt left" { MoveFocusOrTab "left"; }
bind "Alt down" { MoveFocus "down"; }
bind "Alt up" { MoveFocus "up"; }
bind "Alt right" { MoveFocusOrTab "right"; }
bind "Alt h" { MoveFocusOrTab "left"; }
bind "Alt j" { MoveFocus "down"; }
bind "Alt k" { MoveFocus "up"; }
bind "Alt l" { MoveFocusOrTab "right"; }
}
shared_except "locked" "scroll" "search" "tmux" {
bind "Ctrl a" { SwitchToMode "tmux"; }
}
shared_except "locked" "scroll" "search" {
bind "Ctrl s" { SwitchToMode "scroll"; }
}
shared_except "locked" "tab" {
bind "Ctrl t" { SwitchToMode "tab"; }
}
shared_except "locked" "pane" {
bind "Ctrl p" { SwitchToMode "pane"; }
}
shared_except "locked" "resize" {
bind "Ctrl n" { SwitchToMode "resize"; }
}
shared_except "normal" "locked" "entersearch" {
bind "enter" { SwitchToMode "normal"; }
}
shared_except "normal" "locked" "entersearch" "renametab" "renamepane" {
bind "esc" { SwitchToMode "normal"; }
}
shared_among "pane" "tmux" {
bind "x" { CloseFocus; SwitchToMode "normal"; }
}
shared_among "scroll" "search" {
bind "PageDown" { PageScrollDown; }
bind "PageUp" { PageScrollUp; }
bind "left" { PageScrollUp; }
bind "down" { ScrollDown; }
bind "up" { ScrollUp; }
bind "right" { PageScrollDown; }
bind "Ctrl b" { PageScrollUp; }
bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; }
bind "d" { HalfPageScrollDown; }
bind "Ctrl f" { PageScrollDown; }
bind "h" { PageScrollUp; }
bind "j" { ScrollDown; }
bind "k" { ScrollUp; }
bind "l" { PageScrollDown; }
bind "Ctrl s" { SwitchToMode "normal"; }
bind "u" { HalfPageScrollUp; }
}
entersearch {
bind "Ctrl c" { SwitchToMode "scroll"; }
bind "esc" { SwitchToMode "scroll"; }
bind "enter" { SwitchToMode "search"; }
}
renametab {
bind "esc" { UndoRenameTab; SwitchToMode "tab"; }
}
shared_among "renametab" "renamepane" {
bind "Ctrl c" { SwitchToMode "normal"; }
}
renamepane {
bind "esc" { UndoRenamePane; SwitchToMode "pane"; }
}
shared_among "session" "tmux" {
bind "d" { Detach; }
}
tmux {
bind "left" { MoveFocus "left"; SwitchToMode "normal"; }
bind "down" { MoveFocus "down"; SwitchToMode "normal"; }
bind "up" { MoveFocus "up"; SwitchToMode "normal"; }
bind "right" { MoveFocus "right"; SwitchToMode "normal"; }
bind "space" { NextSwapLayout; }
bind "\"" "s" { NewPane "down"; SwitchToMode "normal"; }
bind "%" "v" { NewPane "right"; SwitchToMode "normal"; }
bind "," { SwitchToMode "renametab"; }
bind "[" { SwitchToMode "scroll"; }
bind "Ctrl a" { Write 1; SwitchToMode "normal"; }
bind "c" { NewTab; SwitchToMode "normal"; }
bind "h" { MoveFocus "left"; SwitchToMode "normal"; }
bind "j" { MoveFocus "down"; SwitchToMode "normal"; }
bind "k" { MoveFocus "up"; SwitchToMode "normal"; }
bind "l" { MoveFocus "right"; SwitchToMode "normal"; }
bind "n" { GoToNextTab; SwitchToMode "normal"; }
bind "o" { FocusNextPane; }
bind "p" { GoToPreviousTab; SwitchToMode "normal"; }
bind "z" { ToggleFocusFullscreen; SwitchToMode "normal"; }
bind "1" { GoToTab 1; SwitchToMode "normal"; }
bind "2" { GoToTab 2; SwitchToMode "normal"; }
bind "3" { GoToTab 3; SwitchToMode "normal"; }
bind "4" { GoToTab 4; SwitchToMode "normal"; }
bind "5" { GoToTab 5; SwitchToMode "normal"; }
}
}
plugins {
about location="zellij:about"
compact-bar location="zellij:compact-bar"
configuration location="zellij:configuration"
filepicker location="zellij:strider" {
cwd "/"
}
plugin-manager location="zellij:plugin-manager"
session-manager location="zellij:session-manager"
status-bar location="zellij:status-bar"
strider location="zellij:strider"
tab-bar location="zellij:tab-bar"
welcome-screen location="zellij:session-manager" {
welcome_screen true
}
}
load_plugins {
zellij:link
}本配置使用 Ctrl+a 作为 tmux 模式前缀(替代默认的 Ctrl+b),更适合手机触控键盘操作。
这是移动端最常用的操作模式,所有操作以 Ctrl+a 开头:
| 快捷键 | 功能 | 说明 |
|---|---|---|
Ctrl+a, s |
水平分屏(下方) | 也可用 Ctrl+a, " |
Ctrl+a, v |
垂直分屏(右侧) | 也可用 Ctrl+a, % |
Ctrl+a, c |
新建标签页 | |
Ctrl+a, z |
全屏切换 | 小屏幕神器,最大化当前面板 |
Ctrl+a, x |
关闭当前面板 | |
Ctrl+a, d |
分离会话 | 断开但保持后台运行 |
Ctrl+a, n |
下一个标签页 | |
Ctrl+a, p |
上一个标签页 | |
Ctrl+a, 1-5 |
跳转到指定标签页 | 数字直达 |
Ctrl+a, h/j/k/l |
切换面板焦点 | vim 方向键 |
Ctrl+a, 方向键 |
切换面板焦点 | 也支持箭头键 |
Ctrl+a, o |
循环切换面板 | |
Ctrl+a, [ |
进入滚动模式 | |
Ctrl+a, , |
重命名标签页 | |
Ctrl+a, space |
切换布局 | |
Ctrl+a, Ctrl+a |
发送 Ctrl+a 到终端 | 用于 readline 行首跳转等 |
这些快捷键在任何非锁定模式下都可用:
| 快捷键 | 进入模式 | 用途 |
|---|---|---|
Ctrl+a |
Tmux 模式 | 主操作入口 |
Ctrl+p |
Pane 模式 | 面板管理 |
Ctrl+t |
Tab 模式 | 标签页管理 |
Ctrl+n |
Resize 模式 | 调整面板大小 |
Ctrl+h |
Move 模式 | 移动面板位置 |
Ctrl+s |
Scroll 模式 | 滚动回看 |
Ctrl+o |
Session 模式 | 会话管理 |
Ctrl+g |
Locked 模式 | 锁定(透传所有按键) |
Esc |
返回 Normal | 退出当前模式 |
任何非锁定模式下直接可用,单次按键完成操作:
| 快捷键 | 功能 |
|---|---|
Alt+n |
新建面板 |
Alt+f |
切换浮动面板 |
Alt+h/j/k/l |
切换面板/标签焦点 |
Alt+方向键 |
切换面板/标签焦点 |
Alt++ / Alt+- |
增大/缩小面板 |
Alt+[ / Alt+] |
上/下一个布局 |
Alt+i / Alt+o |
左/右移动标签页 |
通过 Ctrl+s 或 Ctrl+a, [ 进入:
| 快捷键 | 功能 |
|---|---|
j / k |
逐行上下滚动 |
d / u |
半页下/上翻 |
Ctrl+f / Ctrl+b |
整页下/上翻 |
s |
进入搜索 |
e |
用编辑器打开滚动缓冲区 |
Ctrl+c |
滚动到底部并退出 |
# 备份已有配置
cp ~/.config/zellij/config.kdl ~/.config/zellij/config.kdl.bak
# 下载本配置(替换 GIST_URL 为实际地址)
# curl -fsSL GIST_URL/config.kdl -o ~/.config/zellij/config.kdl
# 验证配置是否合法
zellij setup --check
# 应看到 [CONFIG FILE]: Well defined.# 启动新会话
zellij
# 启动并命名会话(推荐,方便重连)
zellij -s work
# 列出现有会话
zellij ls
# 重新连接到已有会话
zellij attach work
# 如果已有同名会话则连接,否则创建
zellij attach -c work- 字体:选择等宽字体,推荐 Fira Code 或 Menlo,字号 12-14pt
- 终端类型:设置为
xterm-256color - 键盘:启用 Termius 的扩展键盘栏(顶部的 Ctrl/Alt/Esc 快捷栏)
- 触控:开启"点击即粘贴"或使用 Termius 的剪贴板功能
单任务放大模式(手机竖屏推荐):
Ctrl+a, c → 新建标签页运行不同任务
Ctrl+a, n/p → 在标签页间切换
Ctrl+a, 1-5 → 数字直达标签页
分屏模式(平板或手机横屏):
Ctrl+a, v → 左右分屏
Ctrl+a, s → 上下分屏
Ctrl+a, z → 临时全屏某个面板,再按一次恢复
断线恢复:
# SSH 断开后重连,会话仍在
zellij attach -c work
# 一切如断开前| 问题 | 解决方案 |
|---|---|
| 显示乱码/方块字符 | 确认 simplified_ui true 已启用,检查 Termius 字体设置 |
| Ctrl+a 不起作用 | 检查 Termius 是否拦截了该快捷键,尝试使用扩展键盘栏 |
| 触控滚动不工作 | 确认 mouse_mode true,部分 Termius 版本需在设置中启用鼠标协议 |
| 复制不到系统剪贴板 | Termius 支持 OSC 52,无需额外配置 copy_command;如不生效,长按选择使用 Termius 自带复制 |
| 会话丢失 | 检查服务器是否重启过;zellij ls 查看存活会话 |
| 配置不生效 | 运行 zellij setup --check 确认配置路径正确且格式合法 |