================================================================================ version 16.1 (16B15) (2026-09-29) Additions --------- * Introducing "Language Playgrounds", a new interface for creating language modules to add support for languages which are not included from the factory. With this comes a new language module architecture: Declarative Language Modules (DLMs), which supersede the original codeless language modules (CLMs) and provide a much richer language support experience. You can create a new Language Playground from scratch, or by importing an old CLM. Additionally, if you are running on macOS 26.0 or later and Apple Intelligence is enabled and ready for use system-wide, you can provide some basic information about the language for which you want to create a playground: a documentation excerpt, name of the language, and a sample file written in that language. BBEdit will then ask Apple Intelligence to create a new playground, which you can use as a starting point. + Added "Highlight Patterns" to the Setup window. A configured Highlight Pattern will match text in any open document, and highlight it using the configured color, including an alternative for Dark Mode, if desired. The pattern can be either a literal search string or a Grep pattern. (There are built-in safeguards against excessively greedy Grep patterns, but in general the more concise your pattern is, the better it will perform.) You can also configure whether a highlight pattern is active, and whether matches get tick marks in the scroll bar. Changes (addition, removal, editing) take immediate effect. You can also create a highlight pattern from within the Find window or the Live Search bar, and this will start with the contents of the search box and the associated settings. There is a setting in the Editing preferences which controls globally whether Highlight Patterns are shown (at all) and this can be configured per-language via the Custom Settings tab in the Languages preferences. * Integrated the W3C HTML5 syntax checker into the application. This provides isolation against network issues, rate limits, and service misbehavior. The HTML custom language preferences (continue to) establish the global defaults, and these may be overridden by an individual web site project's settings. The built-in checker is the default, but if desired you can use a remote checker, whether the W3C's own system or a local instance (as described in the BBEdit 16.0 change notes and elsewhere). * Added a Kotlin language module. This is prewired to use the official LSP server `kotlin-lsp`, which can be installed via `brew install kotlin-lsp`. * Added a language module for SystemVerilog. If you previously had `.sv` or other SystemVerilog file name extensions mapped to the built-in Verilog language module, remove those mappings to allow use of the new module. * Language modules may now use a `=?` prefix for values in `BBLMRunColors`. Unlike `==`, which makes one run kind a hard equivalent of another, `=?` keeps the declaring run kind visible for color scheme configuration and uses the named run kind only as the default color when the active scheme does not specify an explicit color for the declaring run kind. * There's a new color setting for "Instance variables" in the "Text Colors" settings. This depends on language modules generating the appropriate run kind, and/or LSP servers returning the appropriate semantic token kind. * Added a language module for TaskPaper, with coloring as well as navigation via the Function menu. * Added a language module for coloring and navigating `diff` output. * Fenced code blocks in Markdown documents are now syntax-colored in the language named by the block's qualifier (```python, ```js, ```diff, and so on), when a matching language module is installed. Common informal spellings (`py`, `js`, `ts`, `rb`, `yml`, `bash`, `golang`, `jsx`, `objc`, …) are understood; blocks with no qualifier, an unrecognized qualifier, or `text`/`plaintext`/`none`/`console` are colored as before. Fenced blocks also now follow CommonMark's rules: tilde fences (~~~) work, longer fences can contain shorter ones, and a closing fence must sit on its own line. Because the language inside a colored block is the real thing, some editing behaviors follow the block's language rather than Markdown's: Un/Comment inserts the code language's comment delimiters, auto-pairing follows the code language's rules, and spell checking inside code blocks now follows the code language's policy — comments and strings in code may show spelling indicators where they previously did not. These are intentional. * When displaying an image document, if BBEdit recognized any text, this can be copied via the "Copy Recognized Text" command on the Edit menu. (This is the same as Copy, Cmd-C.) "Copy & Append Recognized Text" is also available. + Added a new submenu to the Edit menu, for inserting explicit bidirectional control characters. When editing in documents containing right-to-left text (whether mixed with left-to-right text or not), these provide explicit layout and processing guidance in compatible tools. * The "Expert" preferences pane gains in-list value editing, without requiring a trip to the command line. (This doesn't alter the activation scope of any setting; settings which require relaunch or other actions to take effect will continue to do so.) * Added JSONC (JSON with comments) to the built-in JSON language module. Changes ------- * The language indicator in the status bar opens a searchable popover for available languages, rather than a long and unwieldy menu. + Settings search results (via the search box at the bottom of the Settings window sidebar) are highlighted in the respective preference panes. * SFTP connections allow for a configurable (via expert preference) keepalive interval. Subject to an expert preference, the built-in client can be instructed to honor keepalive configurations stored per-host in `~/.ssh/config`. * Made assorted changes to improve the experience when using the macOS "Writing Tools" features (macOS 15.2 and later). * `vi` keyboard emulation is disabled by default in the Find and Multi-File Search edit fields. This may be changed by setting the value of `DisableViModeInFindWindows` to `NO`, which will take effect after closing and reopening the corresponding window(s). * Added an expert preference to control whether BBEdit honors custom key bindings in `~/Library/KeyBindings/DefaultKeyBinding.dict`. It is on by default; to have BBEdit ignore that file: `defaults write com.barebones.bbedit HonorDefaultKeyBindingDict -bool NO` * Updated toolbar appearance and control layouts in the Setup window. * Promoted `OSErr` to `OSStatus` for entry point and callback return types in the plug-in language module API. This does not change the ABI, so old modules (if any exist) are still compatible. If you are (re)compiling an existing module you will need to correct any function prototypes. * The "Change Notes" command on the Help menu will open a preview window in-application displaying the change notes. Clicking the document icon in the preview window's navigation bar will open the original document in the system web browser. Performance Improvements ------------------------ * Made changes to significantly improve performance when reading in large files. * Fixed a case in which the File menu's Share submenu would be rebuilt — including a synchronous query for available sharing services — on every command keystroke, rather than only when the menu was actually opened. This improves responsiveness while typing and reduces interference with menu tracking. * Made an assortment of changes to improve performance during application startup, mostly by reducing unnecessary file system activity. * Made a change to reduce macOS mouse cursor management overhead while typing. * Substantially reduced the per-keystroke cost of syntax coloring in Markdown, CSS, and a few other language modules. * Implemented orders-of-magnitude improvements in UTF8 validation and ASCII file ingestion, which will commensurately improve load times for large files. * Implemented orders-of-magnitude performance improvements in computations that are run while loading files (and occasionally at other points). This will commensurately improve the speed of opening large files. * Made an assortment of changes to improve the performance of word counting, particularly on very large files. * Improved the performance of tag balancing and matching-tag highlighting in HTML documents which contain a large amount of embedded `script`, `style`, or PHP. * Made changes to improve the performance of spell checking and AppleScript `word` element access in very large documents. * Fixed a bug in which changing the selection near the end of a very large HTML document could take a very long time (seconds or more per click) while highlighting the matching tag pair, and "Balance Tags" could take equally long, when the document contained many sibling elements whose close tags are omitted (as HTML permits for `

`, `

  • `, ``, ``, and others). * Made a change to address a performance issue when calculating display areas for selection ranges. * Made a change to improve typesetting performance in the text engine. * Made changes to significantly improve text layout and editing performance, most noticeably in very large documents and in documents which contain many combining marks (decomposed polytonic Greek, pointed Hebrew, heavily accented transliteration, and the like). * Made a change to reduce the performance overhead of drawing the LSP status indicator (if present) in the navigation bar. * Improved the responsiveness of syntax coloring in long Markdown documents with few or no headings. Fixes ----- * This version includes extensive changes to the text engine to improve display and editing when working with documents containing text written in RTL (right-to-left) writing systems. Note for reference: when soft-wrapping text that contains RTL and other non-roman characters, character-counted soft wrapping may not wrap where you expect. This is intrinsic to the feature, since character counts are not a reliable way to determine wrap points in such writing systems. You'll obtain more consistent results when wrapping to the Page Guide or to the Window Width. * Fixed holes in settings window search, and futureproofed the mechanics. * Fixed bug in which keyboard events that arrived while waiting for the Xcode integration script to run when the Open File by Name window was invoked would end up going into the document that was active at the time, rather than into the Open File by Name window's search box. * Reworked the drawing mechanics of the folded-range placeholder, so that it looks cleaner especially at larger sizes. * The HTML/XML color scanner has been rewritten, to improve performance and correctness as well as to lay a foundation for additional enhancements. * Fixed a bug in which a syntax coloring setting whose default value is inherited from another setting did not appear in the Text Colors preferences, and so could not be customized. * Fixed a problem in which several syntax elements in JSP documents -- anchor tags, "<%@" directives, and the "%>" which closes a JSP block -- were not colored, and were not correctly accounted for when re-scanning the document after an edit. * The function scanner for HTML-family languages (and related template languages) will use placeholders in places where a blank or empty-named function menu entry might otherwise have occurred. * Fixed bug in which comment delimiters occurring within string literals in codeless language modules using Grep patterns for string and comment scanning would cause miscoloring of the string as a comment. * Fixed bug in JSON+comment parsing which could occur with backslashes inside of strings. * Made changes to avoid mutating menus from within periodic time-based operations (e.g. completion, folder-backed menu refreshes) while a menu tracking operation is in progress. (This *may* work around FB15086140, but requires a negative existence proof since it's not consistently reproducible.) * Implemented an SFTP connection timeout; this factory defaults to 30 seconds, but can be adjusted via expert preference. By default, this overrides a host-specific configuration; this too can be adjusted by an expert preference if necessary. * Fixed a problem where BBEdit could become unresponsive indefinitely if the connection to an SFTP server was lost while an operation was in progress. Such operations now report an error instead of waiting forever. * When a document that was opened from an FTP/SFTP server is rebuilt from its auto-save data after a crash or forced quit, it is now reconnected to its location on the server, rather than being recovered as an untitled document. (The document's auto-save data now includes its origin URL, never including the password; reconnection happens entirely offline, and the server is first contacted when the document is saved or reloaded, at which point authentication proceeds as usual.) If the auto-save data is unusable, or a document is already open for the same server location, recovery produces an untitled document as before. * Text filters used for previewing no longer capture the shell environment from the first filter run for the entire session; each run now uses the current environment, including the active virtual environment (if any). * Fixed a problem in which digit separators were ignored in binary literals in Python and some other languages. * Fixed a problem in which scanning an EditorConfig file would change how subsequent INI files were colored in the same application session. * Fixed a bug in which incremental syntax coloring in Markdown documents could go wrong inside blockquotes and lists (for example, list content losing its coloring, or a fenced code block typed under a list item coloring as plain text) until the document was rescanned from scratch. * Made changes to improve display and editing behavior in the presence of certain zero-width characters when "Show Invisibles" is turned off. * Fixed a bug with selection direction affinity when using a `DefaultKeyBinding.dict` file and certain keyboard equivalent assignments. * Fixed a bug in which Right Arrow and Shift-Right Arrow would not move the insertion point across, or extend the selection over, a folded range. * Fixed a regression (introduced in 16.0.2) in which Replace All in multi-file search, or applying a text factory to files, could hang indefinitely when saving an open document that had been opened from an FTP or SFTP server. The same problem could occur when saving such a document from certain alerts (for example, "Save as UTF-8"), when using "Save & Switch" to change workspaces, or when cancelling the "Saving…" sheet while BBEdit was checking the file's modification date on the server. * Fixed bug in which a very large number of LSP diagnostics would mess up layout and scrolling in the navigation bar diagnostics popover. * Made changes to state-save-at-quit to improve reliability in situations where the sleep state might get wrongly overwritten, and/or there are windows with attached sheets. * Fixed a bug in which BBEdit would stop saving its application state once a minute, for as long as it continued to run, after a Quit which did not go through (for example, because a window had a sheet open, or because an attachment script declined the Quit). State was still saved when switching to another application. * When an attachment script declines an operation, the operation is now canceled in the same way as if the user had canceled it. Previously, a script (or other application) which had asked BBEdit to close or save the document, or to quit, was told that the request had succeeded. * Fixed a regression (introduced in 14.5) in which the result of a "should" attachment script (`applicationShouldQuit`, `documentShouldClose`, `documentShouldSave`, or `documentShouldFinalizeAuthenticatedSave`) was ignored: a script which returned `false`, or which reported an error, did not prevent the operation from taking place. * Fixed bug in which changing the "Grep" check box in the Live Search bar did not immediately update the search results. * Fixed crash which would occur when using the "Use Grep" keyboard equivalent in an editing window with the "Live Search" bar hidden. * Fixed coloring goof in syntax-colored Grep Replace edit fields. * Corrected behavior of paragraph-movement key bindings from a customized `DefaultKeyBinding.dict` file. * Fixed a bug in `vi` visual mode in which reversing direction (for example, `v` `w` `w` `b` `b`) would extend the selection past its starting point, instead of first shrinking it back toward the start. * Characterwise `vi` visual mode now includes the character under the cursor in the selection. For example, `v` by itself selects one character (so `vd` deletes it), and `vwd` deletes through the first character of the next word. * Switching among `v`, `V`, and Ctrl-V in `vi` mode now keeps the selection's starting point, so (for example) `vjjV` selects all three lines. * Fixed a bug in `vi` mode in which an operator used with a find-on-line motion (such as `df,`) could act on a range starting from where an earlier operator (such as `dw`) had been used, rather than from the caret. * `[count]$` in `vi` mode now moves to the end of the line `count - 1` lines below, and `d2$` (and the like) no longer deletes the line break after the last affected line. * In `vi` mode, repeating a `t` or `T` find with `;` or `,` now moves on to the next occurrence, rather than staying put. * In `vi` mode, `$`, `0`, `^`, and `w` now act on the current line after `j` or `k` moves the caret onto an empty line, rather than on the line below it. * Leaving `vi` visual mode no longer adds an entry to the Jump Back history. * [552469] Fixed crash which could randomly occur when dismissing the Multi-File Search window via certain events, and an error occurred in the interval between the event and the actual window closure. * [552466] Fixed bug in which the block or underscore cursor would be very narrow at the hard end of a soft-wrapped line. * [552466] Fixed bug in which, in a soft-wrapped document, the insertion point could be drawn at the end of the previous display line (rather than at the start of the line it was actually on) after an operation that placed it at the start of a line, such as "Go Back" or `cc`, `o`, or `O` in `vi` mode. * [538037] Fixed a crash that could occur when choosing an item from a search history menu, or toggling Grep, shortly after closing the Find window while a live-match search was still running. * Closed a behavior gap between instaprojects and browser windows, in which the former didn't display content thumbnails for files that BBEdit doesn't support editing. * Fixed bug in which adding a document to an editing window without selecting it would hide the "No Editor" placeholder, leaving the editing area blank until something else was selected. (This happens with a project window's own project document, and when moving, merging, or gathering documents into a project window.) The placeholder is now hidden only when the added document is selected, or while application state is being restored. *fin*