Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rework keymap_extras docs #13949

Merged
merged 2 commits into from
Aug 14, 2021
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
155 changes: 80 additions & 75 deletions docs/reference_keymap_extras.md
Original file line number Diff line number Diff line change
@@ -1,86 +1,91 @@
# Language-specific Keycodes

Keyboards are able to support a wide range of languages. However, they do not send the actual characters produced by pressing their keys - instead, they send numerical codes. In the USB HID spec, these are called "usages", although they are more often referred to as "scancodes" or "keycodes" when in the context of keyboards.
Less than 256 usages are defined in the HID Keyboard/Keypad usage page, and some of those do nothing on modern operating systems. So, how is this language support achieved?
Keyboards are able to support a wide range of languages. However, this support is not actually achieved within the keyboard itself - instead, it sends numerical codes, which the operating system maps to the appropriate characters based on the user's configured keyboard layout. For example, when a Swedish person presses the key with the `å` character printed on it, the keyboard is *actually* sending the keycode for `[`.

In a nutshell, the operating system maps the usages it receives to the appropriate character based on the user's configured keyboard layout. For example, when a Swedish person presses the key with the `å` character printed on it, the keyboard is *actually* sending the keycode for `[`.
Obviously, this can get confusing, so QMK provides language-specific keycode aliases for many keyboard layouts. These won't do much on their own - you still have to set the matching keyboard layout in your OS settings. Think of them more as keycap labels for your keymap.

Obviously, this could get confusing, so QMK provides language-specific keycode aliases for many keyboard layouts. These won't do much on their own - you still have to set the matching keyboard layout in your OS settings. Think of them more as keycap labels for your keymap.
Simply `#include` one of the keycode headers below at the top of your `keymap.c`, and assign the keycodes defined in the header in place of the `KC_` prefixed ones.

To use these, simply `#include` the corresponding [header file](https://github.com/qmk/qmk_firmware/tree/master/quantum/keymap_extras) in your `keymap.c`, and add the keycodes defined in them in place of the `KC_` prefixed ones:
## Sendstring Support

|Layout |Header |
|---------------------------|--------------------------------|
|Canadian Multilingual (CSA)|`keymap_canadian_multilingual.h`|
|Croatian |`keymap_croatian.h` |
|Czech |`keymap_czech.h` |
|Danish |`keymap_danish.h` |
|Dutch (Belgium) |`keymap_belgian.h` |
|English (Ireland) |`keymap_irish.h` |
|English (UK) |`keymap_uk.h` |
|English (US Extended) |`keymap_us_extended.h` |
|English (US International) |`keymap_us_international.h` |
|English (US International, Linux)|`keymap_us_international_linux.h`|
|Estonian |`keymap_estonian.h` |
|Finnish |`keymap_finnish.h` |
|French |`keymap_french.h` |
|French (AFNOR) |`keymap_french_afnor.h` |
|French (BÉPO) |`keymap_bepo.h` |
|French (Belgium) |`keymap_belgian.h` |
|French (Switzerland) |`keymap_fr_ch.h` |
|French (macOS, ISO) |`keymap_french_osx.h` |
|German |`keymap_german.h` |
|German (Switzerland) |`keymap_german_ch.h` |
|German (macOS) |`keymap_german_osx.h` |
|German (Neo2)* |`keymap_neo2.h` |
|Greek* |`keymap_greek.h` |
|Hebrew* |`keymap_hebrew.h` |
|Hungarian |`keymap_hungarian.h` |
|Icelandic |`keymap_icelandic.h` |
|Italian |`keymap_italian.h` |
|Italian (macOS, ANSI) |`keymap_italian_osx_ansi.h` |
|Italian (macOS, ISO) |`keymap_italian_osx_iso.h` |
|Japanese |`keymap_jp.h` |
|Korean |`keymap_korean.h` |
|Latvian |`keymap_latvian.h` |
|Lithuanian (ĄŽERTY) |`keymap_lithuanian_azerty.h` |
|Lithuanian (QWERTY) |`keymap_lithuanian_qwerty.h` |
|Norwegian |`keymap_norwegian.h` |
|Polish |`keymap_polish.h` |
|Portuguese |`keymap_portuguese.h` |
|Portuguese (macOS, ISO) |`keymap_portuguese_osx_iso.h` |
|Portuguese (Brazil) |`keymap_br_abnt2.h` |
|Romanian |`keymap_romanian.h` |
|Russian* |`keymap_russian.h` |
|Serbian* |`keymap_serbian.h` |
|Serbian (Latin) |`keymap_serbian_latin.h` |
|Slovak |`keymap_slovak.h` |
|Slovenian |`keymap_slovenian.h` |
|Spanish |`keymap_spanish.h` |
|Spanish (Dvorak) |`keymap_spanish_dvorak.h` |
|Swedish |`keymap_swedish.h` |
|Turkish (F) |`keymap_turkish_f.h` |
|Turkish (Q) |`keymap_turkish_q.h` |
By default, `SEND_STRING()` assumes a US ANSI keyboard layout is set. If you are using a different layout, you can include one of the Sendstring LUT headers below in your `keymap.c` to override the lookup tables used for mapping ASCII characters to keycodes. You do not need to include the corresponding `keymap_*.h` header, as it is implicit when including the Sendstring header.

There are also a few which are not quite language-specific, but useful if you are not using a QWERTY layout:
An important thing to note here is that `SEND_STRING()` only operates on [ASCII text](https://en.wikipedia.org/wiki/ASCII#Character_set). This means that you cannot pass it a string containing Unicode characters - this unfortunately includes accented characters that may be present in your desired layout.
Many layouts make certain characters, such as Grave or Tilde, available only as [dead keys](https://en.wikipedia.org/wiki/Dead_key), so you must add a space immediately after it in the string you want to send, to prevent it from potentially combining with the next character.
Certain other layouts have no Sendstring header as they do not use a Latin-derived alphabet (for example Greek and Russian), and thus there is no way to input most of the ASCII character set.

|Layout |Header |
|-------------------|------------------------|
|Colemak |`keymap_colemak.h` |
|Dvorak |`keymap_dvorak.h` |
|Dvorak (French) |`keymap_dvorak_fr.h` |
|Dvorak (Programmer)|`keymap_dvp.h` |
|Norman |`keymap_norman.h` |
|Plover* |`keymap_plover.h` |
|Plover (Dvorak)* |`keymap_plover_dvorak.h`|
|Steno* |`keymap_steno.h` |
|Workman |`keymap_workman.h` |
|Workman (ZXCVM) |`keymap_workman_zxcvm.h`|
## Header Files

## Sendstring Support
These headers are located in [`quantum/keymap_extras/`](https://github.com/qmk/qmk_firmware/tree/master/quantum/keymap_extras).

By default, `SEND_STRING()` assumes a US ANSI keyboard layout is set. If you are using a different layout, you can also `#include "sendstring_*.h"` (as above) in your keymap to override the lookup tables used for mapping ASCII characters to keycodes.
|Layout |Keycodes Header |Sendstring LUT Header |
|---------------------------------|---------------------------------|------------------------------------|
|Canadian Multilingual (CSA) |`keymap_canadian_multilingual.h` |`sendstring_canadian_multilingual.h`|
|Croatian |`keymap_croatian.h` |`sendstring_croatian.h` |
|Czech |`keymap_czech.h` |`sendstring_czech.h` |
|Danish |`keymap_danish.h` |`sendstring_danish.h` |
|Dutch (Belgium) |`keymap_belgian.h` |`sendstring_belgian.h` |
|English (Ireland) |`keymap_irish.h` | |
|English (UK) |`keymap_uk.h` |`sendstring_uk.h` |
|English (US Extended) |`keymap_us_extended.h` | |
|English (US International) |`keymap_us_international.h` |`sendstring_us_international.h` |
|English (US International, Linux)|`keymap_us_international_linux.h`| |
|Estonian |`keymap_estonian.h` |`sendstring_estonian.h` |
|Finnish |`keymap_finnish.h` |`sendstring_finnish.h` |
|French |`keymap_french.h` |`sendstring_french.h` |
|French (AFNOR) |`keymap_french_afnor.h` |`sendstring_french_afnor.h` |
|French (BÉPO) |`keymap_bepo.h` |`sendstring_bepo.h` |
|French (Belgium) |`keymap_belgian.h` |`sendstring_belgian.h` |
|French (Switzerland) |`keymap_fr_ch.h` |`sendstring_fr_ch.h` |
|French (macOS, ISO) |`keymap_french_osx.h` |`sendstring_french_osx.h` |
|German |`keymap_german.h` |`sendstring_german.h` |
|German (Switzerland) |`keymap_german_ch.h` |`sendstring_german_ch.h` |
|German (macOS) |`keymap_german_osx.h` |`sendstring_german_osx.h` |
|German (Neo2) |`keymap_neo2.h` | |
|Greek |`keymap_greek.h` | |
|Hebrew |`keymap_hebrew.h` | |
|Hungarian |`keymap_hungarian.h` |`sendstring_hungarian.h` |
|Icelandic |`keymap_icelandic.h` |`sendstring_icelandic.h` |
|Italian |`keymap_italian.h` |`sendstring_italian.h` |
|Italian (macOS, ANSI) |`keymap_italian_osx_ansi.h` |`sendstring_italian_osx_ansi.h` |
|Italian (macOS, ISO) |`keymap_italian_osx_iso.h` |`sendstring_italian_osx_iso.h` |
|Japanese |`keymap_jp.h` |`sendstring_jis.h` |
|Korean |`keymap_korean.h` | |
|Latvian |`keymap_latvian.h` |`sendstring_latvian.h` |
|Lithuanian (ĄŽERTY) |`keymap_lithuanian_azerty.h` |`sendstring_lithuanian_azerty.h` |
|Lithuanian (QWERTY) |`keymap_lithuanian_qwerty.h` |`sendstring_lithuanian_qwerty.h` |
|Norwegian |`keymap_norwegian.h` |`sendstring_norwegian.h` |
|Polish |`keymap_polish.h` | |
|Portuguese |`keymap_portuguese.h` |`sendstring_portuguese.h` |
|Portuguese (macOS, ISO) |`keymap_portuguese_osx_iso.h` |`sendstring_portuguese_osx_iso.h` |
|Portuguese (Brazil) |`keymap_br_abnt2.h` |`sendstring_br_abnt2.h` |
|Romanian |`keymap_romanian.h` |`sendstring_romanian.h` |
|Russian |`keymap_russian.h` | |
|Serbian |`keymap_serbian.h` | |
|Serbian (Latin) |`keymap_serbian_latin.h` |`sendstring_serbian_latin.h` |
|Slovak |`keymap_slovak.h` |`sendstring_slovak.h` |
|Slovenian |`keymap_slovenian.h` |`sendstring_slovenian.h` |
|Spanish |`keymap_spanish.h` |`sendstring_spanish.h` |
|Spanish (Dvorak) |`keymap_spanish_dvorak.h` |`sendstring_spanish_dvorak.h` |
|Swedish |`keymap_swedish.h` |`sendstring_swedish.h` |
|Swedish (macOS, ANSI) |`keymap_swedish_osx_ansi.h` | |
|Swedish (macOS, ISO) |`keymap_swedish_osx_iso.h` | |
|Swedish Pro (macOS, ANSI) |`keymap_swedish_pro_osx_ansi.h` | |
|Swedish Pro (macOS, ISO) |`keymap_swedish_pro_osx_iso.h` | |
|Turkish (F) |`keymap_turkish_f.h` |`sendstring_turkish_f.h` |
|Turkish (Q) |`keymap_turkish_q.h` |`sendstring_turkish_q.h` |

An important thing to note here is that `SEND_STRING()` only operates on [ASCII text](https://en.wikipedia.org/wiki/ASCII#Character_set). This means that you cannot pass it a string containing Unicode characters - this unfortunately includes accented characters that may be present in your desired layout.
Many layouts make certain characters, such as Grave or Tilde, available only as [dead keys](https://en.wikipedia.org/wiki/Dead_key), so you must add a space immediately after it in the string you want to send, to prevent it from potentially combining with the next character.
Certain other layouts have no Sendstring header as they do not use a Latin-derived alphabet (for example Greek and Russian), and thus there is no way to input most of the ASCII character set. These are marked above with a `*`.
There are also a few which are not quite language-specific, but useful if you are not using a QWERTY layout:

|Layout |Keycodes Header |Sendstring LUT Header |
|-------------------|------------------------|----------------------------|
|Colemak |`keymap_colemak.h` |`sendstring_colemak.h` |
|Dvorak |`keymap_dvorak.h` |`sendstring_dvorak.h` |
|Dvorak (French) |`keymap_dvorak_fr.h` |`sendstring_dvorak_fr.h` |
|Dvorak (Programmer)|`keymap_dvp.h` |`sendstring_dvp.h` |
|Norman |`keymap_norman.h` |`sendstring_norman.h` |
|Plover |`keymap_plover.h` | |
|Plover (Dvorak) |`keymap_plover_dvorak.h`| |
|Steno |`keymap_steno.h` | |
|Workman |`keymap_workman.h` |`sendstring_workman.h` |
|Workman (ZXCVM) |`keymap_workman_zxcvm.h`|`sendstring_workman_zxcvm.h`|