{"id":35608939,"url":"https://github.com/anuvyklack/hel","last_synced_at":"2026-04-04T04:01:41.630Z","repository":{"id":287476774,"uuid":"964862589","full_name":"anuvyklack/hel","owner":"anuvyklack","description":"Helix emulation layer for Emacs","archived":false,"fork":false,"pushed_at":"2026-04-03T23:59:32.000Z","size":1162,"stargazers_count":75,"open_issues_count":2,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-04-04T00:21:37.057Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Emacs Lisp","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/anuvyklack.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.org","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-04-11T23:19:54.000Z","updated_at":"2026-04-03T22:14:55.000Z","dependencies_parsed_at":"2025-04-12T00:27:59.465Z","dependency_job_id":"eb5bf5eb-34c2-49e7-bade-e822eca618f2","html_url":"https://github.com/anuvyklack/hel","commit_stats":null,"previous_names":["anuvyklack/helix.el"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/anuvyklack/hel","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anuvyklack%2Fhel","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anuvyklack%2Fhel/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anuvyklack%2Fhel/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anuvyklack%2Fhel/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/anuvyklack","download_url":"https://codeload.github.com/anuvyklack/hel/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/anuvyklack%2Fhel/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31387024,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T01:22:39.193Z","status":"online","status_checked_at":"2026-04-04T02:00:07.569Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-01-05T03:58:20.466Z","updated_at":"2026-04-04T04:01:41.620Z","avatar_url":"https://github.com/anuvyklack.png","language":"Emacs Lisp","funding_links":["https://www.paypal.me/anuvyklack"],"categories":[],"sub_categories":[],"readme":"\u003e [!CAUTION]\n\u003e Breaking changes on 27.03.2026:\\\n\u003e Extensions are moved into their own folders, you need to update installation recipe, check the [Installation](#installation) section.\n\n# Hel — [Helix](https://helix-editor.com/) Emulation Layer for Emacs\n\n## Key features\n\n- Multiple cursors based modal editing inside Emacs!\n- Undo/redo that plays well with multiple cursors.\n- PCRE regexps by default (thanks to [pcre2el](https://github.com/joddie/pcre2el)).\n- Smooth scrolling commands out of the box.\n\n## Can I use Hel without knowing Emacs keys?\n\n\u003e [!IMPORTANT]\n\u003e what Vim, Helix, and other modal editors call Normal and Insert **modes**, Hel refers to as **states**. This is because the word \"mode\" in Emacs is already used for its [major](https://www.gnu.org/software/emacs/manual/html_node/emacs/Major-Modes.html) and [minor](https://www.gnu.org/software/emacs/manual/html_node/emacs/Minor-Modes.html) modes.\n\nWhen several years ago I came to Emacs from Neovim, I was in love with Vim\nediting model, found Emacs native keybindings ugly and had zero interest in\nlearning them. I want Emacs not as text editor (which it obviously lacks of)\nbut as an operation system with Lisp and all its power. So the first question\nI asked myself was \"Can I use Evil without learning Emacs keys?\"\n\nThe answer is yes. I have never used — and still don't know — most Emacs keys.\nI know only a few that you need when something breaks early during Emacs startup\nand you don't have your Hel keys available. They are:\n\n- `M-x` — Command palette. The main key you need; all other commands can be invoked from it.\n- `M-w` — Copy the selected text to google the error message or feed it to LLM.\n- `C-x C-s` — Save current buffer.\n- `C-x C-c` — Exit Emacs.\n\nThat's it.\n\nHel and Emacs do not interfere much, because Emacs is not a modal editor:\nletters and numbers are self-inserting, and most command key chords begin with\n`C-x` or `C-c` (e.g. `C-x n d`). Due to this, Hel works as a layer on top of Emacs.\n\nIn Normal state you have selection-based editing, multiple cursors, and all the\nother Hel features. In Insert state, Hel steps aside and standard Emacs keys\nwork as usual. Also Hel doesn't touch `C-x` and `C-c` so they are always available.\nThis allows you to mix Hel and Emacs in any proportion.\n\n## Kakoune vs Helix\n\nThe main difference between Kakoune and Helix, in terms of text editing, is how\nthey handle expanding selections: Kakoune uses `Shift` + motions, while Helix uses\na separate state on the `v` key. Since I originally came from Vim, I prefer\nHelix's `v` key, so I chose Helix. However, Kakoune (as far as I know) was the\noriginal inventor of this keyboard-driven multiple-selections approach, and it\ndeserves credit.\n\n## Installation\n\nHel is not yet on MELPA. You can install it directly from Github.\n\n### Emacs built-in package manager\n\nThis is the most minimal example of the `init.el` file:\n\n```emacs-lisp\n;;; init.el -*- lexical-binding: t; no-byte-compile: t; -*-\n\n(setq package-archives '((\"melpa\"  . \"https://melpa.org/packages/\")\n                         (\"gnu\"    . \"https://elpa.gnu.org/packages/\")\n                         (\"nongnu\" . \"https://elpa.nongnu.org/nongnu/\")))\n;; Dependencies\n(use-package dash :ensure t)\n(use-package avy :ensure t)\n(use-package pcre2el :ensure t)\n\n(use-package hel\n  :vc (:url \"https://github.com/anuvyklack/hel.git\" :rev \"main\")\n  :custom (inhibit-startup-screen t)\n  :config (hel-mode))\n\n;;; init.el ends here\n```\n\n### [Elpaca](https://github.com/progfolio/elpaca)\n\n```emacs-lisp\n(elpaca 'dash)\n(elpaca 'avy)\n(elpaca 'pcre2el)\n\n(elpaca '(hel :host github :repo \"anuvyklack/hel\"\n              :files (:defaults \"extensions/**/*.el\"))\n  (setopt inhibit-startup-screen t)\n  (hel-mode))\n```\n\n### [Straight](https://github.com/radian-software/straight.el)\n\n```emacs-lisp\n(straight-use-package 'dash)\n(straight-use-package 'avy)\n(straight-use-package 'pcre2el)\n\n(straight-use-package '(hel :host github :repo \"anuvyklack/hel\"\n                            :files (:defaults \"extensions/**/*.el\")))\n(setopt inhibit-startup-screen t)\n(hel-mode)\n```\n\n## Documentation\n\n- [Keybindings](docs/keybindings.org)\n- [Customizations](docs/customization.org)\n\n## Differences from Helix text editor\n\nThis package is not one-to-one emulation. Some commands are implemented in\nslightly different way (improved from the author's point of view), and some\nfeatures like keyboard macros, registers, and jumplists already have their\nalternatives in Emacs.\n\n- In Emacs the cursor (\"point\" in Emacs terms) is located **between** two characters\n  rather than **on** a character like in Helix or Vim. I decided to keep this\n  behavior, instead of emulating original one, as Evil does, because the primary\n  object of interaction in Helix approach is a selection, not the cursor itself.\n\n- `x` and `X` commands are reworked. They are expand and contract line-wise\n  selection down when cursor is at the end of the selection, or up when cursor\n  is at the beginning of the selection.\n\n- Inner objects are additionally available directly under `m` prefix to reduce\n  keystrokes: `mw` is the same as `miw` — select word.\n\n- Mark commands accept numeric arguments:\n  `m2ip` or `2mip` — select 2 paragraphs.\n\n- You can restore last multiple selections with `gv`.\n\n- `gs`, `gh`, and `gl` make selections. This is done for convenience, since all other\n  motions make selections. In Helix they only move the cursor without creating\n  selection.\n\n- `gs` and `gh` are swapped: `gs` moves to the beginning of a line, `gh` moves to the\n  beginning of a line skipping indentation.\n\n- Keys that are relevant only when multiple cursors are present will be active\n  only in that case (e.g. `K`, `,`, `\u0026` — full list is in\n  `hel-multiple-cursors-mode-map` keymap). This allows to reuse, for example, `K`\n  for documentation lookup or `,` for localleader when there is only one cursor\n  in the buffer.\n\n- `gg` / `G` to go to the first/last line of the buffer like in Vim.\n  Helix uses `gg` / `ge`.\n\n- Scrolling keybindings are taken from Vim instead of Helix.\n\n- Six easymotion commands are provided:\n  - `gw` / `gb` — chose and mark word forward/backward.\n  - `gW` / `gB` — chose and mark WORD forward/backward.\n  - `gj` / `gk` — go to line down/up.\n\n  Helix provides only `gw` to place 2-char hints at the beginning of each word.\n\n- `f`, `F`, `t`, `T` commands to move to char are enhanced: they show hints for targets,\n  and while hints are active, they can be repeated with `n` / `N` keys.\n\n- When you search backward with `?` command, while hints are active `n` and `N` keys\n  are swapped: `n` will repeat search backward and `N` — forward, like in Vim.\n\n## Commands that are not implemented\n\n- `.` (repeat) — Need to decide what it should repeat.\n- `r` — replace (TODO)\n- `M-u`, `M-U` — traverse undo tree\n- `q`, `Q` — record keyboard macros\n\n## Extensions\n\n- [hel-leader](extensions/hel-leader)\n- [hel-org](extensions/hel-org)\n- [hel-paredit](extensions/hel-paredit)\n- [hel-vterm](extensions/hel-vterm)\n\n## Tips\n\n- By default, Hel uses a bar cursor for Normal state and a box cursor for Insert\n  state—the opposite of what Vim does. Your first instinct may be to switch them\n  back to what you're used to, but I recommend not doing so. This was the first\n  I done myself, and went through all the stages of acceptance, give default\n  settings a try — the bar cursor is better suited for Normal state.\n\n- You can set localleader keymap to `,`. It will act as the local leader while\n  there is only one cursor in the buffer, and will delete all secondary cursors\n  when there are multiple cursors.\n\n## Acknowledgments\n\nHel depends on [dash.el](https://github.com/magnars/dash.el), [pcre2el](https://github.com/joddie/pcre2el), and [avy](https://github.com/abo-abo/avy) wonderful packages.\n\nHel is heavily inspired by:\n- [evil](https://github.com/emacs-evil/evil)\n- [multiple-cursors.el](https://github.com/magnars/multiple-cursors.el)\n- [kak.el](https://github.com/aome510/kak.el)\n- [surround](https://github.com/mkleehammer/surround)\n- [meow](https://github.com/meow-edit/meow)\n- [doomemacs](https://github.com/doomemacs/doomemacs)\n- [crux](https://github.com/bbatsov/crux)\n\nYou are welcome to go and give them all at least a star!\n\n## Contributing\n\n### Share\n\nA quick post about this package on your blog or social network could bring\nnew users to Emacs, which would be great!\n\n### Support the development\n\nHel was developed on an old laptop with a cracked screen, and I worked on it instead of grinding LeetCode. If you'd like to support Hel's development, you can do so with a donation:\n\n- [PayPal](https://www.paypal.me/anuvyklack)\n\nEvery contribution is greatly appreciated.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanuvyklack%2Fhel","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fanuvyklack%2Fhel","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fanuvyklack%2Fhel/lists"}