XEmacs is a powerful, extensible, and highly customizable text editor and integrated development environment, forked from GNU Emacs in 1991 to emphasize graphical user interface enhancements and modular package management.[1]Originating as Lucid Emacs, a branch of GNU Emacs 19 developed by the Lucid company for improved GUI support including mouse integration, multiple fonts, and window management, it was renamed XEmacs in 1994 following Lucid's closure, with key contributions from developers like Chuck Thompson and Ben Wing.[2] The project introduced innovative features such as the Mule (Multilingual Enhancement) system in 1997 for better internationalization support, native Microsoft Windows ports between 1997 and 2000, and a pioneering package system in 1997 that allows independent updates to Lisp extensions without full core rebuilds.[2] These advancements positioned XEmacs as a leader in Emacs variants for graphical and cross-platform usability, supporting image formats like GIF, JPEG, and PNG, and multi-device environments.[2]While development slowed after the stable release of version 21.4.22 in January 2009, the project saw a revival with beta releases resuming in 2023 after nearly a decade of dormancy.[3] The latest beta, version 21.5.36 "leeks," was released on June 14, 2025, incorporating ongoing improvements to the development trunk.[4] Licensed under the GNU General Public License, XEmacs remains available for Unix-like systems, Windows, and other platforms, appealing to users seeking a feature-rich alternative to GNU Emacs with its emphasis on modularity and visual extensibility.[1]
History
Origins as Lucid Emacs
Lucid Inc., a company specializing in C++ and Lisp development environments, initiated the development of Lucid Emacs in 1991 to create a more graphical user interface (GUI)-oriented variant of Emacs tailored for their software tools, particularly the Energize C++ integrated development environment. At the time, the standard GNU Emacs version 18.5 lacked essential GUI features such as mouse support, multiple fonts, and proper window-system integration, prompting Lucid to enhance the editor as a cornerstone for their commercial product suite. This effort aimed to provide a robust, customizable text editor with advanced visual capabilities to improve developer productivity in a graphical computing landscape dominated by the X Window System.[5][2]The initial development of Lucid Emacs was led by Jamie Zawinski, along with early contributors including Matthieu Devin, Harlan Sexton, and Eric Benson, with a primary focus on seamless integration with the X Window System. Building on the existing Emacs codebase, the team prioritized enhancements that would enable Emacs to function effectively as a native X application, including support for graphical widgets and improved event handling for mouse and keyboard interactions. Zawinski, who became known as the primary maintainer, drove much of the core implementation, ensuring the editor could handle complex graphical operations without compromising its extensible Lisp-based architecture.[5][2][6]Lucid Emacs 19.0 was released in 1992 as a pre-release fork derived from the beta version of GNU Emacs 19, reflecting the parallel development paths taken due to delays in the Free Software Foundation's official release and the need for immediate GUI advancements. This fork allowed Lucid to incorporate experimental features from the GNU beta while addressing integration challenges specific to their commercial needs, marking the first major step toward a distinct Emacs lineage optimized for graphical environments.[6][5]Among the key early innovations in Lucid Emacs 19.0 were improved widget support, which enabled the creation of reusable graphical components for user interfaces, and integration with the Motif toolkit, providing a consistent look and feel with contemporary X-based applications. These additions facilitated more intuitive interactions, such as drag-and-drop operations and dialog boxes, setting the foundation for future enhancements in Emacs's graphical capabilities.[2][5]
Forking from GNU Emacs
In late 1991, Lucid Emacs was forked from unreleased sources of GNU Emacs 19 due to mounting disagreements between Lucid Inc. developers and the Free Software Foundation (FSF) over the pace of graphical user interface (GUI) integration and code management practices. Lucid, building on its earlier involvement in Emacs enhancements for the Energize C++ development environment, sought to accelerate support for features like mouse-driven menus, scrollbars, and multiple fonts to align with emerging X Window System standards, which were lagging in the FSF's development timeline. Meanwhile, FSF maintainers, including Richard Stallman, prioritized backward compatibility and a more deliberate integration process, viewing Lucid's rapid changes as potentially destabilizing the codebase.[7][2]Richard Stallman played a central role in the opposition, rejecting several of Lucid's proposed modifications to the unreleased Emacs 19 sources, which had been shared under the expectation of collaborative input. Stallman argued that the changes, developed without sufficient FSF oversight after a maintainer defected to Lucid in 1990, risked fragmenting the Emacs user base and violating design principles centered on extensibility through Lisp. This resistance culminated in Lucid's decision to pursue independent development in late 1991, forking the codebase to maintain momentum for their commercial needs while refusing to merge back without accepting their alterations wholesale.[8][7]Despite Lucid's commercial backing, the forked Lucid Emacs was initially distributed as free software under the GNU General Public License (GPL), ensuring compatibility with the FSF's ethos and broadening its appeal beyond proprietary use. The first public releases emerged in 1992, starting with Lucid Emacs 19.0 in April, followed by 19.1 and 19.2 in June, which introduced enhanced GUI capabilities and garnered quick adoption among users frustrated with GNU Emacs delays. These early versions, primarily authored by developers like Jamie Zawinski, Matthieu Devin, and Harlan Sexton, fostered a growing community around the fork, setting the stage for its evolution.[9][6][2]
Renaming and Expansion
In 1994, following the cessation of support from Lucid Inc., the project originally known as Lucid Emacs was renamed to XEmacs through an agreement between Sun Microsystems and Lucid, with the first release under the new branding being version 19.11 on September 13, 1994.[2][6] The renaming aimed to remove corporate affiliations while highlighting the editor's advanced integration with the X Window System for graphical environments.[10]The development team expanded significantly during this period, transitioning from corporate backing to a broader collaborative effort. Ben Wing, who had joined in late 1992 as a primary architect and code contributor, played a central role, alongside Chuck Thompson, who led enhancements from versions 19.11 to 19.14.[2] By the mid-1990s, additional contributors such as Steve Baur, who served as release engineer starting in 1996, and Hrvoje Nikšić, who became prominent from 1997 onward, further diversified the team's expertise and fostered ongoing innovation.[11]Key milestones included the release of XEmacs 19.13 in September 1995, which introduced a new redisplay engine for improved graphical performance and initial MULE (MULtilingual Enhancement to Emacs) support for handling non-Latin scripts.[12] This was followed by XEmacs 20.0 in February 1997, which fully integrated robust multilingual capabilities, enabling better support for Asian languages and Unicode on Unix platforms.[12]Throughout the 1990s, XEmacs experienced growth in its user base among developers on Unix workstations, particularly those favoring its superior GUI features over terminal-based alternatives, which in turn spurred greater community involvement in the free software ecosystem.[2]
Relationship to GNU Emacs
Philosophical Differences
The philosophical differences between XEmacs and GNU Emacs arose primarily from divergent priorities in development philosophy, with XEmacs favoring rapid innovation through a decentralized, community-oriented approach often described as the "bazaar" model, which encouraged frequent releases and integration of user-contributed enhancements like graphical interfaces and modular packages. In opposition, GNU Emacs under Richard Stallman's leadership adhered to a "cathedral" model, emphasizing stability, rigorous centralized oversight, and controlled evolution to preserve compatibility and reliability within the broader GNU project.[13] This contrast was evident from the 1991 fork, when Lucid developers initiated XEmacs (then Lucid Emacs) amid frustrations with GNU Emacs 19's protracted development.[7]A key point of contention in the 1990s involved debates over licensing purity and the perceived promotion of non-free tools. Stallman objected to Lucid Emacs announcements that highlighted proprietary Lucid products, viewing them as undermining free software ideals by blending commercial interests with GPL-licensed code, which led to restrictions on posting such updates to GNU mailing lists.[7] Despite these criticisms, XEmacs maintained full compliance with the GNU General Public License (GPL), ensuring its code remained freely distributable and modifiable.[13]Stallman repeatedly advocated for project unification to foster cooperation and avoid community fragmentation, stating that "the whole community loses when someone chooses competition rather than cooperation."[13] XEmacs maintainers, however, championed a modular and toolkit-agnostic design philosophy that prioritized extensibility and adaptability over unified control, allowing developers greater freedom to experiment without mandatory alignment to FSF guidelines.[7]These ideological splits influenced free software principles by highlighting tensions between centralized guardianship of the GPL—exemplified by GNU Emacs' requirement for copyright assignments to the Free Software Foundation—and XEmacs' more permissive model of community-driven extensibility, which still adhered to GPL terms but diverged in governance to promote broader participation.[13] The result was a lasting demonstration of how differing visions on control versus openness could coexist within the free software ecosystem without compromising core licensing commitments.
Technical Distinctions
One of the primary technical distinctions between XEmacs and GNU Emacs lies in their implementations of the Emacs Lisp interpreter. XEmacs employs a more object-oriented design, treating characters, events, and keymaps as first-class opaque types rather than integers or lists as in GNU Emacs versions 19 and 20, which enhances type safety and performance in handling editor-specific data.[14] This approach includes optimizations in the Lisp runtime, such as specialized objects for buffers optimized for insertion and deletion operations.[15] In contrast, GNU Emacs maintains a unified interpreter model where such elements are represented more simply, potentially leading to less overhead but reduced abstraction.[14]Regarding bytecode, XEmacs and GNU Emacs both compile Emacs Lisp to bytecode for execution by a dedicated interpreter, but their formats are incompatible due to differences in the underlying object models and compiler implementations.[16] XEmacs includes byte-compilation enhancements, such as those contributed by Martin Buchholz, allowing for a separate handling of uncompiled .el files alongside compiled .elc files to facilitate user modifications without full recompilation.[14] This divergence means bytecode files (.elc) generated for one cannot be loaded in the other, complicating package portability and requiring source-level compatibility checks.[16]The buffer and display engines in XEmacs diverge significantly from GNU Emacs, reflecting architectural choices for greater flexibility. XEmacs represents buffers as character arrays with extents—a unifying abstraction for text properties and overlays—enabling efficient manipulation and copying of properties into strings, whereas GNU Emacs uses separate mechanisms for text properties (attached directly to characters) and overlays (floating ranges).[14] The display engine in XEmacs, developed by Chuck Thompson for redisplay and Ben Wing for glyphs and specifiers, supports dynamic rendering with variable-width proportional fonts and full face support (e.g., syntax highlighting) even in console mode.[14][17]GNU Emacs, by comparison, relies on fixed-width fonts and raw Xlib calls for graphics, limiting toolkit integration. XEmacs integrates more seamlessly with widget toolkits like Xt (supporting Motif and Athena) and has experimental GTK+ support since version 21.2, allowing embedding in external widgets and more responsive GUI elements such as iconic toolbars.[14][18][17]Package formats and Elisp extensions further highlight incompatibilities, stemming from these core differences. XEmacs features a hierarchical package system with dedicated directories (e.g., xemacs-packages, mule-packages) and integrated tools like EFS for remote downloading and installation, bundling more libraries by default than early GNU Emacs releases.[14] Elisp extensions in XEmacs leverage extents for property handling, providing a superset interface compatible with GNU's text properties and overlays but with underlying differences that break direct interchangeability of code relying on internal representations.[14] These extensions, combined with bytecode incompatibilities, make merging packages between the two editors challenging, often requiring dual maintenance or conditional code.[16]In handling Unicode and internationalization, XEmacs adopted the Mule (MULtilingual Enhancement) system earlier and more comprehensively than GNU Emacs. Originating as an extension to GNU Emacs for Asian-language support, Mule was integrated into XEmacs starting from version 19.14, with full Unicode support achieved in version 21.5 via Mule-UCS, including partial implementation in 21.4.[19][14] XEmacs supports a broader range of input methods, such as XIM, Wnn, Canna, and SJ3, compared to GNU Emacs's primary reliance on XIM in earlier versions.[14] However, divergences arose in later standards; while both now support Unicode internally, XEmacs's Mule variants (handling three kinds) and package hierarchies for internationalization differ from GNU Emacs's evolution through Mule 3 and 4, leading to variant-specific incompatibilities in file encoding and display.[14][19]
Core Features
Graphical Interface Enhancements
XEmacs was designed with native integration to the X11 windowing system from its inception as Lucid Emacs in the early 1990s, enabling seamless graphical operation without relying on terminal emulators.[20] This integration utilized the MIT X Toolkit Intrinsics (Xt) to abstract low-level Xlib calls, promoting better portability and "X citizenship" across diverse X11 environments.[14]The editor supports multiple widget toolkits for its graphical user interface, including Motif for a professional look, Athena (via generic Xt) for lightweight rendering, and GTK+ (with improvements to GTK 3.X support in recent 21.5 betas).[14][21] These toolkits facilitate advanced interface elements such as configurable menubars, toolbars (positionable on top, bottom, left, or right), and vertical or horizontal scrollbars, all implemented natively without external dependencies.[1] Drag-and-drop functionality, introduced experimentally in XEmacs 21, allows users to manipulate files, text selections, and buffers directly within the GUI.[14]A key aspect of XEmacs' graphical design is its device-independent graphics layer, built atop the Xt toolkit, which ensures consistent rendering of visual elements across varying X11 configurations and display hardware.[14] This layer supports embedding XEmacs frames into external Xt-based applications, enhancing interoperability.[14] Additionally, since the 1990s, XEmacs has pioneered innovations like in-buffer image display for formats such as XPM and PNG, and sound support for playing audio files via protocols including NAS and EsounD, predating similar capabilities in other Emacs variants.[20]These GUI enhancements are further customizable through Emacs Lisp (Elisp), allowing users to script modifications to interface behaviors and appearances.[1]
Package System and Modularity
The XEmacs package system was introduced in 1997 by Steve Baur to facilitate the installation, upgrading, and removal of Lisp libraries without requiring users to rebuild the editor from source.[2] This system marked a significant advancement in modularity, allowing extensions to be managed as discrete, self-contained units that integrate seamlessly into XEmacs' architecture. By unbundling much of the Lisp code from the core distribution starting with XEmacs 21.1, the package system enabled developers to update functionalities independently, reducing the editor's base size and improving maintainability.[22][23]Central to the system's design are its repositories, which include stable, alpha, and beta categories accessible via Mercurial for incremental updates.[24][22] Packages are organized into hierarchies such as xemacs-packages and mule-packages, with automatic setup of the load-path and autoloads upon installation, ensuring modular loading without manualconfiguration.[24] The Package-Rebuilder tool supports maintenance by rebuilding package manifests and handling binary deletions, while integration with Easy-PKG enables automated fetching and installation of add-ons directly within the interface.[24] Built-in dependencyresolution further enhances reliability, as the system verifies and retrieves prerequisites before installation.[24]Compared to early GNU Emacs distributions, which lacked a comparable built-in mechanism until the introduction of ELPA in 2009 and faced resistance to such features as late as 2007, XEmacs' package system offered superior ease of use and distribution of extensions from the outset.[13] This approach minimized common configuration issues and empowered a broader contributor base through dispersed commit authority. A graphical interface for browsing and selecting packages provides users with an intuitive way to explore available add-ons.[13]
Customization and Extensibility
XEmacs provides extensive customization through Emacs Lisp (Elisp), its primary extension language, which allows users to modify nearly every aspect of the editor's behavior and appearance. Elisp code can be written to define new commands, alter existing ones, and integrate advanced features, with XEmacs introducing specific primitives to enhance graphical user interface (GUI) elements such as toolbars, menubars, and faces for text attributes like fonts and colors. For multimedia, primitives like those in the sound-alist variable enable custom audible feedback, such as playing specific sounds for events on supported hardware.[25][13]Users achieve site-wide or personal customizations by editing initialization files, typically ~/.emacs or ~/.xemacs/init.el, which load Elisp code upon startup to set variables, bind keys, and enable modes. Dynamic loading of modules supports efficient incorporation of terminal-specific libraries or extensions without restarting the editor, a feature refined in XEmacs 21.4 to include loadable compiled modules for performance. Recent beta releases since 2023 have added features like TLS support for secure connections, further enhancing extensibility.[25][13][21] This system facilitates seamless integration of user scripts for tasks like automated editing or workflow automation.[25][13]Customization extends to themes via face definitions, where functions such as set-face-background, set-face-foreground, and set-face-font allow per-frame adjustments to colors, fonts (including Xft for anti-aliased rendering), and styles, supporting diverse visual preferences. Keybindings can be remapped globally with global-set-key or locally via define-key on keymaps, which in XEmacs are treated as first-class opaque objects for more robust handling. The editor includes numerous major and minor modes tailored to domains like programming (e.g., C++ mode with syntax highlighting), writing (e.g., text mode with auto-fill), and more, each customizable through hooks and variables to suit user needs.[25][13]Historically, XEmacs advanced extensibility over early GNU Emacs by introducing extents—a mechanism for attaching properties to buffer text that improves support for keyboard macros and complex editing operations—and enhanced introspection tools like the customizeinterface for interactively browsing and modifying variables with C-h v (describe-variable). These additions, pioneered in XEmacs versions 20 and 21, provided earlier access to GUI widgets (e.g., native progress bars) and a more modular Elisp environment, influencing later developments in the Emacs ecosystem.[13][25]
Development and Maintenance
Development Practices
XEmacs follows an open-source development model under the GNU General Public License, utilizing version control systems that evolved from CVS in the 1990s to Mercurial as a distributed system since around 2009.[26] Early repositories were hosted via CVS on platforms like cvs.alioth.debian.org for anonymous read-only access and commit access for qualified contributors, with a transition to Mercurial repositories on hg.debian.org, then Bitbucket.org, and after Bitbucket's 2020 discontinuation of Mercurial support, to Heptapod (foss.heptapod.net) to support more collaborative distributed workflows.[26][27][28] This shift facilitated easier branching and merging among volunteer developers, aligning with the project's emphasis on accessibility for open-source contributions.[27]Community governance in XEmacs relies on decentralized coordination through mailing lists and beta release cycles, prioritizing volunteer-driven input over centralized authority.[27] Key lists include xemacs-beta for discussing development updates and testing pre-release versions, and xemacs-patches for submitting and reviewing code changes, where contributors are encouraged to use tools like the patcher utility from the xemacs-devel package. Issues are managed through these lists and the integrated issue tracker in the Heptapod repository.[27][28] This model fosters broad participation, with decisions emerging from community consensus on patches and features. Volunteers, regardless of experience level, contribute by identifying bugs, providing fixes, or enhancing packages, often through initiatives like Google Summer of Code.[29]Development practices emphasize modular coding to enhance maintainability and potential interoperability, particularly in attempts to merge innovations with GNU Emacs.[13] The codebase separates core C components from Lisp libraries, enabling independent package development and updates via an integrated system that includes easy file system (EFS) support for remote library fetching.[13] This modularity supports hourly automated builds and smoketests for packages, reducing integration risks and aiding efforts to share code despite historical challenges in reconciliation.[27] Such approaches stem from XEmacs's philosophical divergence from GNU Emacs's more centralized, politically oriented governance under the Free Software Foundation.[13]Key developers have played pivotal roles in advancing XEmacs, with Ben Wing contributing significantly to the display engine during the 2000s through retooling efforts and patches that improved rendering and Unicode support.[30] Wing's work, including merges of data representations and ongoing refinements, enhanced the engine's efficiency for complex graphical interfaces and international text handling.[31][32]
Release History and Current Status
The development of XEmacs began with the 19 series in the early 1990s, spanning releases from version 19.0 in April 1992 to 19.15 in March 1997, during which it evolved from Lucid Emacs and introduced foundational enhancements like preliminary internationalization support and scrollbars.[6] Subsequent iterations included the 20 series, starting with 20.0 in February 1997 and culminating in the stable 20.4 in February 1998, which integrated full MULE multilingual support and separated core functionality from modular packages.[6] The 21 series followed, with 21.4.0 released in April 2001 as a stable branch focused on refinements to the package system and stability, receiving patches through 21.4.22 "Instant Classic" in January 2009.[33][6]Development in the 21.5 beta series progressed more slowly, with 21.5.35 "kohlrabi" released in May 2023, incorporating support for GTK3 rendering, TLS encryption, and native 64-bit Windows builds to improve compatibility with contemporary systems.[21] This was followed by 21.5.36 "leeks" in June 2025, continuing the beta line with incremental updates.[4] Post-2010, XEmacs maintenance has been sporadic, emphasizing bug fixes, security patches, and compatibility enhancements such as an internal Unicode format for better text handling.[2]As of November 2025, XEmacs is actively maintained by volunteers, with Vin Shelton overseeing the stable 21.4 branch receiving critical fixes, while the beta 21.5 branch sees ongoing commits (latest on November 17, 2025) toward the planned 22.0 release focusing on multilingual enhancements. There is no full-time team, but pre-built binaries are provided for modern operating systems including Linux, macOS, and Windows, though the stable series receives only critical fixes while beta work plans toward a potential 22.0 release.[3][1][28]
Derivatives
SXEmacs Fork
SXEmacs emerged as a fork of XEmacs 21.4.16 in late 2004, led by Steve Youngs. The project aimed to deliver a cleaner codebase by systematically removing legacy hacks and redundancies accumulated in XEmacs, while emphasizing better modularity through restructured source hierarchies and separated build processes.[34] These efforts focused on long-term maintainability, enabling easier integration of new features without compromising the core Lisp environment's integrity.[34]Development progressed with the initial public release, SXEmacs 22.1.6, in December 2006, marking a shift to a dedicated 22.x series distinct from XEmacs's 21.x line.[35] Subsequent milestones included the adoption of GPLv3 in November 2007 for stricter license compliance and ongoing enhancements for modern Emacs Lisp (Elisp) compatibility, such as a Foreign Function Interface (FFI) added in 2005 to directly interface with C libraries.[34] Releases continued into the 2020s, with version 22.1.17 in September 2020 incorporating updates like improved multimedia handling and XDG compliance, ensuring sustained relevance in contemporary environments. Development has continued with bleeding-edge updates beyond 2020.[34]
Other Related Projects
XEmacs has inspired several minor ports and derivatives aimed at expanding its reach beyond traditional Unix environments. Early efforts included the Win-Emacs project, derived directly from XEmacs 19.6, which provided a native Microsoft Windows application with features such as multiple windows and syntax highlighting, later integrated into the main XEmacs codebase by developer Ben Wing.[36] Similarly, ports to Apple Macintosh systems were maintained post-2000, including adaptations of XEmacs 19.14 for Mac OS 8 and XEmacs 21.5.9 for Mac OS X using the Carbon framework, led by contributor Pitts Jarvis (who has since passed away).[37] These non-Unix ports ensured continued accessibility for users on desktop operating systems, with binary distributions available through official mirrors into the 2010s.[38]In the realm of embedded systems, XEmacs' emphasis on modularity influenced lightweight derivatives of Emacs-like editors, such as variants of MicroEmacs. MicroEmacs itself, originating in 1985 and evolved through contributions like those from Daniel M. Lawrence, inspired projects such as Jasspa MicroEmacs and NanoEmacs, which support low-resource platforms including DOS and Windows, and Z80EMacs, adapted for the constrained 64KB address space of CP/M systems in 1992 using overlays for efficient file handling up to 30KB.[36] Another example is Freyja, a RAM-optimized derivative targeting palmtops and laptops with limited memory.[36]Among legacy projects, multiple attempts to reconcile XEmacs with GNU Emacs through mergers occurred in the early 2000s, following the 1997 split. At least six to seven major initiatives, initiated primarily by the XEmacs team, involved extensive discussions but ultimately failed due to irreconcilable differences in development philosophies, licensing concerns, and architectural divergences.[39] These efforts highlighted ongoing community interest in unification but reinforced the separate trajectories of the projects.