{"id":25703682,"url":"https://github.com/fominok/ideahelix","last_synced_at":"2025-04-30T07:22:06.107Z","repository":{"id":278911066,"uuid":"929289421","full_name":"fominok/ideahelix","owner":"fominok","description":"Rudimentary Helix editor emulation for JetBrains' IDEs","archived":false,"fork":false,"pushed_at":"2025-03-24T10:44:23.000Z","size":256,"stargazers_count":7,"open_issues_count":22,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-03-24T11:38:06.784Z","etag":null,"topics":["clojure","helix-editor","idea-plugin","jetbrains-ides","kakoune"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fominok.png","metadata":{"files":{"readme":"README.md","changelog":null,"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}},"created_at":"2025-02-08T07:34:49.000Z","updated_at":"2025-03-24T10:44:27.000Z","dependencies_parsed_at":"2025-03-12T19:27:21.551Z","dependency_job_id":"b55d4cf9-1581-46f4-928a-fe4207ac9071","html_url":"https://github.com/fominok/ideahelix","commit_stats":null,"previous_names":["fominok/ideahelix"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fominok%2Fideahelix","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fominok%2Fideahelix/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fominok%2Fideahelix/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fominok%2Fideahelix/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fominok","download_url":"https://codeload.github.com/fominok/ideahelix/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251658625,"owners_count":21622899,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["clojure","helix-editor","idea-plugin","jetbrains-ides","kakoune"],"created_at":"2025-02-25T05:33:02.179Z","updated_at":"2025-04-30T07:22:06.095Z","avatar_url":"https://github.com/fominok.png","language":"Clojure","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\u003ch1\u003e\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"ideahelix_dark.svg\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"ideahelix_light.svg\"\u003e\n  \u003cimg alt=\"IdeaHelix\" height=\"128\" src=\"ideahelix_light.svg\"\u003e\n\u003c/picture\u003e\n\u003c/h1\u003e\n\u003c/div\u003e\n\n[JetBrains IDEs'](https://www.jetbrains.com/ides/) plugin for a\n[Helix](https://helix-editor.com)-like experience.\n\n🚧 _Work in progress! See issues for more details._ 🚧\n\n[LSP](https://github.com/microsoft/language-server-protocol) is not a silver bullet, and\nthere are still some projects and workflows that are better served by more heavyweight\nsolutions, with JB IDEs arguably being some of the best in that regard. Unfortunately,\nthis often forces us to leave an environment like Helix, which feels more like a right\nhand than just an editor. The goal of this project is to bridge the gap between the\ntooling provided by JetBrains and the editing model of Helix.\n\n## Goals\n- Helix users and their muscle memory should feel at home with no need to re-learn\n  everything.\n\n## Non-Goals\n- **1:1 Emulation** – Achieving a perfect, one-to-one emulation of Helix is not the\n  goal, at least for the foreseeable future. Reuse is preferred, and differences in\n  caret implementations may lead to edge cases.  If you're looking for the complete Helix\n  experience, there is Helix.\n- **Plugin Best Practices Compliance** – Stability isn't guaranteed, as the plugin\n  interrupts keyboard events with the author's limited knowledge of JetBrains IDEs and\n  it likely doesn't follow plugin development best practices. Reaching ~150k lines while\n  pursuing those, as IdeaVim does, is something to avoid. Contributions are welcome, as\n  basic compatibility or UX improvements are always possible without overdoing it.\n- **Mouse/Menu interactions**: The primary focus is on keyboard interactions. While\n  executing actions through other means is supported, there are no guarantees that carets\n  or selections will behave in a specific manner.\n\n## Emulating Helix Carets\n\nIn Helix, carets are visually represented as blocks, but these blocks are not\njust indicators -- they are actual one-character selections. This means the visual\nrepresentation directly corresponds to the underlying behavior: replacing or deleting a\ncharacter removes it from the document and places it into a register, just like a yank\noperation. This leads to the first rule:\n\n**Selections are always at least one character long, with a line caret positioned either\nbefore the first character or before the last.**\n\nTo illustrate this, let's introduce a legend:\n\n- `|` -- Line caret (default in Idea and many other non-TUI editors)\n- `|x|` -- Block caret highlighting character `x` (as in Helix)\n- `║` -- Selection boundaries\n\nHere’s how selecting the word `hello` appears in Helix compared to IdeaHelix, with spaces\npreserved to reflect caret positioning accurately:\n\n```\nForward-facing selection:\nHx : ║h e l l|o|\nIHx: ║h e l l|o║\n\nBackward-facing selection:\nHx : |h|e l l o║\nIHx: |h e l l o║\n```\n\n**A caret can only be in one of two positions: at the start of the selection or just\nbefore the last selected character.**\n\n### Edge Case: Empty Buffer\n\nIf the buffer is empty, no selection exists—this is the only exception to the first rule.\nAs soon as text is inserted, the standard behavior applies.\n\n### Insertion mode\n\nIn Helix, a caret is effectively a one-character selection outside of insert mode and\nbehaves like a block caret within it. IdeaHelix ensures text is inserted at the same\nposition as in Helix but uses Idea’s native visual representation -- a line caret with\nselections turned off.\n\nInsert mode in IdeaHelix bypasses its own handlers, temporarily handing control back\nto Idea. This simplifies insert mode behavior, allowing Idea’s features to work without\ninterference. As a bonus, this also enables the use of native keystroke configurations\nwithin insert mode.\n\nIn Helix, selections remain active and may expand when entering insert mode via prepend\nor append. However, due to Idea’s limitations, IdeaHelix must disable selections while\ntyping. This ensures seamless integration with Idea’s completion system, which relies\non the selection start rather than the actual caret position. Once insert mode ends,\nselections are restored to match how they would appear in Helix.\n\n```\nAppend:\nHx : ║h e l l o| |w o r l d\nIHx:  h e l l o|  w o r l d\n\nPrepend:\nHx : |h|e l l o║  w o r l d\nIHx: |h e l l o   w o r l d\n```\n\n### Exiting Insertion Mode\n\nWhen leaving insertion mode, selections reappear as follows:\n\n```\nExiting append:\nHx : ║h e l l|o|  w o r l d\nIHx: ║h e l l|o║  w o r l d\n\nExiting prepend (no change in either case):\nHx : |h|e l l o║  w o r l d\nIHx: |h e l l o║  w o r l d\n```\n\n## Acknowledgments\n- [Kakoune](https://kakoune.org) – for ruining my life by making every other editing\n  style unbearable.\n- [Iosevka](https://typeof.net/Iosevka/) – for being the font of choice, both in the\n  logo and for daily use (licensed under the\n  [SIL Open Font License](https://opensource.org/licenses/OFL-1.1)).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffominok%2Fideahelix","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffominok%2Fideahelix","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffominok%2Fideahelix/lists"}