{"id":13897819,"url":"https://github.com/precondition/ProgramISO","last_synced_at":"2025-07-17T15:30:47.010Z","repository":{"id":117655112,"uuid":"243118187","full_name":"precondition/ProgramISO","owner":"precondition","description":"XKB layout designed for programming on an ISO 105 keyboard with minimized reach (but it sucks)","archived":false,"fork":false,"pushed_at":"2020-07-05T20:14:45.000Z","size":336,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-23T04:44:26.220Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/precondition.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}},"created_at":"2020-02-25T22:39:35.000Z","updated_at":"2022-05-15T14:57:00.000Z","dependencies_parsed_at":"2024-02-23T11:55:20.705Z","dependency_job_id":null,"html_url":"https://github.com/precondition/ProgramISO","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/precondition/ProgramISO","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/precondition%2FProgramISO","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/precondition%2FProgramISO/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/precondition%2FProgramISO/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/precondition%2FProgramISO/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/precondition","download_url":"https://codeload.github.com/precondition/ProgramISO/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/precondition%2FProgramISO/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265622534,"owners_count":23799988,"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":[],"created_at":"2024-08-06T18:03:53.642Z","updated_at":"2025-07-17T15:30:46.716Z","avatar_url":"https://github.com/precondition.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"# ProgramISO\nProgramISO is a XKB layout, inspired by [QWERkey](https://github.com/MicahElliott/QWERkey/), designed specifically for programming (with Vim) on an ISO 105-keys keyboard with minimized reach.\nThe keyboard layout is based on QWERTY-US but brings special keys (enter, control, ...) and symbols (#, %, ...) closer to the home row thanks to layers and dual-role keys.\n\n![Preview of the ProgramISO keyboard layout on the alphanumeric block of a typical ISO keyboard in black](/pictures/keyboard-layout-alphanumeric.png)\n![legend](/pictures/legend.png)\n\n## Brief explanation on layers and dual-role keys\nThe character that gets produced on the computer not only depends on the physical key being pressed but also on the current active layer. The most familiar use of layers is that of non-shifted vs shifted. On a classic QWERTY keyboard, pressing the first key normally produces `q` but if you hold shift and press that same key, `Q` gets produced. This means that the classic QWERTY keyboard layout maps the first key to `q` when on the first layer/level and to `Q` when the second layer/level is active. As already mentioned, one way to access this second level is to hold shift but one can also use caps lock whose behaviour is different. The XKB protocol defines 3 ways to access a certain level:\n1. **Switch** : Level X is active as long as this switch is held. Familiar Examples: Shift, AltGr.\n2. **Lock** : Level X is activated when the lock key is pressed and remains active until the lock key is pressed again. Familiar Examples: Caps Lock, Num Lock.\n3. **Latch** : Pressing (and releasing) the latch key only applies Level X to the next pressed key before going back to default layer. Familiar Examples: Shift key on smartphones.\n\nIt's rather unfortunate to observe that latching is so uncommon since [key sequences are more ergonomic than key chords](http://xahlee.info/kbd/banish_key_chords.html) and you might be glad to hear that ProgramISO does make use of latch keys but only for one modifier key while all others are switches. Why? The answer lies in dual-role keys.\n\nYou see, one of the untapped potential of switch modifiers is that they don't do anything useful when they're tapped (i.e. pressed and released on its own) but thanks to programs like [xcape](https://github.com/alols/xcape), we can turn these switch modifiers into dual-role keys which act as modifiers when held but act as other keys when tapped. This allows us to make more with less.\n\n## Special keys\n\n| QWERTY | Hold | Level 1 | Level 2 | Level 3 | Level 4 |\n|--------|:----:|---------|---------|---------|---------|\n| \u003ckbd\u003eTab\u003c/kbd\u003e    | Level3 Switch | Tab | Left-Tab | ~ | Tab | \n| \u003ckbd\u003e[\u003c/kbd\u003e      | × | Backspace | Backspace | Void | Backspace |\n| \u003ckbd\u003e]\u003c/kbd\u003e      | × | Delete | Delete | Void | Delete |\n| \u003ckbd\u003eCaps Lock\u003c/kbd\u003e | × | Escape | Escape | : | ; |\n| \u003ckbd\u003e;\u003c/kbd\u003e | Control | Enter | Enter | Enter | Enter |\n| \u003ckbd\u003eLeft Shift\u003c/kbd\u003e | Control | Control | Control | Control | Control |\n| \u003ckbd\u003e\\\\\u003c/kbd\u003e | Shift | \\ | \\| | \\ | \\| |\n| \u003ckbd\u003e/\u003c/kbd\u003e | Shift | / | ? | / | ? |\n| \u003ckbd\u003eRight Shift\u003c/kbd\u003e | × | Compose | Compose | Compose | Compose |\n| \u003ckbd\u003eLeft Control\u003c/kbd\u003e | Hyper | Hyper | Hyper | Hyper | Hyper |\n| \u003ckbd\u003eSpace\u003c/kbd\u003e | × | Space | - | _ | Space |\n| \u003ckbd\u003eAltGr\u003c/kbd\u003e | Level3 Switch | Level3 Latch | Level3 Latch | Level3 Latch | Level3 Latch |\n\n## Design Philosophy \u0026 Mnemonics\n#### Number row\nIf you use an ISO keyboard, that's probably because you live in Europe and if that's the case, chances are also high that you need to input accented characters. Using the compose key for each accented character gets annoying if your language uses accents a lot. I speak French so I added french accented characters on Level3 of the number row, in a fashion that is lightly inspired by classic French and Belgian keyboard layouts.\nPS: French accents have been moved to Level5 (and Level6 for uppercase accented letters). The accents on the number row are redundant and less comfortable to use.\n\nThe two leftmost keys on the number row hold `â` and `à` because the normal letter `A` is also the leftmost on the home row (it is also the leftmost in AZERTY). The tilde key is somewhat hard to reach but still feasible so I've placed the uncommon `â` there while `à` is much more commonly used so it is placed on the easier to reach \u003ckbd\u003e1\u003c/kbd\u003e key.\n\nThe `é` found on AZERTY remains at the same place, though on Level3. The two next keys (key \u003ckbd\u003e3\u003c/kbd\u003e and key \u003ckbd\u003e4\u003c/kbd\u003e) are all adjacent to the normal letter \u003ckbd\u003eE\u003c/kbd\u003e so they're used to input accented e's.\n\nOn AZERTY, key \u003ckbd\u003e5\u003c/kbd\u003e is used to enter `(` which looks like a 'C' so this is where you'll find `ç`.\n\nKey \u003ckbd\u003e6\u003c/kbd\u003e is a pain to reach so I did not add any accented characters there.\n\nKeys \u003ckbd\u003e7\u003c/kbd\u003e and key \u003ckbd\u003e8\u003c/kbd\u003e are both adjacent to the normal letter \u003ckbd\u003eU\u003c/kbd\u003e so they're used to input accented u's. On AZERTY, key \u003ckbd\u003e7\u003c/kbd\u003e is used to input `è` which is an e with a *grave* accent but since it made more sense to pack all accented e's together, that key is free to be used for accented u's. Since key \u003ckbd\u003e7\u003c/kbd\u003e inputs *grave* accent in AZERTY, I deciced it would be a good fit for u with a *grave* accent in ProgramISO. \n\nKey \u003ckbd\u003e9\u003c/kbd\u003e is also the key used to enter opening parenthesis. Consequently, the same key can be used to enter opening square brackets `[`.\n\nKey \u003ckbd\u003e0\u003c/kbd\u003e is also the key used to enter closing parenthesis. Consequently, the same key can be used to enter closing square brackets `]`.\n\nThe last two keys are useful if you'd rather get square brackets by a single key press. It also contains « *fancy* » quotes and the degree sign `°` at the exact same place as in AZERTY. I often make bullet points so it's nice to have a fancy bullet point for these purposes `•`.\n\n#### Upper row\nAll symbols from the tilde key to the \u003ckbd\u003e8\u003c/kbd\u003e key are translated one key down and available on level 3. For example, Level3 \u003ckbd\u003eQ\u003c/kbd\u003e produces `!` because it is situated right under the \u003ckbd\u003e1\u003c/kbd\u003e/\u003ckbd\u003e!\u003c/kbd\u003e key and level3 \u003ckbd\u003eU\u003c/kbd\u003e produces `\u0026` because it is right under the \u003ckbd\u003e7\u003c/kbd\u003e/\u003ckbd\u003e\u0026\u003c/kbd\u003e key.\n\nQWERTY's \u003ckbd\u003e=\u003c/kbd\u003e/\u003ckbd\u003e+\u003c/kbd\u003e key gets spread out over Level3 \u003ckbd\u003eO\u003c/kbd\u003e and Level3 \u003ckbd\u003eP\u003c/kbd\u003e (for **P**lus) which helps to keep them close to each other.\n\nThe bracket keys become backspace and delete on Level1 and Level2. You can see it as the backspace staying in the same corner but closer to the home row with the left half used for deleting characters to the left and the right half for deleting characters to the right. The `Void` on Level3 of these keys is useful to cancel a latch such as the one on \u003ckbd\u003eAltGr\u003c/kbd\u003e. Thus, if you realize that you didn't actually need to access Level 3, you can hit backspace or delete.\n\n#### Home row\n\u003ckbd\u003eCaps Lock\u003c/kbd\u003e essentially becomes the Vim key. It's an escape key which can also produce colon (very handy for quickly entering Ex mode from insert mode). The added semicolon on Level4 is simply to stay faithful to the QWERTY layout, the semicolon on Level1 of the rightmost key of the home row is personally more convenient for me. People commonly turn \u003ckbd\u003eCaps Lock\u003c/kbd\u003e into a dual-role key for both `Control` and `Escape` but this is annoying if you quickly change modes in Vim. When I experimented with this, I kept accidently hitting \u003cC-some_key\u003e when I just wanted to quickly go back to Normal mode and use normal mode commands.\n\nPutting Home on Level3 \u003ckbd\u003eA\u003c/kbd\u003e kinda goes against Vim's append command but imagine it this way: Your left fingers resting on the home row represent a line. The beginning of this line aka the home is at the pinky while the end of the line is at the index. The same reasoning applies for Level3 \u003ckbd\u003eF\u003c/kbd\u003e.\n\n\u003ckbd\u003eS\u003c/kbd\u003e and \u003ckbd\u003eD\u003c/kbd\u003e are between 2 navigation commands (`Home` and `End`), thus it makes sense for them to also be navigation commands.\nLevel3 \u003ckbd\u003eS\u003c/kbd\u003e is `Page Down` because the letter 's' is written from top to bottom. The pen goes *down* when writing this letter (There are probably some people out there who write 's' from bottom to top but I have yet to encounter one).\nLevel3 \u003ckbd\u003eD\u003c/kbd\u003e is `Page Up` because the letter 'd' has a stem pointing *up* (which is called an \"ascender\" in typography).\n\nLevel3 \u003ckbd\u003eG\u003c/kbd\u003e is `Volume Up` because it's above the \u003ckbd\u003eV\u003c/kbd\u003e key which is used as `Volume Down` since the letter 'v' points down.\n\n\u003ckbd\u003eH\u003c/kbd\u003e\u003ckbd\u003eJ\u003c/kbd\u003e\u003ckbd\u003eK\u003c/kbd\u003e\u003ckbd\u003eL\u003c/kbd\u003e are the Vim arrow keys and now you can use them everywhere if you are on Level3! It even works to select text on Level4. \n\nThe pinky's resting state can now be used to input `enter`/`return` and be used as a `control` modifier. I don't have a mnemonic for this but it's the best feature of the keyboard layout so you shouldn't have issue remembering it ;)\n\nThe backtick joins its siblings on the Level3 of the \u003ckbd\u003e'\"\u003c/kbd\u003e key.\n\nIn C-like languages, there is often a semicolon at the far-right of a line. Such is also the case for the home row of this keyboard layout. Additionally, the semicolon, which often precedes a new line, is right next to the big fat enter key so you can just roll your pinky over these two keys to end a statement and move on to the next.\n\n#### Lower row\nBoth shifts are moved one key closer, firstly because they're used a lot and secondly because it allows us to move other modifiers closer to the home row. This is where we'll be able to take profit of the ISO keyboard layout. As opposed to an ANSI or a JIS keyboard layout, the ISO keyboard layout, common in Europe, has a shorter left shift key to accommodate the extra key. Normally, this kinda sucks because it requires extra stretch for the pinky to reach a very commonly used modifier. However, if we remap the extra key to `shift` (that extra key was redundant anyways, it's useful for some national European layouts but not on QWERTY-US), we can remap the original left shift to `control`. This is fantastic because `control`, `shift`, `z`, `x`, `c`, and `v` are now all on one neat row! No need to rotate the wrists in order to use these very common key shortcuts now. Additionally, ProgramISO's right shift is vertically aligned with ProgramISO's right control (which doubles as the enter key), meaning you can form a guitar-like pinky barré to hit both control and shift with one single finger without leaving the home row!\n\nLevel3 \u003ckbd\u003eV\u003c/kbd\u003e is for **V**olume Down because it is the first letter of volume and looks like a down arrow.\n\nLevel3 \u003ckbd\u003eN\u003c/kbd\u003e and \u003ckbd\u003eM\u003c/kbd\u003e can be used to produce square brackets because rotating 'n' 90° to the left makes it look like '\\[' and rotating 'm' 90° to the right makes it look like '~~]~~'.\n\nLevel3 \u003ckbd\u003e\u003c\u003c/kbd\u003e and \u003ckbd\u003e\u003e\u003c/kbd\u003e produce {curly brackets} because these keys are aligned with the \u003ckbd\u003e9\u003c/kbd\u003e/\u003ckbd\u003e(\u003c/kbd\u003e and \u003ckbd\u003e0\u003c/kbd\u003e/\u003ckbd\u003e)\u003c/kbd\u003e keys and if you do the fusion: `(` + `\u003c` = `{` and `)` + `\u003e` = `}`.\n\n#### Lowest row\nThe original left control is not required anymore as ProgramISO moved it one key higher so it's been remapped to Hyper to unlock a whole new extra layer of keyboard shortcuts that won't conflict with any program's key shortcuts since they never make use of the Hyper modifier.\n\n\u003ckbd\u003eSpacebar\u003c/kbd\u003e, the most easy to reach key, is finally given a little extra work. Pressing Level2 \u003ckbd\u003eSpacebar\u003c/kbd\u003e produces `-` because it is often used in place of spaces. Hyphen is placed on Level2 because Level2 refers to *upper*case and hyphen is positioned higher than the underscore which can be found on Level3. Underscore is placed on Level3 \u003ckbd\u003espacebar\u003c/kbd\u003e because it is also frequently used as pseudo-spaces. It is important that underscore is easier to type than hyphen because, as it turns out, underscore is the most commonly used symbol in many programming languages. \n\n![Punctuations frequency in all languages](http://xahlee.info/comp/i/computer_language_char_frequency.png)\n\nProgramISO makes it very easy to use your two strongest fingers (i.e. the thumbs) to input `_`. Simply press or hold \u003ckbd\u003eAltGr\u003c/kbd\u003e with your right thumb and press the \u003ckbd\u003espacebar\u003c/kbd\u003e with the left thumb.\n\n## Breaking Changes from QWERTY\nProgramISO tries to deviate minimally from classic QWERTY-US and, generally, merely adds more functionality to each key without altering its classic behaviour but there are still some breaking changes being introduced (for the better). The keys that got radically changed are highlighted in red in this picture:\n![Highlighting of the breaking changes in red](/pictures/keyboard-layout-breaking-changes.png)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprecondition%2FProgramISO","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fprecondition%2FProgramISO","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fprecondition%2FProgramISO/lists"}