Full specification
Every feature this build has, every format it reads, and every limit it enforces — with the numbers. Written to be looked things up in, not read through.
完整功能規格
這一版有的功能、讀得懂的格式、每一道上限,數字都在這。這一頁是拿來查的,不是拿來讀完的。
0.6.63 — 823 tests pass. What is not built yet is named in the last section rather than left out.
0.6.63 — 823 個測試通過。還沒做的功能不是略過不提,最後一節逐項列出。
1. At a glance
1. 一覽
| Version | 版本 | 0.6.63 | |
|---|---|---|---|
| Platforms | 平台 | macOS 14 or later on Apple silicon; Windows 10/11 x64, as an MSI installer
or a portable zip; Linux x86-64, as a .deb built on Ubuntu 22.04 — or from
source against any Qt 6.2 or newer |
macOS 14 以上(Apple 晶片);Windows 10/11 x64,有 MSI 安裝檔和免安裝的 zip;Linux x86-64,在 Ubuntu 22.04 上建置的 .deb,或用 Qt 6.2 以上自行從原始碼建置 |
| Written in | 實作 | Rust 1.98 for everything that decides; Qt 6 Widgets for what is drawn | 判斷邏輯全部在 Rust 1.98,畫面用 Qt 6 Widgets |
unsafe |
Only in the C ABI bridge between the two, every block with a written safety argument | 只有兩者中間的 C ABI 橋接層,每一塊都寫了為什麼安全 | |
| Licence | 授權 | GPL-3.0-or-later | |
| Tests | 測試 | 823 automated, including architecture, migration and hostile-input levels | 823 個自動化測試,架構、遷移、惡意輸入都有 |
| Telemetry | 遙測 | None. The program makes no network connection you did not ask for | 沒有。除了你自己要連的,程式不會連去別的地方 |
2. Keyboard
2. 鍵盤
Two profiles, both plain text files in keymaps/. A binding is a line;
adding one rebuilds nothing. Any binding can also be changed in Settings, and the change is kept
in a file of your own as a difference from the preset, so the keys a new release adds still
arrive. The keys you can press right now are named along the foot of the window and change with
what the bar is on, and the one you are holding lights until you let it go.
兩套設定檔,都是 keymaps/ 裡的純文字檔。一個綁定就是一行,加一個不用重建。每個綁定也能在設定裡改,改過的部分另存在你自己的檔案,只記跟預設不一樣的地方,所以新版本加的按鍵照樣會進來。現在可以按什麼就寫在視窗下緣,會跟著光棒所在的東西換;正按著的那個鍵會亮起,放開才熄。
Single-Key mode — one letter, one command
全鍵模式 — 一個字母,一個命令
| Key | 按鍵 | Does | 動作 | Notes | 說明 |
|---|---|---|---|---|---|
| G | Open | 開啟 | The same as Enter: goes into a folder, opens an archive's listing, and hands anything else to its application | 跟 Enter 一樣:進入資料夾、開啟壓縮檔的內容列表,其他檔案交給對應的應用程式 | |
| V | View | 檢視 | The built-in viewer: text as text, anything else as hex. Images and archive contents show in the inspector (I) | 內建檢視器:文字檔顯示文字,其他一律用十六進位。圖片和壓縮檔內容請看檢視面板(I) | |
| Q | Quick Look | 快速查看 | The system's panel on macOS; the built-in viewer elsewhere | macOS 上是系統面板,其他平台改開內建檢視器 | |
| H | View as hex | 以十六進位檢視 | Always available, never wrong about what a file contains | 永遠可用,對檔案內容的呈現永遠不會錯 | |
| Alt-X | Edit as hex | 以十六進位編輯 | A window of its own that opens read-only; Overwrite or Insert is chosen in it | 獨立的視窗,開啟時是唯讀,要在視窗裡選「覆寫」或「插入」才會修改 | |
| E | Edit | 編輯 | The external editor — macOS only for now | 外部編輯器,目前只有 macOS | |
| C | Copy to… | 複製到… | Asks where; Ins copies to the other pane | 會問要放哪;Ins 直接複製到另一個面板 | |
| M | Move to… | 移動到… | Same, moving; Shift-Ins moves to the other pane | 同上,但是移動;Shift-Ins 直接移到另一個面板 | |
| R | Rename | 更名 | Opens with the extension outside the selection | 開啟時副檔名不在選取範圍內 | |
| D | Move to the trash | 移到資源回收筒 | Always asks first. macOS: the system Trash, so Put Back works. Linux: the freedesktop trash in your home folder. Windows: not yet — it says it cannot, and Shift-Del deletes permanently. A server has no trash | 一定先問。macOS 丟進系統的垃圾桶,可以「放回原處」;Linux 丟進家目錄裡的 freedesktop 回收筒;Windows 還沒接上資源回收筒,會直接說做不到,要刪除請用 Shift-Del 永久刪除。伺服器上沒有回收筒 | |
| Space | Mark, and move on | 標記,並移到下一列 | Marks accumulate; moving the bar never clears them | 標記會累積,光棒怎麼移動都不會清掉它們 | |
| Alt-T · Alt-U · * | Mark all · none · invert | 全部標記・清除標記・反轉標記 | Ctrl/⌘-A marks all as well | Ctrl/⌘-A 也是全部標記 | |
| Shift-↑ · Shift-↓ | Bar to the first · last file | 光棒移到第一個・最後一個檔案 | Folders are passed over, as in CView. In the Native layout the same keys mark the row under the bar and step on, as Total Commander does | 跳過資料夾,跟 CView 一樣。原生模式下同樣的鍵是「標記目前這一列並往下/往上」,跟 Total Commander 一樣 | |
| + · - | Mark · unmark by pattern | 依樣式標記・取消標記 | A wildcard such as *.log; F9 also marks |
例如 *.log 這樣的萬用字元;F9 也可以標記 | |
| Z | Measure a folder | 計算資料夾大小 | On a worker thread, with a running count and a working Cancel | 在背景執行緒跑,計數即時更新,取消按了會停 | |
| F | Filter this folder | 篩選目前資料夾 | Narrows as you type; matches are picked out | 邊打邊縮小,命中的部分會標出來 | |
| W | Search | 搜尋 | Walks subfolders, streaming results, says which folder it is in | 會走子資料夾,結果邊找邊出現,也會顯示正在找哪個資料夾 | |
| S | Sort by… | 排序… | Per tab, remembered across restarts | 每個分頁各自記住,重啟後仍在 | |
| T | Folder tree | 樹狀清單 | Folds the tree away; the places above it stay | 收合資料夾樹;上面的「位置」不受影響 | |
| I | Inspector panel | 檢視面板 | Preview and facts about what the bar is on | 光棒所在項目的預覽與屬性 | |
| A | Properties | 屬性 | Size, dates, permissions, location | 大小、日期、權限、位置 | |
| P or \ | Type a path | 輸入路徑 | With completion; accepts sftp://user@host/path |
有自動完成;接受 sftp://user@host/path | |
| ← | Up one level | 上一層 | The bar lands on the folder you just left | 光棒會落在剛離開的那個資料夾上 | |
| → | Go in | 進入 | Same as Enter | 與 Enter 相同 | |
| Tab | Next area | 下一個區域 | Places → folder tree → each pane. Areas that are hidden are not stops | 位置 → 資料夾樹 → 各個面板。沒顯示的就跳過 | |
| F5 | Refresh | 重新整理 | — | ||
| F7 | New folder | 新增資料夾 | O makes a new file | O 是新增檔案 | |
| Alt-R | Batch rename | 批次更名 | Every new name previewed first | 先預覽全部的新名稱 | |
| Alt-Z | Compress | 壓縮 | ZIP, tar.gz or tar, chosen when saving | 存檔時選 ZIP、tar.gz 或 tar | |
| Shift+letter字母 | Jump | 跳到 | To the first name starting with that letter, since the bare letters are commands | 第一個以該字母開頭的項目;單獨的字母已經是命令了 | |
| Esc | Stop narrowing | 停止縮小範圍 | Clears a filter or a search, whichever is in force | 清掉篩選或搜尋,看當下生效的是哪一個 |
Typing is typing. The moment the keyboard is in a text field — the path bar, the filter, a rename box, the search box — every letter goes to that field. A single-key command cannot fire out from under someone who is typing, and that holds while a completion list is open too.
打字就是打字。游標在輸入欄位裡的時候(路徑列、篩選框、更名框、搜尋框),每個字母都算那個欄位的。單鍵命令不會在你打字的時候跳出來,自動完成清單開著也一樣。
Native mode
原生模式
The operating system's own combinations, for when muscle memory reaches for the copy chord your platform taught you — Cmd-C on macOS, Ctrl-C on Windows and Linux. The same profile follows that convention throughout, so it is your machine's shortcuts rather than a translation of somebody else's.
Switching is live: one chord, no restart, nothing reloaded, and it is the same chord in both modes — a switch that only exists in the mode you left is a door that locks behind you.
作業系統自己的組合鍵,給習慣按平台原本那組複製鍵的人 —— macOS 是 Cmd-C,Windows 跟 Linux 是 Ctrl-C。整套設定檔都照你這台機器的慣例走,不是把別的平台那套翻譯過來。
切換是即時的:按一個組合鍵就換,不用重開、也不用重新載入,而且兩邊用的是同一個組合鍵;只在其中一邊有的開關,等於一扇會在背後鎖上的門。
3. Panes, tabs and windows
3. 面板、分頁與視窗
| Splitting | 分割 | A recursive tree, not two fixed panes. Split any pane horizontally or vertically, and split the result again, up to 16 levels | 不是固定兩個面板。任何一個面板都能再往左右或上下切,切出來的還能再切,最多 16 層 |
|---|---|---|---|
| Presets | 預設版面 | One pane, two, or a 2×2 grid, in one command | 單面板、雙面板、2×2 四格,一個命令切換 |
| Tabs | 分頁 | Every pane owns its own. A tab remembers its folder, its sort, its view mode, its filter, its marks and its history | 每個面板有自己的分頁。分頁會記住資料夾、排序、檢視模式、篩選、標記跟瀏覽歷程 |
| Pinning | 釘選 | A pinned tab refuses to close and stays at the front of the strip | 釘選的分頁不會被關掉,並固定在最前面 |
| Reopen | 重新開啟 | A closed tab comes back with its folder and its history | 關掉的分頁可以連資料夾跟歷程一起叫回來 |
| Tear-off | 拉出視窗 | Drag a tab out to make a window of it, or into another pane to move it. Every window shows the same workspace | 分頁拖出來就變獨立視窗,拖進別的面板就是移過去。所有視窗看的是同一個工作區 |
| Focus | 焦點 | The folder tree, the window title and the preview all follow the focused pane. The focus ring is drawn only when there is more than one pane | 資料夾樹、視窗標題跟預覽都跟著有焦點的面板走。只有面板不只一個時才畫焦點框 |
| Target | 目標面板 | The pane a copy or move lands in has a dashed edge and a Target badge. With three or more panes, Ctrl/⌘-Alt-T picks which | 複製或移動會放進去的面板畫虛線框,並掛上「目標」標籤。有三個以上的面板時,用 Ctrl/⌘-Alt-T 換目標 |
| Views | 檢視方式 | A detail list and an icon grid over the same rows. Thumbnails are decoded
off the UI thread, columns are chosen from the header's menu, widths are kept once dragged,
and names sort naturally — file2 before file10 |
詳細清單和圖示檢視用同一份資料。縮圖在背景執行緒解碼;欄位從標題列的右鍵選單挑;拖過的欄寬會記住;檔名照自然順序排,file2 在 file10 前面 |
| Staying current | 保持最新 | Each pane's folder is watched through the system's own change notifications — FSEvents, inotify, ReadDirectoryChangesW — so a file another program adds, removes, renames or grows shows within half a second, without leaving the folder. Network and FUSE mounts, where those notifications only hear this machine, are checked once a second instead | 每個窗格的資料夾都透過系統本身的變更通知監看(FSEvents、inotify、ReadDirectoryChangesW),別的程式新增、刪除、改名或寫大了檔案,半秒內就會顯示,不用離開資料夾。網路磁碟和 FUSE 掛載上,系統通知只聽得到本機自己的變動,所以改成每秒檢查一次 |
| Restored | 重啟還原 | The whole layout, every tab and every mark, unless you ask it not to | 整個版面、每個分頁、每個標記都會還原,除非你關掉這個設定 |
4. The bar and the marks
4. 光棒與標記
The bar is where you are; marks are what you chose. The bar follows the arrow keys and the mouse, and never marks anything. Marks are made with Space, a tick box, a Ctrl- or Shift-click and the mark commands, and are drawn in the mark colour, so the two never look alike. A command acts on the marked set — and on the row under the bar when nothing is marked. That is how CView works, and it is why having both is not ambiguous.
光棒是你現在的位置,標記是你挑好的東西。光棒跟著方向鍵和滑鼠走,本身不會標記任何東西。標記是用 Space、勾選框、Ctrl 或 Shift 點選,還有標記命令做出來的,用標記色顯示,所以兩者不會混在一起。命令作用在已標記的項目上;沒有標記時,就作用在光棒所在的那一列。CView 就是這樣運作的,也因為有這條規則,兩者並存不會搞混。
| Arrow keys | 方向鍵 | Move the bar, never the marks | 只移動光棒,不會動到標記 |
|---|---|---|---|
| Clicking a row | 點一列 | Moves the bar there and marks nothing. Marks already made stay | 光棒移過去,不會標記任何東西,原本的標記也都還在 |
| Space | Marks the row under the bar, or unmarks it, and moves on. Three presses mark three rows | 標記光棒所在的那一列(已標記就取消),然後往下一列。按三次就標記三列 | |
| Tick box, Ctrl- or Shift-click | 勾選框、Ctrl 或 Shift 點選 | Marks or unmarks that row without moving the bar | 標記或取消標記那一列,光棒不會跟著動 |
| Header box | 標題列的框 | All, none, and a third state when only part of the list is marked | 全部標記、全部取消;只標了一部分的時候是第三種狀態 |
| What a command acts on | 命令作用的對象 | The marked entries in the folder on screen; with none marked, the row under the bar. Rename always takes the row under the bar — renaming several is Batch rename | 目前資料夾裡已標記的項目;沒有標記時,就是光棒所在的那一列。更名一律只改光棒所在的那一列,一次改很多個請用批次更名 |
| Counting | 計數 | The status line counts rows in the folder on screen. Marks made elsewhere are kept but not counted here, and never acted on by accident | 狀態列算的是目前這個資料夾的列。在別的地方標的會留著,不算進來,也不會被誤動到 |
| Dragging | 拖曳 | Carries the row you press on, not the marked set | 拖的是你按住的那一列,不是整組標記 |
5. File operations
5. 檔案操作
Every one is planned before it runs, shows progress, can be cancelled, and reports conflicts rather than guessing. There is an undo.
每個操作都先算好再做,有進度、可以取消,遇到衝突會問,不會自己決定。可以復原。
| Operation | 操作 | Detail | 細節 |
|---|---|---|---|
| Copy / Move | 複製/移動 | To the other pane, or to a folder chosen in a dialog. Conflicts offer skip, keep both, overwrite, or stop — never resolved by guessing | 複製到另一個面板,或用對話框選要放哪。撞名的時候給四個選擇:略過、兩個都留、覆寫、中止。不會自己決定 |
| Rename | 更名 | Opens with the extension outside the selection; a clash is reported, not overwritten | 一開始副檔名不在選取範圍內。撞名會回報,不會覆寫 |
| Batch rename | 批次更名 | Every result is previewed before anything is renamed. The pattern is user input, so the matcher has no backtracking and cannot be made to hang | 改之前先讓你看過全部結果。比對樣式是使用者打的,所以用不會回溯的比對器,寫不出會卡死的樣式 |
| Duplicate | 製作副本 | Named report (1).txt, then report (2).txt; a copy of
report (1).txt is report (2).txt, not report (1) (1).txt.
The same rule for pasting into the same folder, "keep both", and a name already taken in
the trash |
命名為 report (1).txt,接著是 report (2).txt;複製 report (1).txt 會得到 report (2).txt,不會變成 report (1) (1).txt。貼在原本的資料夾、撞名時選「兩個都留」、回收筒裡撞名,都用同一個規則 |
| Trash / Delete | 移到回收筒/永久刪除 | Both ask first. Permanent deletion says it cannot be undone before it runs. Deletion walks by open directory descriptor, so a directory swapped for a symlink mid-run cannot lead it out of the selection | 兩個都會先問。永久刪除在做之前會先講清楚救不回來。刪除是拿開啟的目錄描述符往下走,所以中途被換成符號連結的資料夾,帶不出你選的範圍 |
| New folder / file | 新增資料夾/檔案 | Asks for a name, then puts the bar on what it made | 問名稱,然後把光棒放到剛建立的東西上 |
| Read-only | 唯讀 | Opens showing what is currently true rather than a guess | 開起來看到的是當下的實際狀態,不是猜的 |
| Undo | 復原 | Bounded to the last 32 operations — undo is for the mistake you just made, not an archive | 上限 32 次。復原是拿來救剛剛按錯的,不是歷史紀錄 |
| Drag and drop | 拖放 | Between panes and to and from other applications. A drop asks whether to copy or move rather than inferring it from a modifier nobody can see | 面板之間可以,跟其他程式之間也可以。放下的時候會問要複製還是移動,不會去猜你有沒有按某個看不見的修飾鍵 |
| Clipboard | 剪貼簿 | Paste knows from Ctrl-C or Ctrl-X whether it is a copy or a move. Pasting where the files already are makes copies beside them | 貼上時從 Ctrl-C 或 Ctrl-X 就知道是複製還是移動。貼在檔案原本的資料夾,就在旁邊做出副本 |
| To and from a server | 伺服器與本機之間 | Copy, move and delete between an SFTP server and this machine, with the same progress, cancel and conflict questions (section 8) | SFTP 伺服器跟本機之間可以複製、移動、刪除,一樣有進度、可以取消、撞名會問(第 8 節) |
| Queue | 排隊 | Started while another is running, an operation waits its turn rather than being refused | 前一個操作還在跑時再開一個,會排隊等,不會被拒絕 |
6. Viewing files
6. 檢視檔案
| Inspector | 檢視面板 | Viewer window | 檢視視窗 | |
|---|---|---|---|---|
| Opened by | 開啟方式 | I | V | |
| Text | 文字 | ✓ | ✓ | |
| Hex | 十六進位 | — | ✓ H | |
| Images | 圖片 | ✓ | as hex | 只有十六進位 |
| Archive listing | 壓縮檔列表 | ✓ | — Enter opens it | —(按 Enter 開啟) |
| Find in file | 檔案內尋找 | — | ✓ / N | |
| Indexes at most | 建立索引上限 | 4 MiB | 64 MiB |
Both say when they are showing part of a file rather than pretending to show all of it. The limits are deliberate: the line index is eight bytes per line and building it reads every byte, so an unbounded one meant a multi-gigabyte log froze the window and held hundreds of megabytes before showing a single line.
兩者在只顯示部分內容時都會說出來,不會假裝顯示了全部。這些上限是刻意的:行索引每行要八個位元組,而且建索引得把整個檔案讀過一遍。沒有上限的話,開一個好幾 GB 的日誌會讓視窗卡死,第一行還沒畫出來就先吃掉幾百 MB。
Text encodings: detected from the byte-order mark and then from the content, and selectable by hand — UTF-8, UTF-16 LE and BE, Big5, GB18030, Shift-JIS, EUC-KR, Latin-1. Line endings (LF, CRLF, CR) are identified and shown in the status line; the file keeps whichever it has, and is never converted to another.
文字編碼:先看位元組順序記號、再看內容自動偵測,也可以自己指定:UTF-8、UTF-16 LE 與 BE、Big5、GB18030、Shift-JIS、EUC-KR、Latin-1。換行符號(LF、CRLF、CR)會判讀出來並顯示在狀態列,檔案本身維持原樣,不會被轉成另一種。
Quick Look (Q) on macOS is the real system panel, the same one Finder shows. Windows and Linux have nothing wired up yet, so there the same key opens the built-in viewer: it still means "show me this file without leaving the list".
快速查看(Q)在 macOS 上是真的系統面板,跟 Finder 開的是同一個。Windows 跟 Linux 還沒接上對應的東西,所以同一個鍵改開內建檢視器,意思不變:不離開清單,直接看這個檔案。
The hex editor (Alt-X, or Edit as Hex in the viewer)
changes a file as bytes. It opens read-only, so a stray keystroke never changes anything;
Overwrite keeps the length and Insert pushes bytes along. Two hex digits make a byte, Tab
moves typing to the text column, and changed bytes are drawn in the mark colour until saved.
Find and replace work in hex with ?? wildcards, in UTF-8, Latin-1 and UTF-16, and
as integers of 8 to 64 bits in either byte order; Go To takes 0x1F4,
500., +0x200 or end-4; a selection copies as raw
bytes, hex, a C, Rust or Python literal, or Base64. The file is never read whole - a
piece table over it - and saving first says how many bytes change and whether the length does,
then writes through a temporary and a rename that keeps the file's permissions.
十六進位編輯器(Alt-X,或在檢視器裡按「以十六進位編輯」)用位元組的方式修改檔案。開啟時是唯讀,不小心按到鍵也不會改到任何東西;「覆寫」保持長度不變,「插入」會把後面的位元組往後推。兩個十六進位數字組成一個位元組,Tab 切換到文字欄打字,改過的位元組會用標記色顯示,直到儲存為止。尋找與取代可以用十六進位(支援 ?? 萬用字元)、UTF-8、Latin-1、UTF-16,也可以找 8 到 64 位元、任一種位元組順序的整數;跳到位址接受 0x1F4、500.、+0x200、end-4;選取的內容可以複製成原始位元組、十六進位、C/Rust/Python 的寫法或 Base64。檔案從不整個讀進記憶體,而是用 piece table 處理;儲存前會先說明有幾個位元組改變、長度是否改變,再透過暫存檔改名寫回,並保留原檔的權限。
7. Formats
7. 支援格式
Every format is recognised by its content, not by its name. A
.tar.gz called anything still opens; a text file called .zip is not
claimed as an archive.
所有格式都由內容判定,不看副檔名。叫任何名字的 .tar.gz
都打得開;叫 .zip 的文字檔不會被當成壓縮檔。
Archives and disc images
壓縮檔與映像檔
| Format | 格式 | Browse | 瀏覽 | Extract | 解出 | Create | 建立 | Notes | 說明 |
|---|---|---|---|---|---|---|---|---|---|
.zip | ✓ | ✓ | ✓ | Deflate and stored | Deflate 與未壓縮 | ||||
.tar | ✓ | ✓ | ✓ | Uncompressed; recognised by the ustar mark inside it |
未壓縮;靠檔案裡的 ustar 標記辨識 | ||||
.tar.gz · .tgz | ✓ | ✓ | ✓ | — | |||||
.tar.bz2 | ✓ | ✓ | — | Read only | 唯讀 | ||||
.tar.xz | ✓ | ✓ | — | Read only | 唯讀 | ||||
bare .gz · .bz2 · .xz |
單獨的 .gz/.bz2/.xz |
✓ | ✓ | — | One file, unwrapped to its own name without the suffix | 一個檔案,解出時去掉副檔名 | |||
.iso | ✓ | ✓ | — | ISO 9660, with Joliet and Rock Ridge names. Our own reader, not a dependency (ADR-0005) | ISO 9660,支援 Joliet 與 Rock Ridge 長檔名。自己寫的讀取器,不是套件(ADR-0005) | ||||
.7z · .rar |
— | — | — | Not supported, and not labelled as archives this build can open | 不支援,而且不會被標示成這個版本打得開的壓縮檔 |
Pressing Enter on any supported one opens a listing: Space marks, C extracts what is marked, X extracts everything. A file comes out under a temporary name and takes its own only once it is whole, so an archive that turns out damaged or cut short leaves nothing behind that looks extracted.
在任何一種支援的格式上按 Enter 都會開啟列表:Space 標記、C 解出已標記的、X 全部解出。檔案會先用暫存檔名寫出,完整了才換成正式檔名,所以損毀或不完整的壓縮檔不會留下看起來像解好的檔案。
Everything else it recognises
其他可辨識的內容
| Images | 圖片 | PNG, JPEG, GIF, BMP by signature; everything else the Qt image plugins on the machine can read, which normally adds WebP, TIFF, ICO and SVG | PNG、JPEG、GIF、BMP 由檔頭辨識;其餘由該機器上的 Qt 影像外掛決定,通常還包含 WebP、TIFF、ICO 與 SVG |
|---|---|---|---|
| Recognised and labelled. Opened with the system's own reader — this program does not render PDF | 認得出來也會標示,用系統的閱讀器開。這個程式不畫 PDF | ||
| Text | 文字 | Anything that decodes in one of the encodings above | 任何能用上述編碼解出來的內容 |
| Anything else | 其他一切 | Hex, which is always available and never wrong about what a file holds | 十六進位。什麼檔案都能開,而且顯示的一定是檔案真正的內容 |
7a. Writing a disk image
7a. 把映像檔寫入磁碟
The most destructive thing this program does. Everything on the chosen disk is gone, with no undo and no trash — so the safety is in which disks are offered, not in the dialog. Enumeration is a whitelist: a disk appears only when the program positively established that it is removable, external and not carrying the running system. A disk whose properties could not be read does not appear.
這是這個程式做的最不可逆的事。選到的那顆磁碟上的東西會全部沒有,沒得復原也沒有回收筒。所以安全性放在哪些磁碟會被列出來,不是放在對話框。列表是白名單:程式要能確定那顆是可移除、外接、而且沒裝著現在在跑的系統,才會出現。資料讀不齊的那顆不會出現。
| Sources | 來源 | Any file, byte for byte — .iso, .img,
.dmg, a raw dump. Nothing is interpreted, so nothing can be misinterpreted |
任何檔案,一個位元組都不改:.iso、.img、.dmg、原始 dump。內容完全不解讀,所以也不會解讀錯 |
|---|---|---|---|
| Checked first | 事先檢查 | An image carries its own map - a GPT, an MBR, an ISO 9660 descriptor - and the map says how long it is. A file shorter than that, a download or a decompression that stopped early, is flagged with both sizes before a disk is chosen | 映像檔裡有自己的配置(GPT、MBR、ISO 9660),上面寫著完整大小。檔案比這個小,也就是下載或解壓縮沒有完成,選磁碟之前就會標出來,並列出兩個大小 |
| Offered | 會列出來的 | Removable and external only. Never the boot or system disk. Never an internal disk, even one that is neither. Never a disk of size zero | 只有可移除的外接磁碟。開機碟跟系統碟一定不列。內建磁碟一定不列,就算它兩個都不是也一樣。容量 0 的不列 |
| Refused, and said so | 擋下來並說原因 | A disk too small for the image, and the disk the image itself is sitting on. Both are listed with the reason rather than hidden — a disk you expected to see and cannot is worse than one you can see and are told about | 裝不下映像檔的,還有映像檔本身就放在上面的那顆。這兩種會列出來並寫原因,不會直接藏起來。你以為會看到卻找不到,比看得到但被告知原因更糟 |
| Order | 順序 | Unmount, write, flush, reopen, read back and compare. Unmounting first because a mounted filesystem's driver writes to the same sectors | 卸下、寫入、等磁碟寫完、重新開啟、讀回來比對。先卸下是因為掛載中的檔案系統驅動程式會寫到同一批磁區 |
| Verification | 核對 | On by default, byte for byte, and it is the only thing that catches a failing stick or a counterfeit one — both accept every write and hand back something else. A mismatch reports the byte offset | 預設開啟,逐位元組比對。快壞掉的隨身碟跟假的隨身碟都是照單全收、讀出來卻是別的東西,只有這一步抓得到。對不上會報出是第幾個位元組 |
| Checksum | 檢查碼 | CRC-32 (ISO-HDLC), the same number gzip and
cksum -a crc32 print, so it can be compared with a published one by eye |
CRC-32(ISO-HDLC),跟 gzip、cksum -a crc32 印出來的是同一個數字,可以直接跟官方公布的用眼睛比 |
| Privilege | 權限 | Borrowed for the one operation. macOS uses authopen, so
nothing of ours ever runs as root, and the one access it grants both writes and reads back,
so the password is asked for once; Linux uses pkexec, and skips the prompt
when the caller already has access; Windows needs an elevated process and says so before
it starts |
只為了這一次操作跟系統借。macOS 用 authopen,我們的程式碼完全不會用 root 跑,而且同一個權限既用來寫入也用來讀回核對,所以只問一次密碼;Linux 用 pkexec,本來就有權限的話不會問;Windows 需要提權的行程,會在開始前先講 |
| Cancelling | 取消 | Stops. The disk then holds part of an image and is not usable, which is what it says — there is nothing to put back | 會停。磁碟上就只有映像檔的一部分,不能用,程式會直接這樣講。沒有東西可以還原 |
| Alignment | 對齊 | The final write is padded with zeros to a whole 512-byte sector, which the raw device requires. The reported length is the image's own | 最後一次寫入會補 0 補滿 512 位元組的磁區,raw device 要求這樣。回報的長度還是映像檔自己的長度 |
8. Remote folders
8. 遠端資料夾
| Protocol | 通訊協定 | SFTP (SSH) | |
|---|---|---|---|
| Host keys | 主機金鑰 | Checked and remembered. A changed key stops the connection and says so | 會檢查並記住。金鑰變了就停止連線並說明 |
| Authentication | 認證 | The running agent first, then keys in ~/.ssh, then a
password prompt — in that order, and only asking when the earlier ones failed |
先找執行中的 agent,再找 ~/.ssh 裡的金鑰,都不行才問密碼。就是這個順序,前面失敗才往下走 |
| Passwords | 密碼 | Held in memory for the process lifetime, dropped on disconnect, never written to disk (ADR-0004) | 只放在記憶體裡,程式關掉或斷線就丟,不會寫進磁碟(ADR-0004) |
| What works | 可用的部分 | Browsing, the folder tree, the path bar, tabs, sorting, filtering and
reconnecting. Copy, move and permanent delete between a server and this machine, with the
same conflict questions as on a local disk. A file is written under a .jtf-part
name and renamed only once it is complete, so an interrupted copy never leaves something
that looks finished |
瀏覽、資料夾樹、路徑列、分頁、排序、篩選、重新連線。伺服器跟本機之間的複製、移動、永久刪除,撞名時問的跟本機一樣。檔案先用 .jtf-part 的名稱寫入,寫完才改回原名,所以中斷的複製不會留下看起來像是完成的檔案 |
| What does not | 尚未支援 | Viewing or previewing a file on the server, renaming or making a folder there, copying from one server to another (refused, not attempted), and more than one server at a time | 檢視或預覽伺服器上的檔案、在伺服器上更名或新增資料夾、伺服器對伺服器的複製(會直接拒絕,不會硬做),以及同時連多台伺服器 |
9. Finding things
9. 尋找
| Filter F | 篩選 F | Narrows the current folder as you type. Nothing is re-read, so clearing it is instant. Matches are picked out in the name | 邊打邊縮小目前這個資料夾。不會重讀任何東西,所以清掉是瞬間的。命中的部分會在名稱裡標出來 |
|---|---|---|---|
| Search W | 搜尋 W | Walks subfolders, streaming results as they arrive, and the status line
names the folder it is currently in. Plain words match names; fields narrow it —
name:, glob:, re:, path:,
ext:, kind:, size:>1M, modified:<7d,
hidden: — and NOT or - excludes. Symlinks are never
followed, so a cycle cannot be entered. Stop Search halts it and keeps every row found so
far, marked as stopped; Back to Folder or Esc returns to the listing |
會走子資料夾,結果邊找邊出現,狀態列會顯示正在找哪個資料夾。直接打字比對檔名,也可以加條件縮小範圍:name:、glob:、re:、path:、ext:、kind:、size:>1M、modified:<7d、hidden:,用 NOT 或 - 排除。不跟符號連結,所以不會繞進迴圈。按「停止搜尋」會停下來並保留已經找到的每一筆,也會標明是中途停止的;按「返回資料夾」或 Esc 回到原本的清單 |
| Compare folders | 比較資料夾 | Two panes side by side: only here, only there, differs, identical. Subfolders optional. Compared by size and modification time, two seconds either way counting as the same, because FAT keeps two-second times — a rule printed under the table rather than left to be assumed | 兩個面板並排比:只在這邊、只在那邊、不一樣、一樣。要不要含子資料夾自己決定。比對用大小跟修改時間,時間差兩秒以內算一樣,因為 FAT 只記到兩秒。這條規則就印在表格下面,不用猜 |
| Disk usage | 磁碟用量 | One walk, two answers: which child folder holds the most, and which kind of file adds up to the most. Files sitting in the folder get a row of their own so the rows add up. Copy, move and trash work from inside the report, and it measures again afterwards | 掃一次給兩個答案:哪個子資料夾最大,還有哪一類檔案加起來最大。直接放在那個資料夾裡的檔案自己佔一列,所以每列加起來就是總計。複製、移動、丟回收筒都可以在報告裡直接做,做完會重新統計 |
10. Appearance and language
10. 外觀與語言
| Themes | 佈景主題 | Light, dark, and follow the system. The colours come from semantic tokens resolved in Rust, and a test fails the build if Rust code makes a colour of its own. The only fixed colours in the interface are the checkerboard behind a transparent image and one shadow | 淺色、深色、跟隨系統。顏色都來自 Rust 那邊解析出來的語意 token,Rust 程式碼要是自己寫死顏色,測試就會讓建置失敗。介面裡寫死的顏色只有透明圖片後面的棋盤格,跟一道陰影 |
|---|---|---|---|
| Following the system | 跟隨系統 | Live on Qt 6.5 and newer, which the macOS and Windows builds use. The Linux
.deb uses Ubuntu 22.04's Qt 6.2, so there the theme is read once at launch —
stated rather than hidden |
Qt 6.5 以上會即時切換,macOS 和 Windows 版都是。Linux 的 .deb 用的是 Ubuntu 22.04 的 Qt 6.2,所以只在啟動時看一次。這件事寫出來,不藏 |
| Fonts | 字型 | Family and size for the lists. A fixed-width face goes on the size, date and permission columns by default, so their digits line up; it can go nowhere, or on the whole list. A slider in the status bar changes the size directly | 可設定清單的字型與大小。等寬字型預設只用在大小、日期、權限這些需要對齊的欄位,讓數字對齊;也可以完全不用,或整個清單都用。狀態列的滑桿可直接調整大小 |
| List density | 清單密度 | Compact, Standard or Comfortable. Compact is Finder's list, twenty pixels a row at the default font; Comfortable is the default. The height follows the font at every step | 緊密、適中、寬鬆。緊密就是 Finder 的清單,預設字型下每列 20 像素;預設是寬鬆。三種的列高都會跟著字型大小走 |
| Languages | 語言 | English and 台灣繁體中文, switchable while running. Every user-visible string is in a catalogue; a key missing from either language is a test failure, not a label nobody notices | English 跟台灣繁體中文,程式跑著就能切。使用者看得到的字串全部在語系檔裡,哪一邊少一個 key 就是測試失敗,不會變成沒人發現的標籤 |
11. Limits and bounds
11. 上限與界線
Every one of these is enforced in the source, not a guideline. They exist because the input is often something the user did not make — an archive from the internet, a disc image, a session file someone shared — and a reader with no bound is a reader that can be made to exhaust the machine.
下面每一個都是原始碼裡真的會擋的上限,不是建議值。它們存在的原因是:輸入常常不是使用者自己做的:網路上抓的壓縮檔、映像檔、別人給的工作階段檔。讀取器要是不設上限,就可以被拿來把機器的資源吃光。
| Where | 位置 | Bound | 上限 | Why | 原因 |
|---|---|---|---|---|---|
| Extraction — one member | 解壓縮 — 單一成員 | 8 GiB | Checked against bytes that actually arrive, not the header | 對照實際讀到的位元組,不是標頭宣稱的數字 | |
| Extraction — total | 解壓縮 — 總量 | 32 GiB | A lying header is what a decompression bomb is | 會說謊的標頭正是解壓縮炸彈的本體 | |
| Archive listing | 壓縮檔列表 | 100,000 entries個項目 · 64 MiB | Member names bounded at 4,096 bytes each | 成員名稱每個上限 4,096 位元組 | |
| ISO listing | ISO 列表 | 100,000 entries個項目 · 32 levels層 · 16 MiB | Extents already visited are remembered, so a loop cannot be walked | 會記住走過的區段,所以無法被繞進迴圈 | |
| tar listing | tar 列表 | 100,000 entries個項目 | — | ||
| Search / measure / compare / usage | 搜尋/計算/比較/用量 | 64 levels deep層深 | Iterative, so depth costs heap and not stack | 用迴圈不用遞迴,所以深度吃的是堆積,不是堆疊 | |
| Comparison result | 比較結果 | 200,000 rows列 | Stated when reached, never silently truncated | 碰到上限會講,不會安靜地砍掉 | |
| Disk usage breakdown | 磁碟用量統計 | 200 folders個資料夾 · 20 kinds種類型 | The rest is gathered into one labelled row, so the total still reconciles | 剩下的併成一列並標明,總計還是對得起來 | |
| Deletion depth | 刪除深度 | 64 | Refused past that rather than recursed into | 超過就拒絕,不會繼續遞迴 | |
| Preview index | 預覽索引 | 4 MiB | Says it is showing part of the file | 會說明只顯示了一部分 | |
| Viewer index | 檢視索引 | 64 MiB | The same | 同上 | |
| Split nesting | 分割巢狀 | 16 | Not a UI limit. The layout is restored from a file the user can edit, and the interface builds it by recursing over it | 這不是介面上的限制。版面是從使用者可以編輯的檔案還原的,而介面是用遞迴把它建起來 | |
| Path input | 路徑輸入 | 4,096 bytes位元組 | — | ||
| Directory listing batch | 目錄列舉批次 | 64 → 4,096 | Rows arrive in batches that start small and grow, so the first screenful paints at once and a folder of a million entries paints as it reads | 分批送出,第一批小、後面逐漸變大,所以第一個畫面馬上出現,一百萬個項目的資料夾也是邊讀邊畫 | |
| Undo history | 復原歷程 | 32 operations次操作 | Undo is for the mistake you just made | 復原是給剛剛犯的錯用的 | |
| One undo record | 單次復原紀錄 | 20,000 files個檔案 | Past it the operation gets no undo entry rather than a partial one — a half-undo leaves the tree neither where it started nor where you left it | 超過就完全沒有復原項目,不會只復原一半。復原到一半會讓整個結構卡在既不是原本、也不是你操作完的狀態 | |
| Marked set | 標記集合 | 100,000 | It survives navigation and is written to the session file, so nothing else ends it. A refused mark is counted and reported, never silently dropped | 標記會跨資料夾留著,也會寫進工作階段檔,沒有別的東西會把它清掉。擋掉的標記會計數並回報,不會安靜地丟掉 | |
| Numbered copies | 編號副本 | 999 | A folder already holding (1) to (999) is reported,
not looped over |
資料夾裡 (1) 到 (999) 都有了就回報,不會一直找下去 | |
| Queued operations | 排隊中的操作 | 64 | Each holds its whole plan | 每一個都帶著完整的執行計畫 | |
| Closed tabs to reopen | 可重新開啟的已關分頁 | 16 per pane個/面板 | — | ||
| Recent folders · bookmarks | 最近使用・書籤 | 32 · 512 | — | ||
| Folder sizes remembered | 記住的資料夾大小 | 4,096 · 10 min | Measured again after ten minutes, since a folder changes | 十分鐘後重新計算,因為資料夾會變 | |
| SFTP timeouts | SFTP 逾時 | 20 s · 30 s | To connect, and per request: a server that stops answering is reported, not waited on forever | 連線與每次請求。伺服器不回應就回報,不會一直等 | |
| Stored session nesting | 工作階段巢狀 | 128 | The JSON reader's own limit; a file past it is an error, never a crash | JSON 讀取器自己的上限。超過就報錯,不會當掉 |
12. What it refuses to do
12. 拒絕的事
A file manager that quietly does something other than what it was asked is worse than one that says no. These are the cases where it says no.
一個偷偷做了別的事的檔案管理器,比一個直接說「不行」的更糟。下面是它會說不行的情況。
| A member that would land outside the folder you chose | 會落在你所選資料夾之外的成員 | Refused and reported — never written, never silently
renamed — in every spelling: ../, an absolute path, a Windows drive letter, a
UNC prefix, backslashes on any platform |
擋下來並回報,不寫、也不會自己改名。不管它怎麼寫都一樣:../、絕對路徑、Windows 磁碟機代號、UNC 路徑開頭、任何平台上的反斜線 |
|---|---|---|---|
| A symlink inside an archive | 壓縮檔裡的符號連結 | Refused, not created. Writing one means a later write through it lands wherever the archive chose | 擋下來,不建立。建了它,之後寫進去的東西會跑到壓縮檔說了算的地方 |
| A symlink during a walk | 走訪時遇到的符號連結 | Never followed — not when searching, measuring, comparing, analysing or deleting. A link is a name, not a door | 一律不跟進去,搜尋、計算、比較、分析、刪除都一樣。連結是一個名字,不是一扇門 |
| A directory swapped mid-delete | 刪除中途被掉包的資料夾 | Cannot lead the delete out of the selection: the walk holds an open directory descriptor and never resolves a path twice | 帶不出你選的範圍。走訪的時候拿著開啟的目錄描述符,路徑不會再被解析第二次 |
| A session file from a newer build | 較新版本寫的工作階段檔 | Refused, and left exactly as it is. This build writes beside it, never over it | 擋下來,原檔原封不動。這一版會寫在它旁邊,不會蓋掉 |
| Any removal | 任何刪除 | Confirmed first, every time, from every route. Permanent deletion says it cannot be undone before it runs | 每次都先確認,不管從哪裡發動。永久刪除會在執行前說明無法復原 |
| A conflict | 名稱衝突 | Reported with the first conflicting name and a choice. Never resolved by guessing | 會回報第一個撞名的並讓你選。不會自己決定 |
13. Platform differences
13. 平台差異
Where a platform cannot do something yet, the command is still listed but greyed out, rather than offered and inert — a key nobody can find in a menu is a key nobody learns, and a button that does nothing teaches people to distrust every other button. Quick Look is the exception: where there is no system previewer, its key opens the built-in viewer.
平台還做不到的事,命令照樣列出來,但呈灰色,不做按了沒反應的東西。選單裡找不到的按鍵沒有人學得會;一個按了沒反應的按鈕,會讓人開始懷疑其他每一個按鈕。快速查看是例外:沒有系統預覽可用的平台,同一個鍵改開內建檢視器。
| macOS | Windows | Linux | |||||
|---|---|---|---|---|---|---|---|
| Everything above, except as listed here | 以上所有功能,下列例外除外 | ✓ | ✓ | ✓ | |||
| Trash | 回收筒 | ✓ the system Trash, Put Back works | ✓ 系統垃圾桶,可以放回原處 | not yet — delete permanently instead | 尚未,請改用永久刪除 | ✓ the freedesktop trash | ✓ freedesktop 回收筒 |
| Quick Look | 快速查看 | ✓ the system panel | ✓ 系統面板 | the built-in viewer instead | 改開內建檢視器 | the built-in viewer instead | 改開內建檢視器 |
| Reveal in file manager | 在檔案管理員中顯示 | ✓ | not yet | 尚未 | not yet | 尚未 | |
| Eject | 退出磁碟 | ✓ | not yet | 尚未 | not yet | 尚未 | |
| External editor | 外部編輯器 | ✓ | not yet | 尚未 | not yet | 尚未 | |
| Open With · Share | 開啟檔案的應用程式・分享 | ✓ | not yet | 尚未 | not yet | 尚未 | |
| Open in Terminal | 以終端機開啟 | ✓ | ✓ | ✓ the first terminal it finds | ✓ 找到的第一個終端機 | ||
| Copying a symlink | 複製符號連結 | ✓ | refused — needs a privilege an ordinary account lacks | 不做,這需要一般帳號沒有的權限 | ✓ | ||
| Race-free deletion | 無競態刪除 | ✓ directory descriptors | ✓ 目錄描述符 | path-based; no openat equivalent is reachable portably |
走路徑,因為沒有可移植的 openat 對應機制 |
✓ directory descriptors | ✓ 目錄描述符 |
| Live theme following | 即時跟隨主題 | ✓ | ✓ | the .deb (Qt 6.2) reads it at launch; Qt 6.5+ follows live |
.deb(Qt 6.2)只在啟動時讀一次;Qt 6.5 以上會即時跟隨 | ||
| SSH agent | SSH agent | ✓ | falls through to key files rather than pretending to have looked | 直接改用金鑰檔,不會裝作找過 | ✓ |
14. Not built
14. 尚未完成
Named here rather than left to be discovered.
先講清楚,不要讓人自己踩到才知道。
| Remote | 遠端 | Viewing or previewing a file on a server, renaming or making a folder there, server-to-server copies, and more than one server at a time. Copy, move and delete between a server and this machine work | 檢視、預覽伺服器上的檔案,在伺服器上更名或新增資料夾,伺服器對伺服器的複製,以及同時連多台伺服器。伺服器跟本機之間的複製、移動、刪除已經可以用 |
|---|---|---|---|
| Viewers | 檢視器 | No image, JSON, CSV or syntax-highlighted view in the viewer window | 檢視視窗還不能看圖片,也沒有 JSON、CSV 或語法上色的檢視 |
| Searching inside files | 搜尋檔案內容 | Search matches names, paths, types, sizes and dates, not what a file contains | 搜尋比對的是檔名、路徑、類型、大小和日期,還不會找檔案內容 |
| Metadata of our own | 自有的中繼資料 | No ratings, comments or descriptions | 還沒有評分、註解或描述 |
| AI | None yet, on purpose: it comes last, and never replaces exact search | 還沒有,刻意放到最後做,而且不會取代精確搜尋 | |
.7z · .rar |
Neither reading nor writing | 讀寫都沒有 | |
| Windows and Linux platform services | Windows 與 Linux 的平台服務 | The Recycle Bin on Windows; reveal in file manager, eject, external editor, Open With and Share on both. Those commands are greyed out, the eject button does not appear, and Quick Look opens the built-in viewer instead | Windows 的資源回收筒;兩個平台上的「在檔案管理員中顯示」、退出磁碟、外部編輯器、「開啟檔案的應用程式」和分享。這些命令會呈灰色,退出按鈕不會出現,快速查看則改開內建檢視器 |
| Batch command over marked files | 對已標記檔案下批次命令 | — | |
| Repeat find | 繼續找 | Deliberate: F is a filter rather than a find, so "find next" has no meaning in this model | 刻意不做。F 是篩選,不是尋找,在這個模型裡「找下一個」沒有意義 |
| Signed installers | 簽章的安裝檔 | Not yet. Installers for all three platforms are published unsigned, so macOS and Windows warn once before opening them — which they should. The steps are in Download | 還沒有。三個平台的安裝檔都已經發布,只是沒有簽章,所以 macOS 和 Windows 第一次開啟前會警告一次,本來就該這樣。步驟在下載那一節 |
jt-filework