BBEdit 15.0 Release Notes

BBEdit 15.0 is a major upgrade, which includes significant new features; visible changes to existing features; and fixes for reported issues.

Because BBEdit 15 builds on features that were added during the BBEdit 14 cycle (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 15, with screen shots, see the What's New in BBEdit 15 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).


BBEdit 15 requires Mac OS X 11.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 is particularly important in the case of macOS Sonoma (14.x), which contains bugs and regressions that affect BBEdit's operation.


If you have been using any previous version of BBEdit in Free Mode, starting BBEdit 15.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 14 or older, you will have a full 30-day evaluation period in which to try out BBEdit 15'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.


  • BBEdit's "project" feature gets a set of enhancements and changes, as follows:

    • A project document on disk has a top-level item in the list which reflects the project itself; all other items in the project are subordinate.

      Clicking on the project item display configuration and settings for the project itself.

    • The "Workspace" settings are for specifying which directory represents the root of the workspace; that is, the directory containing all of the files which are functionally important to the project.

      This concept is (intentionally) vague, since the notion of a workspace's functional root may vary depending on what the project is. For example, a software project for macOS might use the directory containing the Xcode project document; or a Node.js development project root would be determined by the location of its package.json file.

      If you set a project's workspace root to "Automatic", BBEdit will guess the workspace root based on various rules (which are intentionally undocumented because they are subject to change). In the simplest case, if the project has only one item at the top level, and it's a directory, then that directory is assumed to be the project's root. If the project has multiple top-level directories, then their common ancestor (if any) is the workspace root.

      If you need more flexibility, or if the "Automatic" setting does not select the appropriate workspace root, you can select an explicit root directory. This does not have to be a directory in the project; it can be anywhere.

      The workspace root setting (whether automatic or explicit) is also relevant to BBEdit's Git support, and to its Language Protocol Server support.

      If the workspace root contains a Git working copy, BBEdit will use the workspace root as the working directory for commands on the Git menu. Otherwise, BBEdit will attempt to locate the nearest ancestor which contains a Git working copy, and use that instead.

      BBEdit will also relay the project's workspace root (along with the workspace roots of any other open projects) to any running language servers, as long as they advertise support for workspaces. (Not all of them do.) In language servers that support it, providing the project's workspace will improve the completeness and accuracy of code completion and other features which rely on LSP-based code indexing.

      When running a Unix script via the #! menu or during clipping insertion, if the active document is in an open project, BBEdit will set the BB_DOC_WORKSPACE_ROOT environment variable to the project's configured workspace root.

    • The "Web Site Settings" provide configuration for projects which rely on BBEdit's built-in HTML markup and static site generation tools. (These settings replace the "Site Settings" panel used in previous versions.)

      The Web Site settings view also includes new controls for HTML syntax and link checking options; these are useful for controlling the respective checking behaviors on a per-project basis.

    • The directory path buttons in the project settings present a list of candidate directories, including the project's workspace root any explicit top-level folder items, as well as an "Other" command to choose an arbitrary directory.

    • The old "Site Settings" command on the sidebar "cloud" menu in project documents is renamed to "Project Settings", and selects the settings pane rather than bringing up a modal panel.

  • A "Minimap" palette is available, on the Palettes submenu of the Window menu. The minimap shows a scaled-down view of the active text document.

    Clicking or dragging in the minimap makes a corresponding selection change in the active text document; and likewise, changing the selection in the active document will update the displayed selection change in the minimap.

    (For greater visibility, an empty selection range in the active document is shown as a highlighted bar across the minimap.)

    The minimap will also highlight (using the Page Guide color) the range of text currently visible in the active document. Scrolling the active document will move the highlighting in the minimap.

  • There's a new document type, "ChatGPT Worksheet". This is created from File => New as with other document types, and provides an interface for conversational exchanges with ChatGPT.

    In order to use this feature, you will need a ChatGPT account, and an API key.

    If you already have an account, you can generate an API key here:

    If you need an account, start here:

    Please note that we cannot provide account or technical support for ChatGPT or other OpenAI products.

    Note that use of the ChatGPT API is not free, but it's not terribly expensive, either. We're not collecting any money from this feature.

    The first time you send a query to ChatGPT, BBEdit will prompt you to provide your API key. It's a shared secret, so BBEdit will store it securely in the macOS keychain.

    If your ChatGPT API usage requires an organization ID, use the following expert preference to set it:

    defaults write com.barebones.bbedit ChatGPTOrganizationID -string "<organization ID goes here>"

    Use an empty string or delete the setting to omit the organization ID from API requests.

    ChatGPT worksheets work similarly to a shell worksheet: type something in, and press the Enter key to send it to ChatGPT. (You can also use the "Send Command" keyboard equivalent, as set in the "Worksheets" section of BBEdit's "Menus & Shortcuts" preferences. The default for this command is Control-Return.) After some period of time, you'll receive a response which BBEdit will insert into the document window.

    If you wish to cancel your request before the response arrives, Command-period or Control-C will do that.

    Responses from ChatGPT are automatically quoted, as long as the worksheet's language is set to "Markdown". If you change the worksheet's language, this quoting will not occur.

    (Since worksheets are Markdown, you can use "Preview in BBEdit" on a worksheet to visualize it.)

    Because chats depend heavily on history, a worksheet saves your prompts and the server's responses. Thus, the document size will grow over time and context is preserved, even if you delete previous prompts and responses from the text area.

    The "ChatGPT Worksheets" preferences can be used to set the default model. There's a predefined list, but the model is specified in an edit field so you can write in your own model if it's not listed. Choosing a nonexistent or unsupported model may result in unexpected behavior.

    You can change a worksheet's model on the fly via the status item below the text area.

    Saved project documents on disk get an additional item in the "Worksheets & Scratchpad" section for a project-specific ChatGPT worksheet.

    Privacy statement: All queries and responses sent between BBEdit worksheets and the ChatGPT API are transmitted securely, and directly between BBEdit and the API endpoint. Bare Bones Software does not receive or retain any data transmitted thereby. Your conversations with the API service are governed by the API service provider’s own privacy and content policies.

  • New feature: Expandable “Cheat Sheets”. A cheat sheet is intended to be a quick “training wheels” reference for pieces of text that you can never quite remember how to type. The built-in examples are for Markdown and Clippings placeholders; but of course you can write your own.

    To use a cheat sheet, choose it from the "Cheat Sheets" submenu of the Window menu. This will open a floating window which displays the contents of the cheat sheet. The left-hand column shows the text of the "cheat", and the right-hand column shows a brief description.

    Double-clicking on the item in the cheat sheet will insert it into the active text document, if there is one. You can also drag the item from the cheat sheet to wherever you'd like to insert it.

    When inserting the item from the cheat sheet, BBEdit will expand any Clippings placeholders present in the text, if the cheat sheet author specified that this should be done. Otherwise, the text is inserted literally. (For example, items in the Clippings cheat sheet itself are inserted literally, to speed the process of authoring clippings.)

    Cheat sheets may display a preview of the text that will be inserted, along with the full text of the description (which is helpful if it is long). The Clippings cheat sheet does this as well.

    You can create and add your own cheat sheets to BBEdit. This documentation describes the file format and implementation of cheat sheets.

  • The "Text Merge" command on the Text menu provides a new way to transform text in files, by employing a file containing a Grep search and replace pattern along with a table of substitution values.

    Each match of the search pattern is processed using the replace pattern, and the table of substitution values is used to provide substitutions for each respective capture group reference in the replacement.

    Here is a simple contrived example to illustrate.

    Consider a file consisting (entirely) of the following:


    If you wanted to transform the first letter ("a", "b", "c", etc) to the corresponding NATO alphabet name ("alpha", "baker", "charlie", etc) and each number to the corresponding spelled-out word, the search pattern to match these would be: (\w)(\d+).

    To replace each letter with the NATO spelling, and each number with the full spelling, the replacement pattern would be: \1 \2.

    The corresponding replacements can be expressed as a list of pairs:

    alpha   one
    baker   two
    charlie three
    delta   four
    echo    five
    foxtrot six
    golf    seven
    hotel   eight
    india   nine
    juliett ten

    So instead of needing to perform sequential Grep replacements with different values for different matches, Text Merge provides the mechanics to do the replacements sequentially. The instructions for the merge operation are specified in the "merge file"; when you choose the "Text Merge" command from the Text menu, select the merge file to apply to the active document.

    Here is a fully expressed and annotated merge file, with comments that describe the construction of the file:

    # -*- x-bbedit-merge-case-sensitive: 0; x-bbedit-merge-match-words: 0; -*-
    # Notes: "MAY", "SHOULD" and "MUST" are used in the RFC sense.
    # Comment lines begin with `#`; blank lines are ignored
    # The file MUST consist of three sections, each prefixed by a non-comment line containing
    # three dashes in a row by themselves: `---`
    # The first delimiter indicates the beginning of the search pattern.
    # The second delimiter indicates the beginning of the replace pattern (and implicitly
    # the end of the search pattern).
    # The third delimiter indicates the beginning of the capture group substitution table
    # (and implicitly the end of the replace pattern).
    # In the following example, the search pattern is `(\w+)(\d+)` and the replace pattern is
    # `\1 => \2`:
    \1 => \2
    # You can specify multi-line patterns using `(?x)` as usual. Note that in all cases, the
    # pattern ends at the last character before the line break immediately preceding the `---`.
    # Following the (optional) search and replace patterns are the capture group substitutions.
    # These are tab-delimited columns of literal strings; the Nth column corresponds to the
    # Nth substitution group (counting starts at "1", i.e. the first column is used for "\1",
    # the second column is used for "\2", and so forth.). There SHOULD be as many columns as
    # there are capture groups in the search pattern. Any capture group references that exceed
    # the column count (e.g. "\4" when there are only three columns) are substituted with 
    # an empty string.
    # There SHOULD be at least as many rows provided as you expect to need; searching and 
    # substitution will end after the last row has been consumed, even if there are matches
    # remaining in the input file(s).
    alpha   one
    baker   two
    charlie three
    delta   four
    echo    five
    foxtrot six
    golf    seven
    hotel   eight
    india   nine
    juliett ten
    # You SHOULD use an Emacs-style mode line to specify options for the merge.
    # (This ensures maximum portability of the merge file.) The two options are
    # `x-bbedit-merge-case-sensitive` and `x-bbedit-merge-match-words`,
    # which (respectively) control the case-sensitivity of the pattern match
    # and enforce whether it should begin and end on word boundaries.

    Here is the same merge file, without the documentation:

    # -*- x-bbedit-merge-case-sensitive: 0; x-bbedit-merge-match-words: 0; -*-
    \1 => \2
    alpha   one
    baker   two
    charlie three
    delta   four
    echo    five
    foxtrot six
    golf    seven
    hotel   eight
    india   nine
    juliett ten

    Note that in the example provided above, the ordering of the pairs is purely incidental. Pairs are used in the order that they are listed in the merge file, consistent with the order that each Grep match is found (starting at the beginning of the document), not in any intrinsic alphabetic (or other) ordering.

  • The Git menu gets commands to push and pull the current branch to/from its remote.

  • The contextual menu for Git items in projects and results windows gets a "Discard Changes" command.

  • When choosing the "Open Recent" item on the File menu (directly), rather than anything off the submenu, BBEdit will open a panel listing all recent items and currently open documents. You can use the search field at the top to filter the results and find the desired item. (You can also select and open multiple items in the list, if desired.)

    The items in the Open Recent panel are sorted in the same order as they appear on the menu. If this confuses you, the search box is your friend.

    There is a corresponding entry in the "Menus & Shortcuts" preferences, so you can assign a keyboard equivalent if desired.

  • If there is a historical backups folder present, the "Text Files" preferences will compute the space used by the files therein, and display the total. Additionally, a button is present which will open the historical backups folder in the Finder. (This folder is also available as the "Document Backups" item on the Folders submenu of the application menu, as well as in the Folders panel of the Setup window.)

  • When "Grep" is turned on in the Find and Multi-File Search windows, BBEdit will validate the pattern as you edit it. An indicator button will display the validation status of the pattern; you can click on it for information about the specific error.

  • Added command to the View menu: Re-Center Selection. This performs the same operation as the Emacs "recenter" command (Control-l), and scrolls the line containing the insertion point to the center of the view area (or as close to it as possible). If the selection range is non-empty and longer than the visible area, choosing the command repeatedly will alternate between centering the start and end of the selection range.

  • The connection panel in FTP/SFTP browser windows (and "Save to FTP/SFTP Server") supports choosing an identity file (SSH private key) for SFTP connections only. If you're using a service that requires this, it's simpler than modifying ~/.ssh/config (although that is an option too, still).

    If you enable "Use SSH Identity" and choose a file, BBEdit will show a warning indicator next to the file's path if the file's permissions are not 0600 (readable by owner only). That's because SSH will refuse to use the private key file if its permissions are not 0600.

    If you subsequently move or delete the identity file, BBEdit will show a warning indicator next to the file's path if it's not found.

  • The navigation bar for text documents includes an item which lists recent SCM revisions (git and/or Subversion) as well as recent file system recorded versions of the file. This can be used as a shortcut to compare a file against a recent revision.

    Each group of revisions (if applicable) displays the six most recent versions; if there are more then there will be a command which presents an interface for choosing from the entire list.

    Revisions are listed in reverse chronological order, so that the most recent ones are at the top of the list.

  • The Sidebar preferences have a setting: "Allow keyboard focus". When this is turned on (as it is by default, or if you previously used the expert preference), the sidebar lists in projects, and multi-document windows can acquire keyboard focus (by clicking or tabbing into them), and then conventional keyboard navigation gestures will change the selection.

    With this change, sidebar behavior is changed somewhat (tl;dr: it's like Xcode):

    • the selection highlighting reflects whether or not the sidebar has keyboard focus; the background always reflects the activation state of the window.

    • When you click in the side bar to select something, keyboard focus goes there (assuming the preference in "Sidebar" is turned on, as it is by default now). Any single click will select a new file, but does not move keyboard focus to the text view. You can double-click on an item, press Return/Enter, or use the Tab key to move keyboard focus as desired.

  • Differences windows gain keyboard navigation in the sidebar, which was not previously possible.

  • The FTP/SFTP browser window list font size follows the "List display font size" appearance preference setting.

  • The various list-based palettes (Scripts, Text Filters, Clippings, Jump Points, Markers, and Functions) will use the "List Font Size" appearance preference to determine the font size of their list content.

  • To validate a codeless language module, open it and choose "Check Syntax" from the #! menu. This is the same check that is done when loading the module at startup, and will report anything untoward.

  • The "Expert Preferences" section of the Preferences window lists available expert preferences (which can be manipulated from the command line), their current values, and their default values. Preferences which have been changed appear in boldface in the list. You can use the search box to filter the list by name.

    Selecting one or more items from the list of expert preferences will enable the "Copy" command on the Edit menu. Choosing this command will copy formatted "defaults write" commands to the clipboard; they can then be pasted into a shell worksheet or a Terminal window for editing and execution. (The copied commands will reflect the default values for the respective preferences.)

  • You can choose your desired insertion point cursor style in the Editing preferences; the options are "Vertical bar" (the default, for all right-thinking Mac users); Block; and Underline. (Note that if you use the Underline cursor, we recommend that you change the style for "Display instances of selected text" to "Highlight".)

  • The "Default page" setting in the "General" section of a project's site settings can accept a comma-separated list of default file names. Thus, if you want both "index.html" and "index.php" to be recognized as default page targets when checking links, you would enter "index.html, index.php" in that field. (This is just an example; both of those will be recognized by default.)

  • "Save a Copy" is enabled for live HTML preview windows; thus you can save a copy of the rendered HTML of a document being previewed. (This can be useful in cases where the HTML was generated by a Markdown renderer or preview filter.)

  • Added a keyboard equivalent assignment for the Cursor Position status bar item; you can use this to bring up the alternative "Go to Line" interface (i.e. use Command-J to use this as an alternative for the "Line Number" command on the Go menu).

  • New text transform: "Normalize Spaces". When used from the Text menu, scripting interface, or text factory, this transforms turns printable nonbreaking spaces into ASCII “space” characters. This is useful for cleaning up text copied from web pages, which is frequently rendered using nonbreaking spaces of various sorts.

  • The "Process Duplicate Lines" command gets a new output option: "Keep matched lines sorted". This does pretty much what it says; in the output of any remaining lines, the lines will be sorted according to the various sorting/matching criteria specified elsewhere in the options. This can be useful for saving a step in cases where the existing order of the input lines is not important, and you need for the de-duplicated lines to be sorted in order.

  • Added "Remove Line Breaks" as an available option for text factories (and "Apply Text Transform"), as well as via the AppleScript interface (as "unwrap") for processing arbitrary text not in a document.

  • The "Insert" submenu of the Edit menu has been rearranged a bit, and gains some new items. Sharp-eyed readers may recognize the additional items as being derived directly from Clippings placeholders.

  • The CSS media type control makes a triumphant return to the live preview window's navigation bar.

  • Added an entry to the application properties so that BBEdit appears as an eligible application to open EPUB containers.

  • Fixed bug in which pasting multi-line text into the "Set Marker" panel (and other commands which used the same "enter a string" UI mechanics) did not behave as intended.

  • Single-file Find All, Extract, and Replace All operations display determinate progress; though if you ever see the progress panel, you are probably doing some seriously heavy lifting.

  • "Restore Defaults" in the Preferences window will, when appropriate, show displayable names for the preferences whose values will be reset. This includes expert preferences.

  • Added window-modal progress for Git "Show Blame" and "Show Revision History" (each of which is likely to take a nontrivial amount of time).

  • The "Copy" command is enabled when there is a selection in the FTP/SFTP browser window; choosing it will copy the URL(s) of the selected item(s) in the browser window.

  • Added "Commit" to the contextual menu for Git commands in sidebars and results lists.

  • "Compare Against Disk File" is available in the sidebar contextual menu as well as the file revisions navigation bar item, when appropriate (for file-backed text documents with unsaved changes).

  • The "Run Unix Command" panel gets a button to save a script (or filter, depending on the selected output option) directly into BBEdit's "Text Filters" or "Scripts" support folder. (Or anywhere else you like, but those are the locations of immediate relevance.)

  • Added "Run Unix Command" to the list of available operations in text factories. This functions similarly to "Run Unix Script", but the script text is stored within the factory itself, which makes the factory more portable.

  • Instaprojects (created by opening a folder) will remember their position and properties, keyed by the folder location.

  • The SGML/HTML syntax checker and the link checker will now check for the use of explicit file:// URLs as attribute values. These are problematic because they're nonportable and many web browsers will refuse to render them even locally, for security reasons.

  • "Check Links" will now warn of explicit file:// URLs; projects have a setting to control this behavior when using "Check Site Links". (It is on by default.)

  • The bbedit command-line tool gets a new argument: --preview. You can use this to open a preview on an existing file, remote URL, or pipe data without opening a document. (verb. sap: BBEdit is still not a web browser.)

    A use case for this might be to use BBEdit as a rendering endpoint for a workflow that generates HTML output (such as pandoc).

  • Document state storage (selection range, folds, markers, etc) is now applied for documents opened via the built-in FTP/SFTP support.

back to top


  • We have reworked the interface for creating and editing Text Factories. Instead of an in-item popup menu, each step in the factory is created as needed by selecting an operation from the list on the left. (As a bonus, now you can see all of the available operations, each with a brief description.) This can be done by double-clicking on one, selecting one and using the "+" button at the bottom of the list, or by dragging the operation into an existing list.

  • The "Go to Line" panel (via the "Go" menu) operates similarly to the "Commands" panel, so as to work around limitations caused by the previous sheet presentation. It can be dragged around by clicking anywhere in the window (other than the text field); use Return or Enter to confirm, and Escape or Command-Period to dismiss.

  • Unsaved documents in the sidebar have a bullet indicator on the left side of the sidebar; this may be more visible in some cases than the highlighting of the "x" close widget.

    The same indicator is used next to the document save date in the status bar, just below the text area.

  • Since output log files are autosaved, the "Run with Options" panel from the #! menu no longer provides an option for "Save after writing".

  • The "Live Search" bar has been reworked. The presentation for Grep pattern validation matches that used elsewhere; and the search box is now allowed to be much wider.

  • If for some reason you want to reset the "untitled document" counting number, run this command in Terminal:

    defaults write com.barebones.bbedit ResetUntitledDocumentsCountAtNextStartup -bool YES

    This will take effect the next time you start the application.

  • Added "Cut Line", "Cut Line & Append", "Copy Line", and "Copy Line & Append" to the Edit menu, as modifiers of Cut/Copy. (The factory defaults are Control for the non-append versions, and Control-Shift for the append versions.) These can be used to perform the respective operations on a line without needing to select it.

  • "Push to Remote" on the Git menu now lists only the local branches, which should make it a little simpler to use.

  • Made a change so that file uploads by saving a document via the built-in FTP/SFTP support are "safe" by default: the file is uploaded to a temporary file in the destination directory. Once that is successful, the existing copy (if any) is deleted, and the temporary upload file is renamed. This adds a measure of protection against various things that can go wrong during file uploads, but there is no substitute for keeping both your local files and the remote server backed up. NB: file uploads during site deployment are not "safe" in this fashion; these work the same as before.

  • This version includes numerous internal and architecture changes to improve application accessibility; this includes compatibility with VoiceOver, Full Keyboard Access, and external applications which use the system accessibility mechanisms to control the application. (If you use an application of this sort and it is not compatible with BBEdit, please contact the application's developer for assistance; we will be happy to work with them to ensure the best possible experience.)

  • When choosing a Git working-copy command, the application will try to figure out what the working copy is from context, and if so will spare the extra step of prompting.

  • Prettied up the presentation of folder-qualified items in the "Search" menu (Find in Project, Find in Disk Browser, and so forth).

  • Removed the "sandboxed" annotation from the About window, since it doesn't add any information. (All versions of BBEdit since 12.6 are sandboxed.)

  • Made a change so that the "Keep historical backups" preference (Text Files) is the default behavior when backups are turned on.

  • Made a change to nominally improve search performance in multi-file search/replace operations involving complicated Grep patterns.

  • Results in the Open File by Name window have their names annotated with Finder tags, if any. This replaces the previous coloring of the icon.

  • The file name in the Info panel is enabled for FTP/SFTP items so that it is selectable and copyable. (It remains non-editable, intentionally.)

  • Updated the style of the "Enable All" and "Disable All" buttons in the Text Encoding preferences pane.

  • On the context menu in text views, choosing the "head" item for the "Definitions" and "References" submenus functions the same as choosing "Show All" from the submenu. (This makes life easier in cases where the submenu is long enough that "Show All" is not easily reachable.)

  • Turning on the "{Sort,Match} using pattern" option for Sort Lines and Process Duplicate Lines (respectively) will place keyboard focus into the pattern editor field.

  • Changes to the "Check Out Branch" panel:

    • list only local branches

    • select the active branch in the branch list

  • Made a change so that COMMIT_EDITMSG and MERGE_MSG files are assumed to be Git commit message files, without requiring them to be explicitly mapped. Such files will get the correct coloring when using BBEdit as a Git commit editor.

  • For language module developers: BBLMParamBlock.fDocumentLocation is non-NIL when guessing for a file. This is not a substitute for explicitly listing files (or wildcards) in BBLMFileNamesToMatch, but may be useful in cases where knowing a file's name or location on disk may assist the guesswork.

  • For language module developers: languages which do not generate their own runs for numbers can support recognition of number separators by adding a BBLMDigitSeparator key to the language properties. This is a string, and should be one character long (but if it's longer, the language module police won't come to your house).

    Here is an example of an underscore used as the digit separator:

  • Made changes so that the user manual download from the Help menu is modeless, allowing use of the application to continue while the download is in progress.

  • The progress display for multi-file search processes has an updated appearance.

  • Updated the iconography in the Differences window list toolbar and the Preview in BBEdit toolbar.

  • Changed "Shell Worksheets" to "Worksheets" in the Menus & Shortcuts preferences, since the command binding there applies to ChatGPT worksheets as well.

  • Made a change to the Markdown color scanner, so that underscores that aren't immediately preceded by a whitespace character don't trigger coloring of an emphasized range. (This is not strictly in the letter of the Markdown specification, but is consistent with common usage.)

  • Edit => Insert => Folder Listing is somewhat faster than before, and runs window-modally.

  • Untitled documents created with the "New HTML Document" command are no longer marked as modified initially.

  • Reworked the Text Colors preferences; all of the settings are now in the list. This cleans up the layout and makes room for future expansion.

  • Corrected some layout issues in the Appearance preferences pane.

  • Did some minor rearranging in the Sidebar preferences pane.

  • Document icons in the sidebar list are scaled with the text size.

back to top


  • The language module used in the Git commit window no longer tries to color numbers.

  • Fixed bug in which Subversion commands would appear on the contextual menu when right-clicking files in a results list that were in a Git working copy.

  • Made a change to (significantly, in some cases) reduce the memory required to store symbol names read from ctags data files when used for syntax coloring.

  • Changes to improve performance significantly when closing a window containing a very large number of documents.

  • Fixed small memory leak which would occur when cancelling a file transfer connection in progress from the "Save to FTP/SFTP Server" command.

  • Made a change to improve performance when closing windows with very long lists in them (such as results lists).

  • Fixed bug in which dragging the window title bar proxy icon representing an untitled document into the sidebar of another window would have no effect.

  • Fixed formatting of line numbers in the "Go to Named Symbol" sheet.

  • Made changes to improve compatibility with the phpactor language server.

  • Some language servers use "${0}" as the terminal placeholder when generating completions; this does not appear to be documented anywhere, but is now recognized and handled appropriately.

  • Fixed bug in the Git revision picker and stash picker sheets in which the first item of the list was scrolled out of view.

  • Fixed bug in which backspacing over certain zero-width characters which were displayed as gremlins would not work correctly, when "Show Invisibles" was turned off.

  • Made a change so that the Git branch status navigation bar item doesn't spend any time updating itself at application activation if it's not visible.

  • Fixed bug in which the "Compare Arbitrary Revisions" sheet for Git was resizable horizontally, but not vertically (rather than the opposite); and horizontally resizing would mis-shape the tables.

  • When using a disk browser to explore a Zip or Tar archive (or a Zip- or tar-based archive format), view image files as intended rather than as raw data.

  • Made a change to resolve the 12003 error which would occur when attempting to apply a Grep match that hadn't been calculated yet, usually by choosing "Replace" or "Replace & Find Again" subsequent to a multi-file search operation.

  • Updated the built-in list of PHP language keywords (and reserved words).

  • The Git "Push to Remote" panel now selects the active local branch in the branch list.

  • Fixed bug in the Git "Push to Remote" panel in which the "Add Upstream References" didn't relocate correctly when resizing the window.

  • Fixed a bug in which using "Preview in BBEdit" on a document which didn't support syntax coloring (such as "Text File" or "(none)") would generate an empty preview.

  • Fixed bug in which "Revert" for an unsaved text factory document didn't warn you that the operation could not be undone.

  • Made a fix so that unresolved file references from "Run AppleScript" and "Run Unix Script" operations in text factories are displayed and can be edited using the "Options" panel, rather than being reset and hidden.

  • Changed "a warning" to "an error" at an important point in the bbresults(1) man page.

  • Fixed bug in which the "Forget Item" button in the alert presented for a missing item chosen from the "Open Recent" menu would not always forget. ("Pepperidge Farm remembers...")

  • Fixed bug in which the Open File by Name window did not always get the memo when a Git branch change was made, and would show stale search results (either by omitting files that were present after the branch change, or including files that were hidden by the branch change).

  • When using the "Remove" command to delete files from a Git repository, BBEdit will close the corresponding documents, if appropriate.

  • Made changes to the application-activation behavior of the command-line tools to conform with best-practices guidance when running on macOS 14.

  • Worked around a regression in macOS 14 which prevented the About window credits from displaying until the mouse passed over the text area.

  • Corrected coloring behavior of @escaping attribute in Swift source files.

  • Made corrections and improvements to the choice of icon drawn for Zip/tarball items in disk browser windows.

  • Fixed bug in which a couple of Search menu commands would behave strangely when applied to an editing window that was in full-screen mode with the Find window in front of it (but without focus, due to having clicked in the editing window).

  • The C-family language module treats ' as a digit separator, where appropriate.

  • Updated the Swift, Java, Ruby, Perl, and Pascal syntax coloring to handle underscore as a digit separator in number literals.

  • Reworked the internals and UI mechanics for progress in the Multi-File Search results window. This improves performance, and should resolve a sporadically reported crash. (There are also some minor appearance changes.)

  • Fixed bug in which Markdown hashtags at the beginning of a line were misparsed as headings.

  • Fixed crash caused by an invalid value returned from a language server in response to a completion request.

  • When creating a new file or folder in an instaproject, the newly created item gets selected in the Project list.

  • Pass the line/column number specifiers through when creating a note from the command line by piping something into bbedit --note.

  • Fixed bug in which the edit fields in the Find and Multi-File Search windows would inappropriately use typographer's quotes when the global preference was turned on.

  • Fixed bug in which Control-C did not work as intended to cancel a pending worksheet operation when Emacs keyboard emulation was enabled.

  • When creating a new HTML5 document or changing character set markup, generate the empty tags as plain HTML rather than empty XML tags.

  • Made a change to reduce the creation of extraneous LSP log files for languages which did not have a server configured.

  • Work around OS misbehavior that would cause the application to hang while updating the Search menu, in the instance that one or more remembered multi-file search sources was on a remote file server that was unreachable.

  • Adjusted layout in the evaluation splash screen.

  • Made a change that might fix a layout problem in the "Go to Named Symbol" sheet.

  • Fixed bug in which a document with unsaved state (but no unsaved changes) would report an error when closing its window, in cases where the backing file had been deleted.

  • Indented heredoc/nowdoc terminators will no longer confuse fold generation in PHP files.

  • Fixed bug in embedded PHP scanning in which a PHP variable following the processing instruction without any intervening whitespace (e.g. <?=$foo?>) was not colored as expected.

  • Worked around macOS Sonoma misfeature in which date/time strings with meridian qualifiers generated from the "Insert" submenu commands and placeholder substitution would contain non-ASCII space characters.

  • Fixed bug in which the live-match status in the Find window didn't update after performing a "Replace & Find" on the last match for the search string/pattern.

  • Zero-width Unicode formatting characters are (once again) displayed when "Show Invisibles" is turned on.

  • Fixed bug in which it was possible to turn off all three of the primary options for Zap Gremlins, at which point it did nothing.

  • Fixed bug in which Grep replacements using capture groups from patterns which employed \K would not behave correctly.

  • Fixed bug in the Pattern Playground in which it would misreport the number of matches in Grep patterns which potentially reported a zero-length match.

  • Fixed bug in which HTML docstrings in Python that began with a backslash were not colored as HTML.

  • Worked around an OS misbehavior in which running an error report sheet over the Get Info popover would cause problems when dismissing the popover while the sheet was still up. (It was probably a bad idea, anyway.)

  • Fixed bug in which final after a struct/class typedef would confuse the C++ function scanner.

  • Made a change to work around unwanted Spaces behavior when invoking the completion, LSP symbol help, or LSP parameter help panels.

  • Fixed bug in which URLs which required percent-escape encoding for correctness as HTML attribute values did not issue a warning.

  • Fixed bug in which using the "Rename" button in the FTP browser info panel didn't update the name in the listing until a manual refresh.

  • Improved reliability of Unix worksheet process cancellation (via Ctl-C or the "x" widget in the status display).

  • Made a change to improve CPU efficiency in Unix worksheets.

  • Saving a document opened from an FTP/SFTP server will update its modification date in the applicable FTP browser listing.

  • Fixed bug in horizontal scrollbar calibration on files with extremely long lines.

  • Corrected behavior of PHP function scanning when used with unionized function return types.

  • Made a change so that ODB editor suite clients who ask the application to open a file that was previously opened with an ODB request (using the same callback signature and token data) will get save and close notifications only once per event, rather than once per time the open request was sent.

  • Made a change to the layout for lists to improve inter-row spacing when using larger list font sizes (as set in the Appearance preferences).

  • Markers are saved with document state, and so making a change to the markers for a document will no longer mark it as having unsaved changes.

  • HTML5 documents will generate folds for unrecognized elements, as long as they are properly balanced tag pairs.

  • Fixed bug in application state restoration in which a document with recovered unsaved changes would end up as the selected document in a multi-document window, even if some other saved document had been the selected document when the application was quit.

  • After performing certain whole-file transformations (such as "Replace All") on documents being compared, recompute the differences in any Differences windows displaying those documents. This corrects consistency errors that can arise from the transformation.

  • Improved the accuracy of language guessing for #! lines (particularly in versioned Python references).

  • Fixed crash which would occur during automated system appearance changes (usually across a sleep/wake boundary) after having used the "Text Colors" preferences (whether the Preferences window was still open, or not).

  • When reopening palette windows at startup, the windows are no longer given keyboard focus, since that generally is not useful.

back to top