交互界面
在终端里不带参数运行 lip,即可打开交互界面:一个全屏程序,用方向键和 Enter 就能设置服务器、安装 levimc.org/mods 上的模组、运行服务器并编辑它的配置。
lip界面一次处理一个工作区,起初是当前目录(见工作区)。当 lip 的标准输入或标准输出不是终端时(脚本或管道中),不带参数的 lip 改为输出帮助。
与命令一样,界面运行在 lip 的守护进程中;你启动的 lip 负责显示它并转发你的按键。你可以同时在多个终端中打开它。
布局
lip 1.2.3 · D:\servers\survival ● 运行中
┌────────────────┐┌─ 主页 ──────────────────────────────────────────┐
│ 主页 ││ │
│ 服务器 ● ││ │
│ 模组 ││ │
│ 获取模组 ││ 当前页面 │
│ 游戏配置 ││ │
│ 模组配置 ││ │
│ 工作区 ││ │
│ 工具 ││ │
│ 设置 ││ │
└────────────────┘└─────────────────────────────────────────────────┘
↑↓ 移动 Enter 打开 Esc 退出| 部分 | 显示 |
|---|---|
| 顶行 | lip 的版本、所选的工作区,以及它的服务器是否在运行。 |
| 侧栏 | 九个页面。服务器运行期间,“服务器”一项带有标记。 |
| 页面 | 侧栏中选中的页面。询问、菜单和进度以对话框的形式显示在它上面。 |
| 底行 | 此刻可用的按键,各附一两个词的说明。它随你的移动而变化。终端较窄时,排在后面的按键会被省略;Esc 始终显示。 |
焦点要么在侧栏,要么在页面里;界面打开时焦点在主页中。在侧栏中,↑ 和 ↓ 逐个显示页面,Enter 进入所显示的页面;Esc 回到侧栏。
界面需要至少 60 列、16 行的终端;终端更小时,它会请你放大终端,此时唯一可用的按键是 Ctrl+C,它不经询问直接退出。在不足 80 列的终端里,当你在页面中时,侧栏收窄为每页一个符号,回到侧栏时再显示名称。
按键
同样的按键在每个页面上作用一致:
| 按键 | 作用 |
|---|---|
↑、↓ | 在列表或菜单中移动。 |
←、→ | 在侧栏与页面之间、并排的各栏或按钮之间移动;改变选项的值。 |
Enter | 打开或执行选中的内容。在列表的一行上,打开可对它执行的操作菜单。 |
Space | 在可多选的列表中勾选一行;打开或关闭一个开关。 |
Esc | 返回上一层:从对话框回到页面,在页面内从里层回到外层(从服务器的输入行回到它的输出,从文件的值回到文件列表),从页面回到侧栏。在侧栏中,询问是否退出。 |
Tab、Shift+Tab | 移到下一个或上一个区域,在侧栏和页面的各个区域之间循环。 |
PgUp、PgDn、Home、End | 在列表或文本中翻页。 |
Ctrl+C | 在服务器页面且服务器正在运行时,停止服务器。在其他页面和侧栏中,询问是否退出。在执行修改期间,取消这次修改。 |
界面没有字母快捷键。你能做的每件事都是屏幕上的一行或一个按钮,用方向键就能选到;只有在文本框获得焦点时(例如搜索框或服务器的输入行),才需要输入字符。
要退出,请在侧栏按 Esc,或在 Ctrl+C 不是停止服务器的地方按 Ctrl+C,然后确认。正在运行的服务器会继续运行(见服务器)。
三步开好第一个服务器
主页按顺序列出新服务器需要的步骤。用 ↑ 和 ↓ 选择一步并按 Enter;已完成的步骤会打勾。
- 创建服务器。 当前目录还没有服务器时,lip 提供在其中创建,或让你选择其他文件夹;然后依次询问游戏版本和加载器(见工作区)。随后它显示将要安装的内容;选择应用,并在询问时接受 Minecraft EULA。
- 安装模组。 这会打开获取模组页面:移到一个模组上,按
Enter,选择安装,再选择版本。同样,lip 会先显示将要做什么,然后才改动。 - 启动服务器。 这会打开服务器页面并启动服务器。在它的输入行里输入服务器命令;
Ctrl+C停止服务器。没有服务器时无可启动,lip 会请你回到第一步。
如果你的网络连不上 GitHub,lip 会在一开始就询问如何连接:见 GitHub 代理。
页面
| 页面 | 作用 | 对应命令 |
|---|---|---|
| 主页(Home) | 显示工作区的状态和下一步该做什么。 | |
| 服务器(Server) | 启动和停止服务器,显示它的输出,并把你输入的内容发给它。 | lip run、lip config |
| 模组(Mods) | 列出已安装的包;安装、更新、卸载。 | lip list、lip install、lip update、lip uninstall |
| 获取模组(Get mods) | 搜索、筛选、排序 levimc.org 上的模组,并安装。 | lip install |
| 游戏配置(Game config) | 编辑 server.properties、allowlist.json 和 permissions.json。 | |
| 模组配置(Mod config) | 编辑已安装模组的配置文件。 | |
| 工作区(Workspaces) | 在工作区之间切换,设置新服务器,更改某个工作区的游戏或加载器。 | lip setup |
| 工具(Tools) | 创建 lip.toml、迁移 tooth.json、打包 ZIP、查看包。 | lip pkg init、lip pkg migrate、lip pkg pack、lip pkg view |
| 设置(Settings) | 语言、GitHub 代理、缓存、lip 的更新、守护进程的状态。 | lip config、lip cache clean、lip self-update、lip daemon status |
每个页面都处理顶行显示的所选工作区。
主页
主页显示所选工作区的状态,以及新服务器的三个步骤:创建服务器、安装模组、启动服务器。已完成的步骤会打勾;在某一步上按 Enter 直接进入该步骤(见三步开好第一个服务器)。
服务器
服务器页面显示所选工作区的服务器是在运行、在等待重启,还是以什么退出码退出;一个启动或停止它的按钮,以及自动重启选项;服务器的输出;服务器运行期间还有一个输入行。在没有服务器的工作区中,页面改为提供新建服务器…,其设置过程与工作区页面相同。
- 启动服务器时,会像
lip run --managed --detach一样把它作为托管服务器启动:它由 lip 的守护进程运行,退出 lip 或关闭其终端后仍继续运行。再次打开 lip,或在该工作区运行lip run --managed,即可重新看到它。 - 服务器运行期间,你在输入行里输入的内容按
Enter发给服务器;↑和↓调出之前发送过的行。Esc从输入行回到输出,Tab则从按钮依次移到输出和输入行。 - 输出获得焦点时,
↑、↓、PgUp、PgDn、Home和End滚动它;否则它跟随服务器的最新输出。 - 用按钮或
Ctrl+C停止服务器时,会向它发送一行stop。 - 自动重启决定服务器崩溃后是否重新启动;它就是工作区的
restart键,与lip config set restart on-failure --workspace设置的相同(参见lip run)。设置页面中也有这个选项。
每个工作区有自己的服务器,因此多个工作区的服务器可以同时运行;工作区页面会标出服务器正在运行的工作区。同时在多个终端中打开的界面以及 lip run --managed 共享这些服务器:每个界面显示其所选工作区的服务器,无论由谁启动。
lip 无法使用守护进程而自己运行界面时,它启动的服务器不是托管服务器:退出 lip 会请求它们停止,lip 会等到它们都退出。
服务器运行期间,界面既不改动其工作区中的包,也不改动游戏配置:见服务器运行期间。
模组
模组页面列出工作区中已安装的包,与 lip list 相同。
- 列表上方是适合当前工作区的操作:从来源安装…始终存在;安装过模组后有全部更新,在此之前则是打开获取模组页面的获取模组;没有游戏的工作区还有新建服务器…。第一项中,可以按命令行的写法输入包(见
lip install),例如包 id 或 URL,也可以浏览并选择磁盘上的 ZIP 文件或文件夹。 - 在模组上按
Enter打开它的菜单:查看详情、更新、更新到你指定的版本(lip update <包>@<版本>),或卸载。详情与获取模组页面为该模组显示的内容相同;levimc.org 的模组目录中没有这个模组,或目录无法读取时,lip 会提示没有它的信息。游戏和加载器的菜单通往工作区页面,它们的版本在那里更改。 Space勾选你安装的模组;此时菜单一次更新或卸载所有勾选的模组。
仅因为被其他包依赖而安装的包既不能勾选,也不能单独卸载:请卸载依赖它的包。
获取模组
获取模组页面读取 levimc.org 的模组目录(https://levimc.org/api/v4/mods/);目录内容不会写入磁盘,也不经过 github_proxy。lip 只管理服务端,所以列表里只有带服务端构建的模组。
页面上有搜索框、排序方式、打开筛选条件的一行(游戏版本、标签、许可证、依赖)、模组列表和选中模组的详情。与 levimc.org 一样,列表的每一行显示模组的下载量、星标和最近更新的日期,已安装的模组带有标记;下载量未知时不显示。排序方式与 levimc.org 一致:
| 排序 | 模组的顺序 |
|---|---|
| 相关性 | 与搜索最匹配的在前。 |
| 热度 | 最热门的在前。模组的热度与 levimc.org 一样,由下载量和星标共同算出,所以它既不是按下载量排序,也不是按星标排序。 |
| 最近更新 | 最近更新的在前。 |
| 最新发布 | 最近发布的在前。 |
在模组上按 Enter 打开它的菜单:安装…、阅读 README,或在浏览器中打开它的页面。安装一定要先选择版本,不能不看版本就直接安装“最新版”:
- 模组有变体时,所有变体作为标签排在顶部的一行里,
←和→切换变体。这一行放不下全部变体时会横向滚动,并标出哪一侧还有未显示的变体;它绝不会占用第二行。 - 下面是所选变体中与工作区的游戏和 LeviLamina 相配的版本,从新到旧,且只有这些版本。没有相配的版本时,会有一行说明是哪个游戏版本或哪个 LeviLamina 版本排除了它们。
- 最后一行**自定义…**改为接受一个分支、标签或提交,例如
branch:main。
在没有服务器的工作区中,没有可供版本相配的对象:lip 会说明这一点,并提供先创建服务器(见工作区)。
游戏配置
游戏配置页面编辑工作区根目录下服务器的文件,分为三个部分:
| 文件 | 内容 |
|---|---|
server.properties | 服务器的属性。 |
allowlist.json | 允许进入服务器的玩家。 |
permissions.json | 每个玩家的权限。 |
Enter 编辑选中的条目,Space 切换 true/false 值;在你修改过的属性上,Enter 还提供恢复原值。**添加玩家…**是两个玩家列表各自的第一行,在玩家上按 Enter 打开它的菜单,可以移除该玩家。
在你选择页面底部的保存之前,什么都不会写入;放弃丢弃你的修改,带着未保存的修改离开页面时,会询问是否保存。如果文件在 lip 读取之后在磁盘上被修改过,lip 会先询问再覆盖。lip 只改动你修改过的内容:在 server.properties 中,只改动你修改过的属性所在的行,所有注释都保留;在 JSON 文件中,只改动你修改过的值,并保持成员的顺序(JSON 文件中的注释不会保留)。
服务器在第一次启动时生成 server.properties,所以新的工作区里可能还没有它;allowlist.json 和 permissions.json 会在你保存时创建。服务器在启动时读取这三个文件。
服务器运行期间,这个页面是只读的:可以浏览这些文件,但不能修改,也不能保存(见服务器运行期间)。
模组配置
模组配置页面列出已安装模组的配置文件。.json 文件以树的形式打开:Enter 打开对象或列表、编辑值,Space 切换 true/false 值,Esc 返回上一级;列表中有一行用于添加值,在它的某个值上按 Enter 可以移除该值。其他文件原样显示,请用文本编辑器修改。与游戏配置页面一样,在你选择保存之前什么都不会写入,带着未保存的修改离开时会询问;已不存在的文件不会被创建。与游戏配置不同,模组的配置在服务器运行期间也可以保存;模组可能要到服务器下次启动时才读取它(见服务器运行期间)。
已安装的模组都没有配置文件时,页面会说明没有可配置的模组,并改为提供获取模组。这并不表示没有安装模组:模组可能没有配置,或把配置放在 lip 不查看的位置。
模组的配置文件是 mods/<模组>/config/ 中的文件;没有这样的文件时,是 mods/<模组>/ 下直接存放的 .json、.ini、.toml、.yml 和 .yaml 文件(manifest.json 除外),以及 mods/<模组>/data/config.json。大多数模组在服务器第一次启动时生成它们。
工作区
lip 把你用过的工作区记在一个列表里,即其状态目录中的 workspaces.json(Windows 上为 %LOCALAPPDATA%\lip\State,其他系统为 $XDG_STATE_HOME/lip)。界面打开时,当前目录若不在列表中会被加入,并被选中。列表在 lip 的多次运行之间保留,并由同时打开的各个界面共享。
工作区页面显示这个列表:哪个工作区是所选的,哪些已不存在,哪些的服务器正在运行。
- 列表上方有两个操作:新建服务器…,以及添加已有文件夹…,后者让你选择文件夹。
- 在工作区上按
Enter打开它的菜单:切换到它、更改它的游戏或加载器版本,或把它从列表中移除。移除不会改变工作区中的任何文件;当前所选的工作区不能移除。目录已不存在的工作区只能移除;服务器正在运行的工作区不能更改版本。
设置新服务器至多分四步:
- 服务器的文件夹:在文件夹浏览器中选择。也可以选择尚不存在的文件夹,它会被创建。所选工作区还没有服务器时,lip 会先提供这个工作区本身。
- 游戏版本:读自服务器的构建列表,先是正式版本(从新到旧),然后是其他版本。每个版本都标明是否有支持它的 LeviLamina。模组需要 LeviLamina,而并非每个游戏版本都有对应的 LeviLamina,所以要装模组的服务器请选择受支持的版本。lip 查不到这一信息时,列表只显示版本。
- 构建:仅当 lip 运行在 x64 的 Linux 上且该版本两种构建都有时才询问:
windows,即 LeviLamina 及其模组运行于其上的服务器(在 Windows 以外通过 Wine 运行);或linux,即不带加载器的 Linux 版服务器。在其他系统上 Linux 版服务器无法运行,所以构建就是windows,lip 不会询问;该版本只有一种构建时同样不询问。 - 加载器(仅
windows构建):支持该游戏的 LeviLamina 版本(从新到旧),或不使用加载器。lip 按lip setup的方式查找它们,可能需要一点时间。
随后 lip 创建该目录,把它加入列表并选中它,再按你的选择执行 lip setup,例如 lip setup --game 1.21.50 --loader levilamina@1.1.0。Esc 返回上一步,在第一步则停止,不会创建任何东西。完成后,新工作区就是列表中选中的那一行。
更改某个工作区的游戏或加载器,就是在其中再次执行 lip setup,除文件夹外的选择与上面相同;每一步都从该工作区现有的内容开始。
工具
工具页面面向制作包的人。它的每一行会询问对应命令所需的内容,并显示结果:
| 行 | 命令 |
|---|---|
创建 lip.toml | lip pkg init |
迁移 tooth.json | lip pkg migrate |
| 打包 ZIP | lip pkg pack |
| 查看包 | lip pkg view |
某一行需要文件夹或文件时,你在文件夹浏览器中选择:打包会先询问包所在的文件夹,再询问要写入的文件。查看包会先询问查看哪一个:工作区中已安装的模组(从列表中选择)、按命令行写法输入的包,或磁盘上的 ZIP 文件或文件夹。
设置
| 行 | 作用 | 命令 |
|---|---|---|
| 语言 | 选择界面的语言,或跟随系统(见语言)。 | lip config set language <值>、lip config delete language |
| GitHub 代理 | 设置并测试 lip 访问 GitHub 所用的代理,改为直接连接,或移除这项设置(见 GitHub 代理)。 | lip config set github_proxy <URI>、lip config delete github_proxy |
| 自动重启 | 决定所选工作区的服务器崩溃后是否重新启动(见服务器)。 | lip config set restart on-failure --workspace |
| 清理缓存 | 删除已下载的文件。 | lip cache clean |
| 检查更新 | 检查是否发布了更新的 lip,并提供安装。 | lip self-update --check |
| 安装更新 | 安装新版本;检查发现新版本后才有这一行。 | lip self-update |
| 守护进程 | 显示 lip 守护进程的状态;Enter 重新查询。 | lip daemon status |
| 关于 | 显示 lip 的版本。 | lip --version |
界面不能停止守护进程,因为界面正是由守护进程运行的:请退出界面后运行 lip daemon stop。
预览与应用
对工作区的每次修改(安装、更新、卸载、设置)都按同样的流程进行:
- 预览。 lip 先以 dry run(
--dry-run)执行命令,并显示将要做什么。 - 应用或取消。 在你选择应用之前,什么都不会改变。取消让工作区保持原样,所以它也是只查看命令将要做什么的方式。预览发现没有任何改动时(例如都已安装),就没有可应用的内容,唯一的按钮是关闭。
- 许可协议,当这次修改会设置游戏时,例如新服务器,或在没有游戏的工作区中安装
LeviLamina(见lip setup):lip 给出 Minecraft EULA 和 Microsoft 隐私声明的链接,询问你是否接受;除非你接受,否则什么都不会改变。 - 进度。
Esc或Ctrl+C取消这次修改,并撤销已经完成的部分。 - 结果。 命令输出的消息。
应用不会从头再来:预览从网络读到和下载的内容(版本、包文件、归档)会被直接使用,所以应用所需的时间只取决于对工作区的改动。新建服务器从第一步起就共用这些内容,所以各步骤读过的版本也不会再读一遍。
若某次设置的预览中列出了因无法与新游戏配合而将被卸载的模组,选择应用即会卸载它们。
命令失败时,界面会显示原因、可以采取的措施,以及工作区 .lip/logs 下失败报告的路径,然后继续运行。
选择文件夹或文件
凡是 lip 需要文件夹或文件的地方,都会打开文件夹浏览器,你不必手动输入路径:新服务器的文件夹和要添加的已有文件夹(工作区),要安装的 ZIP 文件或文件夹(模组),以及要打包的文件夹、要写入的文件和要查看的包(工具)。
浏览器从所选工作区的文件夹开始。它有一个路径栏、所显示文件夹的内容列表(先是 ..,然后是其中的文件夹,最后是可以选择的文件,如果有的话),以及按钮。
| 按键 | 作用 |
|---|---|
↑、↓、PgUp、PgDn、Home、End | 在列表中移动。 |
Enter、→ | 在文件夹上,打开它。在文件上按 Enter 选择它。 |
←,或在 .. 上按 Enter | 返回上一级。盘符的顶层文件夹之上是盘符列表(Windows 上;在其他系统上顶层是 /)。 |
Tab、Shift+Tab | 在路径栏、列表、文件名(要写入文件时)和按钮之间移动。 |
Esc | 在路径栏中,回到列表;否则关闭浏览器,不作选择。 |
- 选择此文件夹选择所显示的文件夹;保存选择所显示文件夹中、以列表下方输入的名称命名的文件。
- **新建文件夹…**询问名称,并在所显示的文件夹中创建该名称的文件夹。
- 你仍然可以在路径栏中输入或粘贴路径,按
Enter前往:绝对路径,或相对于所显示文件夹的路径。
隐藏的文件夹和文件,以及名称以点开头的(例如 .lip),不会列出;要进入它们,请在路径栏中输入路径。lip 无权读取的文件夹会给出提示,此时只能返回上一级。
服务器运行期间
所选工作区的服务器运行期间,界面既不改动它的包,也不改动它的游戏配置:
| 内容 | 服务器运行期间 |
|---|---|
| 安装、更新和卸载模组(模组、获取模组) | 不可用。 |
| 设置或更改游戏或加载器(工作区) | 不可用。 |
server.properties、allowlist.json、permissions.json(游戏配置) | 只读。 |
| 模组的配置文件(模组配置) | 可以修改和保存。如页面所提示,修改可能要重启服务器后才生效。 |
不可用的操作仍留在屏幕上,显示为禁用,并附有原因:请先停止服务器。其他功能照常可用,例如浏览 levimc.org 上的模组、工具和设置。
无论服务器由谁启动,都是如此:界面、lip run --managed,或另一个终端中普通的 lip run。这只针对界面:命令 lip install、lip update、lip uninstall 和 lip setup 在服务器运行期间不会被拒绝(见运行服务器)。
GitHub 代理
lip 从 GitHub 下载 LeviLamina 和大多数模组。界面打开时,如果没有设置 github_proxy(连空值都没有,见配置),lip 会在后台检查能否连上 GitHub,期间你可以照常使用界面:它请求 https://github.com/LiteLDev/LeviLamina.git/info/refs?service=git-upload-pack,并最多等待 10 秒的应答。
GitHub 没有应答时,界面会询问如何连接它:
| 选项 | 作用 |
|---|---|
| 使用代理 | 在设置页面中询问 GitHub 代理的 URL 前缀,通过它发送同样的请求来测试,可用时把它保存为 github_proxy。不可用时,你可以重新输入,或仍然保存它。 |
| 直接连接 | 把 github_proxy 设为空值:lip 直接连接 GitHub,不再检查或询问。 |
| 以后再说 | 什么也不改变;下次打开界面时,lip 会再次检查。 |
lip 自身不推荐任何代理。你随时可以在设置页面中,或用 lip config 修改 github_proxy;设置之后,就不再进行检查。
语言
界面有英文、简体中文和繁体中文三种语言。在设置页面中选择一种,屏幕立即随之改变。这个选择就是用户配置的 language 键(见配置):
| 值 | 语言 |
|---|---|
en | 英文 |
zh-Hans | 简体中文 |
zh-Hant | 繁体中文 |
lip config set language zh-Hans
lip config delete language没有设置 language 时,界面跟随系统:在 Windows 上是你的用户的显示语言;在其他系统上是环境变量 LC_ALL、LC_MESSAGES 和 LANG 中第一个指明了语言的。台湾、香港或澳门的中文区域设置,或带有 Hant 标记的,对应繁体中文,除非它带有 Hans 标记;其他中文区域设置对应简体中文。若是其他语言,界面使用英文。
只有界面自身的文字会被翻译。命令输出的内容,例如预览的各行、消息和错误,与命令行中一样以英文显示。