交互界面
在終端裡不帶參數運行 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 標記;其他中文區域設置對應簡體中文。若是其他語言,界面使用英文。
只有界面自身的文字會被翻譯。命令輸出的內容,例如預覽的各行、消息和錯誤,與命令行中一樣以英文顯示。