{"id":52053,"date":"2026-06-01T14:47:22","date_gmt":"2026-06-01T18:47:22","guid":{"rendered":"https:\/\/mjtsai.com\/blog\/?p=52053"},"modified":"2026-06-01T15:04:52","modified_gmt":"2026-06-01T19:04:52","slug":"bbedit-16","status":"publish","type":"post","link":"https:\/\/mjtsai.com\/blog\/2026\/06\/01\/bbedit-16\/","title":{"rendered":"BBEdit 16"},"content":{"rendered":"<p><a href=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">Bare Bones Software<\/a>:<\/p>\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>This release of BBEdit introduces expanded support for macOS &ldquo;Shortcuts&rdquo;, via additional actions provided in the Shortcuts application. A &ldquo;Transform Text&rdquo; operation allows invocation of &ldquo;one shot&rdquo; operations of many kinds, and transforms are provided for extracting matching lines, deleting matching lines, sorting lines, and text replacement.<\/p>\n<\/blockquote>\n\n<p>The shortcuts can either interact with the front document or use BBEdit as a headless text processing engine (without having to launch the app). This is great news for Shortcuts fans, as it&rsquo;s now really easy to receive text, operate on it, and send it along to the rest of your shortcut. Personally, I&rsquo;m <a href=\"https:\/\/mjtsai.com\/blog\/2026\/05\/20\/updating-shared-shortcuts\/\">not a fan<\/a> of locking logic away in the Shortcuts database. I would be more inclined to use a text factory or AppleScript. Text factories provide more options and a better interface than is available in Shortcuts, and both text factories and scripts can be saved as standalone files and easily reused in other contexts (from within BBEdit or other scripts).<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Added support for using the W3C HTML checker service. This is on by default, and improves the correctness and accuracy of syntax checking in HTML5 documents.<\/p>\n<\/blockquote>\n\n<p>Most of my projects are embarrassingly still HTML 4, but in some limited testing I found that this worked as expected. By default, it works online, which felt plenty fast and presented the results in the familiar BBEdit errors browser window. (I love how, unlike in Xcode, errors and search results are in separate windows that you can keep open.) They say that the connection to the W3C is secure and that no data is retained, but it&rsquo;s also possible to install a local copy of the checker for maximum privacy.<\/p>\n\n<p>A longstanding issue for me is that a lot of my HTML pages contain dynamic elements inserted by PHP or Python on the server. The local files that I edit in BBEdit are either templates, content that will go into templates, or statically rendered pages with a few pieces still missing. In order to check the final versions of these pages, I can use a bookmarklet for the W3C checker or load the final HTML and send it to BBEdit for analysis. This can be done by using <a href=\"https:\/\/c-command.com\/scripts\/safari\/check-syntax-in-bbedit\">an AppleScript<\/a> to send the source from Safari or by loading the page using BBEdit&rsquo;s <strong>Open File By Name<\/strong> command. BBEdit can also check for broken links, but this is for links to files within the local copy of a site you&rsquo;re editing. It won&rsquo;t check remote URLs. If I try to check a page from this blog it will complain about all the links that are just path references because they aren&rsquo;t stored locally (or, indeed, anywhere except in WordPress&rsquo;s cache).<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>BBEdit can search for text in images, via OS-provided image text recognition. Use the Find or Multi-File Search windows to search for (and extract, if desired) matches for a given string or Grep pattern within image files.<\/p>\n<\/blockquote>\n\n<p>This is really cool. Spotlight has had image searching for a while, but it&rsquo;s much more useful in BBEdit. You can do more precise searches, finding case-sensitive or regex matches. The matches are presented in the aforementioned standard results window, so you can see all the files, as well as the context around the matching text, in one list.<\/p>\n\n<p>The use case that immediately came to mind was searching through screenshots, e.g. in documentation for my apps. I also found it useful for finding text in memes and for searching for ski trails in my folder of maps. It was able to find trail names where text was curved or at an odd angle, and it highlighted the matching region of the map in yellow. When there are multiple matches, you can arrow-key through them and watch the highlight move.<\/p>\n\n<p>Text and image files can be part of the same search, and the performance is impressive. I mostly just leave image searching on, but there were a few cases where I was searching a big folder and knew I didn&rsquo;t need image results, so I turned off image searching to make it go faster. The multi-file search window now makes it easier to see at a glance whether options like this are enabled.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Added settings to projects, instaprojects, and notebooks for project- (and notebook-) specific color scheme settings.<\/p>\n<\/blockquote>\n\n<p>I tend to use different color schemes in different <em>apps<\/em>. It&rsquo;s hard enough to find ones that I like, so I certainly don&rsquo;t want to create more. But judging by the reactions I&rsquo;ve seen, people really do want to create multiple color schemes within the same app to quickly tell apart different projects.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Added controls to allow use of an alternative color scheme when\nprinting, if desired. The default is to use the document&rsquo;s\ncurrent color scheme, but if you routinely work in Dark Mode\n<em>and<\/em> print things out, selecting an alternative color scheme\ngenerally provides a better outcome.<\/p>\n<\/blockquote>\n\n<p>I don&rsquo;t use Dark Mode, but this makes a lot of sense. I already had it set to use a different font for printing.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Keyboard emulation for <code>vi<\/code> is available, via the corresponding\nsetting in BBEdit&rsquo;s &ldquo;Keyboard&rdquo; settings. This enables a basic set\nof <code>vi<\/code> navigation and editing commands and modes. <code>:q<\/code> will\nclose the active document rather than quitting BBEdit.<\/p>\n<\/blockquote>\n\n<p>Personally, I prefer the Emacs keybindings, and there&rsquo;s good news on that front, too. There&rsquo;s been a longstanding bug where Control-N (to move down a line) would sometimes stop working. It was a really strange issue that I could never figure out exactly how to reproduce, and it only affected that one Emacs key. BBEdit 16 now supports the Cocoa-standard <tt>DefaultKeyBinding.dict<\/tt> file. I added a <code>\"^n\" = \"moveDown:\"<\/code> line, which is redundant for <code>NSTextView<\/code> apps that already have it built in, but for BBEdit it seems to sufficiently override whatever code path was intermittently failing, so now the key works consistently for me.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Added a button to the Languages preferences for installing a desired language module. This will handle copying of the language module to the appropriate location; so any obsolete instructions regarding where to copy the module can be ignored.<\/p>\n<\/blockquote>\n\n<p>The interface for languages and their settings has been overhauled a bit and overall works more smoothly now. There&rsquo;s also now a nice interface for importing and exporting grep patterns, so you don&rsquo;t have to dig into BBEdit&rsquo;s files.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>The file information panel (via &ldquo;Get Info&rdquo; or the document status icon in the navigation bar) adds an indicator when the file has been quarantined by macOS. The adjacent &ldquo;Clear&rdquo; button will attempt to remove quarantine.<\/p>\n<\/blockquote>\n\n<p>This is one of those minor features that is technically not needed, because I can easily do it from Terminal. But it&rsquo;s annoying, and whenever I do it I think I should probably write a script to remove the quarantine on the front document. I never got around to that, but now I can just click a button. Also, if you haven&rsquo;t checked out the info panel in a while, besides showing the basic file stats it can also adjust file permissions and show Spotlight metadata.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Expanded syntax coloring support, via the Language Server Protocol &ldquo;semantic token coloring&rdquo; feature. When supported by the language server, this allows the server to provide information on specific ranges of the source code that supplements BBEdit&rsquo;s built-in syntax coloring for the given language.<\/p>\n<\/blockquote>\n\n<p>I still love the idea of LSP, but it hasn&rsquo;t quite lived up to my hopes yet. The usefulness probably varies greatly based on which language you&rsquo;re using. These days, I mostly write Swift, so I&rsquo;m comparing with the functionality that&rsquo;s built into Xcode. The main problem is that Apple&rsquo;s SourceKit-LSP doesn&rsquo;t support Xcode project files. In order for LSP to find your dependencies, you have to run <a href=\"https:\/\/www.barebones.com\/support\/bbedit\/lsp-notes.html#caveats\">a script<\/a> to create a <tt>compile_commands.json<\/tt> file and\/or install <code>xcode-build-server<\/code> and set up a <tt>buildServer.json<\/tt> file. It was never fully clear to me what I was supposed to do. Of course, my projects also have Objective-C files and Swift code that extends Objective-C classes, so <code>clangd<\/code> is in play, too.<\/p>\n\n<p>I got it working to a certain extent but never to the point where it would find all the files it needed in Apple&rsquo;s frameworks, my own frameworks, and the related files in the same target. So the display of the compiler errors\/warnings just wasn&rsquo;t useful when editing files in my projects. I&rsquo;m not sure whether this was due to bugs\/limitations of SourceKit-LSP or user error. BBEdit&rsquo;s LSP features do work very well for standalone files with no dependencies, e.g. if I have a test file to explore an API or I&rsquo;m writing a &ldquo;script&rdquo; in Swift.<\/p>\n\n<p>Setting aside the compilation errors, I do find the new semantic token coloring helpful. It&rsquo;s not as good as Xcode&rsquo;s, which can use different colors for local and instance variables. And there are some issues with the coloring of unknown symbols and with local variables sometimes changing color between definition and use. But I prefer it to the basic syntax coloring.<\/p>\n\n<p>Code completion is a mixed bag. Sometimes it works really well, basically like in Xcode. Other times, it won&rsquo;t complete because it hasn&rsquo;t found my dependencies or because AppKit was an implicit import rather than listed at the top of the file. I sometimes wish there were a way to turn off LSP completions (without turning off the rest of LSP) and just use the regular, lower-tech BBEdit completion engine that&rsquo;s more reliable.<\/p>\n\n<p>A pleasant surprise is that the <strong>Edit &#x2023; Show Symbol Help<\/strong> command is often <em>more<\/em> reliable than Xcode at showing the inferred type for a variable.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Added a command to the View menu and to the contextual menu in the sidebar: &ldquo;Move to Window&#8230;&rdquo;. This opens a dialog in which you can choose an extant window for the active document (or selected sidebar documents, as appropriate), and upon confirmation moves the document(s) to the designated window and makes it active. A search box is available to filter candidates.<\/p>\n<\/blockquote>\n\n<p>I love how this can be completely keyboard-driven.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Enhanced the Unicode display section in the Character Inspector palette to show the Unicode code point names for the respective characters.<\/p>\n<\/blockquote>\n\n<p>You can select a range of characters, and it will show the hex code points as well as the names. This is really handy for breaking down complex characters into their parts. Emoji display within text windows has also been improved.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>The Minimap palette gets a cursor position display, and a popup menu button displaying the name of the function containing the start of the selection range. Clicking on the function display will open a function menu, from which you can choose another location in the displayed file.<\/p>\n<\/blockquote>\n\n<p>These are good improvements, but I still find the Minimap much less useful than Xcode&rsquo;s, which shows some section headings directly in the map and lets you browse others by hovering. The other main editor features that I miss from Xcode are multiple cursors and syntax-aware indentation.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>Git revision lists (as used in &ldquo;Compare Revisions&rdquo;, &ldquo;Compare Arbitrary Revisions&rdquo;, and the file version menu in the navigation bar) get indicators for revisions that have annotations (such as commit tags or special status as branch head revisions). Further details are available via hover tooltips.<\/p>\n<\/blockquote>\n\n<p>This is an improvement, but most of my revisions aren&rsquo;t tagged, so all I have to go on are the date and the commit hash. The comparison commands are great if I want to quickly go back a few versions or if I know the desired date. I wish BBEdit had another column or pane to show the commit message. Otherwise, there&rsquo;s a multi-step process of opening the revision history, finding the desired hash, and then looking for it in the other window. At that point it feels easier to switch to Tower and locate the file there so I can use its history browser.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>AI worksheets support streamed responses, which will shorten the\ntime before responses from the service start to appear in the\nworksheet. If wrapping is turned on (as it is by default),\nstreamed responses will appear in chunks (corresponding to an\nunwrapped response line) rather than a word or two at a time.<\/p>\n<p>Added an &ldquo;Other&#8230;&rdquo; item to the popup menu for model selection\nin the AI Worksheet preferences, as well as in the worksheet\npopover. This makes an API request to the service (if supported)\nrequesting a list of the available models, and then provides a\nsearchable list.<\/p>\n<\/blockquote>\n\n<p>Streaming is a huge improvement, as some of the models take a while to produce a large amount of output. Instead of it looking like nothing is happening, you can start reading the response right away. The <strong>Other&#8230;<\/strong> command is much more important than it sounds because the pre-defined models that show up in the pop-up menu may not be the ones you want. I recommend checking the full list now and then and updating your default. In some cases you may want a model that&rsquo;s not even listed there. For example, <code>chat-latest<\/code> is the current ChatGPT Web model, and it auto-updates to use newer models as they become available, but it doesn&rsquo;t appear in the list returned by the API. Also, beware of old worksheets that are still set to use an old model.<\/p>\n\n<p>My other tip is that the AI APIs BBEdit uses seem to default to more concise responses than you would get on the Web. There&rsquo;s no setting to change this, but you can prompt it within the chat to be more verbose.<\/p>\n\n<blockquote cite=\"https:\/\/www.barebones.com\/support\/bbedit\/notes-16.0.html\">\n<p>The codeless language module internals have been extensively reworked to improve performance, and to correct longstanding issues. With these changes, individual patterns (string, comment, keyword, etc) can be tested and developed using the Pattern Playground if desired, and used in a language module with some assurance that they&rsquo;ll behave consistently (which was by no means guaranteed before).<\/p>\n<p>[&#8230;]<\/p>\n<p>Made significant performance improvements to SFTP protocol operations, including file transfers. Most operations will be visibly faster, in some cases an order of magnitude or more can be expected (limited by network throughput to the server).<\/p>\n<\/blockquote>\n\n<p>There&rsquo;s a whole section of the release notes on performance improvements, but I think these are the two most important ones. I&rsquo;ve been using BBEdit&rsquo;s FTP support since the 90s. It&rsquo;s always been convenient, but at some point I switched to mostly using <strong>Edit in BBEdit<\/strong> from Transmit because it felt faster. With BBEdit 16, the SFTP operations and browser feel <em>so<\/em> much faster, due to using Dispatch I\/O and bulk communication with the helper XPC service. It&rsquo;s usually quick enough that it doesn&rsquo;t bother interrupting the flow with a progress sheet, so it feels pretty much like working with local files. Since getting back to working this way, I&rsquo;ve rediscovered the benefits of having BBEdit manage the SFTP connection: remote files show up as recents so I can quickly go back to them, and I can leave a log file open and reload it.<\/p>\n\n<p>I continue to use BBEdit every day, for all manner of coding and non-coding tasks. It continues to be rock solid, and Bare Bones continues to do a good job adding useful new features while also maintaining and optimizing the old ones.<\/p>\n\n<p>BBEdit is still $60&mdash;or $4\/month or $50\/year (up from $40\/year) <a href=\"https:\/\/www.barebones.com\/products\/bbedit\/appstore\/faq.html\">in the Mac App Store<\/a>&mdash;with <a href=\"https:\/\/www.barebones.com\/store\/bbedit_upgrades.html\">upgrades<\/a> still at $30. Of course, many of the features also work in <a href=\"https:\/\/www.barebones.com\/products\/bbedit\/appstore\/comparison.html\">free mode<\/a>.<\/p>\n\n<p>See also:<\/p>\n<ul>\n<li><a href=\"https:\/\/news.ycombinator.com\/item?id=48226944\">Hacker News<\/a><\/li>\n<li><a href=\"https:\/\/sixcolors.com\/post\/2026\/05\/bbedit-16-offers-speed-boosts-and-shortcuts-and-emoji-upgrades\/\">Jason Snell<\/a><\/li>\n<li><a href=\"https:\/\/9to5mac.com\/2026\/05\/21\/bbedit-16-out-now-with-in-image-text-search-deeper-shortcuts-integration-notebook-filtering-more\/\">Marcus Mendes<\/a><\/li>\n<li><a href=\"https:\/\/bicycleforyourmind.com\/bbedit-16-disappoints\">Bicycle For Your Mind<\/a><\/li>\n<li><a href=\"https:\/\/tidbits.com\/2026\/05\/25\/bbedit-16-searches-for-text-in-images-adds-shortcuts-actions-and-more\/\">Adam Engst<\/a><\/li>\n<li><a href=\"https:\/\/jagsworkshop.com\/2026\/05\/bbedit-16\/\">Jason Anthony Guy<\/a><\/li>\n<\/ul>\n\n<p>Previously:<\/p>\n<ul>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2025\/05\/28\/bbedit-15-5\/\">BBEdit 15.5<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2024\/01\/11\/bbedit-15\/\">BBEdit 15<\/a><\/li>\n<li><a href=\"https:\/\/mjtsai.com\/blog\/2018\/04\/29\/multiple-cursors-in-xcode\/\">Multiple Cursors in Xcode<\/a><\/li>\n<\/ul>","protected":false},"excerpt":{"rendered":"<p>Bare Bones Software: This release of BBEdit introduces expanded support for macOS &ldquo;Shortcuts&rdquo;, via additional actions provided in the Shortcuts application. A &ldquo;Transform Text&rdquo; operation allows invocation of &ldquo;one shot&rdquo; operations of many kinds, and transforms are provided for extracting matching lines, deleting matching lines, sorting lines, and text replacement. The shortcuts can either interact [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"apple_news_api_created_at":"2026-06-01T18:47:27Z","apple_news_api_id":"35c5cd3b-0226-4518-9c50-6a8a7348521f","apple_news_api_modified_at":"2026-06-01T19:04:56Z","apple_news_api_revision":"AAAAAAAAAAAAAAAAAAAABQ==","apple_news_api_share_url":"https:\/\/apple.news\/ANcXNOwImRRicUGqKc0hSHw","apple_news_coverimage":0,"apple_news_coverimage_caption":"","apple_news_is_hidden":false,"apple_news_is_paid":false,"apple_news_is_preview":false,"apple_news_is_sponsored":false,"apple_news_maturity_rating":"","apple_news_metadata":"\"\"","apple_news_pullquote":"","apple_news_pullquote_position":"","apple_news_slug":"","apple_news_sections":"\"\"","apple_news_suppress_video_url":false,"apple_news_use_image_component":false,"footnotes":""},"categories":[2],"tags":[2684,1351,2317,69,1805,75,124,257,465,377,81,30,32,2742,622,71,790,1686,901,68,243,1856,226],"class_list":["post-52053","post","type-post","status-publish","format-standard","hentry","category-technology","tag-app-intents","tag-artificial-intelligence","tag-chatgpt","tag-cocoa","tag-dark-mode","tag-developertool","tag-emacs","tag-emoji","tag-gatekeeper","tag-git","tag-html5","tag-mac","tag-macapp","tag-macos-tahoe-26","tag-ocr","tag-programming","tag-sftp","tag-shortcuts","tag-swift-programming-language","tag-texteditor","tag-transmit","tag-vi","tag-xcode"],"apple_news_notices":[],"_links":{"self":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52053","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/comments?post=52053"}],"version-history":[{"count":7,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52053\/revisions"}],"predecessor-version":[{"id":52064,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/posts\/52053\/revisions\/52064"}],"wp:attachment":[{"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/media?parent=52053"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/categories?post=52053"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mjtsai.com\/blog\/wp-json\/wp\/v2\/tags?post=52053"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}