{"id":16400236,"url":"https://github.com/welldan97/atom-helicopter","last_synced_at":"2026-06-12T01:31:23.510Z","repository":{"id":145698227,"uuid":"153841685","full_name":"welldan97/atom-helicopter","owner":"welldan97","description":"Semantic and composable keybindings for Atom","archived":false,"fork":false,"pushed_at":"2019-04-28T23:51:29.000Z","size":114,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-01-04T23:43:03.795Z","etag":null,"topics":["atom","keyboard-layout","keymap"],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/welldan97.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2018-10-19T21:04:32.000Z","updated_at":"2021-04-08T21:45:33.000Z","dependencies_parsed_at":"2023-04-07T23:48:09.767Z","dependency_job_id":null,"html_url":"https://github.com/welldan97/atom-helicopter","commit_stats":null,"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/welldan97%2Fatom-helicopter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/welldan97%2Fatom-helicopter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/welldan97%2Fatom-helicopter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/welldan97%2Fatom-helicopter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/welldan97","download_url":"https://codeload.github.com/welldan97/atom-helicopter/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240306854,"owners_count":19780701,"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":["atom","keyboard-layout","keymap"],"created_at":"2024-10-11T05:27:04.783Z","updated_at":"2026-06-12T01:31:22.915Z","avatar_url":"https://github.com/welldan97.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [Helicopter](https://github.com/welldan97/atom-helicopter)\n\n![Keymap](/keymap.png)\n\n| Modifiers                 | Method               |\n| ------------------------- | -------------------- |\n| \u003ckbd\u003ectrl\u003c/kbd\u003e           | \u003ckbd\u003e*main*\u003c/kbd\u003e    |\n| \u003ckbd\u003ealt\u003c/kbd\u003e            | \u003ckbd\u003e*main²*\u003c/kbd\u003e   |\n| \u003ckbd\u003ectrl-shift\u003c/kbd\u003e     | \u003ckbd\u003e*select*\u003c/kbd\u003e  |\n| \u003ckbd\u003ealt-shift\u003c/kbd\u003e      | \u003ckbd\u003e*select²*\u003c/kbd\u003e |\n| \u003ckbd\u003ectrl-alt\u003c/kbd\u003e       | \u003ckbd\u003e*delete*\u003c/kbd\u003e  |\n| \u003ckbd\u003ectrl-alt-shift\u003c/kbd\u003e | \u003ckbd\u003e*delete²*\u003c/kbd\u003e |\n\n\nHelicopter is a keymap system with composability and ergonomics in mind. It provides a scalable way to define keybindings, making them easy to remember and easy to use.\n\n\n## Core Principles\n\nTo make the Helicopter system effective and powerful it is based on top of a few core principles.\n\n### 1. Composability\n\nOne of the main goals of the project is to give a composable way to define keystrokes in a way that it would be mentally easy to learn them. Each keystroke consists of 2 main elements - *method* and *argument*. The left hand is responsible for *methods* and the right hand is responsible for its *arguments*.\n\nYou can see a few examples of resulting keybindings:\n\n| Statement                                                                      | Keystroke                                 | Command                           |\n| ------------------------------------------------------------------------------ | ----------------------------------------- | --------------------------------- |\n| \u003ckbd\u003e*main*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *move right*                              | \u003ckbd\u003ectrl-;\u003c/kbd\u003e                         | `core:move-right`                 |\n| \u003ckbd\u003e*select*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *select right*                          | \u003ckbd\u003ectrl-shift-;\u003c/kbd\u003e                   | `core:select-right`               |\n| \u003ckbd\u003e*delete*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *delete right*                          | \u003ckbd\u003ectrl-alt-;\u003c/kbd\u003e                     | `core:delete`                     |\n| \u003ckbd\u003e*file*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *next tab*                                | \u003ckbd\u003ectrl-v\u003c/kbd\u003e \u003ckbd\u003ectrl-;\u003c/kbd\u003e       | `pane:show-next-item`             |\n| \u003ckbd\u003e*srch*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *find next*                               | \u003ckbd\u003ectrl-e\u003c/kbd\u003e \u003ckbd\u003ectrl-;\u003c/kbd\u003e       | `find-and-replace:find-next`      |\n| \u003ckbd\u003e*srch*\u003c/kbd\u003e + \u003ckbd\u003e*select*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *select next found* | \u003ckbd\u003ectrl-e\u003c/kbd\u003e \u003ckbd\u003ectrl-shift-;\u003c/kbd\u003e | `find-and-replace:select-next`    |\n| \u003ckbd\u003e*bkmk*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *next bookmark*                           | \u003ckbd\u003ectrl-w\u003c/kbd\u003e \u003ckbd\u003ectrl-;\u003c/kbd\u003e       | `bookmarks:jump-to-next-bookmark` |\n| \u003ckbd\u003e*pane*\u003c/kbd\u003e + \u003ckbd\u003e*→*\u003c/kbd\u003e = *focus right pane*                        | \u003ckbd\u003ectrl-c\u003c/kbd\u003e \u003ckbd\u003ectrl-;\u003c/kbd\u003e       | `window:focus-pane-on-right`      |\n| \u003ckbd\u003e*pane*\u003c/kbd\u003e + \u003ckbd\u003e*→²*\u003c/kbd\u003e = *split pane right*                       | \u003ckbd\u003ectrl-c\u003c/kbd\u003e \u003ckbd\u003e;\u003c/kbd\u003e            | `pane:split-right`                |\n\nThe defined keymap works via regular key events. There is no need for entering mode, like in vim. Although, mode as an addition might be added in a future.\n\nYou can see the whole keymap [**here**](https://github.com/welldan97/atom-helicopter/blob/master/keymap.md).\n\n### 2. Ergonomics \u0026 Semantics\n\nAll the keystrokes are defined with ergonomics in mind. The navigation keys lie literally at your fingertips. And the more common the action you want to make, the easier it is to access.\n\nEach key has a semantics behind it. So you don't have to memorize all the weird keybindings, you just have to remember the base keys and next time you use it you will feel that it make sense. Many times you are going to guess the keybindings without ever using them.\n\nThe whole list of user experience principles you can see [**here**](https://github.com/welldan97/atom-helicopter/blob/master/ux_principles.md)\n\n### 3. Different keyboard layouts support\n\nFrom day one, we have supported different keyboard layouts. No matter which keyboard layout you use, the keys stay at the same place. Me myself using programmer dvorak, I see how it can be important to have support for different keyboards.\n\n### 4. Customizability\n\nAll the keybindings should be customizable. If the defaults don't make sense for you, you would be able to change it. If you want to have the search button on another key — you should be able to do it. And of course nothing stops you to define your own keybindings in a usual way.\n\nYou can see how the keybindings are structured [**here**](https://github.com/welldan97/atom-helicopter/blob/master/lib/keys.js). And [**here**](https://github.com/welldan97/atom-helicopter/blob/master/lib/statements.js) is a resolving file for actions.\n\n### 5. Scalability\n\nHelicopter is not just a keymap, it is actually a system to define one. It gives you an ability to add new *methods* and *arguments* easily. There are still a lot of unbound keys left. So you can add support for your favorite packages without a problem.\n\nRight now it can be used only on Atom. But it's in the plans to support other platforms too.\n\n## Usage\n\nThere are two main concepts in the Helicopter system: *methods* and *arguments*.\nThe combination of two results in a keybinding. *Method* is responsible for a context in which you want to use the action and the action itself. I.e. \u003ckbd\u003e*file*\u003c/kbd\u003e, \u003ckbd\u003e*pane*\u003c/kbd\u003e could be a context and \u003ckbd\u003e*delete*\u003c/kbd\u003e could be an action. *Argument* can be used only once, and usually it defines the direction \u003ckbd\u003e*←*\u003c/kbd\u003e(LEFT) or \u003ckbd\u003e*→*\u003c/kbd\u003e(RIGHT), but it also can define a more abstract concept like \u003ckbd\u003e*SETUP*\u003c/kbd\u003e or \u003ckbd\u003e*⤴*\u003c/kbd\u003e(EXPORT).\n\n\nSome of the keys support alternatives, and they can be addressed either via modified version of keystroke, or via evoking method keybinding twice. I.e.\n`core:save-as` is a third variation of \u003ckbd\u003e*file*\u003c/kbd\u003e + \u003ckbd\u003e*⤴*\u003c/kbd\u003e(EXPORT). And it can be accessed either via \u003ckbd\u003ealt\u003c/kbd\u003e key, or it can be accessed via double press of \u003ckbd\u003ectrl-v\u003c/kbd\u003e and then choosing the version of the third version of keybinding(via \u003ckbd\u003ek\u003c/kbd\u003e key).\n\n| Statement                           | Keystroke                                                               | Command        |\n| ----------------------------------- | ----------------------------------------------------------------------- | -------------- |\n| \u003ckbd\u003e*file*\u003c/kbd\u003e + \u003ckbd\u003e*⤴³*\u003c/kbd\u003e | \u003ckbd\u003ectrl-v\u003c/kbd\u003e \u003ckbd\u003ealt-y\u003c/kbd\u003e                                      | `core:save-as` |\n| \u003ckbd\u003e*file*\u003c/kbd\u003e + \u003ckbd\u003e*⤴³*\u003c/kbd\u003e | \u003ckbd\u003ectrl-v\u003c/kbd\u003e \u003ckbd\u003ectrl-v\u003c/kbd\u003e \u003ckbd\u003ectrl-y\u003c/kbd\u003e \u003ckbd\u003ectrl-k\u003c/kbd\u003e | `core:save-as` |\n\n\nKeybinding version keys go in order of homerow: `hjkl:'`\n\nYou can always consult the list of all keybindings: [**here**](https://github.com/welldan97/atom-helicopter/blob/master/keymap.md).\n\n\n## Plans for the project\n\nHelicopter is still hugely work in progress. And many of the things could be implemented with your contribution.\n\n1. There should be defined more actions and functions which atom is missing\n2. Make complete support for default atom keybindings\n3. See if other units would make sense - word borders etc. What else can be inherited from vim\u0026co.\n4. Make it customizable for real.\n5. Much more...\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwelldan97%2Fatom-helicopter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwelldan97%2Fatom-helicopter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwelldan97%2Fatom-helicopter/lists"}