BBEdit 16.1 Release Notes

BBEdit 16.1 is a feature update, which includes significant new features; visible changes to existing features; and fixes for reported issues.

Because BBEdit 16.1 builds on features that were added as part of the BBEdit 16.0 release (as well as previous versions), please take a few moments to browse the release notes archive and review the release notes for any versions that you may not have seen.

To get a high-level overview of what’s new in BBEdit 16, with screen shots, see the What’s New in BBEdit 16 page.

For detailed information on using any of BBEdit’s features, please refer to the user manual (choose “User Manual” from BBEdit’s Help menu).

Requirements

BBEdit 16 requires macOS 14.0 or later.

For whichever version of macOS you are using, please make sure that you have updated to the latest available OS version. This will resolve any functional issues caused by bugs and regressions in out-of-date versions of the OS.

Upgrading

If you have been using any previous version of BBEdit in Free Mode, starting BBEdit 16.0 will reset your 30-day evaluation period, so that you can have a full trial of the new features.

If you have previously purchased a license from us for BBEdit 15 or older, you will have a full 30-day evaluation period in which to try out BBEdit 16’s new features. License upgrades are available at a discount for existing customers, and some customers may be eligible for a free upgrade (based on date of purchase). Please see the BBEdit upgrades page for information and instructions.

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.

    Documentation for Language Playgrounds is available in this technical note.

    Documentation for Declarative Language Modules is available in this technical note.

  • 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.

back to top

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.

back to top

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 <p>, <li>, <td>, <tr>, 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.

  • Fixed bug in which BBEdit could appear to hang at startup while it collected the environment from a slow login shell (for example, one whose startup files run a lengthy or interactive script). Collecting the login environment, finding git, and starting conda support now happen in the background, so a slow login shell no longer holds up startup.

  • Reduced the time it takes to load language modules at startup. Documents that are opened or reopened at startup wait for the language modules to finish loading, so they now appear sooner.

  • Made a change to reduce application startup time by not unnecessarily checking in with the system color panel.

  • Fixed a case in which BBEdit could stop responding for up to a few seconds after reopening documents at startup, while it started the language servers for those documents one after another. BBEdit no longer waits for each server to finish starting up; the servers start at the same time, and documents are registered with each one as soon as it’s ready.

  • Fixed a case in which BBEdit could be slow to respond at startup, and while showing a Live Preview, when one or more Notebooks were open.

  • When the Open File by Name window is reopened at startup, it no longer gathers its list of candidate files (which may involve significant work) before the rest of the state is restored; this could hold up startup for a second or more. The window now gathers its list once it’s in front.

  • Improved the performance of Open File by Name when it gathers the files in an Xcode project or workspace.

  • Improved the responsiveness of Open File by Name as you type when a Notebook is available.

  • Improved the responsiveness of Open File by Name when its window comes to the front.

  • Improved performance when closing windows and quitting with many documents open, and in other operations that need the front-to-back order of BBEdit’s windows (such as Open File by Name).

  • Made a change to reduce overhead when quitting language servers during application quit.

  • Improved responsiveness right after startup, when language servers start for the reopened documents.

  • Improved performance when reopening windows at startup, and when opening several documents into a new window.

back to top

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.

  • 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.

  • Fixed bug in which the block or underscore cursor would be very narrow at the hard end of a soft-wrapped line.

  • 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.

  • 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.

  • Fixed bug in which the time limit BBEdit applies when collecting the login shell’s environment, and certain other behind-the-scenes commands, was not reliably enforced. The limit for collecting the login environment is now 5 seconds.

  • Fixed a case in which BBEdit could cause macOS to offer to install the command line developer tools, when checking for Git-ignored files on a Mac that doesn’t have them installed.

  • Fixed bug in which Open File by Name could show out-of-date results for a BBEdit project: files added to, removed from, or renamed in the project’s folders weren’t noticed until the project itself changed, another project came to the front, or BBEdit was relaunched. This also fixes a problem in which BBEdit would collect file system event monitors over the course of a session, each of which did unnecessary work every time a file in the project’s folders changed.

  • Fixed a bug in which Open File by Name could occasionally ignore the results of a search that finished very quickly: the list kept showing the previous results, and the progress indicator kept spinning, until you typed another character.

  • Fixed a possible crash in Open File by Name if you closed its window while a search was in progress and then changed a file in the project, switched projects, or used Open Counterpart or open an included file before the search finished.

  • Fixed bug in which notebook search would omit matches when the indexing system didn’t return content for a candidate (which usually happened with very large notes).

  • Fixed a bug in which the Window menu would occasionally show the Scripts, Clippings, Git, Subversion, or Debug menu’s icon next to items for windows containing more than one document.

  • Fixed a bug in which the “Speak items under the pointer” accessibility feature would not speak the text or line number under the pointer in editing windows on macOS 26.

  • Refined the AppleScript quarantine check so that scripts that the OS has quarantined as a result of BBEdit’s own operations (such as running a script which has persistent properties and subsequently saving it back to disk) will be allowed to run.

  • Fixed bug in which saving externally editing an AppleScript while it was running from the Scripts menu (for example, while it was waiting at a “choose folder” dialog) could cause BBEdit to replace the newly saved script with the old version when the script finished running, in cases where the script had stored properties that it modified.

back to top