TextMate 2.2.0-undead
Immutable
release. Only release title and notes can be modified.
2026-08-26 (v2.2.0-undead)
The rave build system is replaced by CMake, two crashes are fixed, and a fork-wide sweep gets bundle Ruby running on the system interpreter — 50 bundle pull requests across 40 repositories. See all changes since v2.1.5-undead.
Build
- rave is gone; the tree builds with CMake and Ninja.
bin/rave(1,686 lines of Ruby),configureand the 60default.ravefiles are removed, along with two scripts only rave called —bin/gen_buildandbin/notarize_await, the latter obsolete since notarytool replacedaltool. The test suites run under CTest, and CI and the release workflow configure and build through CMake. ⌘B still builds and relaunches TextMate:bin/relaunch_appreproduces rave'sTextMate/runtarget behind aruntarget. (#42,d4f6338f,65d907b6,94bd8270) - The CMake build came from @tectiv3. tectiv3/textmate migrated TextMate to CMake first, and this fork adopted their work rather than repeating it: the root
CMakeLists.txt,cmake/TextMateHelpers.cmake,CMakePresets.jsonand 54 of the moduleCMakeLists.txtfiles are theirs. Three more — SoftwareUpdate, network and CrashReporter — were written here because tectiv3 had dropped those modules, and version derivation, Markdown rendering and a few include scopes were adapted to this tree. Thanks for doing it first. - boost, google-sparsehash and ragel are no longer build dependencies.
google::dense_hash_mapgives way tostd::unordered_map,ascii.rlto a hand-written ASCII plist parser,boost::varianttostd::variant, andboost::crc_32_typeto zlib'scrc32(). Ported from tectiv3/textmate36acd469,34e166b9and2c49eead. multimarkdown is deliberately retained — it drives the twelve in-app Help pages as well as the About window, and is build-time only. (#42,0bbeb579) - Deployment target raised from 10.12 to 14.0, which the dependency removals require (
std::variantneeds a modern libc++).LSMinimumSystemVersionfollows it, so the app now declares macOS 14 as its floor. (#42,d8867a71) - Globbed sources are re-scanned on every build. CMake's
file(GLOB)runs once at configure time, so a newly added file was silently ignored until someone re-ran cmake by hand — and for tests that failure is invisible: the file is not compiled into the runner and the suite passes without it.CONFIGURE_DEPENDSmakes ninja recheck each glob. (#43,37bc59a9) - Contributions.md aggregates by person instead of by commit. One entry per commit rendered 739 rows and 1.1 MB of HTML that changed on every push; it is now one row per contributor — avatar, name, handle, commit count, years active — 107 contributors and 39 KB. Identity keys on the GitHub login, so someone who committed under several addresses appears once. (#42,
8e01ffc8)
Stability
- Fixed a crash on launch while restoring a session. An uncaught
std::bad_variant_accessescapedNSApplicationMainandmain()'s handler calledabort(). Movingplist::any_toffboost::varianthad renamed the lenientplist::get<T>toplist::convert<T>and given the old name to the strict accessor, so call sites that relied on coercion silently became strict — and grammars and themes in the wild do carry a numericnameor a stringdisabled. The lenient read is restored at the schema field handlers, the theme colour and font reads, and thedisabledcheck inparse::convert_plist. (#43,bc899cb4) - Fixed a crash on ⌘G and ⇧⌘G in the HTML output window.
-findNext:and-findPrevious:passedcompletionHandler:nilto-[WKWebView findString:withConfiguration:completionHandler:], whose handler parameter is implicitly nonnull; WebKit invokes it without a null check, faulting at0x10on the async IPC reply. The find dialog was never affected — only the two keyboard shortcuts. (#44,8473c153)
Editor
- Tab titles and close buttons are centred again. Both were pinned a few points above the bottom of the tab, which only centres them in a 22pt tab — the height
OakTabBarViewasks for. As a titlebar accessory it is fixed at 36pt whatever it requests, so tabs are 35pt and both subviews sat well below the middle. They are constrained to the tab's centre instead. (#46,a48d539e)
Commands
- Commands run in a UTF-8 locale. Launched from Finder the app inherits no
LANGorLC_*, and neither is in the environment whitelist, so everything it spawned landed in the C locale. For Ruby that meansEncoding.default_externalis US-ASCII andENVstrings come back taggedASCII-8BIT, so interpolating aTM_FILEPATHcontaining an accent raisedEncoding::CompatibilityError.bash_init.shhad exportedLC_CTYPEsince forever, butfix_shebangonly prepends that preamble to commands with no shebang of their own — every#!/usr/bin/env rubycommand went without. It is now set insetup_basic_environment(), covering all of them. (#48,5cab4eef) - No more
env: ruby18: No such file or directory. macOS has noruby18, so every command carrying that shebang died at exec. Fixed in Avian.tmbundle, which ships inside the app and has no upstream repo of its own, and in the Bundle Editor command templates, which were minting aruby18shebang into every newly created command. The 1.8-era-KUflag — which Ruby 2.6 warns about on every run — is replaced by-Eutf-8. (#45, #47,f8803570,525ac364)
Bundles
The embedded bundles are pinned by SHA and ship with the app; everything in the catalogue auto-updates from main and arrives on the next poll.
- Word Count works again.
Text.tmbundlerequiredjcode, removed in Ruby 1.9, and called theString#jcountit added, so the command died at therequireon a fresh install. Pin34ab5891→f3fd9fc9. (#51, text.tmbundle#1, thanks @capac) - Every command that used
shelltokenizewas broken.lib/shelltokenize.rbfailed to parse at all under the system Ruby —invalid multibyte escape: /[^\w_\-\+=\/\x7F-\xFF]/— whatever shebang the caller carried. Bundle Support and Source pins bumped to pick that up, along withFile.exists?/ERB.newmodernization (thanks @mattneub) and the Source shebang fix. (#49,4a9664fb) ruby18shebangs replaced across 15 bundles — cvs, lua, bundle-development, cron, groovy, html, java, markdown, perl, php, python, ruby, source, xcode and yaml — andruby20in html and rust.- The 1.8-era
-Kflag replaced with-Eutf-8in 18 bundles — ant, applescript, arduino, cmake, git, golang, haskell, Julia, nim, ninja, pdb, processing, r, rust, scala, swift, tads3 and vagrant. Dropping it outright is not enough: with no locale setEncoding.default_externalfalls back to US-ASCII, which is what-KUwas there to prevent. Hash#to_plistresolves again in 6 bundles — ant, apache, git, objective-c, ocaml and html — which used it without requiringprivate/plist.- Markdown list commands work under modern Ruby.
List.parsecalledString#to_a, removed in Ruby 1.9. (markdown.tmbundle#2, thanks @tbates) - GitHub Markdown preview works under Ruby 4.0. Rouge 3.x calls
CGI.parseinLexer.lookup_fancy, and Ruby 4.0 ships onlycgi/escape, so any code block with no language tag — including every indented one — raisedNoMethodErrorwhenTM_RUBYpointed at a modern interpreter. Thecgigem is now a declared dependency. (GitHub-Markdown.tmbundle#3, reported by @capac) - Hyperlink Helper matches non-ASCII URLs. URL detection covered ASCII only, so an IRI stopped at the first accented character; matching also no longer runs through Unicode whitespace. (hyperlink-helper.tmbundle#1, #2, thanks @tectiv3)
- AppleScript URL escaping uses
URI::DEFAULT_PARSER.escapeinstead ofURI.encode, removed in Ruby 3.0. (applescript.tmbundle#2) - iPhone dropped from the catalogue, 108 entries → 107. Its
Completion: Inside Bracketscommand requires a symlink into the flat TextMate 1 bundle layout, which cannot resolve under one-repo-per-bundle; Objective-C grammar and completion come from objective-c.tmbundle. It was never a default bundle, so nothing installed it. (#50, bundle-support.tmbundle#9)
What's Changed
- Replace the rave build system with CMake by @dayglojesus in #42
- Fix crash on launch from strict plist field reads by @dayglojesus in #43
- Fix crash on Cmd-G in the HTML output window by @dayglojesus in #44
- Centre tab titles and close buttons in the tab bar by @dayglojesus in #46
- Replace ruby18 shebangs with the system ruby by @dayglojesus in #47
- Give commands a UTF-8 locale by @dayglojesus in #48
- Bump the Bundle Support and Source pins by @dayglojesus in #49
- Bump Bundle Support to drop iPhone from the catalogue by @dayglojesus in #50
- Bump the Text pin to pick up the jcode fix by @dayglojesus in #51
- Release v2.2.0-undead by @dayglojesus in #53
Full Changelog: v2.1.5-undead...v2.2.0-undead