[0.20.0] - 2026-10-08
Added
- PDF orientation, margins and code font size (Settings → Editor → Export & Print): Portrait or Landscape; Normal, Narrow (0.5 in) or Wide (1 in) margins; 7–12 pt for source code. Orientation and margins apply to source-text, selection, Markdown and CSV PDFs, the font size to source text only. Image, tree, Project Map and tool-rendered PDFs and printing are not affected. Settings schema 117; existing installations keep the page they had.
- Page footer on printed pages and exported PDFs: the document name and “Page n of N”. On by
default; turn it off under Settings → Editor → Export & Print or with
View: Toggle Page Footer in Print and PDF. - Print Selection… and Export Selection to PDF… in the editor’s right-click menu and the palette: the selected lines, numbered as in the file. Print… and Export to PDF… are in that menu too.
- Image tabs can be printed and exported to PDF. The Project Map’s output is in the palette as
Project Map: Print…andProject Map: Export to PDF…. - Exported PDFs have clickable links (web, mail and
#heading), bookmarks from the headings, and a title, creator and date. Fenced code in a Markdown PDF is syntax-coloured. - Print Preview: zoom (Fit Page, Fit Width, 50–400%; Ctrl+wheel, Ctrl +/−/0) and a page number you can type. The window remembers its size and zoom for the session. Printed links show their address.
- With no printer installed, Print offers Export to PDF instead of only a status-bar message.
- PDF export shows page progress and says when a second export is queued. New commands
File: Open Last Exported FileandFile: Cancel PDF Export. - Project Map: a command
Project: Toggle Tree / Map View(no default key), a ”?” popover listing the mouse and keyboard controls, and an options (⋯) menu holding Keep current zoom, Focus new column, Hide all open Personal Notes, Print… and PDF…. Tree/Map and the two navigation options are remembered per workspace (workspace-state schema 13). - Settings sync (Beta). Keeps your snippets, abbreviations, templates and personal dictionary the
same on every computer, through a private Git repository you own (Settings → Sync). Paste the
repository URL, or use Create on GitHub… when
ghis signed in, and Connect: it first shows what the repository would bring. After that Editora syncs after startup, shortly after you change something, and every 15 minutes;Settings Sync: Sync Nowdoes it on demand. Changes merge entry by entry, so two computers that each added a snippet both keep both. If the same entry was changed on two computers, the one that syncs keeps its version and the other version stays in the repository history. Files a sync replaces are first copied to<configDir>/sync/backups/. Editora uses your own Git credentials and stores none; automatic syncs never prompt, and a failing sync shows as “Sync ⚠” in the status bar. Preferences (settings.json), keymaps, macros and themes are not synced. Off by default. New commandsSettings Sync: Set Up…,Settings Sync: Sync NowandSettings Sync: Toggle Sync Automatically. Settings schema 115. - GitHub tool window: a row under the toolbar shows the repository’s URL (click to open it on GitHub,
right-click to copy), the branch checked out, and the GitHub account
ghis signed in with. It replaces theowner/namelabel in the toolbar. The account needs gh 2.81 or newer. - Crash recovery. Unsaved edits, including untitled buffers, in every window, are kept in the config
folder while you work and offered back on the next launch if Editora did not close normally (crash,
kill, logout, power loss). Restoring opens the text as unsaved tabs and never writes your files; a file
that changed on disk in the meantime is flagged. Copies are removed when you save, revert or close.
Buffers over 16 million characters are not covered. New setting Keep a recovery copy of unsaved
edits (Settings → Workspace, on by default) and commands
File: Recover Unsaved Edits…andView: Toggle Crash Recovery. Settings schema 112. - If Editora is interrupted in the middle of a refactoring that moves or deletes files, the next time the project is opened it offers to put the files back.
- Project tree: Delete moves files to the trash on Linux and macOS (the dialog says which will happen; a permanent delete now defaults to Cancel), and a new “Undo Move” in the tree menu reverses the last drag-move. Windows still deletes permanently.
- Git: a merge, rebase, cherry-pick or revert in progress is shown in the status bar (
main · MERGING) and as a banner in the Commit window with Continue, Skip and Abort (Git: Continue Operation,Git: Skip Commit,Git: Abort Operation). Conflicted files have their own Conflicts group with Resolve (the three-way resolver), keep-one-side actions named for what they are in the current operation, and Mark Resolved. Finishing a resolution saves and stages the file. A merge commit is prefilled with Git’s prepared message. - Git: a “Pull mode” setting (fast-forward only, which stays the default; rebase; merge) and
Git: Pull (Rebase)/Git: Pull (Merge). A pull that cannot fast-forward because the branch diverged offers Rebase or Merge instead of an error. Rebase and merge pulls carry uncommitted changes across with--autostashand say what happened to them. - Git: branch management from the branch dropdown (a row’s
⋯, right-click or the Menu key) and the palette: new branch from any branch or tag, rename, merge into current, rebase onto, set or unset upstream, compare with current, check out a tag or revision by name, delete locally (unmerged commits are confirmed with their count) and delete on the remote. Remote branches are grouped by remote when there are several. - Git:
Force Push(always--force-with-lease, confirmed),Push to…another remote or branch name, andPush Tags. A push rejected as non-fast-forward offers Pull-then-Push, Force-with-Lease or Cancel. - Git:
Manage Remotes…(add, rename, set URL, fetch, prune, remove),Fetch Remote…, andManage Worktrees…(list, add, open in a new window, remove, prune). - Git Log: history loads a page at a time as you scroll instead of stopping at 200 commits; an
all-branches view and a commit graph; a details area with the full message, author, date, hash,
parents and refs; Enter in the filter box searches the whole history (message words,
author:,content:,since:/until:,path:); file history follows renames; Enter on a commit opens everything it changed as one review, and two selected commits can be compared. - Git: tags. New Tag…, Checkout, Push and Delete from a commit row and from the palette.
- Git: work on a file’s changes in the editor.
Git: Next Change/Previous Change; clicking a gutter change bar (orGit: Peek Change at Caret) opens a card with the old and new lines and Revert Hunk, Stage Hunk, Copy Old Text and Open Diff;Git: Revert Hunk at Caretis an undoable edit andGit: Stage Hunk at Caretstages only that change. Editor tabs are tinted by their file’s Git status and the minimap marks changed lines. - Git:
Git: Stashes…lists every stash with its files; Enter shows its changes, and each stash can be applied, popped, dropped, branched from or copied by name.Stash Changes…offers include untracked, staged only and keep index. - Git blame: ignore-whitespace and detect-moved-lines toggles, automatic use of
.git-blame-ignore-revs, andGit: Annotate Previous Revisionto walk a line back through history. - Git:
Apply Patch…(to the working tree or the index, checked first, with a 3-way offer when it does not fit) andCreate Patch…from staged changes, unstaged changes or a commit. - Commit window: Amend, Commit and Push, Sign off,
Git: Undo Last Commit…, a subject and body length guide, recent messages,commit.templatesupport,Unstage All,Discard All Changes…, Space to stage or unstage the selected rows, and per-file added/removed line counts. - Git: “Fetch automatically” (Settings → Git, off by default). The background fetch never prompts and runs only in a trusted folder or in a repository you fetched, pulled or pushed in during the session.
- Git: the clone form takes a branch, a shallow depth and a submodules option.
- Java refactorings that ask where to, or what. With the Java language server, the Code Actions menu
now carries out Move (a class to another package, a nested class to its own file or another class,
a static member to another class, an instance method onto one of its parameters or fields), Extract
Interface (choose the methods, name the interface, choose its package) and Change Signature. The
signature is edited as one line —
public String greet(Helper helper, int n)— where you can rename the method, change its visibility or return type, reorder, rename, retype or remove parameters, and add one astype name = value(the value is what existing callers pass). - Generate Getters and Setters and Generate Delegate Methods open the same checkbox list as the other Java generators, so you choose the fields, or the methods of a field, instead of getting all of them.
- Code lenses — the language server’s reference and implementation counts, drawn after a declaration
(
3 references). Click one to open the references or implementations. Off by default: Settings → Code Completion, orView: Toggle Code Lenses. - Tests in nested classes run from the gutter. A method inside a JUnit
@Nestedclass (or a static nested test class) gets its own ▶, as does the nested class; Run and Debug target it asOuter$Inner. A class whose tests are all in nested classes used to get no test markers at all. - Spell check per file type. Settings → Spell Check → File Types and
Spell Check: Toggle for This File Type. Data and configuration formats (JSON, YAML, TOML, XML, CSV, INI, properties and similar) are off by default; HTML and Typst documents have their text checked, not only comments. Settings schema 113. - Spell check commands: Next / Previous Misspelling, Correct Word at Caret, Add Word at Caret to
Dictionary, Ignore Word at Caret, Reload Personal Dictionary. Bound in the Emacs (
M-$), Sublime (F6,Ctrl+F6) and CUA (F7) keymaps. The status bar shows the dictionary in use; the language picker shows names, marks the current one and can return a file to the default. - Snippets: the fields of a running snippet are outlined, mirrors underlined and the final caret marked; the status bar shows “Snippet 2/3”.
- Snippets: new setting Expand snippets with Tab (Settings → Snippets, on by default) and
View: Toggle Snippet Expansion on Tab. Settings schema 114. - Snippets: bundled snippets for JavaScript, TypeScript (also used in JSX/TSX), PHP, Lua, TOML, Dockerfile
and Terraform. Added the variables
UUID,RANDOM,RANDOM_HEX,CURRENT_*,LINE_COMMENT,BLOCK_COMMENT_*,WORKSPACE_*,RELATIVE_FILEPATHandTM_CURRENT_WORD. Bundled snippets can be disabled; a snippet can have several triggers; the Settings list has a filter and a trigger column. - Macros can drive prompts: text and keys typed into the find bar, an overlay prompt or a picker are
recorded and replayed into that prompt (
C-s foo Enter Escreplays as a search). A command that opens a blocking dialog, and a mouse click, show a status hint while recording. - Macros: Esc (or
C-g) cancels a recording. New commandsMacro: Cancel RecordingandMacro: Start or Stop Recording, a Tools → Macros submenu, and default keys in the CUA (Ctrl+Shift+R, record) and Sublime (Ctrl+Shift+Q, replay) keymaps. Long replays run in slices with progress in the status bar and stop on Esc. - New Project From Template asks for a project name and a location, creates that folder, and opens it as a project on the template’s main file.
- Templates: the wizard asks for a template’s main name (package, file base name) with readable,
translated labels, and template JSON can supply its own
labels. “Edit User Templates” lets you pick a template to open, start a new one, or copy a bundled template (multi-file included) to customize. The picker shows where each template comes from, and plugin templates appear in Settings → Templates.
Changed
-
Project Map, changed behaviour: clicking an open folder selects it and brings its column into view (collapse with the row’s chevron or the column’s ×); Escape closes open cards, then clears the search, then returns to the editor (Ctrl/Cmd+0 and the Fit button still fit); the default flow is Left → Right for workspaces with no stored flow; columns follow the Project “show hidden files” setting and the per-column checkbox is now “Show hidden”; at most eight cards are open in total, previews and notes together.
-
CSV Print, Export to PDF, Excel and ODS output what the grid shows: its visible rows in displayed order, with its header setting. From source mode they output the whole file with row 1 as the header.
-
The page size setting is named PDF page size: printing uses the paper chosen in Page Setup. For a new installation it defaults to the region’s paper (Letter or A4); an existing choice is kept. It does not apply to Mermaid, Graphviz, PlantUML or Typst PDFs, which are sized by their tools. Settings schema 116.
-
Command titles: “View: Toggle Line Numbers in Print and PDF”, “View: Toggle Syntax Highlighting in Print and PDF”, “CSV: Print…”, “CSV: Export to PDF…”.
-
Print and Export to PDF are in the File menu. “Print…” and “Export to PDF…” for the current file are in the File menu (also in Simple UI mode) and on the tab right-click menu; before, they were reachable only from the palette. The commands for the rendered preview are renamed “File: Print Rendered Preview…” and “File: Export Rendered Preview to PDF…”. On a CSV file they print or export the table; they are disabled for
.httpfiles. -
Print Preview has a Page Setup… button, shows the printer, paper and orientation, draws the sheet at paper size with its margins, and turns pages from the keyboard (Page Up/Down, Left/Right, Home/End). Printing shows “Printing page n of N…” with a Cancel. The window is modal to its own window only, is centred on it and has a minimum size.
-
Export Save dialogs (PDF, HTML, Word, ODT, spreadsheet, CSV) open beside the document, or else in the last export folder; they add a missing extension and ask before replacing an existing file.
-
Run Configurations: the form only enables the fields the selected type uses. A Java main class has no Script / target; a Python, shell, Make or NPM configuration has no Main class, Module, VM arguments or JDK. A disabled field keeps its value, and the JDK field now follows the type as soon as it is changed.
-
GitHub: the tool window names the repository
ghresolved, filters pull requests and issues by state (open, closed, merged, all) and “Mine”, offers “load more” instead of stopping at 50 (30 for runs), and shows a spinner whileghis working. Row menus open with the Menu key, and the segment buttons can be reached with Tab. -
GitHub: the status-bar checks indicator appears on its own, names the pull request, updates while checks are pending, and opens a list of the checks with links and failure logs.
-
GitHub: Create Pull Request starts from the branch’s commits and the repository’s template, with a base-branch chooser, the head branch shown and a push offer when the branch is unpushed or ahead. It refuses the default branch and offers the pull request a branch already has. The Create and Submit Review forms stay open while
ghruns and keep what you typed if it fails. -
GitHub: new commands Show Pull Requests, Show Issues, Rerun Selected Workflow Run, Rerun Failed Jobs, Cancel Selected Workflow Run, Copy URL of Selected Row and Show Pull Request Checks, and a VCS ▸ GitHub submenu.
-
GitHub: with Git support off, GitHub commands say so and name the command that turns it on.
-
GitHub: the checks indicator requires
gh2.50 (Settings said 2.4). An olderghis detected, and Settings, Doctor and the checks command say which version is needed. -
Launching Editora again (no file,
--project,--dev) now goes to the running editor on the same config directory instead of starting a second process;--new-instancestarts a separate one. -
“Reset to Defaults” first saves the previous settings as
settings.json.before-reset-<date>.bakand names the file in the status bar; it no longer lowers Local History limits. -
Lowering a Local History limit (Settings or the
history.setMax*commands) asks first, stating how many revisions from how many files would be removed, instead of deleting them at once. -
The Rename preview lists files and folders a rename would delete and files it would replace; a code action or refactoring that deletes a folder or replaces an existing file asks first, naming the paths.
-
Git Log: Reset states how many commits leave the branch and how many are not on the upstream; Soft and Mixed ask before stranding commits; checking out a commit reports the detached HEAD. “Delete” on an untracked folder says it is a folder and how many files it removes.
-
MCP:
edit_bufferreplaces a whole buffer only withreplace_whole_buffer: true; unknown arguments and empty or relative paths are rejected for every tool;save_bufferreportssavedonly once the file is written. -
Typst: a one-page PNG/SVG export is written under the chosen name, and the export asks before replacing existing page files (
name-1.png, …). -
Dragging a folder or several items in the Project tree asks first; Settings → Templates → Remove asks for confirmation.
-
The VCS menu is grouped into submenus (Changes, Branches, Remotes & Worktrees, Tags, Stash, Patches, History & Blame, Compare) with the daily actions at the top level.
-
A Git command that stops on conflicts (pull, merge, rebase, revert, cherry-pick, stash pop, 3-way patch) opens the Commit window with its conflicts instead of an error dialog.
-
A successful local Git command no longer raises the Output console, so a Git Log row action keeps the log visible. Network commands and failures still raise it.
-
Deleted lines are marked in the gutter by a corner flag at the top of the following line instead of a full-height red bar, and change bars have a wider click target.
-
Log reads run on their own lane, so a slow history search no longer delays status and gutter updates, and a running search is cancelled when it is replaced or cleared.
-
The
samples/corpus for manual testing now covers more of the editor. Every syntax sample is a complete, commented program instead of a ten-line stub, and there are new fixtures for Astro, JSX and ignore files, sticky scroll and fold levels (one long file), related-file pairs, the HTML live preview, Markdown lint and extensions, every recognised log format, shell and shebang scripts, a script to debug, tests in the Maven, npm, Cargo and Go projects, more of the HTTP client format, diff3 conflicts, and JPEG/GIF/BMP images. A test now fails if a bundled grammar has no sample. -
After a pull, clicking a file’s change graph (
4 ++--) in the Git tab opens a diff of that file between the commit you were on and the one the pull brought. Clicking the file name still opens the file. -
Clone, fetch, pull and push now open the Output window’s Git tab as soon as they start and show the command running there: the
gitcommand line, then Git’s own progress (counting, receiving, resolving, writing) updating in place, then the exit line. Before, the tab only appeared once the command had finished. While one runs, the tab’s Stop button (or the newGit: Cancel Running Command) cancels it. -
The log viewer’s controls are now a bar above the log instead of a box floating over its first two lines. The bar shows how many lines a filter is showing (“65 of 185 lines”), the Follow button is labelled, the level list includes Fatal, and all three controls can be reached with Tab. A new
Log: Focus Filtercommand puts the keyboard in the filter field; Escape returns to the log. -
A log filter now keeps or hides whole records. A pattern that matches any line of a record shows all of it, so an exception appears with the line that says what failed, and a matched ERROR line keeps its stack trace. Filtered lines keep their real line numbers.
-
More files open as logs: rotated logs (
app.log.1,app.log.2026-10-06),access_log/error_log,syslog,catalina.out,nohup.out, and files such asserver.outor an extensionless file in/var/logwhose content looks like a log.Log: View as Logis now a toggle. -
More log formats get level colours: .NET (
info:,warn:,fail:), a lowercase level after a timestamp, syslogerror:prefixes, klog (Kubernetes), pino/bunyan numeric levels, and a JSON level key anywhere in the line.Log: Next Erroris renamedLog: Next Warning or Error, which is what it does. -
Following a log no longer drops the top of a large one: the 12 MB limit now applies to what the follow adds, not to what was already open.
-
Spell check: “Ignore” now holds in every open file for the session. The technical dictionary has 264 more terms.
-
Snippets and templates: your own entry overrides a plugin’s with the same name or id (the order is bundled, plugin, user). Editing a bundled snippet in Settings replaces it under all its triggers.
-
Snippets: Tab no longer expands inside comments or strings, or in CSV/TSV files, and the bundled
dateandtimesnippets are offered in the popup and picker only. Markdown’s one-letter triggers (b,i,l,u,n,t,w,c) are removed. An unknown$namein a snippet body stays in the text. -
Template bodies treat only
${variable},${variable:default}and${cursor}as special;$1,$HOME,${arr[0]}and backslashes are written as they are, and$${name}writes a literal${name}. A user template that relied on snippet-style$1tab stops now gets that text literally. A template file with nonameis skipped and reported. -
Multi-file templates always require a folder; a blank one is refused in the wizard. Before a template writes anything it lists the files that already exist and lets you create only the missing ones.
-
Macros:
macros.jsonis version 2 with stored ids, migrated automatically; existing key bindings are kept. Saved macros appear in the palette as “Macro: ‹name›”. One replay is one undo step, also with a count;C-u Non a replay is capped at 10,000.
Fixed
- Project Map review fixes (62 findings: keys, layout, loading, cards, Print/PDF).
- Print… and PDF… output the whole map. Previously only the part visible on screen was painted and the rest of the page was blank. Output uses a light palette whatever the theme, a landscape page when the map is wider than tall, and is split across pages when one page would make labels smaller than 7 pt; the status bar says when the map was scaled or split. The PDF is rendered only after a destination is chosen.
- Alt+Left / Alt+Right (history), Ctrl/Cmd+0 (Fit) and Ctrl-N / Ctrl-P (siblings) reach the map in every keymap instead of doing nothing, resetting text zoom, or opening New File / Print / Find File. Ctrl-N / Ctrl-P also work from the Project search field in the GUI keymaps.
- Large folders no longer truncate silently. Each column shows up to 300 rows with a “+N more…” row that loads the next chunk, headers read “shown/total”, the status bar says when the 1,200-item limit is reached, and empty or unreadable folders open a column that says so.
/works on keyboards where the slash is a shifted key and on the numpad, no longer types a ”/” into the column filter, and zooms in to reveal a filter hidden by low zoom. F2 renames and Delete deletes the selected entry as in the Project tree; the Menu key / Shift+F10 open the selected row’s menu at that row. Page Up / Page Down stop at the ends of a column; Enter in a column filter selects the first match, and a selection hidden by a filter is no longer opened.- The first view opens at 100% with the root and the start of the first column in view. Fit anchors on the selected path when it cannot show everything, the map never shrinks itself below 85%, opening a large folder shows its header, first rows and parent row, and columns at different depths can no longer overlap.
- The toolbar fits the tool window in every language: filters wrap, the zoom bar is icons with a fixed percentage, breadcrumbs collapse their middle, and the Tree/Map switch no longer truncates.
- Clearer rows: focus ring and on-accent icon on the selected row, a chevron on every folder, a Git letter versus an unsaved dot, a preview (eye) affordance with a tooltip, tooltips and accessible names on the controls, contrast fixes in both Editora themes, “No files match” and per-column “No matches” messages. Column headers collapse when their controls are hidden, and the zoom bar and overview no longer cover a keyboard-selected row.
- The map reloads when you switch to it and after in-app file changes during a search, and no longer loads for windows that never show it. Switching Map → Tree keeps the tree’s expansion and selection. Reveal, Back/Forward and breadcrumb jumps no longer collapse other open branches. A search always loads and selects its first match and reports “showing N of M matches”; closing a search-opened column works, and clearing the search restores exactly the folders you had open.
- Open / Modified / Bookmarks / Personal Notes chips highlight collapsed folders that contain matches; folder bookmarks and folder Personal Notes are shown; the Type filter classifies files through the editor’s language registry.
- Preview and note cards keep a usable size in a narrow panel and no longer pan the map when they open
or when a large file finishes loading. Previews decode files the way the editor does (
.editorconfigcharset, no replacement characters for Latin-1 files), highlight CRLF files, follow edits in an open tab and changes on disk, and say when the file no longer exists. Note cards no longer drop an edit that returns to the original text, follow notes changed elsewhere, and restore a blanked note. Escape closes a focused card; Tab leaves the preview text. Cards close when their folder is collapsed and stay open across a Tree/Map switch. - Header drags stop at the parent column and no longer activate the row under the release; middle-drag pans from anywhere; hover no longer goes stale; horizontal touchpad scrolling pans, scroll inertia no longer zooms, pinch zooms (untested on real devices). History is bounded and treats a run of arrow-key moves as one step.
- Project tree and Map: names that differ only by case sort deterministically.
- Print and Export to PDF, second round from the review:
- Printed Markdown fills each page: long lists, quotes, code blocks, tables and paragraphs continue from the current page, and a heading stays with what follows. Long inline code wraps instead of running off the page. A file ending in a newline no longer prints an empty numbered last line, and an empty document says “Nothing to print”.
- Tree, timeline and summary previews print and export at twice the resolution, with page breaks between rows. A wide image turns the PDF page to landscape and a very wide one is tiled across pages. A Mermaid diagram is no longer enlarged to fill the page; an SVG exports at four times the resolution.
- An OpenAPI file prints and exports its documentation view when that is what the preview shows.
- Exporting a large tree no longer freezes the window, and says when it stopped at 4,000 rows.
- Markdown PDF tables keep bold, code and links in cells and their column alignment, size columns to their content and repeat the header row on each page. Badges and other images in a line of text are embedded. Mermaid diagrams are no longer blown up to a page and formulas are sharp and sized to the text. The status bar says when a diagram could not be rendered.
- Code PDF and code print wrap long lines at a space where possible; the PDF marks wrapped lines with
↪. Line numbers and footers have readable contrast. - Print or Export to PDF on a PDF or hex viewer tab said “No file open”; the preview commands looked enabled on a preview showing a parse error.
- Closing a window during a PDF export no longer leaves an
.editora-export-*folder behind, and a failed DOT/PlantUML print no longer leaves a temporary file. An abandoned print job is cancelled. - A PDF open in a tab reloads when an export replaces its file.
- Printing, from a review of Print, Print Preview and Export to PDF:
- Printed Markdown and CSV pages are always light. With a dark theme they came out as a dark sheet, and Mermaid, DOT/PlantUML and math printed in the dark palette.
- A printed table taller than a page splits between rows and repeats its header; it used to break into one cell per row, which hit most CSV prints. A very wide table is condensed instead. Preparing a 5,000-row CSV takes about two seconds instead of minutes.
- Long code blocks in printed Markdown print every line, monospaced and syntax-coloured; a plain block used to stop at the end of the page with ”…”.
- Images and diagrams are measured at their final size, so content no longer runs off the page or paginates differently on paper than in the preview. An image that cannot be loaded prints its alt text.
- A page range chosen in the system print dialog is honoured.
- Changing paper or orientation in the system print dialog shows the new preview instead of printing pages you had not seen.
- Running Print twice no longer opens two previews, a failure while preparing or printing is reported instead of leaving “Preparing…” in the status bar, and a very large source file no longer builds every page up front.
- Export to PDF:
- A table row or CSV cell taller than a page continues on the next page; its text used to run off the bottom and be lost.
- Task lists show their checkboxes (searchable as
[x]/[ ]),~~strikethrough~~is struck, and numbered lists of ten or more items no longer overprint their text. - Text after a table, image, rule or formula no longer touches it; headings stay with their section and quote bars continue across pages.
- A Mermaid
.mmddiagram exports light regardless of the app theme. - “Export Rendered Preview to PDF…” no longer shows the Save dialog and then fails for a file whose preview cannot be exported; a JSON, YAML, TOML or XML file that does not parse says so.
- Failure dialogs for print, PDF and Word/ODT export no longer show “failed: ” with nothing after it, or “null”.
- Tabs restored from the last session no longer keep the muted italic read-only title for files that are editable. The title was drawn while the file was still loading and never redrawn afterwards.
- Abbreviations that contain punctuation now expand:
adl-fn,;sig,e.g. Only letters and digits were looked up, so such an entry could be saved in Settings and never expanded, with nothing saying why. The longest match wins (adl-fnover a separatefn), and a space typed around the abbreviation in Settings no longer stops it matching. - Settings: closing the window no longer drops what was typed last in a list-and-form page. An abbreviation’s expansion, a remote site’s host or an external tool’s command typed and followed straight by Close or Escape (no Enter, no Save, no click elsewhere) was not saved; an abbreviation left that way had an empty expansion and never expanded.
- In an
.http/.restfile, a# @name xcomment now names the request wherever it appears. After a###separator, with or without a title, it was ignored, so{{x.response.body.$.id}}in a later request resolved to nothing unless the named request was the first in the file. A request with a### Titleand no@namecan still be referred to by its title. - GitHub: being offline when Editora starts no longer disables the integration for the session as “not
authenticated”. A missing or signed-out
ghis checked again when a command needs it, and a rejected token is reported as such. - GitHub: a
ghpath containing spaces (for exampleC:\Program Files\GitHub CLI\gh.exe) works. - GitHub: a pull request too large for a single diff (over 300 files or 20,000 lines) opens for review from GitHub’s file list, and the review tab says so. A file diff shows each hunk at its real line numbers and marks a missing final newline. A one-file pull request opens the review tab, so its description, Open on GitHub, Submit Review and Refresh are reachable.
- GitHub: a failed CI log larger than 10 MB shows its end, where the failure is, instead of its
beginning. The log’s Stop button stops
gh, and lists, long checkouts and background checks no longer queue behind each other. - GitHub: the tool window recognises scp-style remotes without a user, GitHub remotes other than
origin, and Enterprise hostsghis signed in to. Saving unrelated settings no longer closes it. - GitHub: checking out a pull request from the tool window supersedes pending saves in that repository,
not the active tab’s. Open on GitHub works for files whose name starts with
-. A reviewer typed as@a, ais added once. Workflow run ids are no longer digit-grouped, and tooltips show relative and local times. - Data-loss review fixes. A review of every path that writes, deletes, replaces or discards user
data found 58 issues; this release fixes them, with the limits noted at the end of this entry.
- Unsaved edits. Deleting a file from the Project tree now asks every window that has unsaved edits to it, and a tab with unsaved text is never closed by a delete it was not asked about. Text typed while a file is being reloaded (after a Git operation, or after choosing Reload) is no longer replaced by the disk copy. In the “File Changed on Disk” prompt, Enter keeps your version when the buffer has unsaved edits. A file deleted outside Editora leaves its tab marked unsaved, and auto-save does not recreate it. Following a log no longer replaces text you typed into it when the log rotates.
- Saving. Saving a file with mixed line endings without editing it no longer rewrites it; an edited
save still normalises to the dominant ending but says so, keeps the original bytes in
<config>/line-ending-originals, and asks first when the file contains binary data. The status bar shows “Mixed (LF)” for such a file, and a non-UTF-8 mixed file is no longer told that “no bytes are lost”. The save status says when an.editorconfigrule changed a file’s encoding or byte-order mark. A document containing half of a split emoji is refused instead of being saved as?. Saving through a dangling symlink creates its target; pipes, devices and directories are not replaced. Saves keep extended attributes and setuid/setgid/sticky bits. An interrupted in-place save no longer leaves the file empty, and a backup left by a killed save is offered at the next launch. Save as Administrator backs the file up before overwriting it. - Editora’s own files. Two Editora processes on one config directory no longer revert each other’s
settings, sessions, projects, notes, bookmarks, breakpoints, macros, dictionary or Local History.
Two windows with the same file open no longer overwrite each other’s notes, bookmarks or
breakpoints. “Project: Delete” no longer deletes the project’s notes, bookmarks, breakpoints and
Local History. An unreadable
projects.jsonno longer deletes untitled windows’ sessions. Config writes are flushed to disk before being renamed into place and retried after a failure; an empty or damaged config file is preserved and reported instead of silently reset; config set aside by an older build is restored by the newer one;settings.tomlis kept assettings.toml.migrated. - Bulk edits. AI “Rewrite Selection” and “Generate Commit Message” apply a reply only when it is complete and refuse a selection too large to send whole. Large files and files with very long lines have no undo: bulk edits there (Replace in Files, line transforms, external tools, AI, agent, MCP, language-server edits, apply-from-diff) save the previous text to Local History first or are refused. CSV grid edits change the row shown, also when narrowed, and only the edited field. Line commands no longer split a line containing NUL characters. Narrowing says so when it clears the undo history. An external tool replaces the text that was selected when it started.
- Agents and language servers. An agent’s relative path is no longer written relative to the
editor’s working directory; an agent write keeps a Local History copy, the file’s encoding and line
endings, never touches
.git/, and cannot replace text typed since the agent’s last read. The permission dialog opens on the rejecting choice. A request that timed out is not applied afterwards. A language-server edit no longer deletes a file whose tab became unsaved while it was applied, is never half-applied, and copies what it deletes or replaces to Local History. - Files on disk. An HTTP
>>!redirect no longer writes an error response over an existing file and records the replaced file in Local History. Exports are written to a temporary file and renamed, so a failed export cannot truncate the file it was replacing. Updating a plugin keeps itsdata/folder; a plugin with an invalid id is not loaded and Remove can only delete the plugin’s own folder. - Git, merge and Local History. Local History keeps the text a file held before the first save of a session. Restoring a deleted file writes it back in its original encoding. Untracked files are copied to Local History before “Delete” removes them. The merge resolver writes an unresolved conflict back exactly as it was, a stray marker-looking line no longer swallows the rest of the file, and the file’s own conflict regions are used when the recomputed merge disagrees.
- Not fully fixed. Linux POSIX ACLs are still dropped on save. Switching branch from a detached HEAD with unreferenced commits does not warn. Tree delete has no trash on Windows. A config write that still fails at quit is not reported before the window closes.
- Git: a repository Git refuses to work in (for example “dubious ownership”) says why in the status bar and the Commit window instead of looking like no repository.
- Git: commands never start an external editor, so continuing a rebase no longer hangs waiting for one.
- Git: reverting a merge commit asks which parent is the mainline instead of failing.
- Git: a missing globally configured
blame.ignoreRevsFileno longer empties the blame column. - Git: the Commit window’s header no longer cuts the push indicator to ”↑…”.
- Java’s Change signature code action was listed and then failed with “Could not apply”.
- Git: a click on empty space or a section header in the branch dropdown no longer checks out the selected branch; only a click on a row activates it. Dropdown actions are refused if another repository became active while it was open.
- Git: unstaging a renamed file also unstages the deletion of its old path, instead of leaving a half-staged rename.
- Git: the first push of a branch goes to the configured push remote (
branch.<name>.pushRemote,remote.pushDefault) or the only remote, instead of alwaysorigin. - Git: blame, status, diffs and file lists larger than 10 MB are no longer shown or cached in part. Blame uses a compact format, so large files are annotated in full.
- Git: staging a new executable file or symlink from the diff viewer keeps its mode.
- Git: blame annotations and gutter change bars follow unsaved line insertions and deletions.
- Git: the
Git Log: …palette commands no longer act on a hidden log’s remembered selection; they open the log and ask for a commit. - Git: the Commit window keeps its selection, collapsed groups and scroll position across status updates. Ctrl/Cmd+Enter no longer commits with nothing staged or while a commit is running, and text typed during a commit is kept.
- Git: Clone accepts
~and relative destinations, creates missing parent folders and accepts an existing empty folder. - Git: a repository created inside an already-open one is noticed without a manual refresh, and Git is found again after being installed without restarting Editora.
- Git: blame works in SHA-256 repositories; file names with non-ASCII characters plus a tab, quote or
backslash parse correctly under
core.quotePath=false; an inheritedGIT_DIRorGIT_WORK_TREEno longer redirects every folder to one repository; the Git console no longer stalls on output lines with very long runs of whitespace. - Git: remaining English-only error headers are localized, and relative times read “1 day ago” instead of “1 days ago”.
- Following a log through a pattern filter no longer joins lines together (
ERROR bERROR c), and a line written in two parts is no longer missed by the filter. - Pausing and resuming Follow no longer skips the lines written in between, and turning Follow on no longer skips lines written since the file was opened.
- A log that is being followed no longer raises “File Changed on Disk” every time the window regains focus.
- Follow now survives log rotation. It waits while the file is missing and reads the new file from its start; before, it stopped with an error that showed only the file’s path.
- New lines in a followed log no longer move the caret, drop the selection, or pull the view to the end while you are reading further up.
- Applying or clearing a log filter keeps you on the line you were on instead of jumping to the end.
- Filtering a large log no longer freezes the window while the filter runs, and pressing Enter in the filter field no longer applies the filter twice.
- The log viewer now recognises all six levels of the .NET console logger.
dbug:andtrce:lines were treated as part of the record above them, so they took its colour, level filter and grouping. - A level or pattern set from the command palette now shows in the log’s controls, and is no longer dropped by the next change made there.
- In a filtered log, stack-trace lines are tinted with their own record’s level, not the level of whichever line the filter left above them.
- Undo no longer removes the newest lines of a followed log.
- Followed text is decoded with the file’s own encoding (it was always read as UTF-8), and Windows line
endings no longer stop
$from matching. - With word wrap on, the level tint covers every row of a wrapped line, not only the first. The tints are now derived from the editor theme, so they are visible on dark themes.
- A filter pattern that is not a valid regular expression is marked as being matched as plain text.
- Stack-trace lines such as
at com.example.ERROR_CODES.lookup(...)are no longer mistaken for ERROR records. - An exported patch now applies to a file with Windows (CRLF) line endings. The diff viewer compares text with plain line feeds, and the patch was written from that text, so Git rejected it for a CRLF file. Each side’s own line ending is put back, and a Latin-1 / Windows-1252 file’s patch is written in that encoding rather than UTF-8.
- Export Patch no longer freezes the window on a large rewritten file (a re-indented 40,000-line file took 27 seconds). The patch is computed in the background, and two texts too far apart to search are exported as one hunk.
- In a block of rewritten lines the diff viewer lists the removed lines first and their replacements after them. With smart alignment on, unrelated new lines were shown above the lines they replaced.
- A
.patch/.difffile opened as a diff shows the line numbers its hunk headers state, so a hunk at line 500 is no longer numbered from 1 and the jump between two hunks is visible. - The merge resolver treats changes on neighbouring lines as one conflict, as Git does. It used to merge them on its own, so a region Git had reported as a conflict could be resolved without ever being shown.
- The merge resolver no longer silently discards conflicts you already resolved by hand. When the file has moved on from Git’s merge of the three versions, it asks whether to start again from Git’s versions or to resolve the markers the file still has.
- Open diffs you cannot see — other tabs, the other files of a review — are no longer re-read on every window focus, file change and apply; each catches up when it is shown.
- Export Patch is disabled when a side is binary or too large to load, instead of exporting a patch of the placeholder text.
- In a diff, Save becomes available again after an Undo that follows a Save, and Undo no longer counts an undo when the file has nothing left to undo.
- “Ignore whitespace” and “Ignore case” now also apply to very large rewrites that use the simplified comparison.
- The unified view lists a change block’s removed lines before its added lines instead of alternating them.
- The floating controls at the top-right of the editor no longer overlap. In Expert mode the “E” exit button sat on top of an HTML file’s open-in-browser button, a Markdown file’s Editor/Split/Preview toggle or a log file’s controls; they now share one row. In Zen mode the “Z” also clears the HTML and log controls, not only the preview toggle.
- Spell check: typing in a very long line with no whitespace took about 0.7 s per key; scrolling a viewport full of squiggles is about ten times cheaper.
- Spell check: Add to Dictionary and Ignore did nothing for words with a typographic apostrophe;
possessives and plurals of dictionary words were flagged; the first word of a Spanish question or
exclamation,
_emphasis_/~~strike~~text and words after a comma with no space were never checked; non-Latin text was underlined wholesale andcafé-style loan words were flagged in English. - Spell check: a hand-edited
dictionary.txtwas not re-read until restart; prose autocomplete offered nothing with Spanish (Mexico) selected; an unknown spell language in settings.json silently disabled checking; suggestions stalled the right-click, included split-word junk and were enabled in read-only files; corrections were offered inside Markdown code fences. - Snippets: a session now ends when the caret leaves its fields, so Tab indents again after clicking elsewhere, switching tabs or moving to the other split view. Auto-pairs, Enter auto-indent and smart Backspace work inside a field; undoing a typo in a field keeps Tab going to the next stop.
- Snippets: changes reach every open window and a user snippet file reloads when saved. A broken file is
reported at once with its name, reason and line, and only the bad entry is skipped. Saving from Settings
keeps the comments in the file. Two-word triggers such as
else ifexpand, space-indented bodies follow the file’s indent style, blank body lines get no trailing whitespace, andscopeis honoured. - Macros: a replay chord ending in a printable key (
C-x e) typed that key when the macro contained Backspace or arrows. A macro that runs a saved macro skipped it on replay. Tab, Shift+Tab, Enter and Escape now replay through the same path as the key (snippet expansion, outdent, auto-indent); typing at several carets replays at every caret;C-u N x, Shift+Insert and input-method text are recorded. - Macros: an empty recording no longer discards the previous macro, and Replay Last works after a restart
and in a second window. Name and Save reports an empty name and asks before replacing; names in any
script and case variants get their own command id. Delete Saved confirms and removes the key binding.
Replay status reports skipped typing on a read-only buffer and missing commands. A hand-edited
macros.jsonwith a null list no longer stops a window from opening. - Settings → Macros: steps are shown and edited by kind (command picker, multi-line text, key capture), edits are not dropped on selection change, buttons are not truncated, and the note shows the active keymap’s chords instead of F3/F4.
- Templates: new files open with the caret at
${cursor}, in the file that marks it. The Java Class template writes thepackageline of its folder, and a template’slanguagesets the created file’s grammar. Java package inference stops at the project root and no longer treatssrc/main/resourcesor an ancestor folder calledsrcas a source root. - Templates: changes are live in every window; invalid template files are reported with file, reason and
line; a template path can no longer leave the target folder through a symlinked directory; failures are
shown as errors and the wizard keeps what you typed. Shell and Zsh files are created executable, and
template files end with a newline and follow
.editorconfigline endings. - New File:
release-1.2under Markdown becomesrelease-1.2.md; reserved Windows names, illegal characters, Java keywords,Foo.txtas a class name and~/…are refused with a specific message.