# janestreet/emacs architecture

> Architecture diagram of the GitHub repository janestreet/emacs, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-15). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/janestreet/emacs
- Repository: https://github.com/janestreet/emacs

## Overview

GNU Emacs is an extensible, self-documenting editor. A user supplies keyboard or other input; Emacs interprets commands, edits buffers, and redisplays the result. Its C runtime provides the Lisp interpreter, editing primitives, and display machinery, while platform code handles native UI and integration. Android adds an Activity/service front end, a Java-to-native bridge, window and graphics handling, and document access. The README documents these major roles; sampled excerpts chiefly confirm Android wiring and search’s buffer-related dependencies, so other links are limited to documented relationships.

Main entry points: [`java/org/gnu/emacs/EmacsService.java`](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsService.java) (Emacs service), [`src/buffer.h`](https://github.com/janestreet/emacs/blob/master/src/buffer.h) (Buffer state), [`java/org/gnu/emacs/EmacsWindow.java`](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsWindow.java) (Android window), [`java/org/gnu/emacs/EmacsOpenActivity.java`](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsOpenActivity.java) (Open-file intents)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_editor["Editor runtime"]
  node_keyboard["Input events<br/>[keyboard.c]"]
  node_commands["Editing commands<br/>[cmds.c]"]
  node_lisp["Lisp evaluation<br/>[eval.c]"]
  node_buffers[("Buffer state<br/>[buffer.h]")]
  node_search["Search and replace<br/>[search.c]"]
  node_coding["Character coding<br/>[coding.c]"]
end

subgraph group_display["Display and platforms"]
  node_redisplay["Redisplay<br/>[xdisp.c]"]
  node_frames["Frames and windows<br/>[frame.c]"]
  node_xplatform["X display backend<br/>[xterm.c]"]
end

subgraph group_android["Android application"]
  node_androidactivity["Android activities<br/>[EmacsActivity.java]"]
  node_service["Emacs service<br/>[EmacsService.java]"]
  node_native["JNI bridge<br/>[EmacsNative.java]"]
  node_windowmanager["Window manager"]
  node_window["Android window<br/>[EmacsWindow.java]"]
  node_view["Android view<br/>[EmacsView.java]"]
  node_graphics["Graphics operations<br/>[EmacsGC.java]"]
  node_documents["Document access"]
  node_openactivity["Open-file intents"]
end

subgraph group_integration["Process integration"]
  node_client["Emacs client<br/>[emacsclient.c]"]
  node_exec["Android exec helper<br/>[exec.c]"]
end

node_user(("Editor user"))
node_program(("User programs"))

node_user -->|"provides input"| node_keyboard
node_keyboard -.->|"dispatches commands"| node_commands
node_commands -.->|"invokes evaluation"| node_lisp
node_lisp -.->|"edits state"| node_buffers
node_search -->|"searches and modifies"| node_buffers
node_buffers -.->|"supplies display state"| node_redisplay
node_redisplay -.->|"renders frames"| node_frames
node_frames -.->|"uses backend"| node_xplatform
node_androidactivity -->|"starts service"| node_service
node_service -->|"calls native methods"| node_native
node_service -->|"creates views"| node_window
node_service -->|"uses manager"| node_windowmanager
node_windowmanager -->|"tracks windows"| node_window
node_window -->|"owns view"| node_view
node_view -->|"sends input events"| node_native
node_service -->|"dispatches drawing"| node_graphics
node_openactivity -->|"checks service"| node_service
node_service -->|"delegates access"| node_documents
node_openactivity -->|"launches client"| node_client
node_client -.->|"requests editor action"| node_user
node_user -->|"runs programs"| node_program
node_exec -->|"supports execution"| node_program

click node_keyboard "https://github.com/janestreet/emacs/blob/master/src/keyboard.c"
click node_commands "https://github.com/janestreet/emacs/blob/master/src/cmds.c"
click node_lisp "https://github.com/janestreet/emacs/blob/master/src/eval.c"
click node_buffers "https://github.com/janestreet/emacs/blob/master/src/buffer.h"
click node_search "https://github.com/janestreet/emacs/blob/master/src/search.c"
click node_coding "https://github.com/janestreet/emacs/blob/master/src/coding.c"
click node_redisplay "https://github.com/janestreet/emacs/blob/master/src/xdisp.c"
click node_frames "https://github.com/janestreet/emacs/blob/master/src/frame.c"
click node_xplatform "https://github.com/janestreet/emacs/blob/master/src/xterm.c"
click node_androidactivity "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsActivity.java"
click node_service "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsService.java"
click node_native "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsNative.java"
click node_windowmanager "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsWindowManager.java"
click node_window "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsWindow.java"
click node_view "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsView.java"
click node_graphics "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsGC.java"
click node_documents "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsSafThread.java"
click node_openactivity "https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsOpenActivity.java"
click node_client "https://github.com/janestreet/emacs/blob/master/lib-src/emacsclient.c"
click node_exec "https://github.com/janestreet/emacs/blob/master/exec/exec.c"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_keyboard,node_commands,node_lisp,node_buffers,node_search,node_coding,node_user,node_program toneBlue
class node_redisplay,node_frames,node_xplatform toneAmber
class node_androidactivity,node_service,node_native,node_windowmanager,node_window,node_view,node_graphics,node_documents,node_openactivity toneMint
class node_client,node_exec toneRose
```

## Components

### Editor runtime

- [Input events](https://github.com/janestreet/emacs/blob/master/src/keyboard.c): `src/keyboard.c`
- [Editing commands](https://github.com/janestreet/emacs/blob/master/src/cmds.c): `src/cmds.c`
- [Lisp evaluation](https://github.com/janestreet/emacs/blob/master/src/eval.c): `src/eval.c`
- [Buffer state](https://github.com/janestreet/emacs/blob/master/src/buffer.h): `src/buffer.h`
- [Search and replace](https://github.com/janestreet/emacs/blob/master/src/search.c): `src/search.c`
- [Character coding](https://github.com/janestreet/emacs/blob/master/src/coding.c): `src/coding.c`

### Display and platforms

- [Redisplay](https://github.com/janestreet/emacs/blob/master/src/xdisp.c): `src/xdisp.c`
- [Frames and windows](https://github.com/janestreet/emacs/blob/master/src/frame.c): `src/frame.c`
- [X display backend](https://github.com/janestreet/emacs/blob/master/src/xterm.c): `src/xterm.c`

### Android application

- [Android activities](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsActivity.java): `java/org/gnu/emacs/EmacsActivity.java`
- [Emacs service](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsService.java): `java/org/gnu/emacs/EmacsService.java`
- [JNI bridge](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsNative.java): `java/org/gnu/emacs/EmacsNative.java`
- [Window manager](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsWindowManager.java): `java/org/gnu/emacs/EmacsWindowManager.java`
- [Android window](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsWindow.java): `java/org/gnu/emacs/EmacsWindow.java`
- [Android view](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsView.java): `java/org/gnu/emacs/EmacsView.java`
- [Graphics operations](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsGC.java): `java/org/gnu/emacs/EmacsGC.java`
- [Document access](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsSafThread.java): `java/org/gnu/emacs/EmacsSafThread.java`
- [Open-file intents](https://github.com/janestreet/emacs/blob/master/java/org/gnu/emacs/EmacsOpenActivity.java): `java/org/gnu/emacs/EmacsOpenActivity.java`

### Process integration

- [Emacs client](https://github.com/janestreet/emacs/blob/master/lib-src/emacsclient.c): `lib-src/emacsclient.c`
- [Android exec helper](https://github.com/janestreet/emacs/blob/master/exec/exec.c): `exec/exec.c`

### Other components

- **Editor user**
- **User programs**

## Connections

- Editor user → Input events: provides input (evidence: `README`)
- Input events → Editing commands: dispatches commands
- Editing commands → Lisp evaluation: invokes evaluation
- Lisp evaluation → Buffer state: edits state
- Search and replace → Buffer state: searches and modifies (evidence: `src/search.c`)
- Buffer state → Redisplay: supplies display state
- Redisplay → Frames and windows: renders frames
- Frames and windows → X display backend: uses backend
- Android activities → Emacs service: starts service (evidence: `java/org/gnu/emacs/EmacsActivity.java`)
- Emacs service → JNI bridge: calls native methods (evidence: `java/org/gnu/emacs/EmacsService.java`)
- Emacs service → Android window: creates views (evidence: `java/org/gnu/emacs/EmacsService.java`)
- Emacs service → Window manager: uses manager (evidence: `java/org/gnu/emacs/EmacsService.java`)
- Window manager → Android window: tracks windows (evidence: `java/org/gnu/emacs/EmacsWindowManager.java`)
- Android window → Android view: owns view (evidence: `java/org/gnu/emacs/EmacsWindow.java`)
- Android view → JNI bridge: sends input events (evidence: `java/org/gnu/emacs/EmacsWindow.java`)
- Emacs service → Graphics operations: dispatches drawing (evidence: `java/org/gnu/emacs/EmacsService.java`)
- Open-file intents → Emacs service: checks service (evidence: `java/org/gnu/emacs/EmacsOpenActivity.java`)
- Emacs service → Document access: delegates access (evidence: `java/org/gnu/emacs/EmacsService.java`)
- Open-file intents → Emacs client: launches client (evidence: `java/org/gnu/emacs/EmacsOpenActivity.java`)
- Emacs client → Editor user: requests editor action
- Editor user → User programs: runs programs (evidence: `README`)
- Android exec helper → User programs: supports execution (evidence: `README`)
