Volt
00000000

Everything it does

The whole editor, on one page

Most editors keep a feature list short because the list is the marketing. This one is the opposite: every command, every setting and every behaviour that is actually in the build you can download today, grouped so you can find yours. Search it — a menu name, a shortcut, a format, a habit you would miss.

Try it instead of reading about it

It is a free download and needs no account.

Download Volt for Mac

Large files and speed

The size of a file is not supposed to be your problem. Past a threshold you set, a file is not read to be opened at all — so the time to open it does not depend on how big it is, and neither does the memory it costs.

Opening

  • A 4.23 GB log opens in 2 ms50.4 million lines, on a few megabytes of memory — measured on an M-series Mac, not estimated.
  • The threshold is yoursSettings decides the size past which a file is mapped rather than read; 64 MB by default.
  • The status bar says which it didMapped or in memory, with the size on disk and the line count beside it.
  • Progress never blocks the textLong work appears as a strip above the status bar with a Stop button — never a modal sheet — and the text stays readable and scrollable while it runs.
  • Small files skip all of itUnder 4 MB a file opens straight away, and the strip only appears at all if work is still running after a quarter of a second.
  • A line of any length is drawnA minified bundle or a JSON document on one line is shown, up to a megabyte of it.
  • Native on Apple silicon and IntelOne download, native on both, for macOS 13 or later.

Line numbers and the scroller

  • Absolute, relative or hybrid numbersThe caret's line absolute and the rest counted from it, for the people who move by counts.
  • Numbers set in tabular figuresWhich matters the moment the editor is not in a monospaced font.
  • The scroller is a mapSearch hits, changes against HEAD, bookmarks, errors and warnings are all drawn down its track. Clicking the track goes there.

Minimap and wrapping

  • Minimap, one row per lineThe shape of the code beside the code, with bookmarks down one edge and search hits down the other.
  • It says where you are pointingLine 412 · Server.start — the line number and what encloses it.
  • Soft wrap, on by default⌥⌘W turns it off. Continuation rows keep the line's own indentation, so wrapped code keeps its shape.
  • Wrapped text still behavesPage Up and Page Down move a page, End goes to the end of the row, a resize keeps what you were looking at, and the caret never slips off the bottom.
  • Wrap at a columnSettings ▸ Editor ▸ Wrap at column: lines break at 80, or wherever you choose, rather than at the window's edge.

Files, character sets and line endings

220 character sets, 9 line endings, and detection that explains itself rather than guessing quietly. This is the half of the editor most others leave to the command line.

What a file is, from its bytes

  • A file is recognised by what is in itWhen the name says one thing and the contents another, it says so on opening — with the extension such a file usually has.
  • A picture opens as a picturePNG, JPEG, GIF, WebP, HEIC, TIFF, BMP and icons, with the format and size — and a way back to the bytes.
  • File ▸ Byte Order MarkTurn the mark at the front of a file on or off; ticked when there is one, and ⌘Z takes it back.
  • No byte order mark where it breaks thingsNever written into .htaccess or a script with a #! line unless you ask — and opening one that has it says so.
  • Changing the character set can be undone⌘Z puts back the set the bytes were read as.

Character sets

  • Detection that scores every setByte order mark, then structure, then language scoring, then the 8-bit code pages — sampled at the head, the middle and the tail, because a log can change halfway.
  • It tells the lookalikes apartWindows-1252 from Mac Roman, Latin-2 from Latin-1, KOI8-R from Windows-1251 — the pairs every "does it decode?" detector gets wrong.
  • A short file is not ChineseA handful of accented bytes in a French or Russian note is read as what it is, not as three ideographs.
  • Compare Character Sets…The same bytes read every way, side by side, scored — for the file the detector cannot settle. Only the sets that can genuinely read those bytes are offered.
  • Reinterpret, or convert on saveChoosing a set asks which you meant: read the same bytes again, or write the text out in that set.
  • Nothing becomes a ? without a wordA character the chosen set cannot spell is reported before it is lost, not after.
  • 62 EBCDIC code pagesWestern and Central Europe, the Baltic, Cyrillic, Greek, Turkish, Arabic, Hebrew, Farsi, Urdu, Japan, Thailand, Vietnam, Laos and Devanagari.
  • Japanese mainframe files, Kanji and allEBCDIC 930, 939, 1390 and 1399 — and the shift-out and shift-in runs put back exactly where they belong on save.
  • Library records in MARC-8Accents shown as one character so a search finds them, and written back the way a MARC 21 record needs — lengths and directory kept valid.
  • Six-bit codes, older than EBCDICIBM's BCD, GBCD, Burroughs, CDC and the rest — chosen from a list, because nothing in such a file says which it is.
  • And the rarer standardsISO/IEC 6937, KOI-7, JIS X 0208, and JIS X 0213 in both its wrappings.
  • The character-set menu is yours to setTick the sets that belong in it; the rest stay one level down, grouped by region rather than in a flat list of fifty-eight.
  • A file named for its set is read as itpayroll.ebcdic, MASTER.CP273, extract.ibm-1047 — believed about EBCDIC, doubted about everything else.
  • UTF-16 and UTF-32, in and outOpened as text, written back in the encoding they came in, and what nobody touched is written back byte for byte.
  • volt --encodingPrints what it decided and why, with the runners-up and their scores behind --verbose.
  • Repair Garbled Charactersé and ’, read in the wrong character set once and saved that way, are é and ’ again.

Compressed files

  • A .gz opens as its textA rotated log, a dump, a config out of a backup — read, edited and saved as a .gz again.
  • bzip2, Zstandard and xz too.bz2, .zst and .xz open and save exactly as .gz does, with nothing to install.
  • Several members read as one textAppended logs, cat a.gz b.gz, anything bgzip writes — one document, not a refusal.
  • The inner file decides everythingnginx.conf.gz is highlighted as an nginx configuration and dump.sql.bz2 as SQL, each with the icon it would have without the wrapper.
  • The bytes decide, not the nameA compressed file is unpacked whatever it is called, and a file saved without the extension comes out plain — the only way to unwrap one from inside an editor.
  • Saved as hard as it cameA file packed at the strongest setting is packed that way again.

Logs

  • A log is recognised by its linesNot by its name — from the way its first two hundred lines start.
  • Every line coloured for what is in itThe time, the level, addresses, identifiers, HTTP methods, exceptions, key=value pairs and durations.
  • Errors red, warnings amberMarked down the scroller as well, and the stack trace under an error belongs to the record above it.
  • Show Only ErrorsAnd errors and warnings — a filter that keeps each record's own lines with it.
  • Go to Time…The first line at or after a moment: 14:03, a full date, or +5m and -1h from the line you are on.
  • A file that grows is followedNew lines are added to what is on screen rather than the file being read again.

Line endings

  • LF, CRLF, CR — and mixed files reportedConverted in the same pass that reads the character set.
  • NEL, LS, PS, VT, FF and LFCRNine endings in all, including the ones from mainframes and from Unicode itself — files that open as one enormous line everywhere else.
  • A form feed is a page markIt only counts as a line ending in a file that plainly uses it as one.
  • A final newline, if you want oneOff by default, and when it is on it appears in the window as an ordinary, undoable edit.

The file on disk

  • It notices when a file changesModified, truncated, replaced or deleted — with nothing unsaved it reloads by itself and keeps your caret and scroll position.
  • Locked and read-only files say soIn the title bar, before a save fails — and a lock is Volt's to undo, so Save offers to unlock.
  • The File menu does the Finder's workReveal in Finder, Copy Path and Copy Relative Path, Save a Copy…, Rename…, Move To…, Move to Trash, Reopen Last Closed Window.
  • Volt is in Open With for any fileAlways as an alternate, never taking a file away from the application it belongs to.
  • Quick Look in the FinderThe space bar on a file gives Volt's own reading — records, character set, line endings — where the system's preview shows a wall of question marks. Gzip files are read too.
  • Drag a file into the textIts path is typed, relative to the document; Markdown writes a link or an image, HTML writes a tag, CSS writes url().
  • A filetype icon in front of each nameIn the project sidebar and in Go to Anything, grouped by what a file is for.
  • Project ReportWhat every file in the project is — character set, byte order mark, line ending, final newline, and what a hygiene scan found — filtered to Not UTF-8, Not LF, Something wrong.
  • Save when you walk awaySwitching window or application writes the file, if you turn it on — and it refuses where refusing is right.
  • Text that never was a filegit diff | volt opens the diff in a window, highlighted as a diff.
  • Normalise UnicodeNFC, NFD, NFKC and NFKD, over the selection or the document.
  • Files only an administrator may change/etc/hosts, /etc/sudoers: opened and saved with the system's own password dialog.
  • Open a web addressOpen Remote fetches a file over HTTP or HTTPS and opens it under its own name.
  • New File from the FinderA right click in the Finder makes an empty text, Markdown, HTML, CSS, JavaScript, JSON, PHP, Python or shell file where you are.
  • When another app changes a fileSettings ▸ Files decides: reload it, ask what to do, or keep the version in Volt.
  • Opens .txt and .log filesDouble-clicked text and log files open in Volt from its first launch; Settings ▸ Files shows what opens them.
  • Composed or decomposedThe status bar shows whether accented letters are composed (NFC), decomposed (NFD) or mixed, with a menu to convert the document.
  • One password per administrator sessionA file only an administrator may change asks for the password at its first save, not at every save after it, until its window closes.
  • sudo volt /etc/hostsOpens the file in the Volt you are running, ready to save as an administrator with the password sudo asked for.

Mainframe files, records and the bytes themselves

Files that have no lines in them, columns a copybook defined sixty years ago, and a hex editor for when the question has no other answer.

Records

  • IBM RDW recordsVariable-length records with their four-byte descriptor word are recognised by following the chain, not by guessing.
  • Fixed-width records80 columns from a card, 133 from a printer — turned into lines on the way in, with the padding taken off.
  • The window says what it readBecause what is on screen is Volt's reading of the file: it saves lines, not records.
  • EBCDIC with an ASCII line feedThe half-converted file that comes off a mainframe through the wrong tool still reads as lines.

Fixed-width fields

  • Field Widths…Type the widths the way a copybook writes them — 3 15 10 20 20 20 3 10 40 — and a hairline is ruled down each boundary.
  • Detect from FileWorks the columns out from the runs of padding that every record shares.
  • Fields as CSV in a New DocumentEach record cut at its field widths, the padding taken off — or tab-separated, behind ⌥.
  • Named layouts, remembered3 id, 15 surname, 10 first name — and the layout is offered again for the next file like this one.

Hex editor

  • Show Hex Editor (⌃⌘X)Offsets, the bytes in groups of eight, the printable characters beside them — in the pane beside the text.
  • The bytes are editableThe caret stands between two bytes; type hex digits and they go in. Selections, cut, copy, paste and one shared undo with the text.
  • Overwrite Mode for patchingTyping changes a byte instead of inserting one — what patching a file without moving anything after it means.
  • It follows the caretMove in the text and the dump moves to the same place; 64 KB at a time, with an offset field that takes hex or decimal.
  • It says when the bytes are not the file'sA UTF-16, EBCDIC or packed file is edited as UTF-8 and written back in its own form, and the pane tells you so.

Files on another machine, and on a server

Four ways in, all of them ending in an ordinary window with your own settings, highlighting, formatter and linter — and ⌘S sending it back.

Over SSH

  • File ▸ Open Remote…user@host:/etc/nginx.conf, and the file is in a window. ⌘S writes it back.
  • It lists the directory as you typeBecause nobody knows the whole path past the first time.
  • Asked for a password once, not three timesAnd kept in the login keychain if you ask it to.
  • rmate config.yml on a serverOpens the file here, over the SSH session you are already in. The script ships with the editor.
  • It says what it is doingEach step while a file is fetched and while it goes back — and a save that does not arrive says so rather than failing quietly.
  • A dropped connection loses nothingThe save is written beside the real file and moved into place, so half a file is never what is left.
  • A remote window comes back tomorrowRemembered by web1:/etc/nginx.conf rather than by a temporary path that will be gone.
  • Search a project on another machineFind and Replace in Project, and search by shape, work on a project opened over SSH or SFTP — the whole project there is searched.

FTP and SFTP

  • Drag and drop, both waysFiles and whole folders, out to the Finder and in from it — and Option-drag copies instead of moving, as it does in the Finder.
  • Synchronise…A folder here and one on a server compared by size and date, with every step listed before anything happens. One way at a time, and nothing is ever deleted that you were not shown.
  • A stopped transfer picks up where it left offOnly the part that is missing goes, in either direction.
  • Permissions…Read, write and execute for owner, group and everyone, with the number beside it — and a default for new files and folders, so a page is never uploaded where the web server will not serve it.
  • Rename by Rule…Replace text, add before or after, number them, change the case — with the new names on screen before anything is renamed.
  • Compress on the servergzip, bzip2, xz, Zstandard, Zip, Tar or RAR — packed where it lies; tar, RAR and 7-Zip archives unpacked on this Mac.
  • Places, a sidebar of servers, and the last folderThe folders worth one click kept with each server, a dot for the one connected, and the window opens where you left it.
  • Copy Web AddressTell a server where its files are served from, and a file copies as the link somebody will open.
  • Open in Terminal, Show Hidden FilesFor an SSH connection, a Terminal in the folder you are looking at; and the .htaccess and .env a server is often opened for.
  • Activity and TranscriptWhat has been fetched and sent, and what passed between here and the server.
  • A speed limit per serverFor when the upload is also the connection you are working over.
  • An SSH key per serverFor the machine that is not in ~/.ssh/config.
  • Nothing is written over by accidentA name that is taken is named, and Replace has to be asked for.
  • File ▸ FTP…Your servers down one side, what is on the picked one down the other — for the shared host or the appliance that has no shell at all.
  • SFTP is the same windowA saved connection can be one over SSH, or an sftp:// link.
  • Plain FTP, or FTP over TLSExplicit or implicit, with passive mode — the one that works from behind a router.
  • A connection is saved onceName, server, port, user, the folder to start in. The password goes to the login keychain, not into a settings file.
  • The folders behave like a Finder windowA source list, kept until Refresh, because each listing is a login and a round trip.
  • New folder, rename, deleteOn the right-click menu — and the delete says plainly that a server has no Trash.
  • Saving goes up under its own nameAnd is renamed over the file once every byte is there.
  • Several servers at onceEvery FTP window is a tab — ⌘T opens another connection — and files are dragged straight from one server to another.
  • Through a jump hostA server reached only through another machine says so, and Volt goes that way.
  • Search in a folder on the serverFind and replace across a folder on the server, in a window of its own.
  • Quick Look on the serverThe space bar previews a file on the server.
  • A transfer queueDownloads, uploads, compressing and synchronising wait their turn in an order you can drag, with a pause.
  • Renames that can be undoneOn the server and on this Mac, with Undo and Redo.
  • This Mac beside the serverYour Mac on one side and the server on the other — the same path bar, listing and search on both, and the Finder's commands on your side.

Together, through iCloud Drive

  • File ▸ Share…For a file in iCloud Drive, the people you invite get the same file and edit it with you.
  • Their changes arrive as they saveMerged into the text on screen; yours stay, and your caret keeps its place.
  • Marked in the gutter, by nameEvery line a merge brought in, with who changed it when you point at it.
  • A save never writes over something newerWhen two Macs saved at once, both versions come into the window with every difference marked.

Unsaved work

The promise is small and absolute: what you typed is still there. Quitting, closing, crashing, a battery that ran out — none of them is a way to lose it.

  • Undo survives quittingAnd closing the window: bring it back and its last steps come back with it, whether it held a file or only what you had typed.
  • Unsaved work survives quittingAnd closing the window, and a crash, and a forced quit. It is written as you type, not at the end.
  • A draft that was never a file is kept tooThe window that was never saved comes back with what was in it.
  • A window that shows what is heldEvery draft Volt is keeping, in one list, so nothing is held in secret.
  • Letting go of a draft means the wastebasketDiscarding is an explicit act with a sound, not a silent deletion.
  • A big file is kept tooThe rule does not stop applying because the file is inconvenient.
  • Come back to exactly what you leftOpen files, caret, selection, scroll position, character set, language, window size and split, restored on the next launch.
  • Edit ▸ Browse History…A document's past on a timeline, as Time Machine does: every step of Undo and Redo, and the versions Volt keeps — go back to any point without losing what came after.
  • A version every minute, saved or notKept while a document changes: every one from the last hour, then one an hour and one a day. Every save is kept as a version too.
  • A deleted file can be put backFrom the last version Volt kept of it — offered when it is found missing, in Open Recent and in the Dock.
  • When quitting: keep, ask or saveSettings ▸ Files decides what quitting does with unsaved changes: keep them for next time, ask, or save them.
  • Save automaticallyEvery file with unsaved changes saved every minute, or every few minutes, if you want it.
  • A backup before savingThe version on disk kept just before a save replaces it — in Volt's backups folder, or beside the file.
  • Compare with SavedWhat has changed since the last save, beside the file as it is on disk — and one change at a time can be put back.

Editing

Sixty-five things the Edit menu does, and the ones people actually reach for every day are in the first two lists.

Every day

  • Multiple cursors and block editing⌥-click adds a cursor, ⌥-drag makes a rectangle, ⌃⇧↑/↓ add one above or below, ⌘D selects the next occurrence — and the whole batch is one undo step.
  • Undo, a word at a timeNot a burst at a time: ⌘Z after a sentence takes back a word, not the sentence.
  • Toggle Comment (⌘/)The language's own token, at the shallowest indentation so the markers line up — and the block form when the selection is inside one line.
  • Move, duplicate and delete lines⌥⌘↑/↓, ⇧⌘D, ⌃⌘K — and New Line Below (⌘↩) and Above (⇧⌘↩), indented to match.
  • Shift Left and Right (⌘[ / ⌘])And Tab and ⇧Tab over a selection that spans lines.
  • Paste with Indentation (⇧⌘V)Moves what you paste to where you are pasting it. Plain ⌘V still pastes exactly what was copied.
  • Paste from History (⌥⇧⌘V)What was cut or copied lately, searchable — with pins for the signature or the boilerplate you paste every day.
  • Drag text to move itInside a document that is one undoable change; between windows, the text leaves one and arrives in the other.
  • Overwrite ModeThe Insert key, or the Edit menu.
  • ⌘C with nothing selected takes the lineThe way every editor people arrive from behaves — and it can be turned off.
  • Several selections at once⌘-drag adds a selection and ⌘-double-click a word; the text commands change every selection together, as one Undo.
  • Writing ToolsApple Intelligence proofreads and rewrites what is selected, from the Edit menu and the right-click menu.
  • Markdown lists that continue themselvesReturn continues lists, task lists and quotes and ends them on an empty item; Tab and ⇧Tab move an item in and out.
  • Emmet abbreviationsul>li*3, div#main.box or m10-20 expand with Tab in HTML and CSS, with tab stops for what is left to fill in.
  • Spelling as you typeWith the Mac's own dictionaries, in the languages you write: prose word for word, and in code only comments and strings — never names like camelCase.
  • Paste as MarkdownWhat you copied from a web page, a mail, Google Docs or Word, as Markdown: headings, links, pictures, lists, quotations, code and tables.
  • Paste JSON as TypesJSON on the clipboard as the types it decodes into, in the document's language: Swift structs, TypeScript interfaces, Go structs, Python TypedDicts, Kotlin data classes or Rust serde structs.
  • Paths complete as you typeA / in a string or in a Markdown link lists the files and folders there, and a folder accepted goes on into it.
  • A pasted picture lands beside the fileA screenshot pasted into a Markdown file is saved as a PNG next to it, with a link to it where the caret is.
  • A table of contents that keeps upInsert Table of Contents lists a Markdown file's headings as links, and every save keeps it up to date.
  • Drop a file in to put in its textFiles dragged in with ⌥ held put in their text, each read in its own character set; with ⇧, their full paths.
  • Smart quotes and dashes in proseIn Markdown and plain text, never in code, with your Mac's text replacements — turned on in Edit ▸ Spelling and Substitutions, and ⌘Z gives back what you typed.

Lines, numbers and case

  • Sort lines the way a list is sortedNatural order — line 10 after line 9 — as well as plain, reversed, and by the columns a block of cursors spans.
  • Remove duplicates, empties and repeatsThe first of each kept, or only consecutive ones, as uniq does.
  • Join Lines, Split Lines At…Turn a, b, c into three lines, each with the indentation of the line it came from.
  • Rewrap ParagraphsThe selected lines, or the paragraph the caret is in — never a whole file of code by accident.
  • Increment and Decrement NumbersEvery number in the selection by one, or the one under the caret.
  • Change Numbers…+ 5, − 3, × 1.1, ÷ 2 over every number in the selection.
  • Convert to Decimal, Hex, Binary, OctalEvery whole number in the selection, or the one at the caret.
  • A column of figures is added upSelect them and the status bar says Σ 60 · 3 numbers · average 20.
  • Convert Case, eleven waysUPPERCASE, lowercase, Title, Sentence, iNVERT, UpperCamelCase, lowerCamelCase, kebab-case, snake_case, CONSTANT_CASE, dot.case.
  • Statistics…Characters, words, lines and Unicode scalars, over the selection or the document.
  • Checksums, and a hash for every functionSHA-256, SHA-512, SHA-1 and MD5 at once — and Hash Selection replaces the selection with any of twenty-one: SHA-256, CRC-32, xxHash and the rest, with the old ones marked insecure.
  • Encode and DecodeHTML, URL, Base64 and the rest, over the selection or the document, both ways.
  • Insert DateISO 8601 at every cursor, or your own pattern from Settings.
  • Redact SelectionEvery character becomes █, spaces and line breaks kept — so a log keeps its shape when you send it on.
  • Clean Up URLA path or an address in lower case, with umlauts written out and spaces as hyphens: /Menü-Über-uns.jpg becomes /menue-ueber-uns.jpg.
  • CSV to TSV, and backFor the selection or the whole document, with quoted fields kept intact.
  • Look Up, Translate, Search With GoogleA right click on a word offers the Mac's own services — and Copy with Syntax Highlighting, Copy as XHTML and Share.
  • Calculate (⌃⌘=)Arithmetic in the text worked out: 17.5*3+12 becomes 64.5 — with brackets, powers, percentages, √, π, and decimal commas where the text uses them.
  • Align (⌥⌘A)Lines up the selected lines on what they share — the = of assignments, the : of keys, the bars of a Markdown table — or on a separator you name.
  • Prefix and Suffix Lines…Text before and after every line, or taken off again: a column of names made 'ann', 'bo', in one go.
  • Straighten Quotes, Typographic QuotesCurly quotes made straight for code, or straight ones curled the English, German, Swiss or French way.
  • JSON, YAML and CSV, into each otherSort JSON Keys, JSON to YAML and back, CSV to JSON and back — numbers kept as numbers only where a whole column is, so postcodes keep their zeros.

Selection, brackets and tags

  • Move through the parts of a name⌃⌥← and ⌃⌥→ walk parse, HTTP, Server, 2 in parseHTTPServer2, and the words of snake_case.
  • Expand Selection (⌃⇧⌘→)Grows by the text's own structure: the word, the dotted name, the string, the call, the block.
  • Matching brackets, tags and commentsBoth halves boxed, or neither — including the two ends of a block comment.
  • Change or remove the brackets around itAnd move to the next bracket in the file with ⌃⌘] and ⌃⌘[.
  • Tags close themselvesIn HTML, XML, Markdown, PHP and JSX — and it knows when not to: void elements, comments, doctypes, generics.
  • Wrap Selection in Tag… (⌃⌘T)The selection stays selected, so wrapping twice works.
  • Open SelectionOpens what the selection names — a web address in the browser, a file in Volt.
  • Read Only for All DocumentsEvery window at once, for reading a set of files without a stray keystroke.
  • Undo Selection (⌥⌘Z)Steps back through where the caret and the selection have been, without touching the text; Redo Selection goes forward again.
  • Tags rename in pairsRenaming an opening tag renames the one that closes it as you type — one step of Undo for both.

Indentation

  • Return indents by the language's rulesOne level in after a brace or a colon, and pulled back out when the line closes one.
  • A file's own indentation is adoptedTabs, or 2, 4 or 8 spaces, for that document alone — shown in the status bar.
  • Convert Indentation to Spaces or TabsKeeping where each line starts.
  • Tab width and indent width are two numbersThe same by default, and separable for the files where they are not.
  • Tab stop linesA faint line at every tab stop, from View ▸ Show and Hide or Settings.
  • Indentation coloursEach level of indentation tinted a colour of its own, and an indentation that is not a whole number of levels marked in red.

One bar with both fields always showing, and sixty-odd things built on it — because finding something in a very large file is most of what a very large file is for.

The find bar

  • Literal or ICU regular expressionsWith case, whole words, wrap-around and $1 templates in the replacement.
  • Escape sequences\n, \t, \xHH and \uXXXX in both fields, without turning on regular expressions.
  • Find AllOne pass gives the total, the first 10,000 matches as a clickable list, and markers down the scroller.
  • Markers sampled across the whole fileNot taken from the first few matches — in a big log that is the difference between a map and a smudge at the top.
  • It says how far it has gotSearching… 42%, with the elapsed time on anything slower than half a second, and a Stop button.
  • Replace All is undoableEven on a mapped file — nothing is written to disk until you save.
  • Search in SelectionLimits Find Next, Find All and Replace All to what was selected when you switched it on.
  • Preserve Case When Replacingword becomes name, WORD becomes NAME, Word becomes Name.
  • The last search, anywhereShared with every other Mac application through the system's find pasteboard.
  • Find in Recent Files (⌃⌘F)The files you had open lately, wherever they live.
  • The fields take line breaksSo a two-line pattern is typed as two lines.
  • Find & Replace in a window of its ownFields big enough for long patterns and replacements over several lines, every option in sight — and Extract Matches puts every match in a new document.
  • Find ▸ Pattern Playground…A regular expression tried on a text: every match marked, its groups listed, and the replacement shown done.
  • Regular expressions in colourGroups, escapes, classes, repeats and anchors coloured in the find field, and the groups the replacement puts back.
  • Find with XPath…Selects what an XPath expression finds in XML; Copy XPath — Copy JSON Path in JSON — copies the path of whatever the caret is in.

Counting, marking, filtering

  • Count Matches42 matches on 30 lines, with nothing opened and nothing moved.
  • Tally MatchesEvery match counted by what it says, most frequent first, in a new document.
  • Mark All MatchesKeeps a search painted in one of five colours while other searches come and go — three things to watch in a log is three markers.
  • Show Only Matching Lines (⌥⌘L)grep, still in its window: the lines keep their numbers and stay editable.
  • Hide Matching Lines (⌥⇧⌘L)The other way round, and the two combine — show the errors, hide the ones you have seen.
  • Filter Lines…Several conditions at once, each one a switch, and saved filters you can turn on together.
  • A filter outlasts a rotated logWhen the file is written again, the filter is still on.
  • Find TODO CommentsThe TODO, FIXME, HACK, XXX and BUG comments of the file, or of the whole project, in a list — and marked in the text.

Across a project

  • Find in Project (⇧⌘F)The same engine and the same results list, over every file of the project.
  • Replace in Project (⇧⌘H)Searches first, says how many matches in how many files, and only then writes.
  • File Filter…Include and exclude lists in the patterns you already know — *.swift, Sources/, *.{js,ts} — and a replace obeys the same filter.
  • Find in Open Documents (⌥⌘F)Every window as it is now, unsaved changes and untitled windows included.
  • Structural searchCode with holes in it: print(:[what]) finds every call however long its argument, if (:[cond]) { :[body] } finds the whole statement. The same holes put it back in the replacement.
  • Replace in Open Documents…Every open document at once, after saying how many matches in how many documents; each window takes its change as one Undo.
  • One search, everywhereFind All lists every match in this document, the project, every open document and the files opened lately, file by file.

Batch replace and saved searches

  • Batch Replace…A list of pairs — what a spreadsheet puts on the clipboard when two columns are copied — run in one go, with each pair's own switches.
  • Over every open documentEach document's changes one undo step in its own window — and Count says what would happen without changing anything.
  • Lists you keepA house style's spellings, a migration's renames, saved under a name.
  • Searches worth keepingSaved with their options, because a regular expression brought back without "Regular Expression" on is a literal string that finds nothing.
  • On every Mac you useYour saved searches, language modes and snippets follow an account, merged rather than overwritten when two Macs save at once.
  • Go to Anything (⌥⌘P)@name for symbols, :123 for a line, anything else for open documents and recent files.
  • Commands… (⇧⌘P)Every command in the menus in one field, with the menu it sits under and its shortcut.
  • An outline that needs no language serverBuilt from the same lexer that colours the text, so it works on files far too large for one.
  • Jump to Definition (⌃⌘J) and Find UsagesOr ⌘-click.
  • Outline sidebar and breadcrumbsThe sidebar follows the caret; each breadcrumb drops a menu of its siblings.
  • HTML and XML have an outline tooBecause a page is read by its headings.
  • Go to Line… (⌘L)Takes 12:5 for line and column, a byte offset, and BBEdit's forms — :C for a character, ranges, +N and -N — because a line number is not the only thing a person is told.
  • Bookmarks, with notes⌥⌘M marks a line, the number is drawn on a tag in the gutter, and Bookmark with Note… says why. They move with the text as you edit.
  • Bookmark Shown LinesFilter to the errors, mark them, show the file again — and the marks are where the errors were.
  • Back and forward (⌃⌘← / ⌃⌘→)Records jumps, not arrow keys: a move of fewer than twelve lines is typing, not travelling.
  • Scope headerThe definition you are inside, pinned above the text as its own first line scrolls away — keeping its real line number.
  • Code foldingFrom braces, from indentation, and from a language's own markers, with a ribbon down the gutter showing every region in view. Folds are per pane.
  • Jump to Selection (⌘J)Back to where the caret is, after the view has wandered off.
  • Jump to Word (⌃J)A letter or two on every word on the screen: type them and the caret is there — with ⇧ to select, with ⌥ to add a cursor.
  • Compare with ClipboardThe document, or the selection, side by side with what is on the clipboard.
  • Compare Folders…What differs between two folders — files on one side only, files whose contents differ — and a double click shows two of them side by side.

Languages and syntax

129 languages and 500 file extensions, each one a table of keywords, comments, string delimiters, indentation, folding and symbols — which is why you can add one yourself as a plain file instead of waiting for a release. The full list of what it opens is its own page.

Highlighting

  • Everything you work inSwift, C/C++/Objective-C, JavaScript/TypeScript, Python, Rust, Go, Java, Kotlin, C#, PHP, Ruby, Perl, Lua, Shell, SQL, CSS, SCSS, HTML, Markdown, YAML, JSON, TOML and the rest.
  • And what the mainframe runsCOBOL, JCL, RPG in both forms, ABAP, PL/SQL, Delphi, Visual Basic, Visual FoxPro, SAS.
  • And the newer onesMojo (.mojo and .🔥), Zig, Nix, Julia, Elixir, Haskell, OCaml, Lisp, Ada, Fortran, Tcl, R, PowerShell.
  • The files that build the softwareMakefile, Dockerfile, CMake, Terraform/HCL, Gradle, Bazel — read as themselves rather than as shell scripts.
  • Servers and their configurationApache and .htaccess, nginx, Caddyfile, crontab, SSH config.
  • CSV and TSV get a mode of their ownNot a language, and worth colouring: where the fields end and which one you are in.
  • Templates lex as what they holdERB, EEx, EJS, PHP-HTML, Jinja, Nunjucks, Twig, Liquid, Handlebars, Mustache and Go templates — the page as a page, each tag as its own language.
  • HTML with other languages in it<script> is JavaScript and <style> is CSS, with their own comments and strings.
  • Strings with code in themThe expression inside "\(name.count)" or ${a + 1} is lexed as the code it is — and only where that delimiter really interpolates.
  • Heredocs<<EOF, <<~EOF, <<'EOF' and PHP's <<<EOT — and a << b is still a shift.
  • Character references, right and wrong&#233; is marked as what it is and &nsbp; as the mistake it is.
  • Bracket colours by depthSo the one that closes the line you are on is obvious.
  • No extension, no problemThe words in the file decide, and a #! line is read — a script called deploy is what its first line says it is.
  • A new file works out what it is turning intoPaste a page of Python into an untitled window and the window is a Python window.
  • .m is Objective-C and it is MATLABNo rule about names can tell them apart, so the file itself is asked.
  • CSV columns in colours of their ownEach column drawn in its own colour down every row, and the status bar names the column the caret is in from the header.
  • Comments that mean somethingA comment starting with ! is drawn in red, with ? in blue and with * in green: a warning, a question, something to notice.
  • DNS zone filesEach record's name, TTL, class, type and data coloured as what it is — a host called mx is a name, not a type — in .zone files and BIND's db.example.com.

Per language, per project

  • Settings ▸ LanguagesIndentation, wrapping, formatter, linter and character set per language — each control with a Default that means "whatever the settings say".
  • .editorconfig is readindent_style, indent_size, tab_width, end_of_line, charset, trim_trailing_whitespace, insert_final_newline — and the project has the last word.
  • .gitattributes tootext, eol=lf|crlf and working-tree-encoding, after .editorconfig.
  • New files in a language can have their own rulesLine endings and character set, decided per language.

Code intelligence

  • Language servers, when you want themDiagnostics as you type, completion, hover documentation (⌃⌘H), Rename Symbol (⌃⌘R) and code actions — off until you switch a language on, because nobody should get a long-running process by opening a file.
  • A rename says what it will touch firstHow many changes, in how many files, and how many of those are not open.
  • Signature helpThe signature above the line with the parameter you are on in bold — and it never takes the keyboard.
  • Find Symbol in Project… (⌥⇧⌘O)The names a server knows anywhere in the project.
  • Completion, with or without a serverFrom the server when one is running, otherwise from the words already in the file, ranked by how often and how near they are.
  • It never covers what you are typingAnd typing carries on into the document underneath the list.
  • Snippets with stops and variablesTab between the stops, $TM_FILENAME, $CLIPBOARD and the rest by the names other editors use — and a number used twice is one stop in two places.
  • Linting (⌃⌘L)Defaults for swiftlint, ruff, eslint, go vet, clippy, shellcheck, cppcheck, rubocop, yamllint and markdownlint; anything else is a command you configure.
  • Findings in four placesA dot in the gutter, a mark down the scroller, the message on the line, and the list — which opens itself only when you asked for the check.
  • A language server's coloursWhere a language server runs, its idea of which names are types, functions or macros replaces Volt's guess from the words.
  • Inlay hints, after the codeThe type a language server worked out for a name, or an argument's name, shown after the line — so the code itself never moves.
  • SQL is formatted tooFormat Document puts SQL a clause a line, with its columns and conditions indented under it and strings and comments exactly as they were.

Git

  • Git ▸ Repository… (⇧⌘0)One window for the repository: what has changed, what happened before, the branches, and what was put aside.
  • Stage a file, or one change in itTick a file, or put the caret in a change and Stage This Hunk — then write the message, amend if you want to, and commit with ⌘↩.
  • Throw away one change on its ownWithout touching the rest of the file.
  • History, for the repository or one fileThe files each commit touched, the difference for whichever you pick, search by message, author, change or hash — and put a file back as any commit left it.
  • BranchesLocal and those only on the server; switch, start, delete, and see how far ahead or behind each one is.
  • StashPut the working copy aside, new files included, read what is in it, and give it back — kept in the list or not.
  • Fetch, Pull and PushWhat is waiting to come and go, said in one line. A pull that would have to merge is refused in Git's own words rather than decided for you.
  • Merge conflicts, settled in the editorGit ▸ Conflicts walks through them: keep what is here, what arrived, or both. A file still holding markers says so.
  • The file list marks what has changedA letter beside each name, and on the folders above it.
  • Change bars against HEADAdded, modified, and a wedge where lines were deleted — in the gutter and down the scroller.
  • Outside a repository, against its saved selfSo the marks mean something in any file you edit.
  • The branch, and how many lines differIn the status bar, with Next and Previous Change (⌃⌘↓ / ⌃⌘↑).
  • A moved block reads as a moveNot as every brace realigned.
  • Revert ChangePuts the hunk under the caret back to what HEAD says, as one ordinary undoable edit — nothing written to disk.
  • Show BlameWho last touched each line and when, labelled once per run — or ⌃⌘B for just the line you are on.
  • Compare with Revision…Then and now in two panes, rows aligned, with Take Left to bring a difference back.
  • Compare with File…Two files that are not versions of one another, unsaved changes included.
  • Show Changes (⌃⌘D)The diff against HEAD as a patch, in a window — highlighted, folded and listed like any other file.
  • The project is what Git says it isGo to Anything and the files sidebar list the repository's files, so .gitignore decides and a build folder is not in your way.
  • Stage single linesSelect some lines of a change and stage only those — or take them back out.
  • Clone a repositoryCopied from a server into a folder on this Mac, with its history and its README opened when it is there.
  • A branch graphWhere branches part, run side by side and join again, drawn beside the commits.
  • Git ▸ History of Selected Lines…Every commit that changed the selected lines, following them as they moved about the file.
  • Tags and commit notesTags in the branches list, an annotated tag's message, and notes on commits shown under their message.
  • Put some files asideRight-click files in the list of changes and Put Aside… keeps just those out of the way while the rest is committed.
  • Undo the last commitWhile it has not been pushed: its changes are staged again and its message put back, ready to commit differently.
  • Diffs that mark what changed in a lineA changed line shows the part that actually changed, on green and red bands with each line's numbers beside it.
  • Copy Link to Selected LinesA link to those lines on GitHub, GitLab, Bitbucket or Codeberg, at the commit you are on, so it keeps showing the same lines.

Tools and external commands

  • Format Document (⌥⇧⌘F)Through the formatter you configured for that language — and only the part that differs is replaced, so your caret and scroll position survive it.
  • Format before savingPer language, if you want it.
  • Minify JSONWith no tool at all.
  • Filter Through Command (⌃⌘U)Pipes the selection — or the document — through a shell command and replaces it with what came back. A command that fails changes nothing and says why.
  • Commands run in a login shellSo Homebrew and nvm tools are found, and a missing one is named rather than reported as a generic failure.
  • Run Script (⌘R)Runs the document with its language's interpreter — python3, ruby, perl, node, osascript — and what is on screen is what runs.
  • Compile Script…Writes the .scpt that Automator, Folder Actions, Mail rules and the Script menu expect.
  • Install Command Line Tool…Writes a volt command, after saying whether it will work — and asks for an administrator's password the way the system does.

Preview, printing and output

Preview

  • Code in a Markdown fence is highlightedIn the language the fence names — ```swift, ```py, ```bash — in the editor and in the preview.
  • Markdown rendered as you type (⌘R)From the buffer, so it follows what you type without saving.
  • HTML previewed from diskWith its own stylesheet, reloaded when you save.
  • A CSV is previewed as the table it isOf any size — and the separator is read from the file, because a .csv from a German spreadsheet is as often semicolons.
  • Plain text and RTF as a pageProportional type, a comfortable measure, line breaks kept.
  • Clicking the preview goes to that place in the fileAnd the pane follows the caret the other way.
  • A contents button in the pane's barEvery heading in the document, indented by level.
  • Nothing is fetched from the networkJavaScript is off in the rendered page, and a clicked link opens in your browser rather than in the pane.
  • Images shown under the line that names themIn Markdown, in CSS url(), in an src attribute, or a bare path in a comment.
  • A JSON previewIndented, in the editor's colours, every object and array folding open and shut with a click — comments and trailing commas taken in their stride.
  • Markdown as GitHub reads itPlus Obsidian's callouts and [[links]], emoji by name, ==highlights==, definition lists and front matter.
  • Print the previewThe page as it is rendered — headings, tables, pictures and coloured code.
  • Jupyter notebooks, as notebooksMarkdown cells as text, code cells coloured with their run numbers, and what each run printed and drew: plots as pictures, tables as tables, tracebacks in red.
  • A CSV table you can type intoPick a cell in the preview and type: Return puts it into the file and goes down, Tab goes right, and quotes are added where a value needs them.
  • Open in BrowserView ▸ Open in Browser shows the page in your browser, with its developer tools, and reloads it whenever a file of its folder changes.

Printing and copying out

  • Print… (⌘P) and Export as PDF…With the file's colours, optional line numbers, the name at the top of every page and the page number at the foot.
  • The page header can be turned offAs can the date beside it.
  • Printing uses the light themeWhatever the editor is set to — a dark theme on white paper is a black rectangle — and prints the selection when there is one.
  • Copy with Syntax Highlighting (⌥⌘C)RTF, HTML and plain text at once, so it keeps its colours in Pages, Word or a mail message.
  • Colour swatches, and a pickerEvery #hex, rgb() and hsl() gets a bar in its own colour, and Edit Colour… writes your choice back in the notation it was found in.
  • volt --pdf file out.pdfThe same PDF, from the command line.
  • Settings ▸ PrintingThe font, the header with the file's name or path and a date, a frame round the text, and colours — automatic, black and white, or any theme.
  • Copy with StylesCode on the clipboard with its colours and its background, for pasting into Mail.
  • Insert Colour…The colour picker writes the colour you pick at the caret as #rrggbb.
  • Copy As ▸ ImageThe selected lines on the clipboard as a picture in the editor's font and colours, for a chat or a slide; File ▸ Export ▸ Image… saves it as a PNG.
  • Export ▸ Word Document… and Web Page…Markdown as a Word file with Word's own headings, lists, tables and pictures, or as the preview's page with its pictures inside it.

Text hygiene and security

  • Clean Up Document… (⌥⇧⌘K)Says what is in the file that is not in the text, with a checkbox for each kind — and applies every ticked one as a single undoable change.
  • Bidirectional controls are reported as errorsThey can reorder what a reader sees without changing what a compiler reads. That is an attack, not untidiness.
  • What it refuses to remove is the pointA tab is text, a form feed is a page mark, and the joiners inside 👨‍👩‍👧 are what make it one emoji.
  • Show Invisible CharactersSpaces as ·, an arrow inside each tab's own width, ¬ at a real end of line.
  • The ones worth finding are marked as wrongA non-breaking or ideographic space, a soft hyphen, a zero-width character — what a word processor leaves in pasted text.
  • Control characters are always shownEach drawn as a picture of its own name — ␀, ␇, ␡ — with its number over it if you ask.
  • Trimming on saveTrailing whitespace, and the invisible half of the clean-up, on every save if you want it.
  • Column guidesAt the columns your project cares about.
  • Character Inspector (⌥⌘I)What a character actually is — or every one selected: code point, name, bytes in this file's character set, whether it is composed or decomposed, and how HTML writes it.

Themes, fonts and appearance

  • Three themes, and yoursPaper (warm and light), Midnight (cold and dark) and Coffee (warm and dark), plus colour-blind-safe Light and Dark.
  • A theme decides the whole windowTitle bar, the bars above and below the text, the sidebars — and the light or dark appearance follows.
  • A theme editorEvery colour a theme has, grouped, as colour wells over a live sample of real code.
  • Themes are plain JSON filesAnything you leave out is inherited, so a theme can be four lines long.
  • Language modes are files tooKeywords, comments, string delimiters, indentation, folding and symbols — and a mode whose id matches a built-in language replaces it, which is how you add a keyword without waiting for a release.
  • A mode can paint its own patternsA regular expression on top of what the scanner found — IP addresses in a log, ticket numbers in a comment.
  • A theme can let the desktop throughTranslucency, from a slider or one line in the file.
  • Any font on the machineAt any size — not only the monospaced ones.
  • Font Features…Small capitals, old-style figures, alternates and rare ligatures — whatever the font you chose can do.
  • Ligatures that come apart under the caretAn arrow you cannot see the halves of is a poor thing to edit.
  • Letter spacingIn points, negative to pull the text together, with the guides following it.
  • A status bar you chooseLine and column, lines and size, iCloud, the Git branch, mapped or in memory and the rest — shown or left out, as you like.
  • Themes from other editorsImport… in the theme editor brings in a Visual Studio Code, Sublime Text or TextMate theme — the ones already on this Mac listed by name.
  • Typewriter Scrolling and Focus ModeThe line being written stays in the middle of the window, and everything but the paragraph you are in can be dimmed.

Windows, tabs and the session

  • Split viewSide by side (⌥⌘S) or stacked (⌃⇧⌘S) — one document, but each pane keeps its own caret, scroll, folds and filters.
  • Tabs, and windows, explicitly⌘T always tabs and ⌘N always opens a window — and Sort Tabs by Name or by Type puts them in order.
  • A window can be two lines tallSmall enough to keep a log's last lines in the corner of the screen.
  • What a window shows is that window's ownLine numbers, minimap, outline, breadcrumbs, blame, issues and invisibles — per window, not per application.
  • A large session is usable at onceTwo hundred windows come back without the application going still.
  • The session is written as you workNot only on a clean quit, so it survives a crash.
  • A files sidebar (⌃⌘1)The project as a list, with a filter field at the foot, Finder's own row height, and the context menu you expect — Quick Look, Show in Finder, Rename, Duplicate, Compress, Move to Trash.
  • My CommandsA menu of your own, made of any commands Volt has.
  • A file on a share does not hold Volt stillWhen the server behind it has gone.
  • Window ▸ Collapse to Title BarA window rolled up into its title bar and down again, with the line the caret was on shown beside its name.
  • Every window comes backNot only documents: the repository window, a file's history, comparisons, the FTP window and the find window return after a relaunch.
  • Each language its own markFiles carry their language's letters on its usual colour — SW, TS, PY, GO and more than sixty others — in the sidebar, in Go to Anything and on a window's tab.

Accessibility, and five languages

  • Increase Contrast is honouredEvery token colour is pushed away from the background until it meets the ratio.
  • Colour-blind-safe themesLight and dark. Contrast cannot fix colour blindness; a different palette can.
  • VoiceOverThe editor answers for itself as a text area — how many characters, what is on line n, where the insertion point is — and the rotor moves by definitions, bookmarks and issues.
  • What a command says is said aloudBookmarked line 12, 42 matches — the notices that come and go at the bottom of the window.
  • Accessibility Zoom follows the caretA magnified screen keeps up with where you are typing.
  • English, Deutsch, Français, Italiano, EspañolThe whole interface, with numbers and sizes in the interface language too.
  • Indent guides, at the strength you wantIncluding none.

Automation and keys

  • AppleScriptA real dictionary: documents expose name, path, text, selection, line count, encoding, line ending and language — and open, count, exists and quit work as they do in any Mac application.
  • Scripted commandsselect line document 1 number 42, find document 1 for "needle" using regex true, replace…, and do menu command for anything else.
  • Vim modeNormal, Insert, Visual, Visual Line and Visual Block, with counts, the usual motions, operators, registers, macros and . to repeat the last change.
  • ⌘ always belongs to the menusAn editor that swallowed ⌘S because it was in Normal mode is an editor that loses work.
  • Every command is rebindableSettings ▸ Keys lists them all, records a new shortcut by pressing it, and warns when the key is taken.
  • Shortcuts live in a readable fileWritten as the symbols people already read, so it can go in your dotfiles.
  • Actions for the Shortcuts appTwelve of them: open files, get or insert the front document's text, and transform, find, replace, count and compare text.
  • Macros without VimStart Recording Macro (⌃Q) records typing, keys and menu commands, and Play Macro (⌃⇧Q) does them again.

Finding your way around

  • Volt Help (⌘?)Every feature there is, on one page, in a window of its own — offline.
  • A command that cannot work says soGreyed out before it is clicked, with an honest sentence when you ask why: no language server for this file, this file is not in a repository, no changes to compare.
  • Menus you can find things inThe small switches one level down, nothing in two places, and every shortcut where it always was.
  • The status bar is four pickersCharacter set, line ending, language and indentation — each one a menu, each one saying what the document actually does.

That was the list. The download is 26 MB.

A free download — no account, no sign-up. macOS 13 or later.

Download Volt for Mac

Want to hear what is new? Leave your address, or read what changed in the last build.