Error: 4054 Statement extended is not currently supported in context

Hello, I am having some trouble compiling my keyboard. Starting on line 294, all non-commented lines of code are returning the error, “Error: 4054 Statement extended is not currently supported in context”. I tried searching around for information about the error message, but couldn’t find much.

It appears that it has to do with creating rules with context, but by using the actual key names rather than the characters they produce.

Here is my code:

c
c Keyman keyboard generated by ImportKeyboard
c Imported: 2024-03-11 14:40:31
c
c Source Keyboard File: KBDLA.DLL
c Source KeyboardID: 0000080a
c
c 

store(&Version) "10.0"
store(&NAME) 'Test Teclado Quechua'
store(&TARGETS) 'any'
store(&VISUALKEYBOARD) 'test_teclado_quechua.kvks'
store(&BITMAP) 'test_teclado_quechua.ico'
store(&LAYOUTFILE) 'test_teclado_quechua.keyman-touch-layout'
store(&COPYRIGHT) '©'
store(&KEYBOARDVERSION) '1.0'

begin Unicode > use(main)

c vea un mapa del teclado en https://help.keyman.com/developer/language/guide/virtual-keys
c Lo que aparece en [corchetes] es el nombre de la misma tecla física en el teclado. Su nombre por lo general se basa en la letra o carácter que tiene en el teclado inglés. 
c Los códigos que empiezan con U+ y que son seguidas por un código alfanumérico de 4 dígitos son los códigos Unicode, que especifican un carácter. 
c En este idioma de programación, la letra c empieza un comentario. Al final de cada Línea he puesto "c | " y después el carácter en sí

group(main) using keys

+ [K_SPACE] > U+0020       c |    (hace un espacio)
 
+ [K_0] > U+0030             c | 0
+ [SHIFT K_0] > U+003d       c | =
 
+ [K_1] > U+0031             c | 1
+ [SHIFT K_1] > U+0021       c | !
 
+ [K_2] > U+0032             c | 2
+ [SHIFT K_2] > U+0022       c | "
 
+ [K_3] > U+0033             c | 3
+ [SHIFT K_3] > U+0023       c | #
 
+ [K_4] > U+0034             c | 4
+ [SHIFT K_4] > U+0024       c | $
 
+ [K_5] > U+0035             c | 5
+ [SHIFT K_5] > U+0025       c | %
 
+ [K_6] > U+0036             c | 6
+ [SHIFT K_6] > U+0026       c | &
 
+ [K_7] > U+0037             c | 7
+ [SHIFT K_7] > U+002f       c | /
 
+ [K_8] > U+0038             c | 8
+ [SHIFT K_8] > U+0028       c | (
 
+ [K_9] > U+0039             c | 9
+ [SHIFT K_9] > U+0029       c | )
 
+ [NCAPS K_A] > U+0061       c | a    | cuando el usuario teclea la tecla de A, pone una "a"
+ [CAPS K_A] > U+0041        c | A    | cuando el usuario teclea la tecla de A y el Bloq Mayúscula está activado, pone una "A"
+ [NCAPS SHIFT K_A] > U+0041 c | A    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, pone una "A"
+ [CAPS SHIFT K_A] > U+0061  c | a    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, y el Bloq Mayúscula está activado, pone una "a"
 
+ [NCAPS K_B] > U+0062       c | b
+ [CAPS K_B] > U+0042        c | B
+ [NCAPS SHIFT K_B] > U+0042 c | B
+ [CAPS SHIFT K_B] > U+0062  c | b
 
+ [NCAPS K_C] > U+0063       c | c
+ [CAPS K_C] > U+0043        c | C
+ [NCAPS SHIFT K_C] > U+0043 c | C
+ [CAPS SHIFT K_C] > U+0063  c | c
 
+ [NCAPS K_D] > U+0064       c | d
+ [CAPS K_D] > U+0044        c | D
+ [NCAPS SHIFT K_D] > U+0044 c | D
+ [CAPS SHIFT K_D] > U+0064  c | d
 
+ [NCAPS K_E] > U+0065       c | e
+ [CAPS K_E] > U+0045        c | E
+ [NCAPS SHIFT K_E] > U+0045 c | E
+ [CAPS SHIFT K_E] > U+0065  c | e
 
+ [NCAPS K_F] > U+0066       c | f
+ [CAPS K_F] > U+0046        c | F
+ [NCAPS SHIFT K_F] > U+0046 c | F
+ [CAPS SHIFT K_F] > U+0066  c | f
 
+ [NCAPS K_G] > U+0067       c | g
+ [CAPS K_G] > U+0047        c | G
+ [NCAPS SHIFT K_G] > U+0047 c | G
+ [CAPS SHIFT K_G] > U+0067  c | g
 
+ [NCAPS K_H] > U+0068       c | h
+ [CAPS K_H] > U+0048        c | H
+ [NCAPS SHIFT K_H] > U+0048 c | H
+ [CAPS SHIFT K_H] > U+0068  c | h
 
+ [NCAPS K_I] > U+0069       c | i
+ [CAPS K_I] > U+0049        c | I
+ [NCAPS SHIFT K_I] > U+0049 c | I
+ [CAPS SHIFT K_I] > U+0069  c | i
 
+ [NCAPS K_J] > U+006a       c | j
+ [CAPS K_J] > U+004a        c | J
+ [NCAPS SHIFT K_J] > U+004a c | J
+ [CAPS SHIFT K_J] > U+006a  c | j
 
+ [NCAPS K_K] > U+006b       c | k
+ [CAPS K_K] > U+004b        c | K
+ [NCAPS SHIFT K_K] > U+004b c | K
+ [CAPS SHIFT K_K] > U+006b  c | k
 
+ [NCAPS K_L] > U+006c       c | l
+ [CAPS K_L] > U+004c        c | L
+ [NCAPS SHIFT K_L] > U+004c c | L
+ [CAPS SHIFT K_L] > U+006c  c | l
 
+ [NCAPS K_M] > U+006d       c | m
+ [CAPS K_M] > U+004d        c | M
+ [NCAPS SHIFT K_M] > U+004d c | M
+ [CAPS SHIFT K_M] > U+006d  c | m
 
+ [NCAPS K_N] > U+006e       c | n
+ [CAPS K_N] > U+004e        c | N
+ [NCAPS SHIFT K_N] > U+004e c | N
+ [CAPS SHIFT K_N] > U+006e  c | n
 
+ [NCAPS K_O] > U+006f       c | o
+ [CAPS K_O] > U+004f        c | O
+ [NCAPS SHIFT K_O] > U+004f c | O
+ [CAPS SHIFT K_O] > U+006f  c | o
 
+ [NCAPS K_P] > U+0070       c | p
+ [CAPS K_P] > U+0050        c | P
+ [NCAPS SHIFT K_P] > U+0050 c | P
+ [CAPS SHIFT K_P] > U+0070  c | p
 
+ [NCAPS K_Q] > U+0071       c | q
+ [CAPS K_Q] > U+0051        c | Q
+ [NCAPS SHIFT K_Q] > U+0051 c | Q
+ [CAPS SHIFT K_Q] > U+0071  c | q
+ [NCAPS RALT K_Q] > U+0040  c | @
 
+ [NCAPS K_R] > U+0072       c | r
+ [CAPS K_R] > U+0052        c | R
+ [NCAPS SHIFT K_R] > U+0052 c | R
+ [CAPS SHIFT K_R] > U+0072  c | r
 
+ [NCAPS K_S] > U+0073       c | s
+ [CAPS K_S] > U+0053        c | S
+ [NCAPS SHIFT K_S] > U+0053 c | S
+ [CAPS SHIFT K_S] > U+0073  c | s
 
+ [NCAPS K_T] > U+0074       c | t
+ [CAPS K_T] > U+0054        c | T
+ [NCAPS SHIFT K_T] > U+0054 c | T
+ [CAPS SHIFT K_T] > U+0074  c | t
 
+ [NCAPS K_U] > U+0075       c | u
+ [CAPS K_U] > U+0055        c | U
+ [NCAPS SHIFT K_U] > U+0055 c | U
+ [CAPS SHIFT K_U] > U+0075  c | u
 
+ [NCAPS K_V] > U+0076       c | v
+ [CAPS K_V] > U+0056        c | V
+ [NCAPS SHIFT K_V] > U+0056 c | V
+ [CAPS SHIFT K_V] > U+0076  c | v
 
+ [NCAPS K_W] > U+0077       c | w
+ [CAPS K_W] > U+0057        c | W
+ [NCAPS SHIFT K_W] > U+0057 c | W
+ [CAPS SHIFT K_W] > U+0077  c | w
 
+ [NCAPS K_X] > U+0078       c | x
+ [CAPS K_X] > U+0058        c | X
+ [NCAPS SHIFT K_X] > U+0058 c | X
+ [CAPS SHIFT K_X] > U+0078  c | x
 
+ [NCAPS K_Y] > U+0079       c | y
+ [CAPS K_Y] > U+0059        c | Y
+ [NCAPS SHIFT K_Y] > U+0059 c | Y
+ [CAPS SHIFT K_Y] > U+0079  c | y
 
+ [NCAPS K_Z] > U+007a       c | z
+ [CAPS K_Z] > U+005a        c | Z
+ [NCAPS SHIFT K_Z] > U+005a c | Z
+ [CAPS SHIFT K_Z] > U+007a  c | z
 
+ [K_LBRKT] > dk(00b4)       c | Esta tecla pone los acentos encima de los vocales en español. ( " ´ " ). Es una tecla muerta. 
+ [SHIFT K_LBRKT] > dk(00a8) c | Esta tecla (con Mayúscula) pone los umlaut encima de los vocales en español. ( " ¨ " ). Es una tecla muerta. 
 
+ [K_RBRKT] > U+002b         c | +
+ [SHIFT K_RBRKT] > U+002a   c | *
+ [RALT K_RBRKT] > U+007e    c | ~
 
+ [K_COMMA] > U+002c         c | ,
+ [SHIFT K_COMMA] > U+003b   c | ;
 
+ [K_SLASH] > U+002d         c | -
+ [SHIFT K_SLASH] > U+005f   c | _
 
+ [K_PERIOD] > U+002e        c | .
+ [SHIFT K_PERIOD] > U+003a  c | :
 
+ [K_BKSLASH] > U+007d           c | }
+ [SHIFT K_BKSLASH] > U+005d     c | ]
+ [RALT K_BKSLASH] > dk(0060)    c | alt derecho más "}" hace una "tecla muerta virtual" que pondrá un  "`" encima del vocal siguiente. Por ejemplo: ALT-DERECHO + "}" + e > ê

 
+ [NCAPS K_COLON] > U+00f1       c | ñ
+ [CAPS K_COLON] > U+00d1        c | Ñ
+ [NCAPS SHIFT K_COLON] > U+00d1 c | Ñ
+ [CAPS SHIFT K_COLON] > U+00f1  c | ñ
 
+ [K_HYPHEN] > U+0027        c | '
+ [SHIFT K_HYPHEN] > U+003f  c | ?
+ [RALT K_HYPHEN] > U+005c   c | \
 
+ [K_BKQUOTE] > U+007c       c | |
+ [SHIFT K_BKQUOTE] > U+00b0 c | °
+ [RALT K_BKQUOTE] > U+00ac  c | ¬
 
+ [K_EQUAL] > U+00bf         c | ¿
+ [SHIFT K_EQUAL] > U+00a1   c | ¡
 
+ [K_QUOTE] > U+007b         c | {
+ [SHIFT K_QUOTE] > U+005b   c | [
+ [RALT K_QUOTE] > dk(005e)  c | alt derecho más "{" hace una "tecla muerta virtual" que pondrá un  "^" encima del vocal siguiente. 
c |                              Por ejemplo: ALT-DERECHO + "{" + e > ê. También, para conseguir el "^" solo, solo hay que teclear
c |                              Alt-DERECHO + "{" + ESPACIO > "^"
 
+ [K_oE2] > U+003c           c | <
+ [SHIFT K_oE2] > U+003e     c | >

match > use(deadkeys)

group(deadkeys)


c | "store(vocales) A E I O U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales'
c | "store(vocales_con_acentos) Á E Í Ó U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales_con_acentos'
c | "dk(tecla_muerta_de_acento) any(vocales) > index(vocales_con_acentos, 2)" quiere decir, "Cuando tecleo la tecla muerta de acento 
c |     y después un carácter en la lista "vocales", pone el carácter de la lista "vocales_con_acentos" que aparece en la misma posición 
c |     del carater en la lista de "vocales". Por elemplo, "´" + "e" > "é". 


store(dkf00b4) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 U+0059 c |   a A e E i I o O u U y Y
store(dkt00b4) U+00b4 U+00e1 U+00c1 U+00e9 U+00c9 U+00ed U+00cd U+00f3 U+00d3 U+00fa U+00da U+00fd U+00dd c | ´ á Á é É í Í ó Ó ú Ú ý Ý
dk(00b4) any(dkf00b4) > index(dkt00b4, 2)

store(dkf00a8) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 c |   a A e E i I o O u U y
store(dkt00a8) U+00a8 U+00e4 U+00c4 U+00eb U+00cb U+00ef U+00cf U+00f6 U+00d6 U+00fc U+00dc U+00ff c | ¨ ä Ä ë Ë ï Ï ö Ö ü Ü ÿ
dk(00a8) any(dkf00a8) > index(dkt00a8, 2)

store(dkf0060) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt0060) U+0060 U+00e0 U+00c0 U+00e8 U+00c8 U+00ec U+00cc U+00f2 U+00d2 U+00f9 U+00d9 c | ` à À è È ì Ì ò Ò ù Ù
dk(0060) any(dkf0060) > index(dkt0060, 2)

store(dkf005e) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt005e) U+005e U+00e2 U+00c2 U+00ea U+00ca U+00ee U+00ce U+00f4 U+00d4 U+00fb U+00db c | ^ â Â ê Ê î Î ô Ô û Û
dk(005e) any(dkf005e) > index(dkt005e, 2)

c | inicio de modificaciones para el teclado Quechua

c | == sección de consonantes ==

c | == Habilitar consonantes con acento ==
store(consonantes_sin_tilde)           U+0063 U+0043 U+0072 U+0052 U+0073 U+0053 c | c C r R s S
store(consonantes_con_tilde) U+0107 U+0106 U+0155 U+0154 U+015B U+015A c | ć Ć ŕ Ŕ ś Ś
dk(00b4) any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "´" para poner el acento, igual como los vocales
[K_BKQUOTE] any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "|" ("`" en teclados norteamericanos) para lograr lo mismo que "'" (método heredero)

c | == Habilitar la C con circunflejo ==
store(c)                 U+0063 U+0043 c | c C
store(c_con_circunflejo) U+0109 U+0108 c | ĉ Ĉ
dk(005e) any(c) > index(c_con_circunflejo, 2) c | AltDerecho + "{" + "c" > "ĉ"
[SHIFT K_6] any(c) > index(c_con_circunflejo, 2) c | Mayús + "6" + c" > "ĉ"

c | == Habilitar consonantes con caron ==
store(consonantes_sin_caron) U+0063 U+0043 U+0073 U+0053 c | c C s S
store(consonantes_con_caron) U+010D U+010C U+0161 U+0160 c | č Č š Š
[SHIFT K_5] any(consonantes_sin_caron) > index(consonantes_con_caron, 2) c | Mayús + "5" + c > "č"

c | == sección de puntuación ==

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
[ALT K_COMMA] > U+003C c | Alt + "," = "<"
[ALT K_PERIOD] > U+003E c | Alt + "." = ">" 

c | == Habilitar las comillas angulares simples y dobles ==
c | ==== Primer método. Funciona en teclados Latinoamericanos. ====
[K_oE2] [K_oE2]                                  > U+00AB c | "<" + "<" = "«"
[K_oE2] [K_oE2] [K_oE2]                      > U+2039 c | "<" + "<" + "<" = "‹" No estoy seguro si esto va a funcionar
[SHIFT K_oE2] [SHIFT K_oE2]                      > U+00BB c | ">" + ">" = "»"
[SHIFT K_oE2] [SHIFT K_oE2] [SHIFT K_oE2]    > U+203A c | ">" + ">" + ">" = "›" No estoy seguro si esto va a funcionar
c | ==== segundo método. Funciona en teclados norteamericanos. ====
[ALT K_COMMA] [ALT K_COMMA]                  > U+00AB c |       Alt + "," + "," > "«"
[ALT K_COMMA] [ALT K_COMMA] [ALT K_COMMA]     > U+2039 c | Alt + "," + "," + "," > "‹" . No estoy seguro si esto va a funcionar
[ALT K_PERIOD] [ALT K_PERIOD]                > U+00BB c |       Alt + "." + "." > "»"
[ALT K_PERIOD] [ALT K_PERIOD] [ALT K_PERIOD] > U+203A c | Alt + "." + "." + "." > "›" . No estoy seguro si esto va a funcionar

[K_COLON] [K_LBRKT] > U+A78C c | ꞌ para teclear el glotal

c | == Seccion de AFI == 
c | basado en el SIL IPA Keyboard (https://help.keyman.com/keyboard/sil_ipa/1.8.6/sil_ipa),
c | pero considerando la configuración del teclado latinoamericano

[SHIFT K_SLASH] [SHIFT K_SLASH] > U+02BC c | ʼ  "]" + "]" eyectiva
[SHIFT K_LBRKT] [SHIFT K_0]     > U+0294 c | ʔ	"?" + "=" glotal
[K_A] [SHIFT K_0]               > U+0251 c | ɑ 	"a" + "=" 
[K_A] [SHIFT K_QUOTE]           > U+00E6 c | æ	"a" + "[" 
[K_O] [SHIFT K_QUOTE]           > U+0254 c | ɔ	"o" + "[" 
[K_E] [SHIFT K_0]               > U+0259 c | ə	"e" + "=" 
[K_E] [SHIFT K_QUOTE]           > U+025B c | ɛ	"e" + "["
[SHIFT K_G] [SHIFT K_0]         > U+0262 c | ɢ	"G" + "="
[K_G] [SHIFT K_0]               > U+0263 c | ɣ	"g" + "="
[K_H] [SHIFT K_6]               > U+02B0 c | ʰ	"h" + "&"	
[K_I] [SHIFT K_0]               > U+026A c | ɪ	"i" + "="	
[K_N] [SHIFT K_0]               > U+0272 c | ɲ	"n" + "="	
[K_F] [SHIFT K_0]               > U+0278 c | ɸ	"f" + "="	
[K_S] [SHIFT K_0]               > U+0283 c | ʃ	"s" + "="	
[K_U] [SHIFT K_QUOTE]           > U+028A c | ʊ	"u" + "["	
[SHIFT K_L] [SHIFT K_QUOTE]     > U+028E c | ʎ	"L" + "["	
[K_B] [SHIFT K_0]               > U+03B2 c | β	"b" + "="	
[K_T] [SHIFT K_0]               > U+03B8 c | θ	"t" + "="	
[K_X] [SHIFT K_0]               > U+03C7 c | χ	"x" + "="	

c | Keyboard name: "Winchus"? No contentious graphemes! 
c | Communicate the ideas of beauty, eligance, speed!

I’m sorry all of the comments are in Spanish. They are spell-checked, so they should be fairly marchine-translatable. For every line I tried to give the desired output, then the key combination needed to generate it (assuming a Latin American keyboard).

What do I need to do differently?

Thanks so much.

I’m not at my computer, but it looks like your punctuation rules are in a group that isn’t using keys, just output (deadkeys). But, the punctuation is using rules based on keystrokes and not the output.

Thanks so much Lorna! Taking for example this line:

How might I correct its syntax?

Hi Alex,
Part of the issue is that you have already processed [K_A] in a rule prior (line 60). It was + [NCAPS K_A] > U+0061. Nevertheless, Keyman considers that the same keystroke. So, you now have to look for U+0061.

So, I would expect most of the rules from line 273 down to need modifications. Some examples:

Line 273:

[K_BKQUOTE] any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2)

U+007c any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2)

Line 279:

[SHIFT K_6] any(c) > index(c_con_circunflejo, 2)

U+0026 any(c) > index(c_con_circunflejo, 2)

Line 284

[SHIFT K_5] any(consonantes_sin_caron) > index(consonantes_con_caron, 2)

U+0025 any(consonantes_sin_caron) > index(consonantes_con_caron, 2)

Line 312

[K_A] [SHIFT K_0] > U+0251

U+0061 U+003d > U+0251

(FYI: The other issue is that in this section group(deadkeys) you aren’t allowed to use the virtual keys. This is a post processing group.That’s why you got the message, but it didn’t explain it all.)

1 Like

I would just like to say that in my opinion, that error message is decidedly unhelpful! We’ll try and improve it; I’ve opened issue #11022.

The Using Rules documentation also helps to differentiate between the different parts of a rule, but given how the understanding of ‘a sequence of keystrokes’ vs ‘existing context + a keystroke’ is so common, we should probably also add clarification of that specific idea to that documentation page.

Thanks so much Lorna and Marc! This really helps me understand what the complier is looking for. I’m away from my computer for the next week or two, but after Easter I’ll make some changes and give it a shot! I’ll study the Using Rules documentation too. Thanks also Marc for opening the issue!

1 Like

Thanks again for the tips. I’ve made great progress but I am still getting the same error message twice. Here is the complete revised keyboard. Details below:

c
c Keyman keyboard generated by ImportKeyboard
c Imported: 2024-03-11 14:40:31
c
c Source Keyboard File: KBDLA.DLL
c Source KeyboardID: 0000080a
c
c 

store(&Version) "10.0"
store(&NAME) 'Test Teclado Quechua'
store(&TARGETS) 'any'
store(&VISUALKEYBOARD) 'test_teclado_quechua.kvks'
store(&BITMAP) 'test_teclado_quechua.ico'
store(&LAYOUTFILE) 'test_teclado_quechua.keyman-touch-layout'
store(&COPYRIGHT) '©'
store(&KEYBOARDVERSION) '1.0'

begin Unicode > use(main)

c vea un mapa del teclado en https://help.keyman.com/developer/language/guide/virtual-keys
c Lo que aparece en [corchetes] es el nombre de la misma tecla física en el teclado. Su nombre por lo general se basa en la letra o carácter que tiene en el teclado inglés. 
c Los códigos que empiezan con U+ y que son seguidas por un código alfanumérico de 4 dígitos son los códigos Unicode, que especifican un carácter. 
c En este idioma de programación, la letra c empieza un comentario. Al final de cada Línea he puesto "c | " y después el carácter en sí

group(main) using keys

+ [K_SPACE] > U+0020       c |    (hace un espacio)
 
+ [K_0] > U+0030             c | 0
+ [SHIFT K_0] > U+003d       c | =
 
+ [K_1] > U+0031             c | 1
+ [SHIFT K_1] > U+0021       c | !
 
+ [K_2] > U+0032             c | 2
+ [SHIFT K_2] > U+0022       c | "
 
+ [K_3] > U+0033             c | 3
+ [SHIFT K_3] > U+0023       c | #
 
+ [K_4] > U+0034             c | 4
+ [SHIFT K_4] > U+0024       c | $
 
+ [K_5] > U+0035             c | 5
+ [SHIFT K_5] > U+0025       c | %
 
+ [K_6] > U+0036             c | 6
+ [SHIFT K_6] > U+0026       c | &
 
+ [K_7] > U+0037             c | 7
+ [SHIFT K_7] > U+002f       c | /
 
+ [K_8] > U+0038             c | 8
+ [SHIFT K_8] > U+0028       c | (
 
+ [K_9] > U+0039             c | 9
+ [SHIFT K_9] > U+0029       c | )
 
+ [NCAPS K_A] > U+0061       c | a    | cuando el usuario teclea la tecla de A, pone una "a"
+ [CAPS K_A] > U+0041        c | A    | cuando el usuario teclea la tecla de A y el Bloq Mayúscula está activado, pone una "A"
+ [NCAPS SHIFT K_A] > U+0041 c | A    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, pone una "A"
+ [CAPS SHIFT K_A] > U+0061  c | a    | cuando el usuario teclea la tecla Mayúscula y después la tecla de A, y el Bloq Mayúscula está activado, pone una "a"
 
+ [NCAPS K_B] > U+0062       c | b
+ [CAPS K_B] > U+0042        c | B
+ [NCAPS SHIFT K_B] > U+0042 c | B
+ [CAPS SHIFT K_B] > U+0062  c | b
 
+ [NCAPS K_C] > U+0063       c | c
+ [CAPS K_C] > U+0043        c | C
+ [NCAPS SHIFT K_C] > U+0043 c | C
+ [CAPS SHIFT K_C] > U+0063  c | c
 
+ [NCAPS K_D] > U+0064       c | d
+ [CAPS K_D] > U+0044        c | D
+ [NCAPS SHIFT K_D] > U+0044 c | D
+ [CAPS SHIFT K_D] > U+0064  c | d
 
+ [NCAPS K_E] > U+0065       c | e
+ [CAPS K_E] > U+0045        c | E
+ [NCAPS SHIFT K_E] > U+0045 c | E
+ [CAPS SHIFT K_E] > U+0065  c | e
 
+ [NCAPS K_F] > U+0066       c | f
+ [CAPS K_F] > U+0046        c | F
+ [NCAPS SHIFT K_F] > U+0046 c | F
+ [CAPS SHIFT K_F] > U+0066  c | f
 
+ [NCAPS K_G] > U+0067       c | g
+ [CAPS K_G] > U+0047        c | G
+ [NCAPS SHIFT K_G] > U+0047 c | G
+ [CAPS SHIFT K_G] > U+0067  c | g
 
+ [NCAPS K_H] > U+0068       c | h
+ [CAPS K_H] > U+0048        c | H
+ [NCAPS SHIFT K_H] > U+0048 c | H
+ [CAPS SHIFT K_H] > U+0068  c | h
 
+ [NCAPS K_I] > U+0069       c | i
+ [CAPS K_I] > U+0049        c | I
+ [NCAPS SHIFT K_I] > U+0049 c | I
+ [CAPS SHIFT K_I] > U+0069  c | i
 
+ [NCAPS K_J] > U+006a       c | j
+ [CAPS K_J] > U+004a        c | J
+ [NCAPS SHIFT K_J] > U+004a c | J
+ [CAPS SHIFT K_J] > U+006a  c | j
 
+ [NCAPS K_K] > U+006b       c | k
+ [CAPS K_K] > U+004b        c | K
+ [NCAPS SHIFT K_K] > U+004b c | K
+ [CAPS SHIFT K_K] > U+006b  c | k
 
+ [NCAPS K_L] > U+006c       c | l
+ [CAPS K_L] > U+004c        c | L
+ [NCAPS SHIFT K_L] > U+004c c | L
+ [CAPS SHIFT K_L] > U+006c  c | l
 
+ [NCAPS K_M] > U+006d       c | m
+ [CAPS K_M] > U+004d        c | M
+ [NCAPS SHIFT K_M] > U+004d c | M
+ [CAPS SHIFT K_M] > U+006d  c | m
 
+ [NCAPS K_N] > U+006e       c | n
+ [CAPS K_N] > U+004e        c | N
+ [NCAPS SHIFT K_N] > U+004e c | N
+ [CAPS SHIFT K_N] > U+006e  c | n
 
+ [NCAPS K_O] > U+006f       c | o
+ [CAPS K_O] > U+004f        c | O
+ [NCAPS SHIFT K_O] > U+004f c | O
+ [CAPS SHIFT K_O] > U+006f  c | o
 
+ [NCAPS K_P] > U+0070       c | p
+ [CAPS K_P] > U+0050        c | P
+ [NCAPS SHIFT K_P] > U+0050 c | P
+ [CAPS SHIFT K_P] > U+0070  c | p
 
+ [NCAPS K_Q] > U+0071       c | q
+ [CAPS K_Q] > U+0051        c | Q
+ [NCAPS SHIFT K_Q] > U+0051 c | Q
+ [CAPS SHIFT K_Q] > U+0071  c | q
+ [NCAPS RALT K_Q] > U+0040  c | @
 
+ [NCAPS K_R] > U+0072       c | r
+ [CAPS K_R] > U+0052        c | R
+ [NCAPS SHIFT K_R] > U+0052 c | R
+ [CAPS SHIFT K_R] > U+0072  c | r
 
+ [NCAPS K_S] > U+0073       c | s
+ [CAPS K_S] > U+0053        c | S
+ [NCAPS SHIFT K_S] > U+0053 c | S
+ [CAPS SHIFT K_S] > U+0073  c | s
 
+ [NCAPS K_T] > U+0074       c | t
+ [CAPS K_T] > U+0054        c | T
+ [NCAPS SHIFT K_T] > U+0054 c | T
+ [CAPS SHIFT K_T] > U+0074  c | t
 
+ [NCAPS K_U] > U+0075       c | u
+ [CAPS K_U] > U+0055        c | U
+ [NCAPS SHIFT K_U] > U+0055 c | U
+ [CAPS SHIFT K_U] > U+0075  c | u
 
+ [NCAPS K_V] > U+0076       c | v
+ [CAPS K_V] > U+0056        c | V
+ [NCAPS SHIFT K_V] > U+0056 c | V
+ [CAPS SHIFT K_V] > U+0076  c | v
 
+ [NCAPS K_W] > U+0077       c | w
+ [CAPS K_W] > U+0057        c | W
+ [NCAPS SHIFT K_W] > U+0057 c | W
+ [CAPS SHIFT K_W] > U+0077  c | w
 
+ [NCAPS K_X] > U+0078       c | x
+ [CAPS K_X] > U+0058        c | X
+ [NCAPS SHIFT K_X] > U+0058 c | X
+ [CAPS SHIFT K_X] > U+0078  c | x
 
+ [NCAPS K_Y] > U+0079       c | y
+ [CAPS K_Y] > U+0059        c | Y
+ [NCAPS SHIFT K_Y] > U+0059 c | Y
+ [CAPS SHIFT K_Y] > U+0079  c | y
 
+ [NCAPS K_Z] > U+007a       c | z
+ [CAPS K_Z] > U+005a        c | Z
+ [NCAPS SHIFT K_Z] > U+005a c | Z
+ [CAPS SHIFT K_Z] > U+007a  c | z

+ [K_LBRKT] > dk(00b4)       c | Esta tecla pone los acentos encima de los vocales en español. ( " ´ " ). Es una tecla muerta. 
+ [SHIFT K_LBRKT] > dk(00a8) c | Esta tecla (con Mayúscula) pone los umlaut encima de los vocales en español. ( " ¨ " ). Es una tecla muerta. 
 
+ [K_RBRKT] > U+002b         c | +
+ [SHIFT K_RBRKT] > U+002a   c | *
+ [RALT K_RBRKT] > U+007e    c | ~
 
+ [K_COMMA] > U+002c         c | ,
+ [SHIFT K_COMMA] > U+003b   c | ;
 
+ [K_SLASH] > U+002d         c | -
+ [SHIFT K_SLASH] > U+005f   c | _
 
+ [K_PERIOD] > U+002e        c | .
+ [SHIFT K_PERIOD] > U+003a  c | :
 
+ [K_BKSLASH] > U+007d           c | }
+ [SHIFT K_BKSLASH] > U+005d     c | ]
+ [RALT K_BKSLASH] > dk(0060)    c | alt derecho más "}" hace una "tecla muerta virtual" que pondrá un  "`" encima del vocal siguiente. Por ejemplo: ALT-DERECHO + "}" + e > ê

 
+ [NCAPS K_COLON] > U+00f1       c | ñ
+ [CAPS K_COLON] > U+00d1        c | Ñ
+ [NCAPS SHIFT K_COLON] > U+00d1 c | Ñ
+ [CAPS SHIFT K_COLON] > U+00f1  c | ñ
 
+ [K_HYPHEN] > U+0027        c | '
+ [SHIFT K_HYPHEN] > U+003f  c | ?
+ [RALT K_HYPHEN] > U+005c   c | \
 
+ [K_BKQUOTE] > U+007c       c | |
+ [SHIFT K_BKQUOTE] > U+00b0 c | °
+ [RALT K_BKQUOTE] > U+00ac  c | ¬
 
+ [K_EQUAL] > U+00bf         c | ¿
+ [SHIFT K_EQUAL] > U+00a1   c | ¡
 
+ [K_QUOTE] > U+007b         c | {
+ [SHIFT K_QUOTE] > U+005b   c | [
+ [RALT K_QUOTE] > dk(005e)  c | alt derecho más "{" hace una "tecla muerta virtual" que pondrá un  "^" encima del vocal siguiente. 
c |                              Por ejemplo: ALT-DERECHO + "{" + e > ê. También, para conseguir el "^" solo, solo hay que teclear
c |                              Alt-DERECHO + "{" + ESPACIO > "^"
 
+ [K_oE2] > U+003c           c | <
+ [SHIFT K_oE2] > U+003e     c | >

match > use(deadkeys)

group(deadkeys)


c | "store(vocales) A E I O U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales'
c | "store(vocales_con_acentos) Á E Í Ó U" quiere decir, "recuerda esta lista de caracteres que nombro 'vocales_con_acentos'
c | "dk(tecla_muerta_de_acento) any(vocales) > index(vocales_con_acentos, 2)" quiere decir, "Cuando tecleo la tecla muerta de acento 
c |     y después un carácter en la lista "vocales", pone el carácter de la lista "vocales_con_acentos" que aparece en la misma posición 
c |     del carater en la lista de "vocales". Por elemplo, "´" + "e" > "é". 


store(dkf00b4) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 U+0059 c |   a A e E i I o O u U y Y
store(dkt00b4) U+00b4 U+00e1 U+00c1 U+00e9 U+00c9 U+00ed U+00cd U+00f3 U+00d3 U+00fa U+00da U+00fd U+00dd c | ´ á Á é É í Í ó Ó ú Ú ý Ý
dk(00b4) any(dkf00b4) > index(dkt00b4, 2)

store(dkf00a8) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 U+0079 c |   a A e E i I o O u U y
store(dkt00a8) U+00a8 U+00e4 U+00c4 U+00eb U+00cb U+00ef U+00cf U+00f6 U+00d6 U+00fc U+00dc U+00ff c | ¨ ä Ä ë Ë ï Ï ö Ö ü Ü ÿ
dk(00a8) any(dkf00a8) > index(dkt00a8, 2)

store(dkf0060) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt0060) U+0060 U+00e0 U+00c0 U+00e8 U+00c8 U+00ec U+00cc U+00f2 U+00d2 U+00f9 U+00d9 c | ` à À è È ì Ì ò Ò ù Ù
dk(0060) any(dkf0060) > index(dkt0060, 2)

store(dkf005e) U+0020 U+0061 U+0041 U+0065 U+0045 U+0069 U+0049 U+006f U+004f U+0075 U+0055 c |   a A e E i I o O u U
store(dkt005e) U+005e U+00e2 U+00c2 U+00ea U+00ca U+00ee U+00ce U+00f4 U+00d4 U+00fb U+00db c | ^ â Â ê Ê î Î ô Ô û Û
dk(005e) any(dkf005e) > index(dkt005e, 2)

c | inicio de modificaciones para el teclado Quechua

c | == sección de consonantes ==

c | == Habilitar consonantes con acento ==
store(consonantes_sin_tilde)           U+0063 U+0043 U+0072 U+0052 U+0073 U+0053 c | c C r R s S
store(consonantes_con_tilde) U+0107 U+0106 U+0155 U+0154 U+015B U+015A c | ć Ć ŕ Ŕ ś Ś
dk(00b4) any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "´" para poner el acento, igual como los vocales
U+007c any(consonantes_sin_tilde) > index(consonantes_con_tilde, 2) c | usa la tecla "|" ("`" en teclados norteamericanos) para lograr lo mismo que "'" (método heredero)

c | == Habilitar la C con circunflejo ==
store(c)                 U+0063 U+0043 c | c C
store(c_con_circunflejo) U+0109 U+0108 c | ĉ Ĉ
dk(005e) any(c) > index(c_con_circunflejo, 2) c | AltDerecho + "{" + "c" > "ĉ"
U+0026 any(c) > index(c_con_circunflejo, 2) c | Mayús + "6" + c" > "ĉ"

c | == Habilitar consonantes con caron ==
store(consonantes_sin_caron) U+0063 U+0043 U+0073 U+0053 c | c C s S
store(consonantes_con_caron) U+010D U+010C U+0161 U+0160 c | č Č š Š
U+0025 any(consonantes_sin_caron) > index(consonantes_con_caron, 2) c | Mayús + "5" + c > "č"

c | == sección de puntuación ==

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
[ALT K_COMMA] > U+003C c | Alt + "," = "<"
[ALT K_PERIOD] > U+003E c | Alt + "." = ">" 

c | == Habilitar las comillas angulares simples y dobles ==
c | ==== Primer método. Funciona en teclados Latinoamericanos. ====
U+003c U+003c > U+00AB c | "<" + "<" = "«"
U+00AB U+003c > U+2039 c | "«" + "<" = "‹" No estoy seguro si esto va a funcionar
U+003e U+003e > U+00BB c | ">" + ">" = "»"
U+00BB U+003e > U+203A c | "»" + ">" = "›" No estoy seguro si esto va a funcionar
c | ==== segundo método. Funciona en teclados norteamericanos. ====
c |  WON'T BE NEEDED SI SECCIÓN "Habilitar menor-que y mayor-que en teclados norteamericanos" FUNCIONE
c | U+002c U+002c        > U+00AB c |       Alt + "," + "," > "«"
c | U+002c U+002c U+002c > U+2039 c | Alt + "," + "," + "," > "‹" . No estoy seguro si esto va a funcionar
c | U+003e U+003e        > U+00BB c |       Alt + "." + "." > "»"
c | U+003e U+003e U+003e > U+203A c | Alt + "." + "." + "." > "›" . No estoy seguro si esto va a funcionar

dk(00a8) U+0027 > U+A78C c | ' ꞌ para teclear el glotal, teclea la tecla de acento 
c |                              (a la derecha de la "P") y después la tecla de comilla 
c |                              (a la derecha de la "0"). En breve "´" + "'" > "ꞌ"

c | == Seccion de AFI == 
c | basado en el SIL IPA Keyboard (https://help.keyman.com/keyboard/sil_ipa/1.8.6/sil_ipa),
c | pero considerando la configuración del teclado latinoamericano

U+005f U+005f   > U+02BC c | ʼ  "]" + "]" eyectiva
dk(00a8) U+003d > U+0294 c | ʔ	"?" + "=" glotal
U+0061 U+003d   > U+0251 c | ɑ 	"a" + "=" 
U+0061 U+005b   > U+00E6 c | æ	"a" + "[" 
U+006f U+005b   > U+0254 c | ɔ	"o" + "[" 
U+0065 U+003d   > U+0259 c | ə	"e" + "=" 
U+0065 U+005b   > U+025B c | ɛ	"e" + "["
U+0047 U+003d   > U+0262 c | ɢ	"G" + "="
U+0067 U+003d   > U+0263 c | ɣ	"g" + "="
U+0068 U+0026   > U+02B0 c | ʰ	"h" + "&"	
U+0069 U+003d   > U+026A c | ɪ	"i" + "="	
U+006e U+003d   > U+0272 c | ɲ	"n" + "="	
U+0066 U+003d   > U+0278 c | ɸ	"f" + "="	
U+0073 U+003d   > U+0283 c | ʃ	"s" + "="	
U+0075 U+005b   > U+028A c | ʊ	"u" + "["	
U+004c U+005b   > U+028E c | ʎ	"L" + "["	
U+0062 U+003d   > U+03B2 c | β	"b" + "="	
U+0074 U+003d   > U+03B8 c | θ	"t" + "="	
U+0078 U+003d   > U+03C7 c | χ	"x" + "="	

The error appears on lines 289 and 290:

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
[ALT K_COMMA] > U+003C c | Alt + "," = "<"
[ALT K_PERIOD] > U+003E c | Alt + "." = ">" 

[ALT K_COMMA] and [ALT K_PERIOD] aren’t defined anywhere else in the project. The goal is for Alt + “,” = “<” and Alt + “.” = “>”.

Possibly relevant sections include lines 198-199 and 205-205:

+ [K_COMMA] > U+002c         c | ,
+ [SHIFT K_COMMA] > U+003b   c | ;
 
...
 
+ [K_PERIOD] > U+002e        c | .
+ [SHIFT K_PERIOD] > U+003a  c | :

How might I code this key sequence?

Thanks so much!

@Alex_Larkin, you just need to move those rules out of the deadkeys group into the main group. The deadkeys group does not process key events, so those rules could never match there.

You can put them anywhere in the main group but for clarity you could put them near the K_COMMA and K_PERIOD rules you mention on lines 198 and 205. When you move them to the main group, you also need to add a + on the front, in order to make them match the key:

c | == Habilitar menor-que y mayor-que en teclados norteamericanos 
+ [ALT K_COMMA] > U+003C c | Alt + "," = "<"
+ [ALT K_PERIOD] > U+003E c | Alt + "." = ">" 

Thanks so much! Now that you mention it, that makes perfect sense. I moved those lines up as you suggested and got Error 4054 to go away!