sim 現在能做什麼

sim 現在能做什麼,依用途分組。每項功能都列出了專案規格中支撐它的需求編號。規劃中的功能只列在「路線圖」之下。

顯示被隱藏的東西

核心理念:檔案是什麼樣子,就顯示成什麼樣子。

  • 顯示不可見字元與雙向字元

    由右至左覆寫字元、零寬空格或控制字元,會以洋紅色色塊顯示為 <U+202E>、<U+200B> 或 ^[。無論儲存格處於什麼狀態都一樣:被選取、被搜尋命中、位於游標所在行、處於外部變更之內,或在遠處行的霧化之中。它們沒有任何一個會原封不動地送給終端機。檔案中字面的文字 <U+202E> 沒有色塊,因此兩者可以分辨。

    規格: SAFE-8, UI-15

  • 看起來什麼都沒有的空白也會標出來

    行尾空白顯示為 ·,不換行空格顯示為 ⍽,Tab 顯示為 »:這些標記沒有任何程式碼會使用,畫在文字之上,並不屬於文字本身。行尾沒有標記,也不使用 - 和 %,因為它們是程式碼中的一般字元。

    規格: UI-6

  • 標出來自外部的寫入

    sim 會監看開啟的檔案。當另一個行程(建置、格式化工具或其他工具)改寫它時,變更的行會在文字中被標出,邊框會顯示磁碟上有多少處變更,分頁顯示 ↯,檔案樹也會標出該檔案。儲存時會先比對檔案的雜湊值,如果它在你讀取之後有變動,就不會寫入任何內容。在與該檢查完全同一時刻發生的寫入,仍有可能漏過(見「安全」頁)。

    規格: DISK-1, DISK-2, DISK-6, SAFE-5, UI-4, MARK-1

  • 一眼看清與 git HEAD 的差異

    行號旁的標記表示新增、修改與刪除的行;檔案樹中每個檔案有一個狀態字母(M、A、U、D、R),資料夾則顯示其下最強的那個狀態的字母;狀態列顯示分支名稱與 +n ~n -n。這些資訊來自 git,在背景執行,絕不會佔用按鍵的處理路徑。

    規格: UI-3, UI-5, UI-10

  • 儲存庫自身的設定無法讓 git 執行指令

    執行 git 之前,sim 會先向 git 詢問儲存庫自身的設定。命令列能擋住的都會被關閉:檔案系統監視器、hooks、過濾器、外部 diff 和文字轉換都不會執行任何東西,檔案樹會寫出被關閉的設定數量(2 git settings off)。如果設定裡仍有擋不住的、可能執行指令的項目(core.sshCommand、可能引入這類項目的 include 等),就不執行 git:檔案樹不顯示 git 標記,並寫出 git not run,狀態列會指出相關的鍵與檔案。git 不經過 shell 執行,不使用選用鎖,也無法擷取。

    規格: MARK-1, GIT-1, GIT-2, GIT-3, GIT-5

  • 所有不顯示任何內容的字元,都會被顯示出來

    除了由右至左覆寫字元和零寬空格,sim 還會把標籤字元(把指令偷偷傳給 AI 助理的手法)、變體選擇符(在已發布的擴充功能中隱藏程式碼的手法)、諺文填充字元、軟連字號、行分隔符號以及所有未指派的碼點,顯示為 <U+E0041> 這樣的形式,凡是 sim 繪製文字的地方都一樣:檔案、狀態列、訊息,以及檔案樹和分頁中的名稱。表情符號序列、按鍵符號、英格蘭、蘇格蘭和威爾斯的旗幟,以及 Nerd Font 圖示維持原樣。漢字後面接著表意文字變體選擇符時,會顯示該選擇符。

    規格: SAFE-10, SAFE-11

  • 警示色塊標記的不只是字元

    洋紅色表示某處值得再看一眼。除了隱藏字元,文字看起來像某個位址、而連結目標並不是該位址的 Markdown 連結([https://good.example](https://evil.example)),其目標會畫在這個色塊上;基於安全考量而沒有執行 git 的儲存庫,檔案樹裡會在色塊上寫出 git not run。

    規格: UI-15, MD-10, GIT-5

該拒絕的就拒絕,你的文字不會遺失

沒有你的明確操作,任何人的文字都不會遺失,檔案也無法重新設定編輯器。

  • 沒有 modeline,沒有設定檔,沒有外掛

    設定與指令絕不會從檔案內容中讀取,因此檔案無法重新設定編輯器。沒有可從儲存庫載入的設定檔,沒有外掛 API,sim 也不會開啟任何網路連線。它記住的只有你選擇的外觀、圖示與 Markdown 檢視,各一個詞。

    規格: SAFE-9

  • 不會寫到一半的儲存

    儲存時,sim 會在原檔旁寫入一個暫存檔(以 0600 權限與 O_EXCL 建立),對其執行 fsync,再以 rename 覆蓋原檔,並對目錄執行 fsync,所以你看到的要嘛是舊檔,要嘛是新檔,絕不會是兩者的混合。屬於他人的檔案、有硬連結的檔案,或位於唯讀目錄中的檔案,會在產生復原用副本後原地儲存。sim 拒絕透過他人擁有的連結寫入。開啟後不做編輯直接儲存,輸出與原檔逐位元組相同。

    規格: SAFE-1, SAFE-2, SAFE-3, SAFE-5

  • 當機時不遺失文字

    未儲存的變更最多每秒產生一次快照,存入私有的狀態目錄(0700)。當機、kill -9 或關閉終端機之後,再次開啟該檔案時,會提示還原它們,作為一次復原步驟。最多遺失一秒鐘的工作。

    規格: SAFE-6

  • 搜尋絕不執行儲存庫所能控制的東西

    sim 自己在 PATH 的絕對路徑項目中尋找 ripgrep,並以空環境與 --no-config 執行它,絕不使用 --pre,所以儲存庫無法讓搜尋執行它的程式碼。搜尋從不寫入任何內容,也從不跟隨符號連結走出專案。

    規格: GREP-7, GREP-8

  • 非文字檔案以唯讀方式開啟

    不是有效 UTF-8 的檔案,或前 8 KB 中含有 NUL 的檔案,會以唯讀方式開啟並顯示原因,無效位元組顯示為 U+FFFD。編輯與寫入都會被拒絕,因為畫面上的文字並不等於檔案本身。

    規格: SAFE-4

  • 儲存發生衝突時保留兩個版本

    當儲存時發現檔案在磁碟上已被改動,雙方的內容都不會遺失。:w! 在把對方的版本複製到狀態目錄之後保留你的版本,:e! 在替你的版本建立快照之後採用對方的版本。

    規格:

  • --plain:不執行外部行程

    sim --plain 只有核心:calm 外觀、單一檔案、沒有面板,也不執行任何外部程式(不用 git,不用 ripgrep,不用過濾器,不用掛鉤)。以 root 身分執行或作為 sudoedit 的編輯器時,這是預設行為,狀態列會顯示 plain。

    規格:

觸及與速度

從「那個檔案」到讀到它,步驟最少。

  • 從不亂動的專案樹

    sim 啟動時會開啟目前目錄的檔案樹。目錄在前,檔案在後,各自依名稱排序,順序始終不變,展開狀態也維持你離開時的樣子,所以你是憑位置而不是靠閱讀來找到檔案。目錄在背景讀取:項目到達時才出現,不會推動它上方的任何內容。

    規格: TREE-1, TREE-3, TREE-4, TREE-5

  • 在浮動視窗中尋找檔案與文字

    Ctrl-p 依路徑做模糊比對來尋找檔案,並依比對程度與你開啟每個檔案的可能性排序。Ctrl-f 隨著你的輸入搜尋所有檔案的內容(PATH 中有 ripgrep 時使用它),結果依檔案分組,並預覽所選的那一行。Esc 會讓一切恢復原狀。

    規格: FIND-2, FIND-4, GREP-1, GREP-5, PICK-1

  • 可能要開啟的檔案就地標出

    sim 會記住你開啟過哪些檔案,並綜合最近使用與使用頻率來排序。最可能的五個檔案在檔案樹中以 • 標出。只要一個鍵 .,就能把檔案樹縮小到有變更、已開啟或最近開啟過的檔案。

    規格: MARK-2, MARK-3

  • 多個檔案,每個都是完整的編輯器

    每個開啟的檔案都有各自的復原、快照、監看與儲存。分頁列會顯示它們,未儲存的變更以粗體 ● 表示。Tab 與 Shift-Tab 用來切換。

    規格: BUF-1, BUF-2, UI-4

  • 快到你察覺不到

    在專案的基準測試中(release 建置、100,000 行的檔案、面板開啟、語法上色開啟),在 80×24 到 240×60 的螢幕上,單次按鍵在 p99 下至多耗時 1 ms。在有 100,000 個檔案的儲存庫中,第一個畫面會在讀取檔案清單之前就畫出來:實測為 1.8 至 8.7 ms,而需求是 20 ms。任何耗時的操作(走訪目錄樹、詢問 git、為上色做剖析)都在背景執行緒中執行。

    規格: SPEED-1, SPEED-2

  • 只有一個可執行檔:sim

    原本獨立的 si 可執行檔已併入 sim:安裝只要一個指令,執行也只要一個指令。核心是一個函式庫 sim-editor-core,sim 建構於其上。sim --version 與 sim --help 會印出資訊後直接結束,不會碰終端機。

    規格:

  • 以字母選擇分頁

    <Space>bp 會為每個分頁標上一個字母,按下該字母即可跳到對應的檔案。<Space>bc 以同樣的方式關閉分頁,而且絕不會關閉已修改的檔案。第一次開啟第二個檔案時,會有提示告訴你 Tab 與 Shift-Tab,直到你用過它們三次為止。

    規格:

  • 與 git HEAD 比對的變更樹

    <Space>ge 會開啟只包含與 HEAD 不同的檔案的樹,已暫存、未暫存和未追蹤的都包括,每個檔案帶狀態字母和 +n −n,每個資料夾帶合計。按 Enter 以唯讀方式開啟該檔案在 HEAD 中的版本。

    規格: GIT-1, GIT-2, GIT-3, GIT-4, DIFF-1, DIFF-3, DIFF-4

舒適閱讀

色彩與版面是計算出來的,不是憑感覺。

  • 取自你自己調色盤的語法色彩

    色彩取自終端機的調色盤(以 OSC 4 讀取)。色相保持不變,只調整明度,直到文字相對背景達到 |Lc| 75。關鍵字為紅色,字串與數字為綠色,型別為黃色,函式為青色,註解為灰色斜體;藍色與洋紅色從不用於程式碼。語言依檔名、副檔名或第一行判斷,使用 bat 的語法集。zh 可關閉這些顏色。

    規格: SYN-1, SYN-2, SYN-4

  • Markdown 閱讀檢視

    在 Markdown 檔案中,除游標所在行外,每一行都依閱讀時的樣子繪製:強調和程式碼標記不畫出來,表格依顯示寬度對齊,標註區塊(> [!NOTE])顯示該類型的名稱。被隱藏的只有這些標記,絕不會隱藏 #、括號、URL 或任何文字字元,<Space>um 可顯示原始文字。

    規格: UI-8, MD-1, MD-10, MD-11

  • 三種外觀

    calm 是最樸素的一種:只用四種樣式與一種彩色背景。flat 把差異顯示為綠色與紅色,並替行染上淡色。depth 是預設外觀,加入了邊框、概覽尺規,以及依與游標的距離讓文字漸淡的霧化。zl 可在它們之間循環切換。分不清紅色與綠色的人適合使用 calm。

    規格: LOOK-1, LOOK-2, LOOK-3

  • 靠量測保證可讀

    內文為 |Lc| 90,次要文字為 |Lc| 60(APCA),依終端機背景計算。在 calm 外觀中,唯一的變更色彩在 protan(紅色覺異常)、deutan(綠色覺異常)與 tritan(藍色覺異常)三類色覺下仍可分辨。整個介面中,一種色相只代表一件事:灰色代表結構,藍色代表你操作的位置,綠、琥珀、紅代表變更,洋紅色只代表被隱藏或有危險的東西。

    規格: VIS-4, VIS-5, COLOR-1, UI-12

  • 能長住的編輯器

    檔案樹中的圖示(需要 Nerd Font;zi 可關閉)、分頁列、作為編輯器標題的麵包屑(src › sim.rs › leader_key)、顯示模式、分支、與 HEAD 的差異和位置的狀態列(只有編碼不是 UTF-8、換行字元不是 LF 時才會寫出)、相對行號、縮排參考線、帶標記的捲軸,以及剛複製的內容上的一次閃爍。

    規格: UI-2, UI-5, UI-6, UI-10, UI-11

  • 日文及其他 CJK 文字

    寬字元佔兩欄,文章依日文禁則(kinsoku)規則換行,依詞移動時會在文字種類改變處切開 CJK 文字,開著輸入法(IME)時,全形按鍵也能當作指令使用。

    規格: VIS-7, VI-10

  • 沒有顏色也能用,而且從不只靠顏色

    NO_COLOR 與少於 8 色的終端機只用粗細、底線與反白來繪製,sim 也不會向終端機請求任何顏色。意義從不只靠顏色傳達:變更的行在符號欄中是 ┆,資料夾顯示其下最強的 git 狀態的字母,分頁以 ↯ 表示檔案在磁碟上已有變動。關閉圖示後,不會繪製任何私有區(private-use)字形。

    規格:

  • 可能裝有 Nerd Font 的終端機中,圖示預設開啟

    圖示需要 Nerd Font,而終端機無法告知自己有沒有。圖示在 Ghostty、kitty 與 WezTerm 中預設開啟,在其他終端機中預設關閉,並在狀態列給出一次性的提示:zi: icons (needs a Nerd Font)。你用 zi 做的最後一次選擇永遠優先。

    規格:

  • 複製時亮起,在每種外觀中都一樣

    剛剛複製的內容會亮 150 ms。最樸素的 calm 外觀現在也會亮:用選取範圍的灰色,沒有選取範圍的地方用底線。另一個行程剛剛寫進已開啟檔案的行,會亮 400 ms。

    規格: UI-13, UI-19

按鍵

vi 的文法,去掉 vi 的怪癖。

  • 你的手早已熟悉的 vi 按鍵

    移動指令、運算子、文字物件、計數、.、視覺模式、支援 smartcase 的搜尋、:s 與範圍,但去掉了 vi 的怪癖:Y 複製到行尾,U 是重做,Ctrl-s 儲存,q 結束。方向鍵、Home、End 與 Delete 在任何地方都能用。

    規格: VI-1, VI-2, VI-3, VI-4, VI-5, VI-6, VI-7

  • 複製的內容會進入系統剪貼簿

    每次沒有指定暫存器名稱的複製也會透過 OSC 52 送進系統剪貼簿,在 tmux 裡同樣如此。刪除與修改只會填入暫存器,所以 x 和 dd 永遠不會覆蓋你複製的內容。

    規格: VI-8

  • 不出意外的滑鼠

    按一下可開啟檔案或放置游標,滾輪捲動,拖曳選取。滑鼠自己絕不會編輯、儲存或建立快照。

    規格: PTR-1, PTR-2

  • Space 是 leader 鍵,附帶 which-key 視窗

    在前綴鍵(Space、g、z、Z、[、],或 d 這類運算子)上稍待片刻,會開啟一個小視窗,列出接下來可以按的鍵。繼續輸入的效果與沒有這個視窗時完全相同。

    規格:

  • 搜尋會告訴你目前的位置

    搜尋的比對結果以醒目提示標出時,狀態列會顯示游標位於第幾個比對結果,以及總共有多少個:[3/12]。

    規格:

  • Vim 的暫存器

    "a 到 "z 保存文字,"A 到 "Z 在其後附加;"0 是最近一次複製,"1 到 "9 是最近的幾次刪除,"_ 接收任何內容卻什麼也不保存。:registers 會列出它們。暫存器只存在於記憶體中,所有開啟的檔案共用。沒有指定名稱的複製仍會透過 OSC 52 送進系統剪貼簿;刪除仍不會。

    規格: VI-15

  • 標記

    ma 到 mz 在檔案中設定標記;'a 跳到標記所在的行,反引號鍵跳到它的確切位置,也可以搭配運算子使用(d'a)。'' 回到最近一次跳躍之前游標所在的位置。標記會跟著它所在的文字,經過編輯、復原和來自外部的變更,:marks 會列出它們。標記只存在於記憶體中。

    規格: VI-17

  • :tutor

    約十五分鐘的簡短課程,在一個暫存緩衝區裡進行,語言取決於你的地區設定(English、日本語、简体中文、繁體中文、한국어、Español、Português、Français、Deutsch 或 Русский;其他情況用 English)。練習題會在你輸入時自動在 ✗ 和 ✓ 之間切換。

    規格: TUTOR-1, TUTOR-2, TUTOR-3, TUTOR-4

路線圖

規劃中,尚未推出。此清單中的任何內容目前都無法使用,順序也不是承諾。

  • 巨集

    規劃中

    錄製並重播按鍵。sim 目前沒有。

  • 剪貼簿整合

    規劃中

    比目前透過 OSC 52 複製更進一步。

  • 沙盒中的語言伺服器

    規劃中

    一個語言伺服器用戶端,其伺服器在沙盒中執行;狀態列中還有一個指示項,顯示專案根目錄是否受信任。

  • 真正有層次感的 GUI

    規劃中

    帶有真實陰影與高度層次的圖形化前端。目前已作為原型起步,沒有任何可安裝的東西。

  • 更多安裝方式

    規劃中

    AUR和crates.io 的套件即將推出。