https://github.com/kurouna/elecxzy
elecxzy project
https://github.com/kurouna/elecxzy
electron elecxzy emacs emacs-like piece-table react text-editor typescript xyzzy
Last synced: 24 days ago
JSON representation
elecxzy project
- Host: GitHub
- URL: https://github.com/kurouna/elecxzy
- Owner: kurouna
- License: mit
- Created: 2026-02-03T10:14:50.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2026-05-23T00:40:42.000Z (about 1 month ago)
- Last Synced: 2026-05-23T02:34:17.197Z (about 1 month ago)
- Topics: electron, elecxzy, emacs, emacs-like, piece-table, react, text-editor, typescript, xyzzy
- Homepage:
- Size: 94.3 MB
- Stars: 15
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[](https://opensource.org/licenses/MIT)
[](https://zenn.dev/kurouna)
[](https://x.com/elecxzy)
**A Lisp-free text editor with Emacs keybindings, featuring a built-in MCP server for AI-driven editing.**
https://github.com/user-attachments/assets/ea817cb4-85c9-4225-9425-5c61915823ab
[English](#english) | [æ¥æ¬èª](#japanese)
---
`elecxzy` is a text editor developed to provide an Emacs-like editing experience within a web technology stack (Electron). While it does not include an embedded Lisp engine, it features a built-in MCP (Model Context Protocol) server, enabling AI assistants to directly interact with and control the editor. By providing well-considered default settings out of the box, it reduces the need for extensive initial configuration, allowing you to start editing immediately.
### Download
**Windows only**
[](https://apps.microsoft.com/detail/9P32F2WFL69M)
Automatic updates are provided via the Microsoft Store. For the latest development builds, you can also download binaries from:
ð **[GitHub Releases](https://github.com/kurouna/elecxzy/releases)**
*Note: The source repository is currently private.*
### Architecture & Design
- **Technology Base**: Built on the Electron framework, utilizing HTML and CSS for the user interface, and TypeScript for application logic. It employs IPC communication between the Main and Renderer processes to handle system-level operations.
- **Buffer Management**: Uses an RB-Tree (Red-Black Tree) based Piece Table. This allows efficient operations and incremental, delta-based undo histories for large files.
- **Rendering Engine**: Implements a custom virtual rendering system. It utilizes the Canvas API for accurate text metrics (handling mixed full-width and half-width characters without fixed-width assumptions) and minimizes DOM reflows.
- **IME Input Control**: Implements explicit handling of DOM composition events to manage uncommitted text state and focus. Additionally, it ignores IME input after prefix keys (e.g., `C-x`) to prevent conflicts between Japanese text input and Emacs command execution.
- **Settings System**: Relies on static JSON configurations (`config.json`, `color-config.json`) instead of a dynamic scripting engine.
### Key Features
* **Emacs Keybindings:** Core operations including cursor movement (`C-f`, `C-b`, `C-n`, `C-p`), recursive window splitting (`C-x 2`, `C-x 3`), window resizing (`C-x ^`, `C-x }`), animated window-layout reshaping (`C-x w t` to transpose, `C-x w f` / `C-x w v` to flip, `C-x w r ` / `` to rotate the layout 90°, `C-x w o ` / `` to cycle buffers across panes), and kill ring management (`C-w`, `M-w`, `C-y`, `M-y`).
* **Search & Replacement:** Incremental search (`C-s`), interactive replacement (`M-%`), and cross-file search across directories (`M-x grep`) powered by background OS processes (`findstr` / `grep`).
* **Completion System:** `dabbrev-expand` (`M-/`) for buffer-local word completion, extracting multi-byte characters and preserving undo chain integrity.
* **Live Preview:** Preview modes for Markdown and HTML, featuring one-way scroll synchronization that tracking the source buffer's position.
* **Window & Buffer Management:** Provides seamless buffer switching (`C-x b`) and a dedicated buffer list (`C-x C-b`). In addition to standard minibuffer prompts, it provides commands to utilize OS-native file and save dialogs (`C-x M-f`, `C-x M-w`).
* **Sidebar File Explorer (Filer):** A dedicated file manager (`C-x d` / `C-c d`) displayed on the window's left side. Provides fast file previewing (`l` / `Right`), and directory traversal (`r`, `u`) including support for Windows system drives.
* **Sidebar Utility Suite:** Multiple dedicated sidebars displayed on the window's right side to assist editing:
* **Workspace Sidebar** (`C-c w`, `C-,` or `M-x toggle-workspace-sidebar`): Manage multiple folders in a dedicated workspace, seamlessly opening and saving `.code-workspace` files compatible with VS Code.
* **Outline View** (`C-c o`): Hierarchical display of headings for Markdown and HTML with real-time sync.
* **Kill Ring Sidebar** (`C-c y` or `M-x browse-kill-ring`): Browse and manage your kill ring (clipboard history).
* **Register Sidebar** (`C-c r` or `M-x browse-registers`): Inspect and select persistent registers (text and points).
* **Undo History Sidebar** (`C-c u` or `M-x browse-undo-history`): Browse the active buffer's undo history with text previews; selecting an entry rolls the buffer back to that point and is recorded as a single redo transaction (Office-style).
* **Recent Files Sidebar** (`C-c c` or `M-x browse-recent-files`): Quickly browse and open recently used files with path previews.
* **Settings Sidebar** (`C-c s`, `C-.` or `M-x open-config`): Manage editor configurations like fonts, themes, and line numbers.
* **Terminal Integration:** Built-in interactive shell buffer (`M-x shell`) on Windows environments.
* **Major Modes:** Automatic language detection and syntax highlighting for major languages based on file extensions.
* **Minibuffer Completion:** Interactive completion for `M-x` commands, files, and directories within the minibuffer.
* **Non-text File Import:** Automatically extract and import plain text from PDF, Word documents (**`.docx`**), and Excel (**`.xlsx`**) files. Excel documents are parsed with sheet headers and data formatted in a clean TSV (Tab-Separated Values) layout. **Note:** Imported files are opened in **Read-only mode** to prevent overwriting the original binary data. Use 'Save As' (`C-x C-w` or `C-x M-w`) to save the extracted text to a new file. A **50MB size limit** applies to these formats to ensure system stability.
* **File Operations & Encoding:** Includes periodic auto-saving, a recent files list (`M-x recentf-open-files`), automatic UTF-8 promotion, and native buffer printing (`M-x print-buffer`).
* **Text Formatting (Fill Paragraph):** `M-q` (`fill-paragraph`) command to reformat and hard-wrap paragraphs based on a configurable width (`set-wrap-column`), optimizing layout for both Japanese and English text.
* **Persistent Registers:** Store and recall text or cursor positions across sessions using Emacs-style registers. Commands include `C-x r s` (copy to register), `C-x r i` (insert), `C-x r SPC` (save point), and `C-x r j` (jump). All data is persisted in browser local storage. Supports special 'rectangle' type storage when in rectangle mark mode.
* **Rectangle Editing:** Enhanced rectangle support for mass-editing columns. Enter rectangle mark mode with `C-x SPC`, and perform operations like `C-x r k` (kill), `M-x kill-ring-save` (copy), and `C-y` (yank). The editor intelligently detects rectangular data in the kill ring and registers.
* **Full Unicode Support:** Robust handling of surrogate pairs (emojis, etc.) throughout the editor, ensuring characters are never split during editing or navigation.
* **Accurate Word Navigation**: Utilizes the native `Intl.Segmenter` API for precise word boundary detection. It provides natural cursor movement (`M-f`, `M-b`, etc.) across CJK (Chinese, Japanese, Korean) text and supports subword navigation (e.g., `snake_case`) out of the box without additional configurations.
* **Avy Jump Navigation (`C-'`):** Quick cursor movement within the visible viewport using target labels. Press `C-'` followed by a character to overlay matching locations with labels, then type the label to jump.
* **Cursor Visual Effects (VFX):** Add dynamic visual flair to your cursor movement. Switch between 9 unique styles (including "Light Particle", "Cyber Trace", and "Kawaii Shower") or turn it off using dedicated shortcuts:
* `C-c 1` to `C-c 9`: Switch through different VFX styles.
* `C-c 0`: Turn VFX off.
* **Lightweight Cursor-based Macros (Beta):** Reproduce repetitive text mutations (`insert`/`delete`) relative to the cursor position (`C-x (`, `C-x )`, `C-x e`). Supports prefix arguments for repetition (e.g., `C-u 10 C-x e`).
* **Customizable Color Themes:** Personalize your workspace with color themes. Switch between built-in modes like **"Dark"**, **"Light"**, **"Cyber"** (Neon/Futuristic), and **"Cute"** (Pastel/Macaron) using `M-x -theme`. Note: Application restart is required for changes to take effect.
* **MCP Server Integration**: Functions as a Model Context Protocol (MCP) server, allowing AI assistants (Google Antigravity, Claude Desktop/Code, etc.) to read/edit buffers and control the editor directly via the **`ELECXZY_MCP_MODE`** environment variable.
* **Custom Keybindings (`keybinds.json`)**: Override or remove default keybindings without rebuilding. Drop a `keybinds.json` next to `config.json` (open it any time with `M-x show-keybinds-config`); Emacs-style notation is supported (`\C-` = Ctrl, `\M-` = Alt, space-separated tokens form a key sequence like `"C-x C-f"`), and an empty string value removes a binding. Parsing or validation problems are reported once in the echo line and never crash editing. Example:
```json
{
"\\C-s": "save-buffer",
"C-x C-r": "mark-whole-buffer",
"\\C-_": ""
}
```
### MCP Server Integration
`elecxzy` can function as an MCP server. By connecting your AI assistant to `elecxzy`, the AI can gain direct access to your open buffers, layout, and editing commands. This allows for powerful AI-driven editing workflows.
> [!IMPORTANT]
> Before starting the MCP server, configure **Allowed Save Directories** in `Settings â MCP` (or `mcpAllowedDirectories` in `config.json`). The MCP `save_file` tool can only write to paths under one of these directories. `M-x mcp-start` aborts with an echo-line message if the list is empty or contains a non-existent path.
#### Configuration (Google Antigravity / Claude Desktop / Claude Code)
Add the following to your `claude_desktop_config.json` or the relevant configuration section of your AI agent (like Google Antigravity), referring to one of the examples below:
```json
{
"mcpServers": {
"elecxzy": {
"command": "C:\\path\\to\\elecxzy\\elecxzy.exe",
"args": ["C:\\path\\to\\elecxzy\\resources\\app.asar"],
"env": {
"ELECXZY_MCP_MODE": "true",
"ELECTRON_RUN_AS_NODE": "1"
}
}
}
}
```
```json
{
"mcpServers": {
"elecxzy": {
"command": "C:\\Users\\...\\AppData\\Local\\Programs\\elecxzy\\elecxzy.exe",
"args": ["C:\\Users\\...\\AppData\\Local\\Programs\\elecxzy\\resources\\app.asar"],
"env": {
"ELECXZY_MCP_MODE": "true",
"ELECTRON_RUN_AS_NODE": "1"
}
}
}
}
```
### Tech Stack
- **Platform**: Electron
- **Frontend**: React, TypeScript
- **Styling**: Styled-components
### Commands and Customization
For a full list of available commands and keybindings, please refer to:
ð **[COMMANDLIST.md](./COMMANDLIST.md)**
---
`elecxzy` ã¯ãElectronãåºç€ãšããŠéçºããããEmacsããŒãã€ã³ãããµããŒãããããã¹ããšãã£ã¿ã§ãã
Lispãªã©ã®ã¹ã¯ãªãããšã³ãžã³ã¯å
èµããŠããŸããããããã¹ãç·šéæ©èœãæäŸããMCPïŒModel Context ProtocolïŒãµãŒããŒæ©èœãåããŠãããåçš®AIã¢ã·ã¹ã¿ã³ãããçŽæ¥ãšãã£ã¿ãæäœããããšãå¯èœã§ãã
ããããã䜿ããããèšå®ãããã©ã«ãå€ãšããŠçµã¿èŸŒãã§ããããšã§ãåæèšå®ã®ãªãŒããŒããããæžãããã€ã³ã¹ããŒã«çŽåŸããããã«äœæ¥ãéå§ã§ããããšãç®çã«èšèšãããŠããŸãã
### ããŠã³ããŒã
**Windowså°çš**
[](https://apps.microsoft.com/detail/9P32F2WFL69M)
Microsoft Storeçã¯ãèªåæŽæ°ãæäŸãããŸããææ°ã®éçºçïŒGitHubçµç±ïŒã¯ä»¥äžããå
¥æå¯èœã§ãïŒ
ð **[GitHub Releases](https://github.com/kurouna/elecxzy/releases)**
*â»ãœãŒã¹ã³ãŒãã¯çŸåšéå
¬éã§ãã*
### ã¢ãŒããã¯ãã£ãšèšèšæ¹é
- **åºç€æè¡**: Electronãã¬ãŒã ã¯ãŒã¯ãããŒã¹ãšããUIã®æ§ç¯ã«HTML/CSSãã¢ããªã±ãŒã·ã§ã³ããžãã¯ã«TypeScriptãæ¡çšããŠããŸããã¡ã€ã³ããã»ã¹ãšã¬ã³ãã©ãŒããã»ã¹éã®IPCéä¿¡ãçšããŠããã¡ã€ã«ããŠã£ã³ããŠã®ã·ã¹ãã åŠçã飿ºãããŠããŸãã
- **ãããã¡ç®¡ç**: èµ€é»æšïŒRB-TreeïŒããŒã¹ã® Piece Table ãããŒã¿æ§é ãšããŠæ¡çšããŠããŸããå·®åïŒDeltaïŒãå©çšããã€ã³ã¯ãªã¡ã³ã¿ã«ãªUndoå±¥æŽã®æ§ç¯ã«ããã倧容éãã¡ã€ã«ã«ãããŠãã¡ã¢ãªäœ¿çšéãæãã€ã€ç·šéæäœãå¯èœã§ãã
- **æç»ãšã³ãžã³**: ä»®æ³ã¬ã³ããªã³ã°ã«ããã«ã¹ã¿ã æç»ç³»ãå®è£
ããŠããŸããCanvas APIãå©çšããé«ç²ŸåºŠãªæåå¹
èšæž¬ãçµã¿èŸŒãããšã§ããã©ã³ããµã€ãºãå
šè§ã»åè§æåã®æ··åšã«èµ·å ããã¬ã€ã¢ãŠãã®ãºã¬ãé²ããè«ççãªã«ãŒãœã«é
眮ãšã¹ã¯ããŒã«èšç®ãè¡ã£ãŠããŸãã
- **IMEå
¥åå¶åŸ¡**: DOMã®compositionã€ãã³ããå©çšããŠæªç¢ºå®æåã®åŒ·å¶ç¢ºå®ããã©ãŒã«ã¹ç®¡çãè¡ã£ãŠããã»ããããªãã£ãã¯ã¹ããŒïŒ`C-x`çïŒã®å
¥åçŽåŸã¯IMEã®å
¥åãç¡èŠããå¶åŸ¡ãå
¥ããããšã§ãEmacsããŒãã€ã³ããšæ¥æ¬èªå
¥åã®ç«¶åãé²ããã³ãã³ãå®è¡ã®ç¢ºå®æ§ãåäžãããŠããŸãã
- **èšå®æ©æ§**: åçãªã¹ã¯ãªãããšã³ãžã³ãæãããéçãªèšå®ãã¡ã€ã«ïŒ`config.json` ããã³ `color-config.json`ïŒãçšããŠãšãã£ã¿ã®å€èгãåºæ¬çãªæåã管çããŸãã
### äž»ãªæ©èœ
* **Emacsäºæã®æäœäœç³»**: åºæ¬çãªã«ãŒãœã«ç§»åïŒ`C-n`, `C-a`çïŒãååž°çãªãŠã£ã³ããŠã®åå²ãšæ¯ç倿ŽïŒ`C-x 2`, `C-x ^`çïŒããŠã£ã³ããŠã¬ã€ã¢ãŠãã®ã¢ãã¡ãŒã·ã§ã³ä»ãåæ§æïŒ`C-x w t` ã§è»¢çœ®ã`C-x w f` / `C-x w v` ã§å·Šå³ã»äžäžå転ã`C-x w r ` / `` ã§ã¬ã€ã¢ãŠã 90° å転ã`C-x w o ` / `` ã§ãã€ã³éãããã¡åŸªç°ã·ããïŒããã«ãªã³ã°ã®ç®¡çïŒ`C-w`, `M-w`, `C-y`, `M-y`ïŒããµããŒãã
* **æ€çŽ¢ã»çœ®ææ©èœ**: ã€ã³ã¯ãªã¡ã³ã¿ã«æ€çŽ¢ïŒ`C-s`ïŒã察話ç眮æïŒ`M-%`ïŒãããã³ããã¯ã°ã©ãŠã³ãã®OSããã»ã¹ïŒWindowsã§ã¯ `findstr`ãä»ç°å¢ã§ã¯ `grep`ïŒãçšãããã£ã¬ã¯ããªå
ããã¹ãæ€çŽ¢ïŒ`M-x grep`ïŒã
* **åçåèªè£å®**: ãããã¡è¿åã®æååããæšæž¬ãã `dabbrev-expand` (`M-/`)ãæ¥æ¬èªãªã©ã®ãã«ããã€ãæåã®æœåºã«å¯Ÿå¿ããUndoå±¥æŽç®¡çãšã®é£æºãç¶æããŸãã
* **ãªã¢ã«ã¿ã€ã ãã¬ãã¥ãŒ**: Markdownããã³HTMLã®ç·šéå
容ãåæ ãããã¬ãã¥ãŒã¢ãŒãããœãŒã¹ãããã¡ã®ã¹ã¯ããŒã«ã«é£åããŠãã¬ãã¥ãŒåŽãã¹ã¯ããŒã«ããçæ¹åã¹ã¯ããŒã«åæãåããŠããŸãã
* **ãŠã£ã³ããŠã»ãããã¡ç®¡ç**: ãããã¡ã®åãæ¿ã (`C-x b`) ãå°çšã®ãããã¡ãªã¹ãæ©èœ (`C-x C-b`) ãåããã»ãããããããã¡ã«ãããã¡ã€ã«æäœã«å ããŠãOSãã€ãã£ãã®ãã¡ã€ã«éžæã»ä¿åãã€ã¢ãã° (`C-x M-f`, `C-x M-w`) ããµããŒãããŸãã
* **ãµã€ãããŒåãã¡ã€ã©æ©èœ**: ãŠã£ã³ããŠå·ŠåŽã«è¡šç€ºããããã¡ã€ã«ãšã¯ã¹ãããŒã© (`C-x d` / `C-c d`)ãçŽ æ©ããã¡ã€ã«ã®äžèº«ã確èªã§ãããã¬ãã¥ãŒæ©èœ (`l` / `Right`) ããWindowsç°å¢ã®ã·ã¹ãã ãã©ã€ãã«ã察å¿ãããã£ã¬ã¯ããªããã²ãŒã·ã§ã³ (`r`, `u`) ãåããŠããŸãã
* **å³ãµã€ãããŒæ©èœçŸ€:** ãŠã£ã³ããŠå³åŽã«è¡šç€ºããããç·šéãå¹çåããããã®åçš®å°çšãµã€ãããŒãæèŒïŒ
* **ã¯ãŒã¯ã¹ããŒã¹ã»ãµã€ãããŒ** (`C-c w`, `C-,` ãŸã㯠`M-x toggle-workspace-sidebar`): è€æ°ã®ãã©ã«ãããŸãšããŠç®¡çãVS Codeäºæã® `.code-workspace` ãã¡ã€ã«ã®èªã¿æžãã«å¯Ÿå¿ããŠããŸãã
* **ã¢ãŠãã©ã€ã³ãã¥ãŒ** (`C-c o`): Markdown/HTMLã®èŠåºãéå±€ã衚瀺ããšãã£ã¿ãšã®ãªã¢ã«ã¿ã€ã åæãäœçœ®åŸ©å
ã«å¯Ÿå¿ã
* **ãã«ãªã³ã°ã»ãµã€ãããŒ** (`C-c y` ãŸã㯠`M-x browse-kill-ring`): ãã«ãªã³ã°ïŒã¯ãªããããŒãå±¥æŽïŒãäžèЧããéå»ã®ããã¹ããéžæããŠã€ã³ã¯ïŒè²Œãä»ãïŒå¯èœã
* **ã¬ãžã¹ã¿ã»ãµã€ãããŒ** (`C-c r` ãŸã㯠`M-x browse-registers`): ä¿åãããŠããããã¹ããäœçœ®ïŒã¬ãžã¹ã¿ïŒãäžèЧã
* **Undo å±¥æŽãµã€ãããŒ** (`C-c u` ãŸã㯠`M-x browse-undo-history`): çŸåšã®ãããã¡ã® Undo å±¥æŽãäžèº«ä»ãã§äžèŠ§è¡šç€ºããéžæããé
ç®ãŸã§ãŸãšã㊠Undo ã§ããŸãããµã€ãããŒçµç±ã®ãŸãšã Undo 㯠1 åã® Redo ã§äžæ¬åŸ©å
ã§ããŸãïŒWord/Excel ãšåæ§ïŒã
* **æè¿äœ¿ã£ããã¡ã€ã«ãµã€ãããŒ** (`C-c c` ãŸã㯠`M-x browse-recent-files`): æè¿äœ¿çšãããã¡ã€ã«ããã£ã¬ã¯ããªãã¹ãšå
±ã«äžèŠ§è¡šç€ºããçŽ æ©ãéãããšãå¯èœã
* **èšå®ãµã€ãããŒ** (`C-c s`, `C-.` ãŸã㯠`M-x open-config`): ãã©ã³ããããŒããè¡çªå·è¡šç€ºãªã©ã®ãšãã£ã¿èšå®ãèŠèŠçã«ç®¡çã
* **ã·ã§ã«çµ±å**: ãšãã£ã¿å
ã§å¯Ÿè©±çã·ã§ã«ïŒcmd.exeçïŒãå®è¡ãããããã¡æ©èœ (`M-x shell`)ã
* **ã¡ãžã£ãŒã¢ãŒã**: ãã¡ã€ã«ã®æ¡åŒµåå€å®ã«åºã¥ãã·ã³ã¿ãã¯ã¹ãã€ã©ã€ãã
* **ãããããã¡è£å®**: `M-x` æã®ã³ãã³ãã®ã»ãããã¡ã€ã«ãã¹ããã£ã¬ã¯ããªãã¹ã®è£å®æ©èœãæèŒã
* **ããã¥ã¡ã³ãã»ã€ã³ããŒã¿ãŒ**: PDFãWord (**`.docx`**)ãExcel (**`.xlsx`**) 圢åŒã®ãã¡ã€ã«ãããã¬ãŒã³ããã¹ããšããŠèªåçã«æœåºã»ã€ã³ããŒãããŠéãããšãå¯èœã§ããExcel ã¯åã·ãŒãã TSV 圢åŒã§èªã¿èŸŒãŸããŸãã**泚æ:** å
ã®ãã€ããªãã¡ã€ã«ãç Žå£ããªããããã€ã³ããŒãããããããã¡ã¯èªåçã«**ãèªã¿åãå°çšïŒRead-onlyïŒã**ãšããŠéãããŸãïŒå®å®æ§ç¢ºä¿ã®ããã**50MBãŸã§ã®ãµã€ãºå¶é**ããããŸãïŒãæœåºããããã¹ããä¿åããå Žå㯠`Save As` (`C-x C-w`ãŸãã¯`C-x M-w`) ã䜿çšããŠãã ããã
* **ãã¡ã€ã«ã»ãšã³ã³ãŒãã£ã³ã°ç®¡ç**: ãªãŒãã»ãŒããæè¿éãããã¡ã€ã«ã®å±¥æŽ (`M-x recentf-open-files`)ãèªåUTF-8ææ Œãããã³å°å·æ©èœ (`M-x print-buffer`) ã«å¯Ÿå¿ã
* **æ®µèœæŽåœ¢æ©èœ (`M-q`)**: æå®ããæ¡æ°ã§ããã¹ããããŒãã©ããããæ®µèœãçŸããåæŽåœ¢ãã `fill-paragraph` æ©èœãæèŒã
* **æ°žç¶åã¬ãžã¹ã¿æ©èœ**: ããã¹ããã«ãŒãœã«äœçœ®ãäžæçã«èšæ¶ïŒã¬ãžã¹ã¿ïŒããå¿
èŠãªæã«åŒã³åºããŸããä¿åå
容ã¯ããŒã«ã«ã¹ãã¬ãŒãžãžæ°žç¶åãããŸãã察å¿ã³ãã³ã: `C-x r s` (ã³ããŒ), `C-x r i` (æ¿å
¥), `C-x r SPC` (ç¹ä¿å), `C-x r j` (ãžã£ã³ã)ãç©åœ¢éžæã¢ãŒãäžã§ããã°ç©åœ¢ããŒã¿ãšããŠãä¿åå¯èœã§ãã
* **ç©åœ¢ç·šéæ©èœ**: 瞊æ¹åã«ããã¹ããæäœããç©åœ¢ç·šéãæ£åŒã«ãµããŒãã`C-x SPC` ã§ç©åœ¢ããŒã¯ã¢ãŒãã«å
¥ãã`C-x r k` (åãåã) ãã€ã³ã¯ (C-y) ãå¯èœã§ãããã«ãªã³ã°ãã¬ãžã¹ã¿ã«ä¿åãããç©åœ¢ããŒã¿ã¯ã貌ãä»ãæã«èªåçã«å€å¥ã»å±éãããŸãã
* **ãµãã²ãŒããã¢ãžã®å®å
šå¯Ÿå¿**: çµµæåãç¹æ®æŒ¢åãªã©ã®ãµãã²ãŒããã¢ããäžæåããšããŠå³æ Œã«ç®¡çãç·šéã»ç§»åã»æŽåœ¢æã«æåãåæãããããšã®ãªãå
ç¢ãªããã¹ãåŠçãå®çŸã
* **æ£ç¢ºãªåèªããã²ãŒã·ã§ã³**: ãã€ãã£ãã® `Intl.Segmenter` API ãå©çšããåèªå¢çã®å€å®ãå®è£
ããŠããŸããæ¥æ¬èªïŒCJKïŒã«ãããèªç¶ãªæç¯ç§»åããã¹ããŒã¯ã±ãŒã¹ïŒ`snake_case`ïŒãªã©ã®ãµãã¯ãŒãåäœã§ã®ã«ãŒãœã«ç§»åïŒ`M-f`, `M-b` ãªã©ïŒã«æšæºã§å¯Ÿå¿ããŠããŸãã
* **Avy ãžã£ã³ã (`C-'`):** ç»é¢å
ã®è¡šç€ºé åã«å¯ŸããŠãã©ãã«å
¥åãçšããã«ãŒãœã«ç§»åã`C-'` ã«ç¶ããŠæåãå
¥åãããšåº§æšã«ã©ãã«ãéç³è¡šç€ºããããããã¿ã€ãã³ã°ããããšã§ç®çã®å Žæãžå³åº§ã«ãžã£ã³ãã§ããŸãã
* **ã«ãŒãœã«VFX:** ã«ãŒãœã«ã®ç§»åã«åãããŠåçãªèŠèŠå¹æïŒç²åãé·ãã«ã¯ã€ã€ã·ã£ã¯ãŒãå身ãªã©ïŒã衚瀺ããŸããã·ã§ãŒãã«ããããŒã§9çš®é¡ã®ã¹ã¿ã€ã«ãç¬æã«åãæ¿ãå¯èœã§ãã
* `C-c 1` ã `C-c 9`: åçš®VFXã¹ã¿ã€ã«ãéžæã
* `C-c 0`: VFXããªãã«ããŸãã
* **ç°¡æçãªã«ãŒãœã«ããŒã¹ãã¯ã (Beta):** ã«ãŒãœã«äœçœ®ãåºæºãšããããã¹ãæäœïŒæ¿å
¥ã»åé€ïŒãèšé²ã»åçŸããŸãïŒ`C-x (`, `C-x )`, `C-x e`ïŒããŠãããŒãµã«åŒæ°ã«ããé£ç¶å®è¡ïŒ`C-u 10 C-x e` çïŒã«ã察å¿ããŠããŸãã
* **ã«ã¹ã¿ãã€ãºå¯èœãªã«ã©ãŒããŒã:** ã«ã©ãŒããŒãã§äœæ¥ç©ºéãããŒãœãã©ã€ãºã§ããŸãã**"Dark"**, **"Light"**, **"Cyber"** (ããªã³/è¿æªæ¥), **"Cute"** (ãã¹ãã«/ãã«ãã³) ãªã©ã®å
èµããŒãã `M-x <ããŒãå>-theme` ã³ãã³ãã§åãæ¿ãå¯èœã§ããâ»èšå®ã®åæ ã«ã¯ã¢ããªã±ãŒã·ã§ã³ã®åèµ·åãå¿
èŠã§ãã
* **MCP ãµãŒããŒçµ±å**: Model Context Protocol (MCP) ãµãŒããŒãšããŠåäœå¯èœãç°å¢å€æ° **`ELECXZY_MCP_MODE`** ã **`true`** ã«æå®ããŠèµ·åããããšã§ãAI ã¢ã·ã¹ã¿ã³ãïŒGoogle Antigravity, Claude Desktop/Code çïŒããçŽæ¥ãããã¡ã®èªã¿æžãããšãã£ã¿æäœãè¡ããŸãã
* **ããŒãã€ã³ãã®ã«ã¹ã¿ãã€ãº (`keybinds.json`)**: åãã«ããªãã«æ¢å®ããŒããããäžæžãã»åé€ã§ããŸãã`config.json` ãšåããŠãŒã¶ããŒã¿ãã©ã«ãã« `keybinds.json` ã眮ãã ãïŒ`M-x show-keybinds-config` ã§ãã€ã§ãéããŸãïŒãèšæ³ã¯ Emacs äºæã§ã`\C-` ã `Ctrl`ã`\M-` ã `Alt`ãã¹ããŒã¹åºåãã§ããŒã·ãŒã±ã³ã¹ïŒ`"C-x C-f"`ïŒã衚çŸã§ããŸããå€ã空æå `""` ã«ãããšãã®ãã€ã³ããåé€ããŸããJSON ã®æ§æãšã©ãŒãæªç»é²ã³ãã³ã ID ãªã©ã¯ãšã³ãŒã©ã€ã³ã« 1 床ã ããŸãšããŠè¡šç€ºãããèµ·åã»ç·šéãæ¢ããããšã¯ãããŸãããäŸ:
```json
{
"\\C-s": "save-buffer",
"C-x C-r": "mark-whole-buffer",
"\\C-_": ""
}
```
### MCP ãµãŒããŒçµ±å
`elecxzy` 㯠MCP ãµãŒããŒãšããŠåäœããŸããã䜿ãã® AI ã¢ã·ã¹ã¿ã³ãïŒGoogle Antigravity ã Claude Desktop/Code çïŒãšé£æºãããããšã§ãAI ãéããŠãããããã¡ã®å
容ãèªã¿åã£ãããçŽæ¥ç·šéããããšãã£ã匷åãªãšãŒãžã§ã³ãæäœãå¯èœã«ãªããŸãã
> [!IMPORTANT]
> MCP ãµãŒããŒãèµ·åããåã«ã`èšå®ãµã€ãã㌠â MCP` ã® **Allowed Save Directories**ïŒãŸã㯠`config.json` ã® `mcpAllowedDirectories`ïŒã«ä¿åãèš±å¯ãããã£ã¬ã¯ããªãç»é²ããŠãã ãããMCP ã® `save_file` ããŒã«ã¯ãç»é²ãããããããã®ãã£ã¬ã¯ããªé
äžã«ããæžã蟌ããŸããããªã¹ãã空ããŸãã¯ååšããªããã¹ãå«ãå Žåã`M-x mcp-start` ã¯èµ·åãäžæãããšã³ãŒã©ã€ã³ã«æ¡å
ã衚瀺ããŸãã
#### èšå®æ¹æ³ (Google Antigravity / Claude Desktop / Claude Code)
`claude_desktop_config.json` ããGoogle Antigravity ã®èšå®ã»ã¯ã·ã§ã³ã«ä»¥äžã®ããããã®å
容ãåèã«ããŠè¿œå ããŠãã ããïŒ
```json
{
"mcpServers": {
"elecxzy": {
"command": "C:\\path\\to\\elecxzy\\elecxzy.exe",
"args": ["C:\\path\\to\\elecxzy\\resources\\app.asar"],
"env": {
"ELECXZY_MCP_MODE": "true",
"ELECTRON_RUN_AS_NODE": "1"
}
}
}
}
```
```json
{
"mcpServers": {
"elecxzy": {
"command": "C:\\Users\\...\\AppData\\Local\\Programs\\elecxzy\\elecxzy.exe",
"args": ["C:\\Users\\...\\AppData\\Local\\Programs\\elecxzy\\resources\\app.asar"],
"env": {
"ELECXZY_MCP_MODE": "true",
"ELECTRON_RUN_AS_NODE": "1"
}
}
}
}
```
### æè¡ã¹ã¿ãã¯
- **ãã©ãããã©ãŒã **: Electron
- **ããã³ããšã³ã**: React, TypeScript
- **ã¹ã¿ã€ãªã³ã°**: Styled-components
### ã³ãã³ãäžèЧ
ãã¹ãŠã®ã³ãã³ããšããŒãã€ã³ãã®è©³çްã«ã€ããŠã¯ã以äžããåç
§ãã ããã
ð **[COMMANDLIST.md](./COMMANDLIST.md)**
---
## FAQ
### English
**Q: Is word wrap (wrapping at the window edge) supported?**
A: We currently have no plans to support dynamic word wrap. Implementing line folding requires complex rendering calculations, which would negatively impact the predictability of the virtual rendering system and overall maintainability. As an alternative, please use the **`M-q` (Fill Paragraph)** command to perform hard-wrapping, enable **`auto-fill-mode`** to automatically insert newlines as you type, or use **`C-;` (Show Line Expansion)** to temporarily view truncated lines in an overlay.
**Q: Horizontal scrolling with my mouse tilt-wheel doesn't work.**
A: Depending on your environment, mouse utility software (e.g., Logi Options) may block horizontal scroll signals (deltaX) for unrecognized applications. You can horizontally scroll by holding the **Shift** key while rotating the vertical wheel.
**Q: The cursor is misaligned when using "MS Gothic" or "MS Mincho" fonts.**
A: This behavior is due to conflicting legacy bitmap data within these older fonts and the modern Canvas-based text measurement. For proper cursor alignment, we recommend using modern monospace fonts such as **BIZ UDGothic**.
**Q: I see leftover files named `..tmp-*` in my edit folder. Are they safe to delete?**
A: Yes, you can delete them safely. elecxzy uses an atomic-save pattern (write to a temp file, then rename) to prevent file corruption on crashes, and these temp files are normally cleaned up automatically. If one remains, it usually means antivirus software or a cloud-sync tool (e.g., OneDrive, Dropbox, Google Drive) briefly locked the temp file and the rename step failed â your original file is unaffected, but the temp file got stranded. If this happens often, add the folder you edit in to the exclusion list of your antivirus or cloud-sync tool.
### æ¥æ¬èª
**Q: å³ç«¯ã§æãè¿ã衚瀺ã¯ã§ããªãã®ã§ããïŒ**
A: çŸæç¹ã§ã¯ããŠã£ã³ããŠç«¯ã§ã®åçãªæãè¿ãïŒãœããã©ããïŒã«ã¯å¯Ÿå¿ããŠããŸãããæãè¿ãåŠçã®å®è£
ã¯ãä»®æ³ã¬ã³ããªã³ã°ã«ããã座æšèšç®ã®è€éåãæããå®è¡é床ãã³ãŒãä¿å®æ§ã®äœäžã«ç¹ããããã§ããä»£æ¿ææ®µãšããŠã**`M-q` (Fill Paragraph)** ã³ãã³ãã«ããæŽåœ¢ãå
¥åã«è¿œåŸããŠèªåçã«æ¹è¡ãæ¿å
¥ãã **`auto-fill-mode`**ããŸãã¯å³ç«¯ã§åããè¡ãäžæçã«å±é衚瀺ãã **`C-;` (Show Line Expansion)** ããå©çšãã ããã
**Q: ããŠã¹ã®ãã«ããã€ãŒã«ãåããŠãæ°Žå¹³ã¹ã¯ããŒã«ãåäœããŸããã**
A: äžéšã®ããŠã¹ãŠãŒãã£ãªãã£ãœããïŒäŸïŒLogi OptionsïŒãã€ã³ã¹ããŒã«ãããŠããç°å¢ã§ã¯ãã¢ããªã±ãŒã·ã§ã³ã«å¯Ÿããæ°Žå¹³ã¹ã¯ããŒã«ä¿¡å·ããããã¯ãããå ŽåããããŸãã**ShiftããŒãæŒããªãããã€ãŒã«ã瞊ã«å転**ãããããšã§ãæ°Žå¹³ã¹ã¯ããŒã«ãå¯èœã§ãã
**Q: ãMS ãŽã·ãã¯ãããMS ææãã䜿ããšãã«ãŒãœã«ã®äœçœ®ããããŸãã**
A: å€ããã©ã³ãã«å
èµãããŠãããããããã仿§ãšãCanvas APIãå©çšããæåå¹
èšæž¬ãšã³ãžã³ãšã®éã§çããæåã§ããæ£ç¢ºãªã«ãŒãœã«é
眮ã®ããã«ã¯ãè¡šç€ºãæ»ãã㪠**BIZ UDGothic** ãªã©ã®ã¢ãã³ãªçå¹
ãã©ã³ãã®äœ¿çšãæšå¥šããŸãã
**Q: ç·šéãã©ã«ãã« `..tmp-*` ãšãããã¡ã€ã«ãæ®ã£ãŠããŸããåé€ããŠãåé¡ãããŸãããïŒ**
A: åé€ããŠåé¡ãããŸãããelecxzy ã¯ã¯ã©ãã·ã¥æã®ãã¡ã€ã«ç Žæãé²ããããã¢ãããã¯ä¿åæ¹åŒïŒäžæãã¡ã€ã«ã«æžã蟌ãã§ãããªããŒã ïŒã§ä¿åããŠããããããã®äžæãã¡ã€ã«ã¯éåžžèªåçã«åé€ãããŸããæ®ã£ãŠããå Žåã¯ããŠã€ã«ã¹å¯Ÿçãœãããã¯ã©ãŠãåæãœããïŒOneDriveãDropboxãGoogle Drive ãªã©ïŒãäžæãã¡ã€ã«ãç¬éçã«ããã¯ãããªããŒã æé ã倱æããããšãåå ã§ãïŒå
ã®ãã¡ã€ã«ã«ã¯åœ±é¿ãããŸããïŒãé »ç¹ã«çºçããå Žåã¯ãç·šé察象ã®ãã©ã«ãããŠã€ã«ã¹å¯Ÿçãœãããã¯ã©ãŠãåæãœããã®é€å€èšå®ã«è¿œå ããŠãã ããã
---
## License / ã©ã€ã»ã³ã¹
This software is released under the [MIT License](./LICENSE).
æ¬ãœãããŠã§ã¢ã¯ [MITã©ã€ã»ã³ã¹](./LICENSE) ã®ããšã§å
¬éãããŠããŸãã
## Acknowledgements / è¬èŸ
This application is deeply inspired by the design and philosophy of the following pioneering editors. We express our utmost respect and gratitude to their creators and contributors:
æ¬ã¢ããªã±ãŒã·ã§ã³ã¯ã以äžã®å
é§çãªãšãã£ã¿ã®èšèšãšå²åŠã«æ·±ãã€ã³ã¹ãã€ã¢ãããŠããŸãããããã®åªãããœãããŠã§ã¢ãçã¿åºããéçºè
ããã³ã³ãã¥ããã£ã®çæ§ã«ãæå€§éã®æ¬æãšè¬æã衚ããŸãã
- **GNU Emacs**
- Copyright (C) 1985-2024 Free Software Foundation, Inc.
- Created by Richard Stallman
- **xyzzy**
- Copyright (c) 1996-2005 Tetsuya Kamei
- Copyright (c) 2012-2014 xyzzy Project