sim 與 Vim、Neovim、Helix 比較

Vim、Neovim 與 Helix 都是成熟而強大的編輯器,而 sim 是新的。這張表只涵蓋能對照第一手資料查證的內容:各編輯器自己的文件、CVE 條目、發行說明與 issue 追蹤器。來源沒有說的,表中也不寫。

查證於 2026-10-17。當時的最新版本:Vim 9.2.1202、Neovim 0.12.6、Helix 25.07.1。

主題VimNeovimHelixsim
擴充系統Vim script 與套件(packages)。[1]Lua,以及 Vim script 外掛。[2]已發行版本中沒有外掛系統。以 Scheme(Steel)為基礎的外掛系統是一個尚未關閉的草稿 pull request(#8675,2026-10-09 更新)。最新版本是 25.07.1(2025 年 7 月)。[3] [4]沒有,這是刻意的:外掛在它「不會去做的事」清單上。
modeline(檔案中的設定)預設開啟(root 下關閉)。自修補 9.2.0350(2026 年 4 月)起,modeline 只能設定一小部分選項('modelinestrict',預設開啟)。過去的 CVE:CVE-2019-12735、CVE-2026-34982。[5] [6] [7] [8]預設開啟(root 下關閉);'modelineexpr' 為關閉。手冊建議在編輯不受信任的文字之前停用 modeline。CVE-2019-12735 已在 0.3.6 修正。[9] [7]不剖析 modeline:相關請求(#729)尚未關閉,一個 pull request(#7788)被關閉且未合併。[10] [11]從不讀取。設定與指令不來自檔案內容。
專案本地設定'exrc' 預設關閉。手冊把開啟它稱為「a potential security leak」(潛在的安全洩漏),並寫道「BETTER NOT SET THIS OPTION!」(最好不要設定這個選項!)。[5]'exrc' 預設關閉。開啟後,.nvim.lua、.nvimrc 與 .exrc 只有在檔案位於信任清單中(:trust)時才會執行。[9]會從工作區載入 .helix/config.toml(25.07.1 的文件中有記載)。會先詢問的工作區信任(PR #15177,2026 年 3 月合併)在開發分支上,尚未進入任何已發行版本。[12] [13] [14] [3]沒有設定檔,也沒有可載入的專案本地設定。
雙向控制字元(U+202E 等)顯示為 <202e>:手冊指出無法列印的字元與零寬 Unicode 字元會顯示為 <xxxx>,並且對無法列印的字元使用 SpecialKey 醒目提示。[5]以 SpecialKey 醒目提示顯示為 <202e>、<2066> 等(在我們的測試中,預設配色方案下為青色):U+200B–200F、U+202A–202E、U+2060–206F 與 U+FEFF 都在它的無法列印字元表中。[9] [15]25.07.1 版中沒有可見的標記(在我們的測試中,它們佔一個空白儲存格)。零寬字元是一個尚未關閉的 issue(#11255),控制字元會被原封不動地寫入終端機(#16320,尚未關閉)。[16] [17] [3]在任何狀態下都以洋紅色色塊顯示 <U+202E>,絕不原樣送出。字面文字 <U+202E> 沒有色塊。
被另一個行程變動的檔案記住檔案的時間戳記、權限與大小,不一致時發出警告(在 shell 指令之後、在 GUI 取得焦點時,以及透過 :checktime 檢查);'autoread' 會重新載入你沒有改動過的緩衝區。[18]同樣的檢查與警告;'autoread' 會重新載入你沒有改動過的緩衝區。[19]寫入會被拒絕,並提示「file modified by an external process, use :w! to overwrite」(檔案已被外部行程修改,請使用 :w! 覆寫)(在 #6492 中被引用)。自動重新載入是一個尚未關閉的請求(#1125)。[20] [21]監看開啟的檔案,在文字、分頁與檔案樹中標出變更之處,並在儲存前比對檔案的雜湊值;如果檔案已有變動,就不寫入任何內容。在與該檢查同一時刻發生的寫入,仍可能漏過。

sim:專案自己的規格(README.md、SPEC.md、sim/SPEC.md、sim/CONCEPT.md)。

不可見字元的實測

針對每一類什麼也不畫、或會作用於終端機的字元,這裡列出了用終端機開啟一個含有它的小檔案時,Neovim 0.12.5 和 sim 各自顯示了什麼。只測了 Neovim,所以它是這張表裡唯一的另一款編輯器。

測量日期 2026-10-18:Neovim 0.12.5(nvim --clean)和提交 d3caae2 的 sim,該提交包含在 sim 0.2.0 中。最新發布的 Neovim 0.12.6 沒有測。[22]

字元類別Neovim 0.12.5sim
U+200B 零寬空格<200b><U+200B>
字母之間的 U+200D 零寬連接符無標記<U+200D>
Trojan Source:U+202E、U+2066、U+2069<202e> <2066> <2069><U+202E> <U+2066> <U+2069>
標籤字元(ASCII smuggling)無標記<U+E0049> …
字母後的變體選擇符(U+FE00–FE03、U+E0155 等)無標記<U+FE00> … <U+E0155> …
漢字後的表意文字變體選擇符無標記葛<U+E0100>
諺文填充字元 U+3164、U+115F、U+FFA0無標記<U+3164> <U+115F> <U+FFA0>
軟連字號 U+00AD 和組合字素連接符 U+034F無標記<U+00AD> <U+034F>
單詞連接符 U+2060<2060><U+2060>
行分隔符號 U+2028無標記<U+2028>
未指派 U+0378、非字元 U+FDD0無標記<U+0378> <U+FDD0>
非字元 U+FFFF<ffff><U+FFFF>
檔案中間的 U+FEFF<feff><U+FEFF>
ESC 和 DEL^[ ^?^[ ^?
C1 控制字元 U+0085<85><U+0085>
私用區(Nerd Font 圖示)維持原樣維持原樣
帶連接符和選擇符的表情符號、按鍵符號、英格蘭旗維持原樣維持原樣

在 sim 會顯示的 15 類字元中,Neovim 標記了 7 類,另有 8 類無標記。[23] [24] [25] [26]

「無標記」:終端機收到的是字元本身,編輯器沒有做任何標記。「維持原樣」:兩者都刻意不處理(Nerd Font 的圖示、表情符號序列)。其餘儲存格是在該字元位置畫出的內容。

sim 一欄是提交 d3caae2 的 sim。 檔案、命令和每一行都記錄在該提交的 sim 的 NOTES.md 中。

sim 開啟的一個小 Rust 檔案。標籤字元裡的隱藏指令、變體選擇符裡的酬載、雙向控制字元、諺文填充字元、軟連字號和零寬空格,都被畫成洋紅色色塊上可見的代碼,如 <U+202E>。
sim,同一個檔案:每個隱藏字元都是洋紅色色塊上可見的 <U+XXXX>。
Neovim 0.12.5 開啟的同一個檔案。標籤字元、變體選擇符、填充字元和軟連字號完全沒有畫出;只有雙向控制字元和零寬空格顯示為 <202e> 和 <200b>。
Neovim 0.12.5,同一個檔案:因為標籤字元和選擇符沒有畫出,酬載那一行讀起來是 "a";,第一行讀起來是無害的註解。只畫出了 <202e>、<2066>、<2069> 和 <200b>。

同一次測量顯示的 sim 作法的代價:被顯示的字元會占用其形式的欄數(四位數編碼占 8 欄,五位數編碼占 9 欄),所以含有很多這類字元的行會變長;漢字後面的表意文字變體選擇符會被顯示;而且這種顯示無法關閉。

其他編輯器目前仍做得更好的地方

sim 以廣度換取固定且可查證的行為。如果你現在就需要其中任何一項,請使用其他編輯器。

  • Neovim 與 Helix 內建語言伺服器用戶端。sim 目前沒有,計畫提供一個沙盒化的。[27] [28]
  • Vim 與 Neovim 可以用套件與外掛擴充。sim 不會提供外掛。[1] [2]
  • Vim 與 Neovim 可以錄製並重播巨集。sim 目前沒有巨集,計畫提供。暫存器和標記在 sim 0.2.0 中。[1]

查證方式

文件固定在最新的發行標籤上。issue 與 pull request 引用的是上方所列日期當天的狀態,這些狀態之後可能改變。表中寫有「在我們的測試中」的地方,是我們在所指定的版本中開啟了一個含有真實 U+202E 的檔案,並觀察了它的繪製結果;這一點來源本身無法替我們說明。如果這裡有任何過時或錯誤之處,應當予以更正。

來源

  1. Vim 9.2.1202, runtime/doc/repeat.txt (packages, recording)
  2. Neovim, Lua guide
  3. Helix 25.07.1 release (the latest, July 2025)
  4. Helix PR #8675: Add Steel as an optional plugin system (draft, open)
  5. Vim 9.2.1202, runtime/doc/options.txt ('modeline', 'modelinestrict', 'exrc', 'isprint', 'fsync')
  6. Vim patch 9.2.0350: Enabling modelines poses a risk ('modelinestrict')
  7. NVD: CVE-2019-12735 (Vim before 8.1.1365 and Neovim before 0.3.6, modeline)
  8. NVD: CVE-2026-34982 (Vim before 9.2.0276, modeline sandbox bypass)
  9. Neovim 0.12.6, runtime/doc/options.txt ('modeline', 'modelineexpr', 'exrc', 'isprint', 'fsync')
  10. Helix issue #729: Vim modeline parsing (open)
  11. Helix PR #7788: add basic modeline support (closed, not merged)
  12. Helix 25.07.1, book/src/configuration.md (a config.toml local to a project)
  13. Helix PR #15177: Add workspace trust support (merged 2026-03-26)
  14. Helix development branch, book/src/workspace-trust.md
  15. Neovim 0.12.6, src/nvim/mbyte.c (utf_printable)
  16. Helix issue #11255: Substitute unprintable characters in a buffer (open)
  17. Helix issue #16320: C0 control characters are written raw (open)
  18. Vim 9.2.1202, runtime/doc/editing.txt (timestamps)
  19. Neovim 0.12.6, runtime/doc/editing.txt (timestamps, 'autoread')
  20. Helix issue #6492: make the “file modified by an external process” message louder
  21. Helix issue #1125: automatic reload when file changes externally (open)
  22. sim, NOTES.md at commit d3caae2: “Hidden characters in Neovim 0.12.5, measured against sim” (2026-10-18)
  23. The Unicode Standard 18.0, chapter 23, Special Areas and Format Characters (§23.4 Variation Selectors, §23.9 Tag Characters)
  24. Unicode Technical Standard #51: Unicode Emoji, revision 31 (ZWJ sequences, emoji tag sequences, Annex C)
  25. Johann Rehberger, ASCII Smuggler Tool: Crafting Invisible Text and Decoding Hidden Codes (Embrace The Red, 14 January 2024)
  26. Endor Labs, Invisible Threats and the Blind Spots of Security (an analysis of GlassWorm)
  27. Neovim, LSP client
  28. Helix README (features)