# Changelog for *Lx*

## Sep 1, 2026

#### Virtual Space

You can move the cursor past the end of a line by turning on `config.virtual_space`. It is disabled by default.

*Ctrl+Alt+Shift+drag* creates a virtual rectangular selection without changing the setting, so you can use virtual space for one selection when needed.

See [Virtual space](docs/editing_text.md#virtual-space).

#### Checksum Manifests

*Lx* recognizes GNU-style SHA-256 and MD5 checksum manifest files.

#### Preview Export

`preview:render-images` exports rendered previews, including Markdown and tabular previews, as numbered PNG files.

Exported PNG pages keep the original source filename and UTC creation time in their metadata.

Tabular previews keep their visible width when exported instead of stretching across the larger image page.

#### Word Deletion

*Ctrl+Delete* treats punctuation as a word boundary instead of deleting it with the neighboring word.

#### Mouse Selection

Mouse gestures use the modifier keys held when the click starts. Extra modifiers no longer open file links by accident, and *Shift+click* and *Shift+drag* extend character, word, and whole-line selections consistently.

---

## Aug 31, 2026

#### Tabular Preview

CSV, TSV, and PSV files open in preview mode. Press *Ctrl+Alt+E* to switch to editing, the same as with Markdown.

Files ending with a line break no longer show an extra empty row in tabular preview.

#### Scrolling

*Ctrl+Up* and *Ctrl+Down* scroll by one line. In wide previews, *Shift+Left* and *Shift+Right* move horizontally by three quarters of a page.

#### Editor Commands

Editor navigation uses `doc:page-up`, `doc:page-down`, `doc:line-up`, and `doc:line-down`. Keyboard binding commands use the `keybinds:*` namespace.

#### Text Input

Repeated text composition updates no longer leave editors using high CPU.

---

## Aug 29, 2026

#### Deleted Files

When an open file is deleted from disk, *Lx* shows a red border around the whole editor or rendered preview.

#### DOCX Images

Images placed beside paragraph text in DOCX files appear in the correct position in Markdown previews.

#### MaLxTeX Errors

Oversized or unclosed MaLxTeX display blocks show an error and report the line where the block started.

---

## Aug 27, 2026

#### File Locations

File locations are handled more consistently, with related settings available for controlling their behavior.

`config.file_locations.position_mode` accepts `"quiet"`, `"warn"`, or `"strict"` and defaults to `"warn"`. Quiet mode recovers usable locations silently, Warn mode reports one combined *F12* warning per file, and Strict mode rejects every location for a file when any one of them cannot be resolved.

Invalid columns are moved to the nearest usable position. A location with an invalid starting line is skipped, while a range with an invalid ending line is shortened to its starting position.

#### Mouse Selection

Double-clicking punctuation selects the punctuation run separately from nearby letters and digits. Repeated fast clicks alternate between whole-word and whole-line selection instead of failing after *Triple-click*.

#### Other Fixes

- The current editor line number uses the correct highlight.
- Reloading changed user settings removes keyboard shortcuts that are no longer configured.
- `core:reload-changed` reports failure to chained commands when any module cannot reload.
- Word-under-cursor highlighting no longer treats the position immediately after a word as part of that word.

---

## Aug 25, 2026

#### MaLxTeX

MaLxTeX is *Lx*'s native KaTeX-compatible renderer for Markdown math.

`\mathchoice` renders only the branch for the active display, text, script, or scriptscript style. `\mathscr` uses its own script face instead of matching `\mathcal`, while `\mathfrak` keeps its Fraktur alphabet.

Fraction rules also stay clear of visibly drawn limits inside `\smash`.

See [MaLxTeX](docs/malxtex.md).

#### Preview Export

`md-preview:export-images` renders a complete saved Markdown document as numbered PNG pages beside the source file, using names such as `document-001.png` and `document-002.png`.

Use `config.plugins.mdpreview.export_width`, `config.plugins.mdpreview.export_height`, and `config.plugins.mdpreview.export_scale` to control the output. They default to 2560 pixels, 3840 pixels, and `"auto"`. Page breaks follow rendered rows, so content is clipped only when one row is taller than a page.

See [Markdown preview export](docs/markdown_preview.md#save-the-preview-as-images).

#### Document Size

Document views show the current or estimated content size beside the line count.

#### Indentation Controls

The status bar shows whether a document uses `Spaces` or `Tabs`, marks automatically detected sizes with `*`, and cycles through `config.indent_size_cycle`.

`doc:detect-indent` rescans the current document and restores automatic indentation type and size. `doc:use-spaces` and `doc:use-tabs` choose the indentation used for future edits, while `doc:to-spaces` and `doc:to-tabs` convert existing leading indentation as one undoable change.

*Middle-click* the indentation status to restore automatic detection. *Alt-click* switches future indentation between spaces and tabs.

Indentation settings use `indent_type = "spaces"` or `indent_type = "tabs"`.

Automatic indentation samples across larger documents instead of letting an unrepresentative opening section decide the result.

See [Indentation](docs/indentation.md).

#### Licensing

*Lx* is distributed under the *Lx* Interim License. See `LICENSE` for the terms. License files for bundled libraries are included with the program.

#### LuaPad Context

LuaPad scripts can use `core`, `config`, `command`, and `common` directly. The view used before opening LuaPad is available as `previous_view`.

#### FPS Overlay

Use `config.fps_overlay` to control the FPS overlay.

#### Markdown Rendering

Box drawings in Markdown stay connected across monospace rows, including inside fenced and indented code blocks.

#### Markdown Outline

The Markdown outline can switch automatically when the window is maximized or fullscreen.

Set `config.plugins.mdpreview.auto_document_outline` to `true` to enable this behavior; it is disabled by default. When enabled, documents without an explicit outline setting show it only while maximized or fullscreen. `md-preview:toggle-outline` or *Ctrl+D* still changes it manually.

#### Other Fixes

- Markdown blockquotes leave clear space before the content that follows them.
- `doc:delete-lines` stops at an empty final row instead of continuing upward through the document.
- A format chosen with `doc:set-format` stays selected after saving, even when the filename suggests another format.

---

## Aug 18, 2026

#### Line Sampling

`lines:stride`, `lines:reduce`, and `lines:sample` keep repeating, evenly spaced, or random subsets of lines.

See [Keeping fewer lines](docs/text_tools.md#keep-fewer-lines).

#### File References

You can select recognized file references with `file:select-under-cursor`, `file:select-first-in-line`, `file:select-all-in-line`, and `file:select-all-visible`. The exact references available depend on the active format.

`file:open-under-cursor` opens a recognized reference or an existing plain path at the cursor. `file:open-first-in-line` opens the first recognized reference on the line. Both apply any included location without moving the cursor in the source document.

`navigate:back` and `navigate:forward` move between the source and destination, restoring selections, panes, and scroll positions. Hold *Ctrl* or *Cmd* to reveal recognized references as links without moving or selecting the source text.

Use `config.file_reference_links` to turn visible links off. Reference lookup uses `config.file_reference_search_paths` and can use one unambiguous exact match from the project index.

Recognized references cover CMake, C#, CSS, HTML, `.htaccess`, Java, JavaScript, Lua, GNU Make, Go, PHP, Pascal, Perl, Python, Rust, Sass, shell scripts, Visual Studio solutions and projects, and TypeScript. Each format follows its normal local-file syntax and ignores targets that are not local files.

Missing references flash their source line red without replacing the current status message. Built-in help now explains paths, exact locations, virtual paths, selection commands, and opening behavior in one place.

Format rules can use `caseless = true` for readable case-insensitive prefix and path matching.

JavaScript and TypeScript reference rules load with the JavaScript format instead of appearing as a separate format. Missing slash-rooted paths are retried without the leading slash, and PHP recognizes quoted path pieces inside concatenated include expressions.

See [File references](docs/file_references.md).

#### Developer Details

`config.dev.show_details` and `dev:toggle-details` show startup and document-opening reports, including stage timings and every folder checked while resolving file references.

#### Line Commands

`lines:*` commands use every selected line block. When nothing is selected, they use the whole document.

#### Lua Module Names

Developer, file, zoom, and quote helpers use the clearer `core.dev.*`, `core.file.*`, `core.ui.zoom`, and `core.text.quotes` module paths.

#### Highlighting

Syntax highlighting catches up immediately after jumping to a distant part of a long file.

`config.highlight_word_under_cursor` highlights matching copies of the word at the cursor, including numbers. Selection matching remains opt-in through `config.highlight_selection_matches`.

---

## Aug 16, 2026

#### Office Extraction

ODT, ODS, ODP, and ODG files can be extracted to text or Markdown. ODS spreadsheets can also be extracted to TSV.

DOCX extraction keeps list numbering and spacing, preserves aligned code, and places modern and older embedded images beside their text.

ODT extraction keeps list numbering and code indentation without excessive blank lines. Very large ODT paragraphs no longer freeze text or Markdown extraction.

#### Outline Search

Outline searches use exact text by default. Start the query with a space to use fuzzy matching.

*Ctrl+X*, *Ctrl+C*, and *Ctrl+V* cut, copy, or replace the complete outline search filter.

#### XML Formatting

Formatting and minimizing XML preserves declarations, comments, processing instructions, CDATA, namespaces, and mixed text.

#### XML Highlighting

Apostrophes in XML text no longer cause the following content to be highlighted as an attribute value.

---

## Aug 14, 2026

#### ICNS Preview

Apple ICNS files show every recognized image. You can open any decoded frame in Image Viewer.

#### Tabular Files

CSV, TSV, and PSV files open without word wrapping.

#### Windows Build Size

The Windows executable is smaller.

#### Inline Colors

Inline color previews run only in CSS, Sass, HTML, and SVG files, and unchanged previews are reused while you edit.

#### Assembly Highlighting

GNU ARM and AArch64 highlighting recognizes the complete instruction and built-in operand vocabularies from the pinned GNU Binutils revision.

Macro-generated labels and semicolon-separated opcodes use the correct roles. Labels, opcodes, registers, and numbers are visually distinct in the Liqube theme, and labels use their dedicated color.

Bare preprocessor directives no longer color the following line.

#### Markdown Files

Markdown recognizes `.mdown` files alongside `.md` and `.markdown`.

---

## Aug 10, 2026

#### Command-Line Opening

Command-line file arguments accept multiple text or byte locations, ranges, coordinate bases, and Unicode units. *Lx* creates session bookmarks at the starting lines.

`--file PATH` opens filenames that look like options or locations without interpreting them.

Line and range targets open wrapped files without leaving *Lx* hidden and using a CPU core. Locations opened during startup use the configured viewport position, and relative files forwarded to an existing window resolve from the launching terminal's folder.

`--wait` stays attached to documents already opened when a later target fails. Startup scaling accepts only `--scale=value`, so the following argument is left untouched.

#### Assembly Detection

Assembly files automatically choose NASM x86 or GNU x86, ARM, AArch64, RISC-V, or generic GNU highlighting without mixing incompatible syntax rules.

The selected assembly dialect stays stable after the file finishes opening.

#### AngelScript

AngelScript `.as` files use lightweight language-aware highlighting.

#### Property Lists

Property list files choose XML, binary, or OpenStep handling from their contents.

#### Wait for Documents

`--wait` keeps the launcher open until every document from its request closes, including documents reused by an existing *Lx* session.

#### Log View

The *F12* log wraps long entries, keeps error jumps aligned, and scrolls efficiently with a scrollbar.

#### System API Locations

The `system` API can parse complete virtual file references and standalone editor locations.

`system.parse_file_locations(value)` accepts comma-separated text positions, text ranges, byte offsets, and byte ranges. `system.parse_file_reference(value, parse_locations)` returns a filename, optional virtual path, and locations; the second argument explicitly chooses whether a location-looking suffix is parsed or kept as part of the filename.

#### Indentation Detection

Per-file indentation detection ignores isolated alignment and stays consistent between editing, rendering, and the status bar.

#### Other Fixes

- Line-number gutters reserve at least `config.line_number_min_digits` digits, with a default of three.
- Perl regular expressions and substitutions no longer cause later code to be highlighted as strings.
- Markdown links to local files open the requested line, column, range, or byte offset.
- DOCX Markdown keeps visible decimal, lettered, and Roman heading numbers.
- WAV waveform previews remain responsive for long recordings.

---

## Aug 9, 2026

#### Browser Refresh

Browser folders refresh with *F5*, after you reselect a root, and when you return through root history.

#### Tabular Alignment

CSV and TSV alignment uses displayed width, so wide and combining Unicode characters line up correctly.

#### Line Sorting

Caseless line sorting and duplicate removal use the same normalized Unicode matching as Find.

#### Spreadsheet Extraction

XLS and XLSX extraction shows common dates, times, percentages, and currencies without mistaking labels or style metadata for dates.

#### WAV Preview

WAV previews stop analysis that is no longer needed and reject recordings that are too large for an exact graph.

#### JSON Validation

Tidy JSON rejects broken Unicode text instead of silently changing it.

#### Background Work

Background processing and rendering release memory sooner and avoid work that is no longer needed.

#### Error Handling

Invalid commands, settings, Lua windows, keymaps, and file actions fail cleanly instead of destabilizing the session.

#### Save and Close

Save and Close offers Save As for untitled and generated documents.

#### Inline Colors

Hexadecimal and `rgba(...)` color previews keep their transparency.

#### Network Paths

Windows network paths stay complete in Reopen Last Document, file hooks, Find File, and startup checks.

#### Multiline Editing

Bookmarks, per-file indentation, multi-cursor indentation, and line commands stay correct across multiline selections. Formatting also leaves adjacent selections unchanged when expanded markers overlap.

#### Office and HTML Text

Office and HTML handling preserves literal formatting, table pipes, legacy text, and Unicode characters.

#### Other Fixes

- Paragraph cleanup keeps leading Unicode letters in place.
- Very large windows repaint beyond the normal dirty-tracking bounds.
- Switching between editing and preview follows format changes made through Save As.

---

## Aug 8, 2026

#### CSV Conversion

CSV-to-TSV conversion refuses cells that would create extra rows or columns in the result.

#### Document Tabs

Documents opened from full paths show only the filename in their tabs.

#### Large Files

Paragraph wrapping, project search, and CSV tools stay responsive with very large input. Previews and LuaPad keep memory and background work within safer limits for large or unusual files.

#### Background Work

Background jobs and secondary application launches remain responsive under heavy load.

Downloads, database work, and background jobs report failures without closing *Lx* or breaking later work.

#### Input Validation

Invalid plugin and file input is rejected before it can destabilize *Lx*.

#### Updates

Updates verify package files and block unsafe or conflicting paths.

#### Archives and Downloads

ZIP, download, and folder operations preserve existing files and remain recoverable after failure.

Failed or unsupported downloads leave an existing destination untouched. ZIP extraction defaults to limits of 65,536 entries, 32 MiB for one extracted entry, 128 MiB in total, and a 1000:1 expansion ratio. `max_entry_size`, `max_total_size`, and `max_ratio` can adjust the extraction limits.

#### Office Files

Damaged Office files report a clear error quickly instead of exhausting memory.

Office previews handle legacy text, spreadsheet formulas and errors, negative values, shared strings, and tracked deletions. Damaged spreadsheet extraction falls back to binary view instead of raising an internal error.

#### 2D Plots

2D plots skip unsafe values.

#### Network Images

Markdown previews leave images on network shares inactive instead of loading them automatically.

#### Document State

CRLF and CR files no longer appear modified immediately after opening, while real line-ending changes still count as unsaved. One close action shows at most one unsaved-change warning, and undo, replacement, and external-change warnings preserve the document's state.

#### Text and Selections

Arabic and other Unicode scripts keep correct caret and selection boundaries. Selection and whole-document commands handle final lines without adding or dropping text.

#### Forwarded Launches

Busy or incomplete forwarded launches no longer block later launches or lose close and input events.

#### Rendering

UI overlays stay visible over GPU images. Zoomed text remains usable when scaled-font caching is disabled or tightly limited, and windows and previews remain stable when drawing or cleanup fails.

#### Other Fixes

- Failed format-cache updates keep all currently loaded formats available.
- Message boxes keep generated text until they close.
- Dense 2D plots keep both upward and downward spikes.
- ANSI art previews preserve exact 80-column CRLF rows.
- Markdown math keeps unfinished text visible and ignores invalid table line ranges.
- Case-only renames on Windows keep the newly saved document.
- CSS `//` handling preserves base64 and protocol-relative URLs.

---

## Aug 6, 2026

#### Find and Replace

`config.find_escape_clears_text` controls whether *Esc* clears the Find and Replace query. `config.find_restore_position_on_exit` controls whether leaving Find and Replace restores the previous document position.

Both settings default to `false`, so *Esc* closes Find and Replace once and keeps the last match selected. When query clearing is enabled, the first *Esc* clears a non-empty query and the next closes the panel. Position restoration returns to the selection from before the panel opened.

Find and Replace handles UTF-8 text correctly.

See [Closing Find and Replace](docs/search_and_replace.md#closing-find-and-replace).

#### 2D Plots

2D plots draw antialiased curves.

#### WAV Preview

WAV previews preserve the minimum and maximum envelope across every channel and show a smoother FFT spectrum.

---

## Aug 5, 2026

#### Browser Root

The Browser keeps its root when you return from a file inside it.

#### Text Encoding

The status bar shows one text encoding for each document.

---

## Aug 3, 2026

#### Error Logs

Startup errors are written to `user/error.log`, and font-loading errors name the missing files.

#### 2D Plots

2D plots draw smoother curves and respect stretch-point settings.

#### Markdown Math

Markdown math has better spacing and script symbols.

Italic functions and integrands are spaced tightly without colliding, scripts stay clear of neighboring delimiters, and integral limits no longer leave stale extra width. `\mathcal{L}` uses the Unicode script L glyph.

Public packages include the font required for Markdown math.

#### Encoding Detection

Binary files with sections containing many zero bytes no longer open as UTF-16 text.

---

## Aug 2, 2026

#### Document Modes

*Alt+M* cycles read-only tabs through Preview, View, Bytes, and Hex while keeping the position in each mode.

*F9* or *Ctrl+Alt+E* switches between editable and read-only modes. `config.toggle_edit_source_position` controls how positions are matched when switching.

#### Module Reloading

`core:reload-module(name:"module")` reloads one Lua module. `core:reload-changed` reloads changed Lua source.

#### Markdown Math

Markdown math supports more TeX and KaTeX commands, symbols, fonts, fractions, relations, arrows, links, tables, diagrams, accents, roots, limits, rules, boxes, strikeout, and equation tags.

#### Markdown Preview

Large Markdown previews open, scroll, resize, reflow, and jump more quickly. Editing, previewing, reloading, and resizing keep the nearby source position.

Opening a linked Markdown document keeps it in preview mode.

#### Markdown Tables

Compact alignment markers such as `:-:` and `:--:` work in Markdown tables.

#### Wrapped Text

Wrapped text reflows after resizing or zooming and stays visible at the top edge while you scroll.

#### Minimap

The minimap stays in sync while editing, undoing, and redoing.

#### Startup Keyboard Input

*Backspace* and other command keys work when *Lx* starts while a keyboard shortcut is still held.

---

## Aug 1, 2026

#### Restart After Updating

`Restart to update` opens the changelog once after updating. `core:restart` performs a normal restart, while `core:force-restart` forces it.

#### WAV Preview

WAV preview shows file details, a waveform, a combined FFT view, and PCM or floating-point sample data.

This is a proof of concept, not a finished audio tool.

The optional pure-Lua preview supports little-endian RIFF WAVE files with 8-, 16-, 24-, or 32-bit PCM and 32- or 64-bit floating-point samples, including ordinary and extensible format tags. Compressed or unsupported codecs fall back to the normal read-only view.

#### Markdown Math

Markdown math supports macros, equation layouts, matrices, diagrams, boxes, colors, text styles, accents, cancellation, and automatically sized delimiters. Spacing and alignment are improved for roots, fractions, limits, scripts, brackets, tables, and mixed writing systems.

Incomplete math stays visible instead of stopping the preview.

#### Browser Sorting

The Browser sorts numbered names naturally and keeps double-click pinning on the selected row.

#### C++ Highlighting

C++ numbers using apostrophes as digit separators are highlighted correctly.

---

## Jul 31, 2026

#### Temporary Startup Files

A single file opened at startup stays temporary until you edit it or pin it with `--pin`.

#### Transparent Backgrounds

`config.transparent_background` controls checkerboard, theme, or solid-color backgrounds across *Lx*.

#### ICO and CUR Preview

ICO and CUR previews show file details, every embedded image, cursor hotspots, and clickable frames. You can drag to pan and press *L* to switch display modes.

#### Local Folder Links

Local folder links in Markdown previews open through the system.

#### Outline Navigation

*Ctrl+PageUp*, *Ctrl+PageDown*, *Alt+Up*, *Alt+Down*, and *Alt+Wheel* move between Markdown outline headings.

#### Error Logs

Runtime errors are written to `user/error.log`, while startup diagnostics stay in `user/boot.log`.

#### Markdown Outline

The Markdown outline follows headings more predictably.

#### Preview Zoom

*Ctrl+Wheel* zooms the preview under the pointer without moving focus away from the Browser or another pane.

#### Startup

More code loads only when needed, reducing startup work.

#### Restart After Updating

`Restart to update` can be clicked without losing unsaved work or the current open options.

---

## Jul 30, 2026

#### Updates

Automatic updates show progress, clean up after themselves, report failures, and roll back when needed. A clickable `Manual update needed` notice appears when automatic updating is unavailable.

Manual rollback backups cover both *Lx* and user files. Update commands and `config.update_check_delay` control automatic checks and related update actions.

See [Updating](docs/updating.md).

#### Windows Explorer Integration

Commands install or remove the Windows Explorer integration.

On Windows, use `windows-explorer:install` or `windows-explorer:uninstall`; Registry Editor asks for confirmation and no administrator rights are required. `windows-explorer:generate-reg-files` instead writes `lx-explorer-install.reg` and `lx-explorer-uninstall.reg` beside *Lx* without importing them.

See [Windows Explorer integration](docs/plugins.md#windows-explorer-integration).

#### Source Format

`--source-format NAME` and `-sf NAME` force the original file format used for extraction or unpacking. `--format NAME` applies separately to the generated result, as do explicit Edit, View, Preview, Hex, and Bytes requests.

See [Extracting and unpacking from the command line](docs/cli.md#extract-or-unpack-first).

#### Extracted Files

Extracted or unpacked content can open in Edit, View, Preview, Hex, or Bytes mode.

#### Markdown Outline

Markdown previews have a clickable heading outline. Press *Ctrl+D* to show or hide it.

See [Markdown document structure](docs/markdown_preview.md#document-structure-sidebar).

#### Viewer Navigation

*Space* and *Shift+Space* move forward and backward by a page in viewers and previews.

ANSI art is centered and can auto-scroll up or down with *Space*.

See [Viewer navigation](docs/navigation_and_zoom.md#move-through-read-only-text).

#### Help

Press *F1* for built-in help. Command-line help is available through `--help`, `-h`, `-?`, and `/?`.

Built-in help includes more guides.

See the [documentation index](docs/index.md).

#### File Handlers

`config.format_handlers` can select the bundled `markdown`, `ansiart`, `font`, `office`, `als`, `image`, `bytes`, and `hex` handlers for detected formats.

See [Per-format viewers](docs/opening_files.md#choose-a-viewer-for-one-format).

#### User Files

Temporary files and logs are stored in the user folder.

#### Viewer Reloading

Viewers can reload an unchanged file from disk without losing their position.

#### Markdown Rendering

Markdown lists have cleaner spacing, and command-line code blocks render more accurately.

#### Browser Navigation

Pressing *Left* in the Browser closes an open folder before moving to its parent.

---

## Jul 29, 2026

#### Open Modes

The open dialog offers clear choices for Edit, View, Preview, Bytes, Hex, Extract, and Unpack.

The matching short command-line options are `-e`, `-v`, `-p`, `-b`, `-x`, `-ha`, `-ac`, `-ex`, `-un`, and `-en`.

Use `config.default_modes`, `config.format_modes`, `config.format_handlers`, `config.extension_overrides`, and `config.filename_overrides` to control defaults and per-format behavior.

The default modes are Edit for ordinary and text files, and View for binary, image, and document files. Extension overrides omit the leading dot, filename overrides match the final name, and both are case-insensitive. An exact filename wins over an extension, while an explicit command-line mode wins over every default or override.

#### LuaPad

LuaPad provides scratch tabs, runs code with *Ctrl+Enter*, and shows results in a separate panel.

#### Large Text Operations

Editing, formatting, sorting, and cleanup stay faster on large text files.

#### Encoding Detection

Valid UTF-8 files are no longer mistaken for DOS text.

---

## Jul 28, 2026

#### Horizontal Scrolling

Text editors and viewers support horizontal scrolling.

#### Office Extraction

Office files can be extracted to Markdown, and spreadsheets can be extracted to TSV.

Excel extraction accounts for empty cells. Damaged or oversized spreadsheet content reports an error instead of producing a misleading result.

#### ALS Files

ALS files can open as editable XML without changing the original file.

See [Extracting and unpacking](docs/opening_files.md#extracting-and-unpacking).

#### Browser Previews

The Browser uses temporary preview tabs and clearly marks pinned tabs. Press *Enter* or double-click a preview to pin it. Double-click a document tab to close it.

#### ZIP Files

Files can open from deeply nested ZIP locations on Windows, and ZIP archives with many entries use less memory.

#### Large Files

Opening, drawing, scrolling, and navigation stay faster on large files.

#### Browser Navigation

The Browser returns to the active file's folder when you switch tabs or drives. Unreadable files open in a locked tab with a clear warning.

---

## Jul 27, 2026

#### Browser Preview

The Browser uses a reusable preview as the leftmost document tab.

A clean untitled tab is reused for the first file you open or drop instead of leaving an extra empty tab.

#### Network and WSL Paths

The Browser supports network paths and both common WSL path forms.

Text, binary, and Office files open directly from network and WSL folders.

#### ZIP Browsing

ZIP archives open read-only, including archives with very large file lists.

#### Reveal Active Document

`browser:reveal-active-document` shows the active file in the Browser even when it is outside the current folder.

#### Interface Controls

Popup menus, lists, trees, scrollbars, checkboxes, and radio controls are easier to read and use.

---

## Jul 26, 2026

#### Open Choices

Open behavior can be configured globally, for text or binary files, and per format.

`config.default_open_modes` defaults ordinary and text files to Edit and binary files to Bytes. `config.default_open_modes.kinds` and `config.default_open_modes.formats` override those choices by detected kind or format. `config.format_overrides.extensions` uses extensions without a leading dot, while `config.format_overrides.filenames` matches the final filename; both are case-insensitive and an exact filename wins.

Files without a preview fall back to read-only View mode. Markdown opens in Preview mode by default.

See [Default opening choices](docs/opening_files.md#default-choices).

#### Preview Panning

Mouse-drag panning is smoother in previews and image views.

#### Markdown Code

SQL highlighting works inside fenced Markdown code blocks.

#### Selection Rendering

Selections remain visible across empty lines.

---

## Jul 25, 2026

#### Command-Line Open Modes

Command-line options choose Edit, View, Preview, Bytes, Hex, or Extract mode.

See [Command-line opening modes](docs/cli.md#choose-how-a-file-opens).

#### Office Files

Supported Office files show an opening choice instead of forcing one mode.

The prompt applies to `.doc`, `.docx`, `.xls`, `.xlsx`, and `.xlsm` files opened from outside *Lx* or dropped without an explicit mode. It offers Extract text, Open as hex, or Cancel. An explicit mode bypasses the prompt, and failed extraction falls back to Hex mode.

---

## Jul 24, 2026

#### Math Font Scaling

Inline Markdown math and separately rendered math can use independent font scales.

Roots render correctly at any nesting depth and zoom level.

#### Shortcut Errors

Unknown shortcut commands appear in the status bar and log instead of failing silently.

#### YAML Highlighting

Unquoted YAML values stay neutral, keeping regex-heavy syntax definitions readable.

---

## Jul 23, 2026

#### Markdown Preview

Markdown previews render styled headings, lists, quotes, links, images, tables, code, and math. Local images update automatically, and fonts and spacing can be adjusted.

Previews are read-only. Web links, local file links, and document anchors can be opened safely; remote images remain placeholders and are not downloaded. Use *Backspace* for link history, the standard navigation keys to scroll, *+*, *-*, or *0* to zoom, *Ctrl+mouse wheel* to zoom at the pointer, and *Left-drag* to pan.

#### Font Weights

Optional font weights use light and heavy instead of thin and thick.

#### ANSI Navigation

Held arrow keys and page navigation move smoothly in ANSI previews.

#### Display Animation

Animation is smoother on high-refresh-rate displays.

#### Other Fixes

- Text boxes stay aligned and framed at fractional display scales.
- Rust highlighting continues correctly after escaped character literals.
- Wrapped rows stay aligned after minimizing long Unicode JSON.
- Valid UTF-8 files open with the correct encoding.

---

## Jul 22, 2026

#### Previewer Framework

*Lx* has a dedicated Preview mode alongside View and Edit.

See [Opening modes](docs/opening_files.md#opening-modes).

#### Font Preview

`.ttf` and `.otf` files show font details and size samples, with zooming, panning, and clear file errors.

See [Font previews](docs/special_viewers.md#fonts).

#### File Formats

PhotoLab `.dop` sidecar files are recognized when they begin with `Sidecar = {` and highlight fields, strings, numbers, booleans, dates, UUIDs, and punctuation.

#### Image Panning

Images can be panned with the left mouse button as well as the middle button.

#### Markdown Preview

Markdown previews render headings, preserve line breaks, wrap text, zoom, and pan. Fenced code blocks use row backgrounds.

See [Markdown Preview](docs/markdown_preview.md).

#### Extensibility

Syntax definitions are extensible format modules under `data/formats`. The built-in shortcut layer is named `core`, keeping built-in, plugin, and user bindings separate.

Plugins can register or extend formats with `format.register(...)` and `format.extend(...)`. The active format is available as `doc.format`, `doc:set-format` opens the format picker, and `--format NAME` chooses a format at startup.

See [Format modules](docs/formats.md).

#### Line Numbers

Line numbers are right-aligned in editor and viewer gutters.

#### Window State

A window keeps its maximized state when another process forwards files to it.

#### Browser Paths

Browser paths preserve the filesystem's letter case.

---

## Jul 21, 2026

#### Browser Sidebar

The Browser sidebar is available through `browser:*` commands and `config.browser_*` settings. Press *F4* to focus or toggle it, then *Esc* or *Enter* to return focus to the editor.

`config.browser_width` defaults to `200 * SCALE`, and `config.browser_startup_visible` defaults to `false`. Arrow keys navigate and expand folders, *Page Up*, *Page Down*, *Home*, and *End* move through the list, *Shift+Enter* uses the selected folder as the root, and *Backspace* returns to the previous root. `config.browser_reuse_single_tab` defaults to `true`, so opening another clean preview reuses its tab; edited previews remain open.

See [File Browser](docs/file_browser.md).

#### Settings Files

`core:edit-global-settings` opens settings used by everyone. `core:edit-computer-settings` opens settings shared on the current computer, and `core:edit-user-settings` opens settings used only by you on that computer.

Alpha defaults are separate from global, computer, and user settings. They are processed in that order, so later layers can override earlier ones.

Missing Alpha or global settings files no longer stop *Lx* from starting.

See [Settings files](docs/settings.md#settings-files).

#### Auto Surround

Auto Surround wraps selected Markdown text according to the active syntax rules. `format:surround` applies it directly, and repeating a matching wrapper removes it after the configured repeat limit.

Set `config.auto_surround` to `true` to enable automatic wrapping; it is disabled by default. Every selection must be non-empty and contained on one line, otherwise typing behaves normally. Markdown supports up to three `*` or `_` characters, exactly two `~` characters, and up to four backticks.

`config.auto_surround_behavior` defaults to `"unwrap"` and also accepts `"stop"` or `"cycle"`. `format:surround` remains available when automatic wrapping is disabled.

See [Auto Surround](docs/auto_surround.md).

#### Formatting Shortcuts

Markdown syntax rules can provide formatting shortcuts such as *Ctrl+B*, *Ctrl+I*, and *Ctrl+U*.

See [Formatting and surrounding text](docs/format_shortcuts.md).

#### Browser Previews

Edited Browser previews remain open as normal tabs and regain focus without creating duplicates.

See [Temporary Browser previews](docs/tabs_and_documents.md#temporary-browser-previews).

#### XML Highlighting

XML highlighting no longer raises an internal error.

---

## Jul 19, 2026

#### Key Bindings

Key bindings can replace, add, remove, disable, or swap shortcuts without repeating the same configuration. Shortcuts can also be moved or copied without naming their actions again.

Settings can use `keymap.bind`, `keymap.unbind`, `keymap.extend`, `keymap.unextend`, and `keymap.swap`; when the layer is omitted, they change the user layer. `keymap:generate-md` and `keymap:generate-txt` export an overview of the active shortcuts.

The default redo shortcut is *Ctrl+Shift+Z*.

User shortcuts take priority over plugin and built-in bindings.

See [Keyboard shortcuts](docs/keymap.md).

#### Emoji and International Text

Emoji and international text work more consistently throughout *Lx*. Emoji, symbols, kaomoji, and other composed text remain visible while you choose or compose them.

Fallback fonts are enabled by default through `config.use_fallback_fonts`. `config.enabled_fallback_font_tags` includes emoji, color emoji, symbols, music, CJK, Arabic, Thai, and Indic text by default. `config.allow_font_bitmap_glyphs` and `config.allow_font_svg_glyphs` also default to `true`. Windows builds can render OpenType SVG color glyphs; joined emoji and complex scripts still need all glyphs to come from one font.

Preparing color emoji in the background no longer crashes.

---

## Jul 18, 2026

#### Arithmetic

The arithmetic command calculates or transforms selected text with Lua expressions and shows a live preview before changing anything.

It handles multiple cursors and multiline selections one line at a time. Expressions can use `row`, `col`, and `total`, and quick commands can number lines from 1 or from a chosen starting number and step.

`arithmetic:apply` previews the first 10 results and defaults to `i+1` when several targets are selected. Expressions can also use zero-based `i`, one-based `n`, numeric selection `x`, string selection `s`, and the standard Lua libraries. `arithmetic:number`, `arithmetic:number(start: 10, step: 2)`, and `arithmetic:number-start-step` provide quick numbering; steps below 1 are treated as 1.

See [Number sequences and arithmetic](docs/text_tools.md#create-number-sequences).

#### Cursor Position Commands

New commands select text between saved positions or insert a cursor at a specific row and column.

`doc:selection-begin` saves an anchor and `doc:selection-end` selects from it, consuming the saved position. `doc:insert-cursor-at(row: N, col: N)` uses one-based coordinates; either omitted coordinate keeps the current row or column. It requires multi-cursor support to be enabled.

#### Multi-Cursor Toggle

Set `config.enable_multi_cursor` to turn all multi-cursor features on or off.

#### Display Synchronization

`config.vsync` controls display synchronization.

See [Display synchronization](docs/appearance.md#change-drawing-speed).

#### Edge Scrolling

`config.animate_vertical_edge_scroll` controls animation when jumping to the top or bottom of a document.

#### Image Viewer Settings

`config.image_viewer_*` controls image sizing, zoom focus, reload behavior, and background style.

`config.image_viewer_initial_zoom` accepts `"actual"`, `"fit"`, `"fit_width"`, or `"fit_height"` and defaults to `"fit"`. `config.image_viewer_fit_resize` accepts `"reduce"`, `"enlarge"`, or `"both"` and defaults to `"reduce"`; `config.image_viewer_fit_resize_vector` defaults vector images to `"both"`.

`config.image_viewer_zoom_anchor` defaults to `"mouse"` and also accepts `"center"`. `config.image_viewer_reset_zoom_on_reload` defaults to `false`, and `config.image_viewer_background` accepts `"checkerboard"`, `"theme"`, or a color table.

SVG images grow to fit the window, while raster images shrink but do not enlarge by default. Large images open faster when fitted to the window.

Dragging an image starts smoothly after a period of inactivity.

See [Image viewing](docs/special_viewers.md#images).

#### Editable Office Extraction

Extracted Office text can be edited and saved as a new file.

See [Office documents](docs/special_viewers.md#office-documents).

#### File Change Controls

`config.doc_monitor_notify_passive` can hide file-change notices from background tabs. Open binary and image files can be reloaded after they change on disk.

Changed files warn before unsaved edits are discarded.

*Delete* and *Backspace* at document edges no longer mark a file as modified. Documents remain marked as unsaved after you undo changes and then make a different edit.

File read errors no longer open an empty document, failed encoding reloads leave the current document untouched, and file monitoring notices repeated changes even when the timestamp stays the same.

See [External file changes](docs/external_changes.md).

#### Panning and Scrolling

`config.animate_page_scroll` now applies to text and binary viewers. Middle-drag pans text, binary, image, and ANSI documents consistently, and fast scrolling in the binary viewer remains faster than normal scrolling on shorter files.

Binary middle-drag follows the pointer smoothly without shifting the top byte when you release it.

*Home* and *End* work in text and binary viewers. *Ctrl+End* stops at the longest visible line, wrapped *Ctrl+End* agrees with *PageDown* at the end of the file, and changing word wrap keeps the current line in place.

Binary files keep a stable byte offset when you switch views or change the text or window size.

#### Large Files

*Left* and *Right* remain responsive on very long lines. Syntax coloring catches up faster after distant jumps, unwrapped text files remain responsive, outline navigation opens without long pauses, and Find File stays usable while scanning large folders.

#### Unicode Text

Find and Replace uses the complete Unicode word under the cursor. Uppercase, lowercase, title case, and related conversions work with international text.

#### Office File Validation

Damaged Office files report invalid character references, reject oversized or suspiciously compressed content, and detect damaged modern Office data before displaying it. Legacy Word and Excel files with looping allocation tables are rejected quickly.

#### Rename Errors

Rename errors identify the old file that could not be removed.

#### ANSI Safety

Damaged ANSI files cannot request unbounded screen operations.

#### Text Encoding

Classic Mac text files display with their original carriage-return line breaks. Codepage changes preserve unsaved edits, and legacy-encoding saves stop before unsupported characters are lost.

Overwrite mode replaces complete Unicode characters without deleting neighboring text.

#### Line and Table Commands

Tabularize keeps leading, repeated, and trailing empty columns. CSV conversion keeps apostrophes as ordinary text, and sorting, deduplicating, reversing, and shuffling lines preserve the final newline.

#### External Commands

Failed external commands no longer replace selected text with incomplete output.

#### Replace All

Large Replace All operations can be undone, and Replace All keeps redo history when nothing changes.

#### JSON and XML Formatting

JSON and basic XML formatting respects disabled indentation and layout settings. XML formatting also keeps meaningful spaces around text and nested elements.

#### Configuration Errors

Invalid `config.fps` values no longer stop *Lx* from running, broken outline rules no longer disable the outline, and invalid `config.indent_size` values no longer hide indent guides.

#### Plugins

Local plugins load in a stable order. Broken plugin suggestions and commands no longer interrupt the editor or empty the command palette, and a failed syntax-cache update keeps the working cache.

#### Autocomplete and Indentation

Autocomplete removes duplicate suggestions without mismatching their descriptions. Indentation detected for one document no longer leaks into another after a plugin error.

#### Other Fixes

- Carriage returns in ANSI art redraw from the start of the current row, and tabs use standard 8-column stops.
- Multiline syntax highlighting continues after very long lines.
- The window caption shows the correct build date.
- Repeated `--pane-left` and `--pane-up` arguments open files in the requested pane.
- Missing command-line option values no longer consume the following option.
- Pane grow and shrink commands stay unavailable until a resizable split exists.
- Sparse spreadsheets no longer expand into enormous empty text grids.
- Failed macro playback no longer leaves input or macro commands stuck.
- Binary file read errors remain visible instead of retrying indefinitely.
- File-tree previews open binary, image, and ANSI files in the correct view.
- In-place CSV and TSV alignment remains unavailable in read-only views.
- Bookmarks stay attached to their original text when a line is split.
- Find Previous handles an empty search history without an internal error.
- Files opened in binary mode remain editable and can still be saved.

---

## Jul 17, 2026

#### Multiple Selections

You can edit with multiple cursors and selections. *Alt+click* adds a cursor, clears any active selections before adding it, and removes the primary cursor when used on that cursor.

Keyboard movement, *Shift* selection, Copy, Cut, typing, pasting, *Enter*, *Tab*, and *Shift+Tab* apply to every cursor. Line duplication, movement, deletion, joining, insertion, case conversion, overwrite mode, and autocomplete work across all selections as well.

Commands can place cursors above, below, or at the end of selected lines; select the next matching word, skip a match, or select all matches; and create column selections with *Shift* plus the configured multi-cursor modifier. Multiple selections stay active when you run a command from the command palette.

Use `config.multi_cursor_modifier` to choose *Alt+click*, *Ctrl+click*, or *Command+click*. Secondary cursors can use `style.cursor2`, and *Modifier+middle-click* toggles whole-word selections.

The modifier defaults to *Alt*. *Ctrl+Alt+Up* and *Ctrl+Alt+Down* insert cursors on adjacent lines, *Shift+Alt+I* inserts cursors at selected line ends, and *Alt+D* selects the next occurrence. `doc:select-all-occurrences` and `doc:skip-occurrence` are available without default shortcuts. *Esc* removes secondary cursors before clearing the remaining selection.

See [Multiple cursors and selections](docs/editing_text.md#multiple-cursors-and-column-selection).

#### Mouse Shortcuts

Shortcuts can be assigned to all five standard mouse buttons.

See [Mouse shortcut names](docs/keymap.md#key-names).

#### Font Pack

Additional fonts for CJK and other writing systems are available in the separate `lx-fontpack` download.

#### JSON Lines

`.jsonl` and `.ndjson` files use JSON Lines highlighting and open without word wrapping. JSON and JSON Lines can be formatted automatically or explicitly, including variants that sort keys.

#### Saving

Saved files are more resistant to sudden power loss on Linux and macOS.

#### Paths

Paths on Linux and macOS no longer have a fixed length limit.

#### Background Work

Queued database work no longer blocks the editor.

#### Error Reporting

Invalid drawing and font values from plugins report an error instead of destabilizing *Lx*. Failed tool and process launches report the problem, oversized images show an error instead of closing the editor, and graphics startup failures report their actual cause.

#### File Forwarding

Linux and macOS reject file-forwarding requests from other users.

#### Find

*F3* moves to the next match while Find Text remains open. Search and command matching also handles trailing spaces.

#### Window and Display Stability

Closing *Lx*, resizing a live window, and drawing on Apple Silicon or other strict-alignment systems no longer trigger the related crashes. Displays also remain intact on systems using padded graphics surfaces.

Complex views no longer lose drawing when the render command buffer grows.

#### Image Rendering

New large images no longer show tiles left over from the previous image.

#### Font Rendering

Oversized glyphs and failed SVG color glyphs no longer corrupt memory or crash. Invalid fallback-font settings leave already loaded fonts working.

#### Path Cleanup

Path cleanup keeps roots such as `/`, `C:\`, and network shares intact.

#### Interface Scaling

Invalid `--scale` values no longer break interface sizing.

#### Other Fixes

- Large database IDs and whole numbers keep their full precision.
- Tabs keep the correct width when switching between documents with different indentation settings.

---

## Jul 16, 2026

#### Word Wrap

*Arrow keys*, *Home*, *End*, *PageUp*, *PageDown*, and *Shift* selection follow displayed rows when word wrap is on.

Indent guides, matching brackets and words, color previews, end-of-line markers, and outline dividers remain visible. The cursor stays visible at the right edge of wrapped lines beside the minimap.

#### Minimap

The minimap updates while you edit or change indentation.

#### Line Selection

*Triple-click* keeps the cursor at the end of the selected line.

---

## Jul 13, 2026

#### Save Errors

Saving a read-only file reports the problem more clearly.

On Windows, a file with the read-only attribute reports `file is read-only`. Permission failures on Windows, Linux, and macOS report `access denied while saving file`.

#### SQL Highlighting

Hexadecimal numbers are highlighted more accurately in SQL files.

MySQL, PostgreSQL, and SQLite recognize both `0x` and `0X` forms without treating a suffix inside an identifier, such as `value0x12`, as a number.

---

## Jul 11, 2026

#### Legacy Text Encoding

`config.fallback_codepage` chooses the fallback encoding used for legacy text files.

See [Text encodings and codepages](docs/encodings.md).

#### SQL Outline

SQL statements appear in the document outline.

#### Drag and Drop

Dragging files into *Lx* no longer crashes.

#### Save State

A save error no longer marks the document as successfully saved.

#### Other Fixes

- The binary viewer opens even when its row-width setting is invalid.
- Invalid plugin delay values no longer hang the editor.

---

## Jun 28, 2026

#### Initial Release

This is *Lx*'s first release after two years of side development.
