# Changelog for Lx

## Aug 27, 2026

### Improvements

- Better file location (the stuff after filenames) handling: quiet recovery, one warning per file (default), or strict rejection via setting

### Fixes

- Double-clicking punctuation selects that run separately from letters and digits
- Repeated fast clicks keep alternating between whole-word and whole-line selection instead of collapsing after triple-click
- Current editor line numbers are highlighted correctly
- Reloading changed user settings removes stale keyboard shortcuts
- `core:reload-changed` reports failure to chained commands when any module cannot reload
- Highlighting word under cursor no longer treats cursor position immediately after a word as part of that word

---

## Aug 25, 2026

### Features

- MaLxTeX is *Lx's* native KaTeX-compatible Markdown math renderer
- `md-preview:render-images` renders the complete document as numbered PNG pages beside its Markdown file; `config.plugins.mdpreview` controls output
- Document views show current or estimated content size beside line count
- Status bar shows `Spaces` or `Tabs`, marks automatic sizes with `*`, and cycles through `config.indent_size_cycle`
- `doc:detect-indent` rescans current document and restores automatic type and size
- `doc:use-spaces` and `doc:use-tabs` select future indentation
- `doc:to-spaces` and `doc:to-tabs` convert leading indentation across the document as one undoable edit
- Middle-clicking indentation status restores automatic detection; *Alt*-clicking toggles future indentation between spaces and tabs

### Improvements

- Lx is now distributed under the Lx Interim License. See LICENSE file for details.
- License files for libraries are now packaged with the program
- LuaPad scripts can directly use `core`, `config`, `command`, `common`, and the view used immediately before LuaPad as `previous_view`
- FPS overlay feature is now accessible via `config.fps_overlay`
- Indentation settings now use `indent_type = "spaces"` or `"tabs"`
- Markdown box drawings, including drawings inside fenced and indented code, use connected monospace rows enabled
- Markdown outline may be toggled automatically when maximized or fullscreen

### Fixes

- `\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 distinct Fraktur alphabet
- Fraction rules stay clear of visibly drawn limits inside `\smash`
- Markdown blockquotes leave clear space before following content
- `doc:delete-lines` stops on an empty final row instead of continuing upward through the remaining document
- Formats chosen with `doc:set-format` stay selected after saving, including when the filename suggests another format
- Automatic indentation samples throughout larger documents instead of letting an unrepresentative opening section decide the result

---

## Aug 18, 2026

### Features

- `lines:stride`, `lines:reduce`, and `lines:sample` keep repeating, evenly spaced, or random subsets of lines
- `file:select-under-cursor`, `file:select-first-in-line`, `file:select-all-in-line`, and `file:select-all-visible` toggle confirmed enclosed, prefixed, Markdown-link, or source-located references (depends on format module)
- `file:open-under-cursor` opens a confirmed reference or an existing naked path at cursor, and `file:open-first-in-line` opens the first confirmed reference on the current line; both apply locations without moving the source cursor
- `navigate:back` and `navigate:forward` move between file reference source and destination positions, including selections, panes, and scroll positions
- Holding *Ctrl* or *Cmd* gently reveals confirmed visible file references as clickable links without moving or accidentally selecting source text
- `config.file_reference_links` can turn file reference links off
- File references search `config.file_reference_search_paths` and can use one unambiguous exact match from the existing project index
- CMake file references recognize direct include, source directory, and configure input arguments; source directories open their `CMakeLists.txt`
- C# file references recognize local `#load`, `#r`, `#line`, and checksum directive targets
- CSS file references recognize local quoted or simple unquoted `url(...)` values and quoted `@import` targets while ignoring browser-only targets
- HTML file references recognize local targets in common quoted link, media, object, and form attributes while ignoring web URLs and page-only anchors
- `.htaccess` file references recognize literal local files in direct file-taking directives, including `HeaderName` and `ReadmeName`, without treating rewrite URLs as files
- Java file references recognize direct imports and static member imports as source filenames
- JavaScript file references recognize relative static, dynamic, exported, and CommonJS module targets, including extensionless file and `index` alternatives
- Lua file references recognize literal `require`, `dofile`, and `loadfile` targets; module names try both `.lua` files and matching `init.lua` files
- GNU Make file references recognize plain filenames in `include`, `-include`, and `sinclude` directives
- Go file references recognize literal `//go:embed` files and cgo include targets
- PHP file references recognize literal `include`, `include_once`, `require`, and `require_once` targets
- Pascal file references recognize `uses` units, explicit unit files, and compiler includes
- Perl file references recognize literal quoted files passed to standalone `require` and `do`
- Python file references recognize dotted modules in direct `import` and `from` statements, including package-relative module and `__init__.py` alternatives
- Rust file references recognize external `mod name;` declarations with module-file alternatives, literal include macros, and explicit `path` attribute targets
- Sass file references recognize local `@use`, `@forward`, and `@import` targets with partial and index alternatives
- Shell file references recognize literal `source` and `.` command targets at clear command positions
- Visual Studio solution file references recognize project entries and simple solution items
- Visual Studio project file references recognize direct local file attributes without selecting MSBuild expressions or globs
- TypeScript file references recognize relative module targets with TypeScript-first extensionless file and `index` alternatives
- `config.dev.show_details` and `dev:toggle-details` show headed reports with complete startup and document-opening facts, individual stage times, and every folder checked while opening file references

### Improvements

- `lines:*` commands consistently use every selected line block, or whole document when nothing selected
- Missing file references flash their source line red without replacing the current status message
- File reference help explains paths, exact file locations, virtual paths, selection actions, and opening behavior in one place
- Format file-reference rules can use `caseless = true` for readable case-insensitive prefix and path patterns
- Core developer, file, zoom, and quote helpers use the clearer `core.dev.*`, `core.file.*`, `core.ui.zoom`, and `core.text.quotes` module paths

### Fixes

- Syntax highlighting catches up immediately after jumping to a distant part of a long file
- JavaScript and TypeScript file-reference rules load from the JavaScript format module instead of being discovered as a separate format
- File references retry missing slash-rooted paths without the leading slash; PHP also recognizes quoted path pieces inside concatenated inclusion expressions
- `config.highlight_word_under_cursor` highlights matching copies of the word under the cursor, including numeric words; selection matching is opt-in through `config.highlight_selection_matches`

---

## Aug 16, 2026

### Features

- OpenOffice ODT, ODS, ODP, and ODG files extract to text or Markdown; ODS files also extract to TSV

### Improvements

- Outline searches use exact text by default and fuzzy matching when the query starts with a space
- *Ctrl+X*, *Ctrl+C*, and *Ctrl+V* cut, copy, or replace the complete outline search filter
- XML formatting and minimizing preserve declarations, comments, processing instructions, CDATA, namespaces, and mixed text

### Fixes

- DOCX extraction keeps list numbering and spacing, preserves aligned code, and fits modern and older embedded images beside their text
- Apostrophes in XML text no longer color following content as an attribute value
- OpenOffice ODT extraction keeps list numbering and code indentation without excessive blank lines
- Very large ODT paragraphs no longer freeze extracted text or Markdown previews

---

## Aug 14, 2026

### Features

- Apple ICNS files preview every recognized image and open individual decoded frames in Image Viewer

### Improvements

- CSV, TSV, and PSV files open without word wrapping
- Kept the Windows executable smaller by removing an oversized filesystem dependency
- Microsoft ICO/CUR, and Apple ICNS previews decode embedded images directly from memory instead of creating temporary files
- Inline color previews run only in CSS, Sass, HTML, and SVG files and reuse unchanged results while editing
- GNU ARM and AArch64 assembly highlighting recognizes the complete instruction and built-in operand vocabularies from a pinned GNU Binutils revision
- Markdown recognizes `.mdown` files alongside `.md` and `.markdown`

### Fixes

- Command palette discovery no longer logs workspace errors when no pane is active
- Macro-generated assembly labels and semicolon-separated opcodes use consistent roles
- Assembly labels, opcodes, registers, and numeric values are visually distinct in the Liqube theme
- Assembly labels use the dedicated label color
- Bare assembly preprocessor directives no longer color the following line

---

## Aug 10, 2026

### Features

- Command-line files accept multiple text or byte locations, ranges, coordinate bases and Unicode units, with session bookmarks at their starting lines
- Assembly files automatically select NASM x86 or GNU x86, ARM, AArch64, RISC-V, or GNU generic highlighting without mixing incompatible syntax rules
- AngelScript `.as` files use lightweight language-aware syntax highlighting
- Property list files choose XML, binary, or OpenStep handling from their contents

### Improvements

- `--file PATH` opens option-looking and location-looking filenames literally
- `--wait` keeps a launcher open until every document from its request closes, including documents reused by an existing Lx session
- The F12 log wraps long entries, keeps error jumps aligned, and scrolls efficiently with a scrollbar
- Parse complete virtual file references and standalone editor locations through `system` API

### Fixes

- Assembly dialect detection remains stable after a file finishes opening
- Per-file indentation detection ignores isolated alignment and keeps editing, rendering, and the status bar consistent
- Line-number gutters reserve at least `config.line_number_min_digits` digits, defaulting to three
- Perl regular expressions and substitutions no longer color later code as strings
- File locations opened during startup use configured line-jump viewport position
- Markdown local-file links open their line, column, range, and byte-offset locations in the target document
- Command-line line and range targets open wrapped files without leaving Lx hidden and consuming a CPU core
- `--wait` stays attached to documents opened before a later command-line target fails
- Relative command-line files sent to an existing window open from the launching terminal's folder
- DOCX Markdown keeps visible decimal, lettered, and Roman heading numbers
- Text and hex views avoid expensive general alpha blending on ordinary opaque backgrounds
- Startup scale accepts only `--scale=value`, keeping the following argument untouched
- WAV waveform previews remain responsive for long recordings

---

## Aug 9, 2026

### Improvements

- Browser folders refresh with *F5*, after reselecting a root, and when returning through root history
- CSV and TSV align wide and combining Unicode text by displayed width
- Caseless line sorting and duplicate removal use normalized Unicode folding matching Find
- XLS and XLSX extraction shows common dates, times, percentages, and currencies without mistaking labels or style metadata for dates
- WAV previews stop obsolete analysis and reject recordings too large for exact graphs
- Tidy JSON rejects broken Unicode text instead of silently changing it
- Background processing and rendering release memory promptly and avoid unnecessary work
- Commands, settings, Lua windows, keymaps, and file actions handle invalid input and failures
- Save and Close offers Save As for untitled and generated documents

### Fixes

- Inline colors preserve transparency in hexadecimal and `rgba(...)` values
- Windows network paths stay complete in Reopen Last Document, file hooks, Find File, and startup checks
- Bookmarks, per-file indentation, multi-cursor indentation, and line commands stay correct across multiline selections
- Office and HTML text handling preserves literal formatting, table pipes, legacy text, and Unicode characters
- Formatting leaves adjacent selections unchanged when their expanded markers overlap
- Paragraph cleanup keeps leading Unicode letters in place
- Very large windows repaint beyond dirty-tracking bounds
- Edit and preview toggling follows format changes after Save As

---

## Aug 8, 2026

### Improvements

- CSV-to-TSV conversion refuses cells that would become extra rows or columns
- Full-path files show only their filename in document tabs
- Paragraph wrapping, project search, and CSV tools stay responsive on very large input
- Large or unusual files keep memory and background work within safe limits across previews and LuaPad
- Background work and secondary app launches remain responsive under heavy load
- Invalid plugin and file input is rejected before it can destabilize Lx
- Updates verify package files and protect local files from unsafe or conflicting paths
- ZIP, download, and folder operations preserve files and remain recoverable after failures
- Damaged Office files report clear errors quickly instead of exhausting memory
- 2D plots skip unsafe values
- Markdown previews leave network-share images inert

### Fixes

- Office previews handle legacy text, spreadsheet formulas, errors, negative values, shared strings, and tracked deletions
- CRLF and CR files no longer look edited after opening, while line-ending changes count as unsaved
- One close click shows at most one unsaved-change warning
- UI overlays remain visible over GPU images
- Text in Arabic and other Unicode scripts keeps correct selection and caret boundaries
- Failed format cache updates keep every live plugin format available
- Message boxes keep generated text until they close
- Selections and whole-document commands handle final lines without adding or dropping text
- Undo, replacement, and external-change warnings keep document state
- Busy or incomplete forwarded launches no longer block later launches or lose close and input events
- Downloads, database work, and background jobs report failures without closing Lx or breaking later work
- Dense 2D plots keep both upward and downward spikes
- ANSi art previews keep exact 80-column CRLF rows next to each other
- Markdown math keeps unfinished text visible and ignores invalid table line ranges
- Damaged spreadsheet extraction returns to binary view instead of raising an internal error
- Zoomed text stays usable when scaled-font caching is disabled or tightly limited
- Windows and previews remain stable when drawing or cleanup fails
- Case-only Windows renames keep newly saved documents
- CSS `//` handling preserves base64 and protocol-relative URLs

---

## Aug 6, 2026

### Features

- `config.find_escape_clears_text` and `config.find_restore_position_on_exit` control Find and Replace exit behavior

### Improvements

- 2D plots draw antialiased curves
- WAV previews preserve min/max envelope across every channel
- WAV previews show a smoother FFT spectrum
- Find and Replace closes with *Esc* and keeps last match selected

### Fixes

- Find and Replace handles UTF-8

---

## Aug 5, 2026

### Improvements

- Browser keeps its root when returning from files inside it
- Status bar shows one text encoding for each document

---

## Aug 3, 2026

### Improvements

- Startup errors are saved in `user/error.log`
- Font loading errors name missing files
- 2D plots draw smoother curves and honor stretch-point settings
- Better Markdown math spacing and script symbols

### Fixes

- Public packages include Markdown math font
- Binary files with zero-heavy sections no longer open as UTF-16 text

---

## Aug 2, 2026

### Features

- *Alt+M* cycles read-only tabs through Preview, View, Bytes, and Hex while keeping each position
- *F9* or *Ctrl+Alt+E* switches between editable and read-only modes while `config.toggle_edit_source_position` controls position matching
- `core:reload-module(name:"module")` reloads one Lua module, while `core:reload-changed` reloads changed Lua source

### Improvements

- Markdown math with more TeX and KaTeX commands, symbols, fonts, fractions, relations, arrows, links, tables, and diagrams
- Markdown math spacing, accents, roots, limits, rules, boxes, strikeout, and equation tags
- Faster Markdown previews when opening, scrolling, resizing, reflowing, or jumping through large documents
- Markdown tables accept compact alignment markers such as `:-:` and `:--:`
- Markdown edit, preview, reload, and resize keep nearby source position
- Wrapped text reflows after resizing or zooming and remains visible at top edge while scrolling

### Fixes

- Markdown links keep linked documents in preview mode
- Minimap updates stay stable while editing, undoing, and redoing
- *Backspace* and other command keys work when *Lx* starts from a held keyboard shortcut

---

## Aug 1, 2026

### Features

- `Restart to update` opens changelog once, with separate `core:restart` and `core:force-restart` commands
- WAV preview shows file details, waveform, combined FFT, PCM, and float data. Proof of concept, not anything serious.

### Improvements

- Markdown math with macros, equation layouts, matrices, diagrams, boxes, colors, text styles, accents, cancellation, and automatically sized delimiters
- Markdown math spacing and alignment for roots, fractions, limits, scripts, brackets, tables, and mixed writing systems
- Browser sorts numbered names naturally and keeps double-click pinning on selected row

### Fixes

- Incomplete Markdown math remains visible instead of stopping preview
- C++ numbers with apostrophe digit separators highlight

---

## Jul 31, 2026

### Features

- Single startup files stay temporary until edited or pinned with `--pin`
- `config.transparent_background` controls checkerboard, theme, or solid-color backgrounds anywhere
- ICO and CUR preview with details, every image, cursor hotspots, clickable frames, drag panning, and *L* for display modes
- Open local folder links from Markdown previews via system
- *Ctrl+PageUp*, *Ctrl+PageDown*, *Alt+Up*, *Alt+Down*, and *Alt+Wheel* move between Markdown outline headings

### Improvements

- Runtime errors write to `user/error.log` while startup diagnostics stay in `user/boot.log`
- Markdown outline follows headings predictably
- *Ctrl+Wheel* zooms preview under pointer without moving focus from Browser or another pane
- Slightly faster startup by loading code when needed
- `Restart to update` clickable without losing unsaved work or open options

---

## Jul 30, 2026

### Features

- Automatic updates with progress, rollback, cleanup, failure messages
- Clickable `Manual update needed` notice when automatic updating is unavailable
- Manual rollback backups for *Lx* and user files
- Update commands and `config.update_check_delay` for controlling automatic checks
- Windows Explorer install and uninstall commands
- `--source-format`/`-sf`, with format choices kept after extraction or unpacking
- Clickable heading outline in Markdown previews, toggled with *Ctrl+D*
- *Space* and *Shift+Space* page movement in viewers and previews
- Centered ANSI art with up-and-down auto scrolling on *Space*
- Built-in help on *F1*, command-line help via `--help`, `-h`, `-?`, `/?`
- Extracted or unpacked results can open in edit, view, preview, hex, or bytes mode
- Configurable handlers for Markdown, ANSI art, fonts, and Office files

### Improvements

- Temporary files and logs write to user folder
- More guides in help
- Viewers reload unchanged disk files without losing position
- Better Markdown list spacing and command-line code blocks
- *Left* in Browser closes a folder before moving to its parent

---

## Jul 29, 2026

### Features

- Clear edit, view, preview, bytes, hex, extract, and unpack choices when opening files
- Short open options: `-e`, `-v`, `-p`, `-b`, `-x`, `-ha`, `-ac`, `-ex`, `-un`, `-en`
- `config.default_modes`, `config.format_modes`, `config.format_handlers`, `config.extension_overrides`, and `config.filename_overrides`
- LuaPad scratch tabs with *Ctrl+Enter* execution and a results panel

### Improvements

- Faster large text edits, formatting, sorting, and cleanup

### Fixes

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

---

## Jul 28, 2026

### Features

- Horizontal scrolling built into text editors and viewers
- Markdown extraction for Office files and TSV extraction for spreadsheets
- Open ALS files as editable XML without changing original files
- Temporary Browser previews and visibly pinned tabs; *Enter* or double-click pins, and double-clicking a tab closes it

### Improvements

- Open files from deeply nested ZIP locations on Windows
- Faster opening, drawing, scrolling, navigating large files
- Reduced memory use for ZIP files with many entries
- Take into account empty Excel cells during extraction
- Browser returns to active file's folder when switching tabs or drives
- Damaged or oversized Excel content reports errors
- Unreadable Browser files open in a locked tab with a clear warning

---

## Jul 27, 2026

### Features

- Reusable Browser preview as leftmost document tab
- Browser support for network paths and both common WSL path forms
- Read-only ZIP access, including archives with very large file lists
- `browser:reveal-active-document` for files outside current Browser folder

### Improvements

- Opened text, binary, and Office files from network and WSL folders
- Clean untitled tabs are reused for first opened or dropped files
- Clearer popup menus, lists, trees, scrollbars, checkboxes, and radio controls

---

## Jul 26, 2026

### Features

- Global, text, binary, and per-format open choices

### Improvements

- Files without previews fall back to read-only view
- Markdown opens in preview mode by default
- Smoother mouse-drag panning in previews and image views

### Fixes

- SQL highlighting works in fenced Markdown code
- Selections across empty lines are visible

---

## Jul 25, 2026

### Features

- Command-line choices for editing, viewing, previewing, bytes, hex, and extraction
- Opening choice for supported Office files

---

## Jul 24, 2026

### Features

- Independent font scales for inline and separately rendered Markdown math

### Improvements

- Unknown shortcut commands appear in status bar and log
- Keep unquoted YAML values neutral so regex-heavy syntax definitions remain readable

### Fixes

- Markdown math roots render at any nesting and zoom level

---

## Jul 23, 2026

### Features

- Markdown previews with styled headings, lists, quotes, links, images, tables, code, math, automatic local image updates, and adjustable fonts and spacing

### Improvements

- Optional font weights use light and heavy instead of thin and thick
- Smooth held-arrow movement and page navigation in ANSI previews
- Smoother animation on high-refresh-rate displays

### Fixes

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

---

## Jul 22, 2026

### Features

- Previewer framework (in addition to viewer + editor)
- Previewer for `.ttf` and `.otf` fonts with font details, size samples, zoom, pan, and errors for files
- Several new format modules

### Improvements

- Left-mouse image panning alongside middle-mouse panning
- Row backgrounds for Markdown fenced code blocks
- ANSI art viewer runs as `ansipreview` plugin instead of core code
- Built-in shortcut layer is `core`, separating Lx, plugin, and user bindings
- Syntax modules are extensible format modules under `data/formats`
- Each format calls its highlighting rules Syntax
- Markdown preview renders headings, preserves line feeds, wraps visually, zooms, and pans
- Right-aligned line numbers in editor and viewer gutters

### Fixes

- Window keeps maximized state when another process forwards files
- Browser paths preserve filesystem letter case

---

## Jul 21, 2026

### Features

- Browser sidebar, `browser:*` and `config.browser_*`
- Press *F4* to focus/toggle Browser, *Esc* or *Enter* to focus back to editor
- `core:edit-global-settings` opens settings that apply to everyone
- `core:edit-computer-settings` opens settings shared by everyone on this computer
- `core:edit-user-settings` opens settings used only for you on this computer
- Auto Surround feature controlled via syntax (Markdown) + separate `format:surround` command
- Auto Surround removes matching wrappers after their repeat limit by default
- Format shortcuts feature controlled via syntax (Markdown): *Ctrl+B*, *Ctrl+I*, *Ctrl+U*

### Improvements

- Alpha defaults are separate from global, computer, and user settings, processed in this order
- Edited Browser previews stay as tabs and refocus without duplicates

### Fixes

- XML highlighting no longer raises errors
- Allowed missing Alpha or global settings files without stopping Lx

---

## Jul 19, 2026

### Features

- Simpler and more flexible key bindings: replace, add, remove, disable, or swap shortcuts with less repetition
- Shortcuts can be moved or copied without action names

### Improvements

- Default redo shortcut *Ctrl+Shift+Z*
- User shortcuts take priority over plugin and built-in choices
- Better emoji and international text support throughout Lx
- Displayed emoji, symbols, kaomoji, and other text while choosing or composing it

### Fixes

- Color emoji preparation no longer crashes in background

---

## Jul 18, 2026

### Features

- Arithmetic command with live preview that calculates or transforms selected text with Lua expressions
- Arithmetic processes multiple cursors and multiline selections one line at a time
- Quick arithmetic commands for numbering from 1 or chosen starting number and step
- `row`, `col`, and `total` variables in arithmetic expressions
- Commands for selecting between saved positions and inserting a cursor at a given row and column
- `config.enable_multi_cursor` for turning off all multi-cursor features
- Display synchronization through `config.vsync`
- `config.animate_vertical_edge_scroll` for optional animation when jumping to top or bottom
- `config.image_viewer_*` for image sizing, zoom focus, reload behavior, and background style
- Extracted Office text can be edited and saved to a new file
- `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

### Improvements

- Extended `config.animate_page_scroll` to text viewers and binary viewers
- Middle-drag pans text, binary, image, and ANSI documents consistently
- Fast scrolling works in binary viewer and stays faster than normal scrolling on shorter documents
- SVG images enlarge to fit window, while raster images only shrink by default
- Large images open faster when fitted to window
- Binary middle-drag follows pointer smoothly without moving top byte on release
- *Left*/*Right* remain responsive on very long lines
- Syntax colors appear faster after jumping through large files
- Large files remain responsive when opened in unwrapped text viewer
- Outline navigation and outline list open without pausing on large files
- Rename errors identify old file when it could not be removed
- Find File remains responsive while scanning large folders
- Find and Replace uses full Unicode word under cursor
- Uppercase, lowercase, title case, and related conversions work with international text
- Damaged Office files report invalid character references
- Oversized or suspiciously compressed Office files are rejected
- Damaged content inside modern Office files is detected before it is displayed
- Damaged legacy Word and Excel files with looping allocation tables are rejected quickly
- Changed files warn before discarding unsaved edits
- Damaged ANSI files can no longer request unbounded screen operations

### Fixes

- Image dragging starts smoothly after inactivity
- *Home* and *End* navigate text and binary viewers
- *Ctrl+End* in text viewer stops at longest visible line
- Word wrap changes keep current text viewer line in place
- Binary files stay at stable byte offset when switching views or changing text or window size
- Aligned wrapped *Ctrl+End* with *PageDown* at file end
- Classic Mac text files display with their original line breaks (carriage returns)
- Carriage-return ANSI art redraws from beginning of its current row
- Tabs in ANSI files align to standard 8-column stops
- Multiline syntax colors continue after very long lines
- Invalid `config.fps` values no longer prevent Lx from running
- Broken outline rules no longer disable document outline
- Codepage changes preserve unsaved edits without false errors
- Legacy encoding saves stop before losing unsupported characters
- *Delete*/*Backspace* at document edges no longer mark files as modified
- Window caption shows correct build date
- Repeated `--pane-left` and `--pane-up` files open in requested pane
- Missing command-line option values no longer hide next option
- Local plugins load in same order at every start
- Pane grow/shrink stay unavailable until a resizable split exists
- Broken plugin suggestions no longer interrupt editor
- A broken plugin command no longer empties command palette
- Modified documents remain marked as unsaved after undoing and making a different edit
- File read errors no longer open an empty document
- Sparse spreadsheets no longer expand into huge empty text grids
- Failed macro playback no longer leaves input or macro commands stuck
- Tabularize keeps leading, repeated, and trailing empty columns
- Failed external commands no longer replace selected text with incomplete output
- CSV conversion keeps apostrophes as ordinary text
- JSON and basic XML formatting respects disabled indentation and layout options
- Basic XML formatting keeps meaningful spaces around text and nested elements
- Binary file read errors stay visible instead of repeatedly retrying
- File tree previews open binary, image, and ANSI files in correct view
- In-place CSV and TSV alignment stays unavailable in read-only views
- Bookmarks stay with their original text when splitting a line
- Sorting, deduplicating, reversing, and shuffling lines keeps final newline at end
- Find Previous handles an empty search history without an internal error
- Indent guides stay visible when configured indent size is invalid (`config.indent_size`)
- Autocomplete shows duplicate suggestions only once and keeps their descriptions matched
- Overwrite mode replaces complete Unicode characters without deleting extra text
- Detected indentation no longer affects other documents after a plugin error
- Failed syntax-cache updates no longer discard working cache
- Replace All keeps redo history when no text changes
- Large Replace All operations can be undone
- Edited files opened in binary mode remain editable and savable
- Failed encoding reloads no longer change current document
- File monitoring detects repeated changes even when timestamp stays same

---

## Jul 17, 2026

### Features

- Support for multiple selections (multi-cursor)
- *Alt+click* adds extra cursors for typing, pasting, *Enter*, *Backspace*, and *Delete* in several places at once
- *Alt+click* clears any active selections before adding another cursor
- Keyboard movement, *Shift* selection, Copy, and Cut work with all extra cursors
- Typing and pasting replace every selection when using extra cursors
- *Enter*, *Tab*, and *Shift+Tab* work with all extra cursors and selections
- Using *Alt+click* on primary cursor removes it and activates next cursor
- Secondary cursors can use a separate theme color (`style.cursor2`)
- `config.multi_cursor_modifier` to choose *Alt+click*, *Ctrl+click*, or *Command+click* for adding cursors
- Customizable shortcuts for all five standard mouse buttons
- Keyboard shortcuts for placing cursors above, below, or at end of every selected line
- Column selection by dragging with *Shift* and configured multi-cursor modifier
- Commands for selecting next matching word, all matches, or skipping one
- *Modifier+middle-click* for toggling complete-word selections
- Multiple selections remain active when running commands from command palette
- Line duplication, movement, deletion, joining, and new lines above or below work with all cursors
- Case conversion and overwrite mode work with all cursors
- Autocomplete completes same partial word at every cursor
- Additional fonts (CJK, etc.) ship as a separate download (`lx-fontpack`)
- JSON Lines highlighting for `.jsonl` and `.ndjson` files
- JSON Lines files initially open without word wrap
- Automatic or explicit JSON and JSON Lines formatting, including sorted-key variants

### Improvements

- Saved files are more resilient to sudden power loss on Linux and macOS
- Linux and macOS paths have no fixed length limit
- Background database work no longer blocks editor when more work is queued
- Invalid drawing and font values from plugins report an error instead of destabilizing Lx
- Failed tool and process launches report an error instead of failing silently
- Oversized images report an error instead of closing editor
- Startup reports actual error when graphics initialization fails
- Linux and macOS file forwarding rejects other users

### Fixes

- *F3* advances through matches while "Find Text" remains open
- Closing Lx no longer crashes
- Displays no longer crash on Apple Silicon or other strict-alignment systems
- Displays stay intact on systems using padded graphics surfaces
- Live window resizing no longer risks intermittent crashes
- Search and command matching handles trailing spaces
- Path cleanup keeps root paths such as `/`, `C:\\`, and network shares intact
- New large images no longer show tiles from previous images
- Complex views no longer lose drawing when render command buffer grows
- Oversized font glyphs no longer corrupt memory or crash editor
- Failed SVG color glyphs no longer crash editor
- Invalid fallback font settings no longer break already loaded fonts
- Invalid `--scale` values no longer break interface sizing
- Large database IDs and whole numbers no longer lose precision
- Tabs keep correct width when switching between documents with different indentation settings

---

## Jul 16, 2026

### Improvements

- Navigation behaves more consistently when word wrap is on
- *Arrow keys*, *Home*, *End*, *PageUp*, *PageDown*, and *Shift* selection follow displayed rows with word wrap
- Indent guides, matching brackets/words, color previews, end-of-line markers, and outline dividers remain visible with word wrap
- Cursor stays visible at right edge of wrapped lines beside minimap
- Minimap updates when editing or indenting text
- *Triple-click* line selection keeps cursor at end of selected line

---

## Jul 13, 2026

### Improvements

- Better save errors for read-only files
- Better hexadecimal number highlighting in SQL files

---

## Jul 11, 2026

### Features

- Fallback encoding for legacy text files (`config.fallback_codepage`)
- SQL statements to document outline

### Fixes

- Dragging files into Lx no longer crashes
- Save errors no longer mark documents as saved
- Binary viewer opens despite invalid row-width settings
- Invalid plugin delays no longer hang editor

---

## Jun 28, 2026

### Features

- First release; a couple of years into side development
