Skip to content

Latest commit

 

History

History
487 lines (288 loc) · 19 KB

File metadata and controls

487 lines (288 loc) · 19 KB

Emacs Plus News

This file documents notable changes to Emacs Plus.

2026-08-12

New Features

emacs-plus-app@next cask

New cask that tracks the Emacs release branch (currently emacs-31, the Emacs 31 pretest). It fills the gap between the stable cask and the @master nightly: newer than stable, less bleeding edge than master. Built and updated nightly, same as @master. See #978.

$ brew install --cask emacs-plus-app           # latest stable
$ brew install --cask emacs-plus-app@next      # nightly from release branch (next stable)
$ brew install --cask emacs-plus-app@master    # nightly from master

Note for users switching from the stable cask: there is no emacs-ctags symlink, since the ctags program was removed in Emacs 31 (same as @master).

2026-07-12

New Features

Per-version values in build.yml

icon, external/local patches, and revision now accept a version map keyed by major Emacs version (quoted, e.g. "30") with an optional default fallback. An exact version match wins, default is used otherwise, and with no match the value is simply not applied; for patches this means the patch is skipped for that version. See #950 and #973.

icon:
  default: dragon-plus
  "31": modern-purple-flat

patches:
  - only-for-31:
      "31":
        url: ./my-31-only.patch
        sha256: abc123...

revision:
  default: abc123
  "31": def456

All existing build.yml files keep working unchanged: a plain value applies to every version, exactly as before. Malformed patch entries (missing url or sha256) and unknown revision keys are now rejected when the config is loaded instead of failing later during the build. Note that this also applies to cask installs: a malformed patches or revision entry now fails the cask postflight too, where it was previously ignored (those keys are formula-only). If you hit a new error after updating, fix the reported entry in your build.yml.

2026-07-08

Bug Fixes

Native compilation now works on terminal launches with a cold eln-cache

LIBRARY_PATH is injected via LSEnvironment, which macOS applies to GUI launches only. So a terminal-launched Emacs (for example emacs --daemon from a shell) with a cold eln-cache failed to link freshly compiled .eln files with “ld: library ‘emutls_w’ not found”. A warm cache masked the problem, since nothing needed compiling. See #964.

The generated site-start.el now appends -L flags to native-comp-driver-options for the gcc, libgccjit and gcc support library directories. Driver options are passed only to the libgccjit driver, so unlike setenv they do not leak into child processes of Emacs (the problem that got CC injection removed, see #939). The gcc paths are resolved at Emacs startup, so they survive gcc version bumps without a reinstall. Works for formula and cask, GUI and terminal launches alike.

Reinstall to pick up the fix:

brew reinstall emacs-plus@30            # formula
brew reinstall --cask emacs-plus-app    # cask

More reliable LIBRARY_PATH injection for native compilation

Both formula and cask builds inject LIBRARY_PATH into Info.plist so the libgccjit linker can find libemutls_w.a when GUI-launched Emacs native-compiles packages. The directory was previously located by globbing the gcc Cellar and taking the first match, which could pick a stale gcc version when several are installed. It is now resolved by asking the gcc driver itself (gcc-NN -print-file-name=libemutls_w.a), the same mechanism libgccjit uses internally, with the glob kept only as a fallback. The libgccjit library directory is also added to LIBRARY_PATH, matching the CI build environment. This ports #963 to install-time injection.

Reinstall to pick up the fix:

brew reinstall emacs-plus@30   # or your version

2026-06-21

Bug Fixes

CC no longer leaks into child processes of GUI Emacs

Emacs Plus previously injected CC=/opt/homebrew/bin/gcc-NN into Info.plist under LSEnvironment for both formula and cask builds. macOS applies LSEnvironment to every process spawned by GUI-launched Emacs, so CC bled into terminal emulators (vterm, eat, eshell), M-x compile, and other subprocesses, breaking builds that expect the default clang toolchain.

The injection turned out to be unnecessary. Emacs native compilation never reads CC (libgccjit resolves its driver via PATH / GCC_EXEC_PREFIX), so removing it has no effect on native compilation. LIBRARY_PATH is still injected so the linker can find libemutls_w.a when launching from the GUI. See #939.

Reinstall to pick up the fix:

brew reinstall emacs-plus@30   # or your version

2026-06-14

Bug Fixes

Dropped awk build dependency

emacs-plus@28 through emacs-plus@32 no longer depend on the awk formula at build time. It was added defensively alongside gnu-tar and coreutils, but Emacs builds fine with the system awk and has no need for a specific version. Removing it avoids forcing Homebrew’s awk (onetrueawk) onto users’ systems, where its recent versions break tools such as transcrypt. See discussion #951.

2026-06-10

Bug Fixes

AutoFill (Emacs) helper process disabled on macOS 26 (Tahoe)

On macOS 26 (Tahoe), the system spawns an AutoFill (Emacs) helper process alongside Emacs that heuristically scans text fields for one-time codes. Emacs never marks fields as one-time-code, so the helper is pure overhead. All builds now set NSAutoFillRequiresTextContentTypeForOneTimeCodeOnMac in Info.plist, which prevents the helper from launching.

2026-05-10

New Features

New formula: emacs-plus@32

A new formula emacs-plus@32 tracks Emacs master (the in-development next major version). It builds with the same default feature set as emacs-plus@31: native compilation (AOT), tree-sitter, gnutls, librsvg, webp, little-cms2, dynamic modules, and bundles Emacs.app + Emacs Client.app.

brew tap d12frosted/emacs-plus
brew install emacs-plus@32

The emacs-plus@master formula alias now points to emacs-plus@32, and the emacs-plus-app@master cask publishes pre-built @32 binaries nightly.

Breaking Changes

emacs-plus@31 moved to the emacs-31 release branch

Now that Emacs 32 development has begun upstream, emacs-plus@31 builds from the emacs-31 release branch (version 31.0.60) instead of master. This makes @31 track the upcoming Emacs 31 release rather than ongoing master development.

If you want the development tip, switch to emacs-plus@32 or use emacs-plus@master.

--with-imagemagick removed in emacs-plus@32

The --with-imagemagick option, deprecated in emacs-plus@31, is fully removed in emacs-plus@32. Modern Emacs has native support for most image formats (SVG via librsvg, WebP, PNG, JPEG, GIF). If you rely on ImageMagick, please open an issue describing your use case.

2026-01-29

New Features

Local file paths for patches

External patches in build.yml now support local file paths in addition to URLs. This makes configurations portable across machines.

patches:
  - my-patch:
      url: ~/.config/emacs-plus/my-patch.patch
      sha256: abc123...
  - another-patch:
      url: ./relative-to-config.patch
      sha256: def456...

Supported path formats: absolute (/path/to/patch), home-relative (~/path), and relative (./path, ../path). Relative paths resolve against the directory containing build.yml.

2026-01-26

Bug Fixes

macOS 26 (Tahoe) scrolling lag fix now built-in

The fix-macos-tahoe-scrolling patch has been promoted from community patch to built-in. It is now automatically applied to all emacs-plus@30 and emacs-plus@31 builds, including cask builds.

This patch fixes scrolling lag and input handling issues on macOS 26 (Tahoe) by disabling Apple’s new concurrent event processing which interferes with Emacs’s NS event loop. Based on the equivalent fix in emacs-mac by Mitsuharu Yamamoto.

If you previously added this patch via build.yml, you can now remove it:

# No longer needed - remove from build.yml
patches:
  - fix-macos-tahoe-scrolling

2026-01-11

Breaking Changes

Replaced native_comp_env with inject_path in build.yml

The native_comp_env option in build.yml has been replaced with inject_path:

# Old (no longer works)
native_comp_env: false

# New
inject_path: false

Native compilation environment (CC, LIBRARY_PATH) is now always injected. The inject_path option controls whether user’s PATH is also injected.

Removed EMACS_PLUS_NO_PATH_INJECTION environment variable

The runtime opt-out via EMACS_PLUS_NO_PATH_INJECTION environment variable has been removed. To disable PATH injection, use inject_path: false in build.yml and reinstall.

New Features

inject_path option for formula builds

The inject_path option in build.yml controls user PATH injection for formula builds (default: true). When enabled, your shell’s full PATH is captured at install time and injected into Emacs.app.

Note: This option does not apply to cask builds. Due to a Homebrew limitation, cask postflight doesn’t have access to the user’s shell environment. Cask users should use exec-path-from-shell or switch to the formula for full PATH injection.

ns-emacs-plus-injected-path variable

A new variable ns-emacs-plus-injected-path is defined in site-start.el. It is non-nil only for formula builds with inject_path: true. This allows you to conditionally skip exec-path-from-shell:

(unless (bound-and-true-p ns-emacs-plus-injected-path)
  (exec-path-from-shell-initialize))

Internal Changes

Unified PATH injection via LSEnvironment

Both formula and cask now use LSEnvironment in Info.plist for PATH injection (previously formula used a wrapper script). This simplifies the codebase and ensures consistent behavior.

2026-01-05

Breaking Changes

Cask renamed to emacs-plus-app

Pre-built binary casks have been renamed to follow homebrew-core conventions:

# Old (no longer works)
$ brew install --cask emacs-plus@30
$ brew install --cask emacs-plus@31

# New
$ brew install --cask emacs-plus-app           # Stable (currently Emacs 30)
$ brew install --cask emacs-plus-app@master    # Development (Emacs master)

This naming scheme:

  • Follows homebrew-core convention (emacs formula vs emacs-app cask)
  • Uses semantic names (@master) instead of version numbers
  • Simplifies upgrades: stable users always use emacs-plus-app regardless of Emacs version

Removed --with-no-frame-refocus option

The --with-no-frame-refocus option has been removed from emacs-plus@30 and emacs-plus@31. This can now be achieved via Emacs Lisp in your early-init.el:

(setq ns-use-native-fullscreen nil)

New Features

Formula alias emacs-plus@master

A new formula alias emacs-plus@master points to the current development version (emacs-plus@31):

$ brew install emacs-plus@master    # Always installs development version

Deprecations

Removed deprecated --with-X-icon options

The legacy icon options (--with-modern-icon, --with-spacemacs-icon, etc.) have been removed. Use the unified --with-icon option or configure via ~/.config/emacs-plus/build.yml:

# Using --with-icon
$ brew install emacs-plus --with-icon=modern-icon

# Using build.yml
$ echo "icon: modern-icon" > ~/.config/emacs-plus/build.yml
$ brew install emacs-plus

Removed legacy icons directory

The icons/ directory has been removed. All icons are now in community/icons/.

2025-01-02

New Icons

dragon-plus

New Tahoe-compatible version of the dragon icon with liquid glass effects. Designed for macOS 26+ using Icon Composer with proper layering, gradients, and translucency.

New Features

Detect Emacs Plus in init.el

Emacs Plus @30 and @31 now define ns-emacs-plus-version which you can use to detect Emacs Plus in your init.el:

(when (bound-and-true-p ns-emacs-plus-version)
  ;; Emacs Plus specific configuration
  )

;; Or check specific version
(when (and (bound-and-true-p ns-emacs-plus-version)
           (>= ns-emacs-plus-version 31))
  ;; Emacs Plus 31+ specific
  )

Deprecations

–with-imagemagick deprecated in @31

The --with-imagemagick option is deprecated in emacs-plus@31. Modern Emacs has native support for most image formats (SVG via librsvg, WebP, PNG, JPEG, GIF). If you rely on ImageMagick, please open an issue describing your use case.

Bug Fixes

Info dir file regeneration

Fixed the dir file not being created in the Info directory. Homebrew’s cleaning phase was deleting it, but post_install now regenerates it properly. Also fixed the glob pattern to handle both .info and .info.gz files for users with --with-compress-install.

2025-12-31

New Features

Pre-built binaries via Homebrew Cask

Emacs+ is now available as pre-built binaries for faster installation:

$ brew install --cask emacs-plus-app           # Stable
$ brew install --cask emacs-plus-app@master    # Development

Benefits:

  • Fast installation - Download instead of compile (~1 min vs ~30 min)
  • Self-contained - All dependencies bundled, no Homebrew libs required
  • Nightly builds - Automatically updated at 3 AM UTC

Cask builds include: native compilation (AOT), xwidgets, tree-sitter, imagemagick, mailutils, and Emacs Client.app.

Use the formula (brew install emacs-plus@30) if you need custom icons, patches, or specific build options. Use the cask for quick installation with sensible defaults.

Supported platforms: macOS 14+ (Sonoma, Sequoia, Tahoe) on ARM64 and Intel.

2025-12-29

New Icons

liquid-glass

New icon designed for macOS 26 (Tahoe) liquid glass aesthetic. Contributed by leaferiksen.

17 icons from homebrew-emacs-head

Added icons from the homebrew-emacs-head project:

  • golden-yak - by emacsfodder
  • infinity-yak-* (13 variants) - by emacsfodder
  • modern-paper-icons - by snwh
  • modern-purple - by NicolasPetton

Improvements

Icons gallery

All 76 icons are now browsable in a visual gallery with previews, author attribution, and source links.

2025-12-28

New Features

Revision pinning via build.yml

You can now pin to a specific git revision using ~/.config/emacs-plus/build.yml:

revision:
  "30": abc123def456
  "31": 789xyz

The environment variables HOMEBREW_EMACS_PLUS_XX_REVISION are now deprecated in favor of this approach. See documentation for details.

macOS font rendering fix for CJK text

Added mac-font-use-typo-metrics patch (from railwaycat/emacs-mac) that fixes line height calculation for mixed CJK and English text. This resolves issues with partial screen rendering in vterm and other applications.

org-protocol support in Emacs Client.app

Emacs Client.app now handles org-protocol:// URLs out of the box. This enables org-capture from browser extensions, org-roam protocol, and other integrations without additional configuration. Just add (require 'org-protocol) to your Emacs init file.

Improvements

Better error messages for incompatible options

The formula now errors out early when icon options (--with-*-icon or via build.yml) are used with --with-x11 or --without-cocoa, since these builds don’t produce Emacs.app.

Clearer documentation for non-Cocoa builds

Updated option descriptions to clarify that --with-x11 and --without-cocoa produce terminal/X11 builds without Emacs.app.

Library not loaded errors

Added caveat explaining how to fix “Library not loaded” errors after upgrading dependencies like tree-sitter or libgccjit: simply run brew reinstall emacs-plus@XX.

Better Spotlight integration

The emacs command now automatically finds Emacs.app in /Applications or ~/Applications. This allows you to copy the app for better Spotlight indexing:

cp -r "$(brew --prefix)/opt/emacs-plus@30/Emacs.app" /Applications/

The emacs command will continue to work without any manual adjustments.

2025-12-26

Community Patches

Window blurring and alpha transparency

New community patch adds support for window blurring and configurable alpha transparency effects.

Async process read performance

New community patch improves async process read performance.

2025-12-14

New Features

Community patches and icons system

Introduced a new system for community-contributed patches and icons via ~/.config/emacs-plus/build.yml. This allows users to easily apply patches and icons from a community registry or external URLs.

The --with-*-icon options are now deprecated (removal date: 2026-03-14). Please migrate to build.yml.

See Community Documentation for details.

2025-11-24

New Features

Emacs Client.app

Starting with emacs-plus@30 and emacs-plus@31, the formula now includes Emacs Client.app - a companion application for opening files in Emacs from Finder, Spotlight, and other macOS applications. It connects to an existing Emacs daemon using emacsclient.

macOS 26 (Tahoe) compatibility

Fixed Emacs Client.app icon display on macOS 26+ by removing Assets.car.

2025-10-17

New Features

PATH injection for macOS Sequoia

Fixed PATH injection on macOS 15 (Sequoia) which was ignoring LSEnvironment in Info.plist. The fix uses a wrapper script to inject PATH from your shell.

To disable PATH injection:

export EMACS_PLUS_NO_PATH_INJECTION=1

2025-08-15

Releases

Emacs 30.2

Updated emacs-plus@30 to Emacs 30.2.

2025-02-23

Releases

Emacs 30.1

Released emacs-plus@30 with Emacs 30.1 - the first stable release of Emacs 30.

Changes

Emacs 30 is now the default

emacs-plus (without version suffix) now installs Emacs 30 instead of Emacs 29.

Native compilation enabled by default

Native compilation is now enabled by default for Emacs 30+. The --with-native-comp option is no longer needed.

libjansson dependency removed

The libjansson dependency was removed for Emacs 30.1+ as it’s no longer required.