commit 2e3c970323628bb658e5340c9d2004a963daca98 Author: Anthony Perkins Date: Tue Feb 27 08:13:25 2024 +0000 Commit version 3.0 diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..324f518 --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +Copyright 2024 Anthony Perkins + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.txt b/README.txt new file mode 100644 index 0000000..a22885f --- /dev/null +++ b/README.txt @@ -0,0 +1,12 @@ + ACP Keyboard + ============ + +This is my custom keyboard layout. For the full spec, rationale, and images, +please see the spec file at the URL below: + + https://acperkins.github.io/keyboard/spec.html + +To download the Windows AutoHotKey build, see the GitHub Releases page at the +URL below: + + https://github.com/acperkins/keyboard/releases diff --git a/ahk/acp-keyboard.ahk b/ahk/acp-keyboard.ahk new file mode 100644 index 0000000..cec9ef9 --- /dev/null +++ b/ahk/acp-keyboard.ahk @@ -0,0 +1,644 @@ +#Requires AutoHotkey v2.0 + +; Disable the Alt+Shift language-switch shortcut, run the following: +; REG ADD "HKEY_CURRENT_USER\Keyboard Layout\Toggle" /v "Hotkey" /t REG_SZ /d "3" /f +; REG ADD "HKEY_CURRENT_USER\Keyboard Layout\Toggle" /v "Language Hotkey" /t REG_SZ /d "3" /f +; REG ADD "HKEY_CURRENT_USER\Keyboard Layout\Toggle" /v "Layout Hotkey" /t REG_SZ /d "3" /f + + + + +end_keys := "{esc},{tab},{enter},{backspace},{delete},{insert},{home},{end},{pgup},{pgdn},{up},{down},{left},{right}" + +dead_acute := Map.Call( + " ", "{U+0027}", + "A", "{U+00C1}", + "a", "{U+00E1}", + "E", "{U+00C9}", + "e", "{U+00E9}", + "I", "{U+00CD}", + "i", "{U+00ED}", + "O", "{U+00D3}", + "o", "{U+00F3}", + "U", "{U+00DA}", + "u", "{U+00FA}", + "W", "{U+1E82}", + "w", "{U+1E83}", + "Y", "{U+00DD}", + "y", "{U+00FD}") + +dead_circumflex := Map.Call( + " ", "{U+005E}", + "A", "{U+00C2}", + "a", "{U+00E2}", + "E", "{U+00CA}", + "e", "{U+00EA}", + "I", "{U+00CE}", + "i", "{U+00EE}", + "O", "{U+00D4}", + "o", "{U+00F4}", + "U", "{U+00DB}", + "u", "{U+00FB}", + "W", "{U+0174}", + "w", "{U+0175}", + "Y", "{U+0176}", + "y", "{U+0177}") + +dead_diaeresis := Map.Call( + " ", "{U+0022}", + "A", "{U+00C4}", + "a", "{U+00E4}", + "E", "{U+00CB}", + "e", "{U+00EB}", + "I", "{U+00CF}", + "i", "{U+00EF}", + "O", "{U+00D6}", + "o", "{U+00F6}", + "U", "{U+00DC}", + "u", "{U+00FC}", + "W", "{U+1E84}", + "w", "{U+1E85}", + "Y", "{U+0178}", + "y", "{U+00FF}") + +dead_grave := Map.Call( + " ", "{U+0060}", + "A", "{U+00C0}", + "a", "{U+00E0}", + "E", "{U+00C8}", + "e", "{U+00E8}", + "I", "{U+00CC}", + "i", "{U+00EC}", + "O", "{U+00D2}", + "o", "{U+00F2}", + "U", "{U+00D9}", + "u", "{U+00F9}", + "W", "{U+1E80}", + "w", "{U+1E81}", + "Y", "{U+1EF2}", + "y", "{U+1EF3}") + +dead_macron := Map.Call( + " ", "{U+00AF}", + "A", "{U+0100}", + "a", "{U+0101}", + "E", "{U+0112}", + "e", "{U+0113}", + "I", "{U+012A}", + "i", "{U+012B}", + "O", "{U+014C}", + "o", "{U+014D}", + "U", "{U+016A}", + "u", "{U+016B}", + "Y", "{U+0232}", + "y", "{U+0233}") + + + + +; E00 - SC029 +; | +>!SC029::Send "{U+007C}" +<^>!SC029::Send "{U+007C}" +; ± +>!+SC029::Send "{U+00B1}" +<^>!+SC029::Send "{U+00B1}" + + +; E01 - SC002 +; ! +>!SC002::Send "{U+0021}" +<^>!SC002::Send "{U+0021}" +; ¡ +>!+SC002::Send "{U+00A1}" +<^>!+SC002::Send "{U+00A1}" + + +; E02 - SC003 +; ¢ +>!SC003::Send "{U+00A2}" +<^>!SC003::Send "{U+00A2}" +; « +>!+SC003::Send "{U+00AB}" +<^>!+SC003::Send "{U+00AB}" + + +; E03 - SC004 +; £ +^>SC004::Send "{U+00A3}" +<^>!SC004::Send "{U+00A3}" +; » +>!+SC004::Send "{U+00BB}" +<^>!+SC004::Send "{U+00BB}" + + +; E04 - SC005 +; € +>!SC005::Send "{U+20AC}" +<^>!SC005::Send "{U+20AC}" +; ‹ +>!+SC005::Send "{U+2039}" +<^>!+SC005::Send "{U+2039}" + + +; E05 - SC006 +; ‰ +>!SC006::Send "{U+2030}" +<^>!SC006::Send "{U+2030}" +; › +>!+SC006::Send "{U+203A}" +<^>!+SC006::Send "{U+203A}" + + +; E06 - SC007 +; √ +>!SC007::Send "{U+221A}" +<^>!SC007::Send "{U+221A}" +; ✓ +>!+SC007::Send "{U+2713}" +<^>!+SC007::Send "{U+2713}" + + +; E07 - SC008 +; ⁊ +>!SC008::Send "{U+204A}" +<^>!SC008::Send "{U+204A}" +; ✗ +>!+SC008::Send "{U+2717}" +<^>!+SC008::Send "{U+2717}" + + +; E08 - SC009 +; ° +>!SC009::Send "{U+00B0}" +<^>!SC009::Send "{U+00B0}" +; • +>!+SC009::Send "{U+2022}" +<^>!+SC009::Send "{U+2022}" + + +; E09 - SC00A +; ª +>!SC00A::Send "{U+00AA}" +<^>!SC00A::Send "{U+00AA}" +; +>!+SC00A::Send "" +<^>!+SC00A::Send "" + + +; E10 - SC00B +; º +>!SC00B::Send "{U+00BA}" +<^>!SC00B::Send "{U+00BA}" +; × +>!+SC00B::Send "{U+00D7}" +<^>!+SC00B::Send "{U+00D7}" + + +; E11 - SC00C +; − +>!SC00C::Send "{U+2212}" +<^>!SC00C::Send "{U+2212}" +; ÷ +>!+SC00C::Send "{U+00F7}" +<^>!+SC00C::Send "{U+00F7}" + + +; E12 - SC00D +; ≈ +>!SC00D::Send "{U+2248}" +<^>!SC00D::Send "{U+2248}" +; ≠ +>!+SC00D::Send "{U+2260}" +<^>!+SC00D::Send "{U+2260}" + + +; SC00E (Backspace) +; +>!SC00E::Send "{backspace}" +<^>!SC00E::Send "{backspace}" +; +>!+SC00E::Send "{backspace}" +<^>!+SC00E::Send "{backspace}" + + + + +; D01 - SC010 +; à +>!SC010::Send "{U+00E0}" +<^>!SC010::Send "{U+00E0}" +; À +>!+SC010::Send "{U+00C0}" +<^>!+SC010::Send "{U+00C0}" + + +; D02 - SC011 +; é +>!SC011::Send "{U+00E9}" +<^>!SC011::Send "{U+00E9}" +; É +>!+SC011::Send "{U+00C9}" +<^>!+SC011::Send "{U+00C9}" + + +; D03 - SC012 +; ë +>!SC012::Send "{U+00EB}" +<^>!SC012::Send "{U+00EB}" +; Ë +>!+SC012::Send "{U+00CB}" +<^>!+SC012::Send "{U+00CB}" + + +; D04 - SC013 +; è +>!SC013::Send "{U+00E8}" +<^>!SC013::Send "{U+00E8}" +; È +>!+SC013::Send "{U+00C8}" +<^>!+SC013::Send "{U+00C8}" + + +; D05 - SC014 +; ® +>!SC014::Send "{U+00AE}" +<^>!SC014::Send "{U+00AE}" +; © +>!+SC014::Send "{U+00A9}" +<^>!+SC014::Send "{U+00A9}" + + +; D06 - SC015 +; û +>!SC015::Send "{U+00FB}" +<^>!SC015::Send "{U+00FB}" +; Û +>!+SC015::Send "{U+00DB}" +<^>!+SC015::Send "{U+00DB}" + + +; D07 - SC016 +; ü +>!SC016::Send "{U+00FC}" +<^>!SC016::Send "{U+00FC}" +; Ü +>!+SC016::Send "{U+00DC}" +<^>!+SC016::Send "{U+00DC}" + + +; D08 - SC017 +; ï +>!SC017::Send "{U+00EF}" +<^>!SC017::Send "{U+00EF}" +; Ï +>!+SC017::Send "{U+00CF}" +<^>!+SC017::Send "{U+00CF}" + + +; D09 - SC018 +; ö +>!SC018::Send "{U+00F6}" +<^>!SC018::Send "{U+00F6}" +; Ö +>!+SC018::Send "{U+00D6}" +<^>!+SC018::Send "{U+00D6}" + + +; D10 - SC019 +; ¶ +>!SC019::Send "{U+00B6}" +<^>!SC019::Send "{U+00B6}" +; § +>!+SC019::Send "{U+00A7}" +<^>!+SC019::Send "{U+00A7}" + + +; D11 - SC01A +; “ +>!SC01A::Send "{U+201C}" +<^>!SC01A::Send "{U+201C}" +; „ +>!+SC01A::Send "{U+201E}" +<^>!+SC01A::Send "{U+201E}" + + +; D12 - SC01B +; ” +>!SC01B::Send "{U+201D}" +<^>!SC01B::Send "{U+201D}" +; ‚ +>!+SC01B::Send "{U+201A}" +<^>!+SC01B::Send "{U+201A}" + + + + +; C01 - SC01E +; ä +>!SC01E::Send "{U+00E4}" +<^>!SC01E::Send "{U+00E4}" +; Ä +>!+SC01E::Send "{U+00C4}" +<^>!+SC01E::Send "{U+00C4}" + + +; C02 - SC01F +; ß +>!SC01F::Send "{U+00DF}" +<^>!SC01F::Send "{U+00DF}" +; ẞ +>!+SC01F::Send "{U+1E9E}" +<^>!+SC01F::Send "{U+1E9E}" + + +; C03 - SC020 +; ¨◌ +>!SC020::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_diaeresis.Has(deadac.Input)) { + Send dead_diaeresis[deadac.Input] + } else { + Send deadac.Input + } +} +<^>!SC020::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_diaeresis.Has(deadac.Input)) { + Send dead_diaeresis[deadac.Input] + } else { + Send deadac.Input + } +} +; ″ +>!+SC020::Send "{U+2033}" +<^>!+SC020::Send "{U+2033}" + + +; C04 - SC021 +; ´◌ +>!SC021::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_acute.Has(deadac.Input)) { + Send dead_acute[deadac.Input] + } else { + Send deadac.Input + } +} +<^>!SC021::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_acute.Has(deadac.Input)) { + Send dead_acute[deadac.Input] + } else { + Send deadac.Input + } +} +; ′ +>!+SC021::Send "{U+2032}" +<^>!+SC021::Send "{U+2032}" + + +; C05 - SC022 +; ¯◌ +>!SC022::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_macron.Has(deadac.Input)) { + Send dead_macron[deadac.Input] + } else { + Send deadac.Input + } +} +<^>!SC022::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_macron.Has(deadac.Input)) { + Send dead_macron[deadac.Input] + } else { + Send deadac.Input + } +} +; +>!+SC022::Send "" +<^>!+SC022::Send "" + + +; C06 - SC023 +; +>!SC023::Send "" +<^>!SC023::Send "" +; +>!+SC023::Send "" +<^>!+SC023::Send "" + + +; C07 - SC024 +; `◌ +>!SC024::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_grave.Has(deadac.Input)) { + Send dead_grave[deadac.Input] + } else { + Send deadac.Input + } +} +<^>!SC024::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_grave.Has(deadac.Input)) { + Send dead_grave[deadac.Input] + } else { + Send deadac.Input + } +} +; +>!+SC024::Send "" +<^>!+SC024::Send "" + + +; C08 - SC025 +; ^◌ +>!SC025::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_circumflex.Has(deadac.Input)) { + Send dead_circumflex[deadac.Input] + } else { + Send deadac.Input + } +} +<^>!SC025::{ + deadac := InputHook("L1 C", end_keys) + deadac.Start() + deadac.Wait() + if (dead_circumflex.Has(deadac.Input)) { + Send dead_circumflex[deadac.Input] + } else { + Send deadac.Input + } +} +; +>!+SC025::Send "" +<^>!+SC025::Send "" + + +; C09 - SC026 +; ô +>!SC026::Send "{U+00F4}" +<^>!SC026::Send "{U+00F4}" +; Ô +>!+SC026::Send "{U+00D4}" +<^>!+SC026::Send "{U+00D4}" + + +; C10 - SC027 +; ; +>!SC027::Send "{U+003B}" +<^>!SC027::Send "{U+003B}" +; : +>!+SC027::Send "{U+003A}" +<^>!+SC027::Send "{U+003A}" + + +; C11 - SC028 +; ’ +>!SC028::Send "{U+2019}" +<^>!SC028::Send "{U+2019}" +; ‘ +>!+SC028::Send "{U+2018}" +<^>!+SC028::Send "{U+2018}" + + +; C12 - SC02B +; \ +>!SC02B::Send "{U+005C}" +<^>!SC02B::Send "{U+005C}" +; +>!+SC02B::Send "" +<^>!+SC02B::Send "" + + + + +; B00 - SC056 +; ê +>!SC056::Send "{U+00EA}" +<^>!SC056::Send "{U+00EA}" +; Ê +>!+SC056::Send "{U+00CA}" +<^>!+SC056::Send "{U+00CA}" + + +; B01 - SC02C +; æ +>!SC02C::Send "{U+00E6}" +<^>!SC02C::Send "{U+00E6}" +; Æ +>!+SC02C::Send "{U+00C6}" +<^>!+SC02C::Send "{U+00C6}" + + +; B02 - SC02D +; œ +>!SC02D::Send "{U+0153}" +<^>!SC02D::Send "{U+0153}" +; Œ +>!+SC02D::Send "{U+0152}" +<^>!+SC02D::Send "{U+0152}" + + +; B03 - SC02E +; ç +>!SC02E::Send "{U+00E7}" +<^>!SC02E::Send "{U+00E7}" +; Ç +>!+SC02E::Send "{U+00C7}" +<^>!+SC02E::Send "{U+00C7}" + + +; B04 - SC02F +; — +>!SC02F::Send "{U+2014}" +<^>!SC02F::Send "{U+2014}" +; +>!+SC02F::Send "" +<^>!+SC02F::Send "" + + +; B05 - SC030 +; – +>!SC030::Send "{U+2013}" +<^>!SC030::Send "{U+2013}" +; +>!+SC030::Send "" +<^>!+SC030::Send "" + + +; B06 - SC031 +; ñ +>!SC031::Send "{U+00F1}" +<^>!SC031::Send "{U+00F1}" +; Ñ +>!+SC031::Send "{U+00D1}" +<^>!+SC031::Send "{U+00D1}" + + +; B07 - SC032 +; µ +>!SC032::Send "{U+00B5}" +<^>!SC032::Send "{U+00B5}" +; ™ +>!+SC032::Send "{U+2122}" +<^>!+SC032::Send "{U+2122}" + + +; B08 - SC033 +; … +>!SC033::Send "{U+2026}" +<^>!SC033::Send "{U+2026}" +; ≤ +>!+SC033::Send "{U+2264}" +<^>!+SC033::Send "{U+2264}" + + +; B09 - SC034 +; ⋅ +>!SC034::Send "{U+22C5}" +<^>!SC034::Send "{U+22C5}" +; ≥ +>!+SC034::Send "{U+2265}" +<^>!+SC034::Send "{U+2265}" + + +; B10 - SC035 +; ? +>!SC035::Send "{U+003F}" +<^>!SC035::Send "{U+003F}" +; ¿ +>!+SC035::Send "{U+00BF}" +<^>!+SC035::Send "{U+00BF}" + + + + +; SPC - SC039 +; NNBSP +>!SC039::Send "{U+202F}" +<^>!SC039::Send "{U+202F}" +; NBSP +>!+SC039::Send "{U+00A0}" +<^>!+SC039::Send "{U+00A0}" diff --git a/spec.html b/spec.html new file mode 100644 index 0000000..5ee19d6 --- /dev/null +++ b/spec.html @@ -0,0 +1,2075 @@ + + + + + ACP Keyboard + + + + +

ACP Keyboard

+
    +
  1. Rationale
  2. +
  3. Images
  4. +
      +
    1. UK ISO
    2. +
    3. US ANSI
    4. +
    +
  5. Key table
  6. +
  7. Dead key table
  8. +
  9. Code reference table
  10. +
      +
    1. Dead keys
    2. +
    3. Unicode
    4. +
    +
+

Rationale

+ +

There are thousands of keyboard layouts around. Why make a new one? + Simply: none of them worked for me. They either had too many symbols, + not enough symbols, or the layout was wrong. BÉPO came the closest to having the + main symbols I wanted, but I couldn’t get over the non-QWERTY layout; and + the Canadian Multilingual + Standard layout had the symbols I wanted, but they were spread across + six levels (AltGr and Right Ctrl both act as level selectors). + +

So I made my own. There were a number of requirements for me:

+ +
    +
  1. The most common English symbols I need should be available.
  2. +
  3. No more than four levels (normal; Shift; AltGr; and Shift+AltGr).
  4. +
  5. Keys should be grouped sensibly: the degree sign in °C is preceded by + a narrow non-breaking space, so they should be on the same level.
  6. +
  7. The main layout should be based on the UK ISO layout, but it should + also support the US ANSI layout with one key fewer.
  8. +
  9. It should be able to be used without Administrative permissions. This + led me to AutoHotKey on Windows, and a $HOME-based XKB layout + on Linux.
  10. +
  11. There should be support for French, German, and Spanish—as there are + a number of loanwords from these languages into English—but this should + not come at the cost of ease of use for English.
  12. +
  13. The base layers (Layer 1 and Layer 2) should not be changed. + AutoHotKey has an issue with Command Prompt in Remote Desktop sessions, + so changing the base layers stops the keys from working. It also means + there is no training period for this layout.
  14. +
+ +

Images

+

UK ISO

+ + UK ISO keyboard layout + + + + + + + + + + + ` + ¬ + | + ± + + + 1 + ! + ! + ¡ + + + 2 + " + ¢ + « + + + 3 + £ + £ + » + + + 4 + $ + + + + + 5 + % + + + + + 6 + ^ + + + + + 7 + & + + + + + 8 + * + ° + + + + 9 + ( + ª + + + + 0 + ) + º + × + + + - + _ + + ÷ + + + = + + + + + + + Backspace + + + + + Tab + + + q + Q + à + À + + + w + W + é + É + + + e + E + ë + Ë + + + r + R + è + È + + + t + T + ® + © + + + y + Y + û + Û + + + u + U + ü + Ü + + + i + I + ï + Ï + + + o + O + ö + Ö + + + p + P + + § + + + [ + { + + + + + ] + } + + + + + + + Caps Lock + + + a + A + ä + Ä + + + s + S + ß + + + + d + D + ¨ + + + + f + F + ´ + + + + g + G + ¯ + + + + h + H + + + + + j + J + ` + + + + k + K + ^ + + + + l + L + ô + Ô + + + ; + : + ; + : + + + ' + @ + + + + + # + ~ + \ + + + + + + Shift + + + \ + | + ê + Ê + + + z + Z + æ + Æ + + + x + X + œ + Œ + + + c + C + ç + Ç + + + v + V + + + + + b + B + + + + + n + N + ñ + Ñ + + + m + M + µ + + + + , + < + + + + + . + > + + + + + / + ? + ? + ¿ + + + Shift + + + + + Ctrl + + + Win + + + Alt + + + Space + Space + Narrow non-breaking space + Non-breaking space + + + AltGr + + + Win + + + Menu + + + Ctrl + + + + + Return + + +

US ANSI

+ + US ANSI keyboard layout + + + + + + + + + + + ` + ~ + | + ± + + + 1 + ! + ! + ¡ + + + 2 + @ + ¢ + « + + + 3 + # + £ + » + + + 4 + $ + + + + + 5 + % + + + + + 6 + ^ + + + + + 7 + & + + + + + 8 + * + ° + + + + 9 + ( + ª + + + + 0 + ) + º + × + + + - + _ + + ÷ + + + = + + + + + + + Backspace + + + + + Tab + + + q + Q + à + À + + + w + W + é + É + + + e + E + ë + Ë + + + r + R + è + È + + + t + T + ® + © + + + y + Y + û + Û + + + u + U + ü + Ü + + + i + I + ï + Ï + + + o + O + ö + Ö + + + p + P + + § + + + [ + { + + + + + ] + } + + + + + \ + | + \ + + + + + + Caps Lock + + + a + A + ä + Ä + + + s + S + ß + + + + d + D + ¨ + + + + f + F + ´ + + + + g + G + ¯ + + + + h + H + + + + + j + J + ` + + + + k + K + ^ + + + + l + L + ô + Ô + + + ; + : + ; + : + + + ' + " + + + + + Return + + + + + Shift + + + z + Z + æ + Æ + + + x + X + œ + Œ + + + c + C + ç + Ç + + + v + V + + + + + b + B + + + + + n + N + ñ + Ñ + + + m + M + µ + + + + , + < + + + + + . + > + + + + + / + ? + ? + ¿ + + + Shift + + + + + Ctrl + + + Win + + + Alt + + + Space + Space + Narrow non-breaking space + Non-breaking space + + + AltGr + + + Win + + + Menu + + + Ctrl + + +

Key table

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
KeyISOANSIACP
ISOXKBWinLevel 1Level 2Level 1Level 2Level 3Level 4
E00TLDESC029U+0060 `U+00AC ¬U+0060 `U+007E ~U+007C |U+00B1 ±
E01AE01SC002U+0031 1U+0021 !U+0031 1U+0021 !U+0021 !U+00A1 ¡
E02AE02SC003U+0032 2U+0022 "U+0032 2U+0040 @U+00A2 ¢U+00AB «
E03AE03SC004U+0033 3U+00A3 £U+0033 3U+0023 #U+00A3 £U+00BB »
E04AE04SC005U+0034 4U+0024 $U+0034 4U+0024 $U+20AC U+2039
E05AE05SC006U+0035 5U+0025 %U+0035 5U+0025 %U+2030 U+203A
E06AE06SC007U+0036 6U+005E ^U+0036 6U+005E ^U+221A U+2713
E07AE07SC008U+0037 7U+0026 &U+0037 7U+0026 &U+204A U+2717
E08AE08SC009U+0038 8U+002A *U+0038 8U+002A *U+00B0 °U+2022
E09AE09SC00AU+0039 9U+0028 (U+0039 9U+0028 (U+00AA ª
E10AE10SC00BU+0030 0U+0029 )U+0030 0U+0029 )U+00BA ºU+00D7 ×
E11AE11SC00CU+002D -U+005F _U+002D -U+005F _U+2212 U+00F7 ÷
E12AE12SC00DU+003D =U+002B +U+003D =U+002B +U+2248 U+2260
D01AD01SC010U+0071 qU+0051 QU+0071 qU+0051 QU+00E0 àU+00C0 À
D02AD02SC011U+0077 wU+0057 WU+0077 wU+0057 WU+00E9 éU+00C9 É
D03AD03SC012U+0065 eU+0045 EU+0065 eU+0045 EU+00EB ëU+00CB Ë
D04AD04SC013U+0072 rU+0052 RU+0072 rU+0052 RU+00E8 èU+00C8 È
D05AD05SC014U+0074 tU+0054 TU+0074 tU+0054 TU+00AE ®U+00A9 ©
D06AD06SC015U+0079 yU+0059 YU+0079 yU+0059 YU+00FB ûU+00DB Û
D07AD07SC016U+0075 uU+0055 UU+0075 uU+0055 UU+00FC üU+00DC Ü
D08AD08SC017U+0069 iU+0049 IU+0069 iU+0049 IU+00EF ïU+00CF Ï
D09AD09SC018U+006F oU+004F OU+006F oU+004F OU+00F6 öU+00D6 Ö
D10AD10SC019U+0070 pU+0050 PU+0070 pU+0050 PU+00B6 U+00A7 §
D11AD11SC01AU+005B [U+007B {U+005B [U+007B {U+201C U+201E
D12AD12SC01BU+005D ]U+007D }U+005D ]U+007D }U+201D U+201A
C01AC01SC01EU+0061 aU+0041 AU+0061 aU+0041 AU+00E4 äU+00C4 Ä
C02AC02SC01FU+0073 sU+0053 SU+0073 sU+0053 SU+00DF ßU+1E9E
C03AC03SC020U+0064 dU+0044 DU+0064 dU+0044 DDEADDI ¨◌U+2033
C04AC04SC021U+0066 fU+0046 FU+0066 fU+0046 FDEADAC ´◌U+2032
C05AC05SC022U+0067 gU+0047 GU+0067 gU+0047 GDEADMA ¯◌
C06AC06SC023U+0068 hU+0048 HU+0068 hU+0048 H
C07AC07SC024U+006A jU+004A JU+006A jU+004A JDEADGR `◌
C08AC08SC025U+006B kU+004B KU+006B kU+004B KDEADCI ^◌
C09AC09SC026U+006C lU+004C LU+006C lU+004C LU+00F4 ôU+00D4 Ô
C10AC10SC027U+003B ;U+003A :U+003B ;U+003A :U+003B ;U+003A :
C11AC11SC028U+0027 'U+0040 @U+0027 'U+0022 "U+2019 U+2018
C12BKSLSC02BU+0023 #U+007E ~U+005C \U+007C |U+005C \
B00LSGTSC056U+005C \U+007C |U+005C \U+007C |U+00EA êU+00CA Ê
B01AB01SC02CU+007A zU+005A ZU+007A zU+005A ZU+00E6 æU+00C6 Æ
B02AB02SC02DU+0078 xU+0058 XU+0078 xU+0058 XU+0153 œU+0152 Œ
B03AB03SC02EU+0063 cU+0043 CU+0063 cU+0043 CU+00E7 çU+00C7 Ç
B04AB04SC02FU+0076 vU+0056 VU+0076 vU+0056 VU+2014
B05AB05SC030U+0062 bU+0042 BU+0062 bU+0042 BU+2013
B06AB06SC031U+006E nU+004E NU+006E nU+004E NU+00F1 ñU+00D1 Ñ
B07AB07SC032U+006D mU+004D MU+006D mU+004D MU+00B5 µU+2122
B08AB08SC033U+002C ,U+003C <U+002C ,U+003C <U+2026 U+2264
B09AB09SC034U+002E .U+003E >U+002E .U+003E >U+22C5 U+2265
B10AB10SC035U+002F /U+003F ?U+002F /U+003F ?U+003F ?U+00BF ¿
SPCSPCESC039U+0020 U+0020 U+0020 U+0020 U+202F U+00A0  
+

Dead key table

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Dead keyNext keyResult
DEADAC U+0027 '
DEADACAU+00C1 Á
DEADACEU+00C9 É
DEADACIU+00CD Í
DEADACOU+00D3 Ó
DEADACUU+00DA Ú
DEADACWU+1E82
DEADACYU+00DD Ý
DEADACaU+00E1 á
DEADACeU+00E9 é
DEADACiU+00ED í
DEADACoU+00F3 ó
DEADACuU+00FA ú
DEADACwU+1E83
DEADACyU+00FD ý
DEADCI U+005E ^
DEADCIAU+00C2 Â
DEADCIEU+00CA Ê
DEADCIIU+00CE Î
DEADCIOU+00D4 Ô
DEADCIUU+00DB Û
DEADCIWU+0174 Ŵ
DEADCIYU+0176 Ŷ
DEADCIaU+00E2 â
DEADCIeU+00EA ê
DEADCIiU+00EE î
DEADCIoU+00F4 ô
DEADCIuU+00FB û
DEADCIwU+0175 ŵ
DEADCIyU+0177 ŷ
DEADDI U+0022 "
DEADDIAU+00C4 Ä
DEADDIEU+00CB Ë
DEADDIIU+00CF Ï
DEADDIOU+00D6 Ö
DEADDIUU+00DC Ü
DEADDIWU+1E84
DEADDIYU+0178 Ÿ
DEADDIaU+00E4 ä
DEADDIeU+00EB ë
DEADDIiU+00EF ï
DEADDIoU+00F6 ö
DEADDIuU+00FC ü
DEADDIwU+1E85
DEADDIyU+00FF ÿ
DEADGR U+0060 `
DEADGRAU+00C0 À
DEADGREU+00C8 È
DEADGRIU+00CC Ì
DEADGROU+00D2 Ò
DEADGRUU+00D9 Ù
DEADGRWU+1E80
DEADGRYU+1EF2
DEADGRaU+00E0 à
DEADGReU+00E8 è
DEADGRiU+00EC ì
DEADGRoU+00F2 ò
DEADGRuU+00F9 ù
DEADGRwU+1E81
DEADGRyU+1EF3
DEADMA U+00AF ¯
DEADMAAU+0100 Ā
DEADMAEU+0112 Ē
DEADMAIU+012A Ī
DEADMAOU+014C Ō
DEADMAUU+016A Ū
DEADMAYU+0232 Ȳ
DEADMAaU+0101 ā
DEADMAeU+0113 ē
DEADMAiU+012B ī
DEADMAoU+014D ō
DEADMAuU+016B ū
DEADMAyU+0233 ȳ
+

Code reference table

+

Dead keys

+ +

Unicode

+ + + diff --git a/xkb/install.sh b/xkb/install.sh new file mode 100755 index 0000000..2eede95 --- /dev/null +++ b/xkb/install.sh @@ -0,0 +1,8 @@ +#!/bin/sh +set -e + +mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/xkb/rules" +mkdir -p "${XDG_CONFIG_HOME:-$HOME/.config}/xkb/symbols" +cp ./rules/evdev "${XDG_CONFIG_HOME:-$HOME/.config}/xkb/rules/evdev" +cp ./rules/evdev.xml "${XDG_CONFIG_HOME:-$HOME/.config}/xkb/rules/evdev.xml" +cp ./symbols/acp "${XDG_CONFIG_HOME:-$HOME/.config}/xkb/symbols/acp" diff --git a/xkb/rules/evdev b/xkb/rules/evdev new file mode 100644 index 0000000..7fd07f8 --- /dev/null +++ b/xkb/rules/evdev @@ -0,0 +1,5 @@ +! option = symbols +acp = +acp(basic) +acp = +acp(us) + +! include %S/evdev diff --git a/xkb/rules/evdev.xml b/xkb/rules/evdev.xml new file mode 100644 index 0000000..e7bac3b --- /dev/null +++ b/xkb/rules/evdev.xml @@ -0,0 +1,28 @@ + + + + + + + acp + acp + ACP + + GB + US + + + eng + + + + + + us + ACP (US) + + + + + + diff --git a/xkb/symbols/acp b/xkb/symbols/acp new file mode 100644 index 0000000..e3af3f5 --- /dev/null +++ b/xkb/symbols/acp @@ -0,0 +1,76 @@ +default partial alphanumeric_keys modifier_keys +xkb_symbols "basic" { + + name[Group1]= "ACP"; + + key { [ U0060, U00AC, U007C, U00B1 ] }; // ` ¬ | ± + key { [ U0031, U0021, U0021, U00A1 ] }; // 1 ! ! ¡ + key { [ U0032, U0022, U00A2, U00AB ] }; // 2 " ¢ « + key { [ U0033, U00A3, U00A3, U00BB ] }; // 3 £ £ » + key { [ U0034, U0024, U20AC, U2039 ] }; // 4 $ € ‹ + key { [ U0035, U0025, U2030, U203A ] }; // 5 % ‰ › + key { [ U0036, U005E, U221A, U2713 ] }; // 6 ^ √ ✓ + key { [ U0037, U0026, U204A, U2717 ] }; // 7 & ⁊ ✗ + key { [ U0038, U002A, U00B0, U2022 ] }; // 8 * ° • + key { [ U0039, U0028, U00AA, NoSymbol ] }; // 9 ( ª + key { [ U0030, U0029, U00BA, U00D7 ] }; // 0 ) º × + key { [ U002D, U005F, U2212, U00F7 ] }; // - _ − ÷ + key { [ U003D, U002B, U2248, U2260 ] }; // + = ≈ ≠ + + key { [ U0071, U0051, U00E0, U00C0 ] }; // q Q à À + key { [ U0077, U0057, U00E9, U00C9 ] }; // w W é É + key { [ U0065, U0045, U00EB, U00CB ] }; // e E ë Ë + key { [ U0072, U0052, U00E8, U00C8 ] }; // r R è È + key { [ U0074, U0054, U00AE, U00A9 ] }; // t T ® © + key { [ U0079, U0059, U00FB, U00DB ] }; // y Y û Û + key { [ U0075, U0055, U00FC, U00DC ] }; // u U ü Ü + key { [ U0069, U0049, U00EF, U00CF ] }; // i I ï Ï + key { [ U006F, U004F, U00F6, U00D6 ] }; // o O ö Ö + key { [ U0070, U0050, U00B6, U00A7 ] }; // p P ¶ § + key { [ U005B, U007B, U201C, U201E ] }; // [ { “ „ + key { [ U005D, U007D, U201D, U201A ] }; // ] } ” ‚ + + key { [ U0061, U0041, U00E4, U00C4 ] }; // a A ä Ä + key { [ U0073, U0053, U00DF, U1E9E ] }; // s S ß ẞ + key { [ U0064, U0044, dead_diaeresis, U2033 ] }; // d D ¨◌ ″ + key { [ U0066, U0046, dead_acute, U2032 ] }; // f F ´◌ ′ + key { [ U0067, U0047, dead_macron, NoSymbol ] }; // g G ¯◌ + key { [ U0068, U0048, NoSymbol, NoSymbol ] }; // h H + key { [ U006A, U004A, dead_grave, NoSymbol ] }; // j J `◌ + key { [ U006B, U004B, dead_circumflex , NoSymbol ] }; // k K ^◌ + key { [ U006C, U004C, U00F4, U00D4 ] }; // l L ô Ô + key { [ U003B, U003A, U003B, U003A ] }; // ; : ; : + key { [ U0027, U0040, U2019, U2018 ] }; // ' @ ’ ‘ + key { [ U0023, U007E, U005C, NoSymbol ] }; // # ~ \ + + key { [ U005C, U007C, U00EA, U00CA ] }; // \ | ê Ê + key { [ U007A, U005A, U00E6, U00C6 ] }; // z Z æ Æ + key { [ U0078, U0058, U0153, U0152 ] }; // x X œ Œ + key { [ U0063, U0043, U00E7, U00C7 ] }; // c C ç Ç + key { [ U0076, U0056, U2014, NoSymbol ] }; // v V — + key { [ U0062, U0042, U2013, NoSymbol ] }; // b B – + key { [ U006E, U004E, U00F1, U00D1 ] }; // n N ñ Ñ + key { [ U006D, U004D, U00B5, U2122 ] }; // m M µ ™ + key { [ U002C, U003C, U2026, U2264 ] }; // , < … ≤ + key { [ U002E, U003E, U22C5, U2265 ] }; // . > ⋅ ≥ + key { [ U002F, U003F, U003F, U00BF ] }; // / ? ? ¿ + + key { [ U0020, U0020, U202F, U00A0 ] }; // [space] [space] [nnbsp] [nbsp] + + include "level3(ralt_switch)" +}; + +default partial alphanumeric_keys modifier_keys +xkb_symbols "us" { + + include "acp(basic)" + name[Group1]= "ACP (US)"; + + key { [ U0060, U007E, U007C, U00AC ] }; // ` ~ | ± + key { [ U0032, U0040, U00A2, U00AB ] }; // 2 @ ¢ « + key { [ U0033, U0023, U00A3, U00BB ] }; // 3 # £ » + key { [ U0027, U0022, U2019, U2018 ] }; // ' " ’ ‘ + key { [ U005C, U007C, U005C, NoSymbol ] }; // \ | \ + + include "level3(ralt_switch)" +};