Zellij 的布局系统让你可以在启动时预先定义好面板的排列方式,而不必每次手动分割。布局文件使用 KDL(KDL Document Language)格式编写,功能强大且灵活。本文将带你从最简单的布局开始,逐步掌握面板属性、浮动面板、标签页和模板的用法。
一、创建布局文件
布局文件位置
布局文件使用 .kdl 扩展名,存放在 Zellij 配置目录下的 layouts/ 文件夹中:
~/.config/zellij/layouts/my-layout.kdl
最简布局示例
以下是一个最简单的布局文件,将屏幕垂直分割为两个等大的面板:
// my-layout.kdl
layout {
pane
pane
}
每个 pane 节点代表一个面板。默认情况下,面板会按垂直方向排列(即左右分割)。
使用布局启动
通过 -l 选项指定布局名称(不含扩展名)来使用布局:
zellij -l my-layout
Zellij 会自动在布局目录中查找 my-layout.kdl 文件并加载。你也可以在已运行的会话中通过 zellij action new-tab -l my-layout 在新标签页中使用布局。
二、面板属性详解
面板节点支持多种属性,用于精确控制面板的行为和外观。
分割方向
split_direction 属性控制子面板的排列方向:
layout {
pane split_direction="vertical" {
pane
pane
}
}
vertical 表示左右排列(默认值),horizontal 表示上下排列。
面板大小
size 属性指定面板占用的空间,支持百分比和固定行数两种方式:
layout {
pane size="70%"
pane size="30%"
}
// 固定行数
layout {
pane size=10
pane
}
当使用固定行数时,剩余空间会分配给没有指定 size 的面板。
无边框与焦点
layout {
pane borderless=true
pane focus=true
}
- borderless=true:面板不显示边框,可以与其他面板无缝融合,常用于状态栏或标题栏。
- focus=true:启动时将焦点放到该面板。默认焦点在第一个面板上。
命名与工作目录
layout {
pane name="编辑器"
pane name="终端" cwd="/home/user/project"
}
- name:为面板设置显示名称,方便在状态栏中识别。
- cwd:指定面板的工作目录,面板中的 shell 会直接在该目录下启动。
运行命令
command 属性让面板在启动时自动运行指定命令,args 用于传递参数:
layout {
pane command="htop"
pane command="git" {
args "status"
}
}
命令会在面板中直接执行,退出命令后面板也会随之关闭(除非设置了 close_on_exit=false)。
在编辑器中打开文件
edit 属性可以在面板中打开编辑器并加载指定文件:
layout {
pane edit="src/main.rs"
pane
}
Zellij 会使用 $EDITOR 或 $VISUAL 环境变量指定的编辑器打开文件。
其他属性
- close_on_exit=true:命令退出时自动关闭面板。默认为 true。
- start_suspended=true:面板以挂起状态启动,需要手动唤醒后才会开始执行命令。
面板属性速查表
| 属性 | 类型 | 说明 |
|---|---|---|
split_direction | vertical / horizontal | 子面板的排列方向 |
size | 百分比或整数 | 面板大小,百分比如 "70%",整数为固定行数 |
borderless | 布尔值 | 是否隐藏面板边框 |
focus | 布尔值 | 启动时是否聚焦该面板 |
name | 字符串 | 面板名称,显示在状态栏 |
cwd | 路径字符串 | 面板的工作目录 |
command | 字符串 | 启动时运行的命令 |
args | 子节点 | 命令的参数列表 |
edit | 文件路径 | 在编辑器中打开指定文件 |
close_on_exit | 布尔值 | 命令退出后是否关闭面板 |
start_suspended | 布尔值 | 是否以挂起状态启动面板 |
三、浮动面板布局
布局文件中可以使用 floating_panes 块来定义浮动面板:
layout {
pane
pane
floating_panes {
pane {
x 10
y 10
width "60%"
height "40%"
command "htop"
}
}
}
浮动面板通过 x、y 定位左上角坐标,width、height 指定尺寸。它们悬浮在普通面板之上,不会影响底层布局。你可以在一个 floating_panes 块中定义多个浮动面板。
四、标签页
布局文件中可以使用 tab 节点定义标签页:
layout {
tab name="编辑器" {
pane size="70%"
pane size="30%"
}
tab name="终端" {
pane
}
}
每个 tab 会创建一个独立的标签页,name 属性设置标签页标题。标签页内的面板排列规则与顶层布局相同。
五、标签页模板
default_tab_template
当你有多个标签页,且希望它们共享相同的默认面板结构时,可以使用 default_tab_template:
layout {
default_tab_template {
pane size="80%"
pane size=1 borderless=true {
command "statusbar"
}
}
tab name="编辑器" {
pane edit="src/main.rs"
// children 占位符被替换为上面的内容
}
tab name="终端" {
pane command="bash"
}
}
default_tab_template 定义了一个模板,每个标签页都会自动继承该模板中的面板。标签页内部定义的面板会替换模板中的 children 占位符。如果标签页没有定义任何面板,则会直接使用模板的完整内容。
new_tab_template
new_tab_template 与 default_tab_template 类似,但它只应用于用户在运行时新建的标签页(通过快捷键或命令创建的标签页),不影响布局文件中预定义的标签页。
layout {
new_tab_template {
pane size="80%"
pane size=1 borderless=true {
command "statusbar"
}
}
// 预定义标签页不受 new_tab_template 影响
tab name="主面板" {
pane
}
}
六、面板模板
面板模板(pane_template)允许你定义可复用的面板配置,避免在多个地方重复相同的属性:
layout {
pane_template name="monitor" {
pane size="30%" borderless=true command="btop"
}
pane size="70%"
// 使用模板
monitor
monitor
}
通过 pane_template name="xxx" 定义模板后,就可以像使用 pane 节点一样使用模板名来创建面板。所有模板中定义的属性会被自动应用。
更实用的例子——为每个标签页统一添加状态监控面板:
layout {
pane_template name="status" {
pane size=1 borderless=true {
command "bash"
args "-c" "while true; do date; sleep 1; clear; done"
}
}
tab name="开发" {
pane size="70%" edit="src/main.rs"
pane size="30%"
status
}
tab name="监控" {
pane command="htop"
status
}
}
面板模板结合标签页模板,能够大幅减少布局文件中的重复代码,让复杂布局的维护更加轻松。