AI Decision System
Replayable, offline-verifiable records for AI-assisted go/no-go decisions: experiment promotions, typed model answers and human-approved actions.
1·10·50GB 텍스트·로그 파일을 즉시 열고 검색·편집하며 Windows·Linux·macOS용 무료 오픈소스 편집기로 멈추지 않는다
Open, search and edit 1 GB, 10 GB or 50 GB text and log files instantly. Free, open-source editor for Windows, Linux and macOS that never freezes.
개발 도구Rust · PythonGitHub @Erkinbek온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기Fast text editor for huge files (1-50+ GB): opens 10 GB logs instantly and never freezes. 2.5 GB/s search, regex, replace, editing, atomic save, diff, hex view. Windows, Linux, macOS. Rust + egui.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
README 전문 보기 ↗Open, search and edit 1 GB, 10 GB and 50 GB text and log files instantly. BigText is a free, open-source desktop text editor for huge files — logs, CSV exports, SQL dumps, JSON — that never freezes and never loads a whole file into memory. Files of any size open in milliseconds and stay responsive; search, replace, edits and saving run on background threads with progress and cancellation.
Website · Download · Русский · O'zbekcha
Written in Rust with a custom virtualized text view on top of egui/eframe (glow renderer).
Single self-contained binary, no runtime dependencies.
bigtext file.txt), Windows
"Open with" (registered by the installer), multiple tabs.u64 per 64 KB, built in the background from the top.
Go to line and the scrollbar work immediately (estimated positions, shown with ~, refined
when the index catches up)..gz, .zst, .xz, .bz2, also multi-member/multi-frame as log
rotators write them): unpacked once, streaming, into a temporary copy that opens as soon as
its first megabyte is there; the rest appears as it is unpacked (progress and Cancel in the
status bar, which keeps what is unpacked). The copy is read-only; Save becomes Save As. It
is deleted when the tab closes, and the session remembers the compressed file.
Before unpacking (and before a save) BigText compares the size with the free space and asks
first when it would not fit; Help → Unpacked copies folder… puts the copies on another drive..zip, .tar, .tar.gz / .tgz, .tar.zst, .tar.xz, .tar.bz2): a picker
lists the files with their sizes and dates (filter, arrows, Enter), and the one picked opens
as bundle.zip › app.log; a compressed file inside (app.log.gz) is unpacked too. An archive
with one file opens straight away, and the session remembers which file was open..gz, .zst, .xz or .bz2 when the name ends so (streaming, with progress
and Cancel); Split file… can compress its parts; on the command line -o out.gz and
split --gz.? and are counted in the message. Binary-looking files open as text with a one-click
hex view.↪ in the gutter) so every row computation is bounded; horizontal
virtualization renders only the visible slice.regex-automata), case sensitive,
whole word, multiline (dot matches newline), search in selection. Streams over the mmap on a
worker with a live counter and cancel; F3 / Shift+F3 work before any full search finishes;
"Find All" results in a virtualized list (capped at 1,000,000 with a "more exist" note), with
Top values… (the different matched texts or a capture group counted, most frequent first,
like grep -o | sort | uniq -c) and Save matches… (only the matched texts);
matches highlighted in the viewport only. Non-UTF-8 files are searched by transcoding the
pattern (literal) or decoding windows (regex) with exact byte mapping. Matches spanning
chunk or piece boundaries are found.grep
over the whole file. ±N in its header adds N dimmed lines before and after each match
(grep -C), and Whole entry keeps a log entry together: the stack trace under an ERROR
line, or the entry's first line above a match inside a trace. The Narrow row adds
conditions on top (timeout, then without healthcheck), shown as chips that can be removed;
narrowing a finished filter reads only its lines. Click a line to jump to it.
Save lines… streams every kept line to a
new file (no limit); Copy lines puts them on the clipboard (up to 100 MB). Find All
results offer the same two buttons. Delete these / Keep only these change the document
itself (drop every DEBUG line, keep only the errors): one undo step up to 50,000 runs of
lines, beyond that rewritten on disk like Replace All, with an optional .bak.ERROR in red, a request id in blue — kept across sessions.
Selecting a word (double click) also highlights its other occurrences on screen.14:32:05 or 2024-05-01 14:32:05 to jump to the first
log line at or after that time. A binary search over byte offsets reads only a few hundred
KB, so it is instant even before indexing finishes. Recognises ISO 8601, DD.MM.YYYY,
MM/DD/YYYY, Apache [01/May/2024:14:32:05, syslog May 1 14:32:05 and bare times, with
milliseconds. When a selection spans timestamped lines, the status bar shows the time
between its first and last line (Δt).$1, ${name}, \n, \t. Up to
50,000 matches are applied as one undoable piece-table edit; beyond that the result is
streamed to a temp file and swapped in atomically (optional .bak), with bounded memory and
progress/cancel. Preview of the first 200 replacements.file:line caption, or as HTML in the theme's syntax colours (with the plain
text beside it) for mail, wikis and documents..xlsx opens in the
spreadsheet app.bigtext app.log:120, Explorer's Open with, a
grep result) opens it as a tab of the running window, at its line, and brings that window to
the front; --new-window starts another one. (On macOS only terminal launches are handed
over.)ReplaceFileW on Windows, keeps attributes/ACLs). Any failure leaves the original intact;
"file in use" / permission errors produce clear messages. Save As, optional .bak backup
(File → Keep backup), unsaved-changes prompts. Closing the window during a save waits for a
clean cancel or for the atomic swap to finish.~ before), and for a selection its lines, characters (up to 4 MB)
and bytes, the time it spans in a log (Δt) and the width of a block selection.bigtext-cli stats prints them too).
follow (tail) mode for growing logs that resumes indexing where it stopped. Like
tail -F it survives log rotation: when the file is truncated (copytruncate) or renamed away
and created again, it goes on in the new file, with a button to open the rotated one
(app.log.1); the status bar shows FOLLOW ×n..bak); the same code
runs as bigtext-cli transform --op upper|lower|trim|tabs|untabs and format --json.bigtext-cli sort [-r] [-n] [-i] [-u] and uniq [-c] do the same.sort | uniq -c, jq . or python fix.py gets the selection or the document on its standard input, and
its output replaces the selection (one undo step), opens in a new tab or only its exit code is
shown; both stream through pipes and a temporary file, with Cancel in the status bar. The shell
is cmd, Git Bash or WSL on Windows. Saved commands become Edit → External tools with
{file}, {dir}, {line}, {col} and {selection} filled in (code -g "{file}:{line}").%xx, hex, HTML entities and JSON string escapes, on the selection or the word at the
caret. A result that is not text for the document (bytes, characters its encoding lacks) opens
in a window with Copy and Open in a new tab instead of replacing anything..ttf/.otf/.ttc file, with a preview
and a warning for fonts that are not monospaced; the built-in font stays as the fallback
for missing characters. Kept across sessions..csv and .tsv files open as a table (View → Table view or
Ctrl+T switches any file between table and text). The delimiter (comma, semicolon, tab, pipe)
is detected from the first lines and can be changed in the toolbar; quoted fields follow
RFC 4180. The first row is a pinned header, numbers align right, columns fit their content
(drag a header border to resize, double-click it to fit again). Like the text view it reads
only the rows on screen, so a 10 GB CSV scrolls as fast as a small one. Click a cell to put
the caret there, double-click it to edit it in the text view..bak) in one streaming pass with bounded memory.name.part001.ext, name.part002.ext, … of a given size in MB or number of
lines, always at line breaks (UTF-16 parts each get the byte order mark). All of them
stream on a worker with progress and Cancel in the status bar..bak).bigtext diff -w -i -t --mask).
Unsaved edits are compared too; Compare with the saved file shows what you changed
before Ctrl+S, Compare with the backup (.bak) what the last save changed.
View → Compare side by side shows the other file beside the document: removed lines red
with −, added green with +, the changed part of a changed line brighter, and the two panes
scroll together (the pane under the pointer leads).
Save as .diff… in the compare panel writes a standard unified diff (3 lines of context,
streamed, any size); File → Apply patch… applies a .diff/.patch to the document as one undo
step, finding a hunk up to 4,096 lines away when it matches only one place there and listing
the hunks it could not place.bigtext only-in A B -t --mask RE.request_id=…,
"traceId": "…", bare UUIDs) show as chips in the status bar; a click or Ctrl+Shift+I filters
the file to that id's whole log entries and shows when it was first and last seen, how long it
took and how many errors it had. Search → Id patterns… edits the keys.key=value) line as a
key → value table that follows the caret (nested objects as user.id, escaped stack traces
shown as lines). Each field can filter the file to its value or away from it, highlight it,
or count its values over the whole file into a table (lines, share, first and last time).<n>, <hex>,
<uuid>, <ip>, <path> — with counts and levels, most lines first (the noise) or rarest
first (the anomalies); a click shows only that template's lines.*.log (or any pattern) file of a
folder and its sub-folders, listed as file:line; click to open the file there.! and column under a
name, applied as a filter with one click.$.items[1234].id
(or /catalog/item[1234]/price) and copying the
path at the caret; View → Open JSON Lines as table.$ › items › [1234] › city for the value at the caret, live
as it moves; a part jumps to that parent, a right-click copies the path. Deep in multi-GB files
it is found from checkpoints one background pass records every 8 MB..level == "error" and .duration > 500 in the filter view (bigtext-cli jsonl -q).key=value) logs to a table
(File menu, bigtext-cli convert).bigtext-cli validate).bigtext-cli stats --fields).bigtext-cli jsondiff).sep=; line, comment and title lines before the table
are skipped (and kept as they are by sorting and other rewrites), and a table of numbers is
shown without a header row. The toolbar's Table… menu sets the lines to skip and the quote
(" or ').bigtext-cli join).old → new values), removed and added open as a new table. Columns pair up by header name;
any size, through hash buckets on disk (bigtext-cli diff-table A B --key id).bigtext-cli pivot).{price} * {qty}, substr({ts}, 0, 10),
if(…), regex(…)), previewed as you type (bigtext-cli derive).bigtext path:line.%APPDATA%\BigText\state.txt / ~/.config/bigtext). Portable
mode keeps them in a BigText-data folder next to the program instead (Help → Portable
mode…), and Help → Export / Import settings carries highlights, key bindings, saved
searches and the look to another computer.cargo install copy shows the
command to run instead.| Regex search over 10 GB (2.5 GB/s) | Comparing two logs |
|---|---|
| Hex view in the middle of a 10 GB file | Light theme, JSON, split view, bookmarks |
The screenshots are made by the app itself: bigtext --screenshots DIR testdata/random-lines-10g.txt.
Latest release: all files and release notes · changelog
| Platform | Download |
|---|---|
| Windows 10 / 11 | Installer (adds “Open with” and an Explorer context-menu entry) · portable .zip |
| Linux x64 | AppImage · .deb (Debian, Ubuntu) · .tar.gz |
| macOS | BigText.app for Apple Silicon · Intel; plain binaries: Apple Silicon · Intel (unsigned: right-click → Open on first launch) |
With Rust installed, on any platform: cargo install bigtext
(crates.io/crates/bigtext; on Linux, first install the
packages listed under Building). Or build it yourself (see Building).
bigtext [OPTIONS] [FILE[:LINE] ...]
FILE:LINE open FILE at line LINE (FILE:LINE:COLUMN, as compilers and grep -n
print it, works too)
- read standard input, following it as it grows
(e.g. journalctl -f | bigtext -)
-n, --line N go to line N in the last file
--find TEXT search for TEXT (from the start, or from --line)
--regex RE search for a regular expression
-f, --follow follow the files as they grow and are rotated, like tail -F
--new-window open a window of its own (files otherwise open in the
BigText already running)
-h, --help show this help
For scripts, bigtext-cli (in every download; bigtext --filter … works too) runs the
same streaming code without a window:
bigtext-cli filter [-v] [-i] [-w] [-E] PATTERN FILE [-o OUT] lines with (-v: without) a match
bigtext-cli levels ERROR,WARN FILE [-o OUT] lines of these log levels
bigtext-cli count [-v] [-i] [-w] [-E] PATTERN FILE number of matching lines
bigtext-cli extract [-E] [-g N] [--count] PATTERN FILE only the matched texts (or counts)
bigtext-cli split (--size 100MB | --lines N) FILE [--out-dir DIR]
bigtext-cli grep [-i] [-w] [-E] PATTERN FILES... | -r DIR find in files (file:line:text)
bigtext-cli head [-n N] FILE / tail [-n N] FILE the first / last N lines
bigtext-cli replace [-E] PATTERN REPLACEMENT FILE [--in-place [--bak]] Replace All, streamed
bigtext-cli saved / filter --saved NAME [--settings FILE] searches saved in the app
bigtext-cli slice FILE --lines A-B | --bytes A-B | --from T --to T a part, by binary search
bigtext-cli diff A B [-w] [-i] [-t] [--mask RE] [-U N] [-q] a unified diff
bigtext-cli only-in A B [-t] [--mask RE] lines of A nowhere in B
bigtext-cli diff-table A B --key COL tables compared by key
bigtext-cli sort [-r] [-n] [-i] [-u] FILE / uniq [-c] FILE any size, through temp runs
bigtext-cli transform --op upper|lower|trim|tabs FILE text operations, streamed
bigtext-cli format FILE --json pretty|minify JSON formatting, streamed
bigtext-cli stats FILE... size, lines, encoding, first/last time
bigtext-cli merge FILE FILE... [-o OUT] logs merged by time
bigtext-cli convert FILE --to json|jsonl|md|xlsx|csv [-o OUT] tables (and JSON Lines → CSV)
bigtext-cli validate FILE [--no-header] [--numeric 3,5] malformed CSV / TSV rows
bigtext-cli csv FILE cut|drop COLS | sort --by COL | where COND... | stats COL | group COL
bigtext-cli values FIELD FILE [-o OUT] a JSON Lines / logfmt field's values
bigtext-cli gaps FILE [--min 30s] time gaps, with line numbers
bigtext-cli patterns FILE [--top N] [--rare] [-o OUT] message templates with counts
--json gives one JSON record per line on filter, levels, grep, count, stats, replace and saved
({file, line, offset, text}, errors as {"error": …}).
filter, count and levels take several files, *.log patterns (expanded on Windows too) and
-r DIR --names '*.log;*.gz', printing file: before each line (count: per file and a total),
or --out-dir DIR for one output per input; compressed inputs are unpacked on the way.
filter and count take more patterns: -e PAT (each must match, or one of them with --any)
and --not PAT. filter and levels take -A N / -B N / -C N (lines after / before / around each match),
--entries (whole log entries) and -n (line numbers, 12: a match and 13- context), with
-- between groups like grep, and --from TIME / --to TIME (only the lines between two
times). Exit codes: 0 done, 1 nothing matched, 2 error.
| Shortcut | Action |
|---|---|
| Ctrl+O / Ctrl+N | Open / new |
| Ctrl+S / Ctrl+Shift+S | Save / save as |
| Ctrl+W | Close tab |
| Ctrl+1 … Ctrl+8, Ctrl+9 | Tab 1 … 8, the last tab |
| Ctrl+PageDown / Ctrl+PageUp | Next / previous tab in the bar |
| F4 / Shift+F4 | Next / previous entry of the list under the text (Find All, filter, Find in files) |
| Ctrl+Tab / Ctrl+Shift+Tab | Tabs in most-recently-used order (hold Ctrl, release to switch) |
| Ctrl+F / Ctrl+H | Find / replace (Enter = next, Shift+Enter = previous, Esc = close) |
| F3 / Shift+F3 | Find next / previous |
| Ctrl+Shift+F | Filter: show only the lines with a match |
| Ctrl+Alt+F | Find in files |
| F8 / Shift+F8 | Next / previous error line (or line of the levels shown) |
| Ctrl+Shift+H | Time histogram |
| Ctrl+Shift+I | Follow the id at the caret (or the selected text) |
| Ctrl+Shift+V | Paste from the history of copied texts |
| Ctrl+I | File properties (lines, line breaks, longest line, SHA-256) |
| Ctrl+Shift+L | Log fields of the caret's line |
| Ctrl+] | Go to the matching bracket or tag |
| Ctrl+Shift+J | JSON structure |
| Ctrl+Shift+C | Copy file:line |
| Ctrl+Shift+P | Command palette |
| Alt+Left / Alt+Right | Back to where the caret jumped from / forward again (also the mouse's side buttons) |
| Ctrl+G / Ctrl+Shift+G | Go to line / go to byte offset (decimal or 0x hex; also 50%, +100 / -100 from the caret, $-100 from the end) |
| Ctrl+Shift+T | Go to time (first log line at or after a timestamp) |
| Ctrl+Alt+T | Go to this time in all tabs |
| Ctrl+Shift+R | Run a command on the selection |
| Ctrl+Shift+{ / Ctrl+Shift+} |
View → Hex view, View → Follow (tail), View → Syntax highlighting, File → Open recent, File → Compare with…, File → Reopen with encoding, File → Line endings on save, File → Keep backup (.bak) on save, Edit → Read-only, Help → About.
The workspace builds four binaries: bigtext (the editor), bigtext-cli (the script
commands), bigtext-bench (core benchmarks) and gen-testfiles (test corpus generator).
packaging/ has the Linux .deb / AppImage and macOS .app scripts and Homebrew templates.
stable-x86_64-pc-windows-msvc) and the Visual Studio
Build Tools with the "Desktop development with C++" workload.cargo build --release → target\release\bigtext.exe is the portable executable.ISCC.exe /DSourceExe=%CD%\target\release\bigtext.exe installer\bigtext.iss
(adds Start-menu entry, "Open with" registration and an Explorer context-menu item).sudo apt-get install libxkbcommon-dev libwayland-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libgl1-mesa-dev
cargo build --release
Install the Xcode command line tools, then cargo build --release (Apple silicon), or
rustup target add x86_64-apple-darwin && cargo build --release --target x86_64-apple-darwin.
.github/workflows/build.yml builds Windows x64, Linux x64 and
macOS arm64/x64, runs the unit tests and uploads the binaries plus the Windows installer
(bigtext-<version>-setup.exe) as artifacts of every run. The installer was checked with a silent
per-user install (/VERYSILENT /CURRENTUSER): files, "Open with" and Explorer context-menu
entries and the Start-menu shortcut are created, the installed exe runs, and the uninstaller
removes all of it.
src/
file.rs Source: cached mmap views + positional reads | chunked (block cache + loader) | empty
encoding.rs Encoding, Codec (newline search/count, decode/encode, char boundaries), detection
index.rs LineIndex: one u64 per 64 KB, background indexer, estimates
text/buffer.rs TextBuf: piece table (original mmap + add buffer), line<->offset mapping, undo swaps
text/rows.rs bounded visual segments (64 KB soft breaks), wrap, cell math
search.rs Matcher (memmem / regex-automata / decoded), windowed streaming search
replace.rs templates, batch edits, streaming replace-all
save.rs temp file + fsync + atomic replace (ReplaceFileW), EOL conversion
diff.rs streaming line diff (chunk compare + hashed re-synchronisation)
jobs.rs cancel tokens, progress, wakers
app/ egui shell: tabs, menus, search panel, results list, dialogs, save protocol,
session/recent files, compare panel
view/ custom virtualized text view, hex view, syntax highlighting
self_test.rs in-app GUI self-test driven by synthetic input
bin/ gen-testfiles, bigtext-bench
Key decisions (details in PLAN.md):
Arc snapshots of the piece table and report through channels.cargo test --lib --bins # 80 unit tests: index, piece table, rows, search, replace, save,
# encodings, diff, highlighting, session file, updates, CSV
cargo test --lib update -- --ignored # downloads and unpacks the latest release (needs the network)
target/release/bigtext --self-test --report report.txt [--screenshot shots/x.png]
# 59 GUI checks with synthetic mouse/keyboard/clipboard input
scripts/gen-testfiles.ps1 # or scripts/gen-testfiles.sh; -SkipBig / --skip-big avoids the 10 GB file
target/release/bigtext-bench FILE # core benchmarks (open, first screen, go-to, index, search, replace, memory)
target/release/bigtext --bench-ui FILE --report out.txt [--screenshot out.png]
[--scenario search:TEXT|edit|view|wrap|hex|close-search|close-replace]
The GUI self-test drives the real window through App::raw_input_hook: clicks, drags,
double/triple clicks, shift-click, keys and shortcuts, typing, copy/paste, Ctrl+wheel. It checks
selection, smart Home/End, auto-indent, undo/redo back to the unmodified state, clipboard,
duplicate/delete line, zoom, find / F3 / Shift+F3 / Find All, replace all + undo, go to line and
offset, atomic save (no temp files left), the unsaved-changes prompt, wrap/hex/overlay toggles,
bookmarks, split view, highlighting, file comparison, the CSV table (column selection, delete
and undo), the About window, and these edge cases:
read-only files (edits blocked; saving over one fails cleanly and keeps the edits), a file
appended to while open (banner, then follow mode), a file renamed or deleted while open, a
path longer than 260 characters (open, edit, save), a Unicode path, the chunked read path
(forced, and via \\localhost\E$ UNC), empty / no-trailing-newline / CR-only / BOM-in-the-middle
/ UTF-16 / Windows-1251 files, a binary file, and a 6 MB copy on a worker. Every run: 56/56
passed, max UI frame time 3–5 ms. The close-search / close-replace scenarios close the window
mid-job: the process exits within a second, no temp file is left and the original file's hash
is unchanged.
The generator writes random-lines-1g.txt, random-lines-10g.txt, single-line-2g.txt,
utf16le.txt, cp1251.txt, binary.bin, mixed-eol.txt, short-lines-100m.txt and small
edge cases (empty file, no trailing newline, CR-only, BOM in the middle, NUL + invalid UTF-8,
Unicode path).
The project website (erkinbek.github.io/bigtext) lives in docs/ and is served by
GitHub Pages from the main branch. It is generated in English, Russian and Uzbek by
python scripts/build-site.py (needs Pillow), which also converts the screenshots in
target/shots to WebP and draws the logo, favicons and the social preview image:
target/release/bigtext --screenshots target/shots testdata/random-lines-10g.txt
python scripts/build-site.py
Cargo.toml, installer/bigtext.iss and scripts/build-site.py, add
the release to CHANGELOG.md, run python scripts/build-site.py --no-images
and commit.git tag -a v0.1.2 -m "BigText 0.1.2" and git push origin v0.1.2.releases/latest/download/<file> links keep working, and the in-app updater finds
bigtext-setup-windows-x64.exe, bigtext-windows-x64.zip and the .tar.gz files by these
names). Write the changes under a ## What's new in 0.1.2 heading in the release notes: the
update dialog shows that section (and the whole notes when there is no such heading). Then:
crates-io job) publishes the crate with
trusted publishing, so no token is stored.
It runs when the repository variable CRATES_IO_PUBLISH is true. One-time setup: the
first version is published by hand (cargo login, then cargo publish); then on crates.io
→ bigtext → Settings → Trusted Publishing add the repository Erkinbek/bigtext with the
workflow build.yml.winget job) opens a pull request with the new version at
microsoft/winget-pkgs through
WinGet Releaser. It needs the secret
WINGET_TOKEN (a classic token with the public_repo scope) and a fork of winget-pkgs
under the repository owner, and it only updates a package that is already in winget: the
first version is submitted by hand from the manifests in packaging/winget/, which pass
winget validate. Until that submission is merged the job skips itself.Measured on Windows 11 Pro, Intel Core Ultra 9 285 (24 cores), 191 GB RAM, release build,
files already in the OS page cache ("cached data" as in the targets). GUI numbers come from
bigtext --bench-ui (frame time = CPU time of one egui frame including our layout); core numbers
from bigtext-bench. Raw reports: scripts/bench.ps1 reproduces them.
| Target | Goal | Measured | |
|---|---|---|---|
| Open → first screen of text | < 200 ms | 41–46 ms in the GUI (1 GB … 50 GB, incl. waiting for the next frame); open + detect on the worker 1.2–2.4 ms; first-screen layout 0.03 ms | ✅ |
| Jump to line, indexed (10 GB / 50 GB) | < 50 ms | frame incl. jump + layout: avg 0.86 / 0.88 ms, max 1.31 / 1.22 ms; core lookup + 50-row layout avg 0.07 ms | ✅ |
| Jump to line before indexing (estimate) | < 500 ms | frame avg 1.40 / 1.60 ms, max 1.82 / 2.01 ms (refined automatically when the index arrives) | ✅ |
| UI frame time while indexing / scrolling | < 16 ms | page-down every frame while indexing 50 GB: avg 0.83 ms, p99 1.16 ms, max 1.88 ms (600 frames); 2 GB single line: max 2.68 ms | ✅ |
| Literal search throughput | ≥ 1 GB/s | 2.4–2.5 GB/s (10 GB, 50 GB), 4.4 GB/s (2 GB line), case-insensitive 1.7–2.1 GB/s | ✅ |
| Simple regex throughput | ≥ 200 MB/s | id=99\d{4} 2.3–2.8 GB/s, ERROR\] id=\d+ timeout 2.3 GB/s, no-literal [a-z]{9,} [a-z]{9,} 672 MB/s; decoded UTF-16 / cp1251 regex 390 / 248 MB/s | ✅ |
| Replace All on 10 GB, private memory | < 300 MB | 22.2 M replacements, 10 GB written in 11.3 s (904 MB/s incl. fsync), peak private 46 MB | ✅ |
| Idle private memory, 50 GB file open | < 200 MB | 107 MB in the GUI after indexing (≈95 MB of it is the GUI/GL baseline); core process 12 MB | ✅ |
| Startup → first paint | < 300 ms | 159–185 ms (process start → end of first frame) | ✅ |
| File | Index time (throughput) | Index memory | Lines |
|---|---|---|---|
| random-lines-1g.txt | 0.45 s (2.3 GB/s) | 130 KB | 9,069,553 |
| random-lines-10g.txt | 4.1–4.3 s (2.4–2.5 GB/s) | 2.0 MB | 90,713,192 |
| random-lines-50g.txt | 19.2–23.1 s (2.2–2.7 GB/s) | 8.1 MB (0.016 % of file) | 453,565,956 |
| single-line-2g.txt | 0.76 s (2.7 GB/s) | 260 KB | 1 |
| short-lines-100m.txt | 0.18 s (2.6 GB/s) | 65 KB | 100,000,001 |
| utf16le.txt (64 MB) | 0.02 s | 8 KB | 690,320 |
| cp1251.txt (64 MB) | 0.03 s | 8 KB | 1,091,711 |
Col ~N).← placeholder).Erkin Pardayev
Licensed under the MIT license.
| Fold / unfold the object, array or element at the caret |
| Ctrl+Z / Ctrl+Y (Ctrl+Shift+Z) | Undo / redo |
| Ctrl+X / Ctrl+C / Ctrl+V | Cut / copy / paste |
| Ctrl+A | Select all |
| Ctrl+D | Select the word, then add its next occurrence as another cursor |
| Alt+click | Add a cursor (Esc: back to one cursor) |
| Ctrl+Shift+D / Ctrl+Shift+K | Duplicate line (or selection) / delete line |
| Ctrl+←/→, Ctrl+Backspace/Delete | Word movement / delete word |
| Home / End, Ctrl+Home / Ctrl+End | Line start (smart) / end, document start / end |
| Ctrl+wheel, Ctrl+= / Ctrl+- / Ctrl+0 | Zoom |
| Alt+Z | Toggle word wrap |
| Ctrl+F2 / F2 / Shift+F2 | Toggle / next / previous bookmark |
| Ctrl+\ | Split view |
| Double / triple click | Select word / line |
| Alt+drag, Shift+Alt+arrows | Column (block) selection |
| F12 | Performance overlay (frame time, private memory, index size) |