1 /* Copyright (C) 2003, 2004, 2005
2 National Institute of Advanced Industrial Science and Technology (AIST)
3 Registration Number H15PRO112
4 See the end for copying conditions. */
8 @page mdbIM Input Method
10 @section im-description DESCRIPTION
12 The m17n library provides a driver for input methods that are
13 dynamically loadable from the m17n database (see @ref m17nInputMethod
14 @latexonly (P.\pageref{group__m17nInputMethod}) @endlatexonly).
16 This section describes the data format that defines those input
19 @section im-format SYNTAX and SEMANTICS
21 The following data format defines an input method. The driver loads
22 a definition from a file, a stream, etc. A definitions is converted
23 into the form of plist in the driver.
27 IM-DECLARATION ? DESCRIPTION ? VARIABLE-LIST ? COMMAND-LIST ?
28 TITLE MAP-LIST MACRO-LIST ? MODULE-LIST ? STATE-LIST
30 IM-DECLARATION ::= '(' 'input-method' LANGUAGE NAME ')'
31 DESCRIPTION ::= '(' 'description' MTEXT ')'
32 VARIABLE-LIST ::= '(' 'variable' VARIABLE-DECLARATION * ')'
33 COMMAND-LIST ::= '(' 'command' COMMAND-DECLARATION * ')'
34 TITLE ::= '(' 'title' TITLE-TEXT ')'
36 VARIABLE-DECLARATION ::=
37 '(' VAR-NAME [ VAR-DESCRIPTION | nil ] VALUE VALUE-CANDIDATE * ')'
39 COMMAND-DECLARATION ::=
40 '(' CMD-NAME [ CMD-DESCRIPTION | nil ] KEYSEQ * ')'
44 IM-DESCRIPTION ::= MTEXT
46 VAR-DESCRIPTION ::= MTEXT
47 VALUE ::= MTEXT | SYMBOL | INTEGER
48 VALUE-CANDIDATE ::= VALUE | '(' RANGE-FROM RANGE-TO ')'
49 RANGE-FROM ::= INTEGER
52 CMD-DESCRIPTION ::= MTEXT
56 @c IM-DECLARATION specifies the language and name of this input
59 @c DESCRIPTION specifies the description text of this input method by
62 @c VARIABLE-DECLARATION declares a variable used in this input method.
63 If a variable must be initialized from the default value, or is to be
64 customized by a user, it must be declared here.
66 @c COMMAND-DECLARATION declares a command used in this input method.
67 If a command must be bound to the default key sequence, or is to be
68 customized by a user, it must be declared here.
70 @c TITLE-TEXT is a text displayed on the screen when this input method
74 MAP-LIST ::= '(' 'map' MAP * ')'
76 MAP ::= '(' MAP-NAME RULE * ')'
80 RULE ::= '(' KEYSEQ MAP-ACTION * ')'
82 KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'
85 @c SYMBOL in the definitions of @c MAP-NAME must not be @c t nor @c
88 @c MTEXT in the definition of @c KEYSEQ consists of characters that
89 can be generated by a keyboard. Therefore @c MTEXT usually contains
90 only ASCII characters. However, if the input method is intended to be
91 used, for instance, with a West European keyboard, @c MTEXT may
92 contain Latin-1 characters.
94 @c SYMBOL in the definition of @c KEYSEQ must be the return value of
95 the minput_event_to_key () function.
97 @c INTEGER in the definition of @c KEYSEQ must be a valid character
101 MAP-ACTION ::= ACTION
103 ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
104 | SHOW | HIDE | PUSHBACK | UNDO | UNHANDLE | SHIFT | CALL
105 | SET | IF | COND | '(' MACRO-NAME ')'
107 PREDEFINED-SYMBOL ::=
108 '@0' | '@1' | '@2' | '@3' | '@4'
109 | '@5' | '@6' | '@7' | '@8' | '@9'
110 | '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
114 MACRO-LIST ::= '(' 'macro' MACRO * ')'
116 MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'
118 MACRO-NAME ::= SYMBOL
120 MACRO-ACTION ::= ACTION
123 MODULE-LIST ::= '(' 'module' MODULE * ')'
125 MODULE ::= '(' MODULE-NAME FUNCTION * ')'
127 MODULE-NAME ::= SYMBOL
132 Each @c MODULE declares the name of external module (i.e. dynamic
133 library) and function names exported by the module. If a @c FUNCTION has
134 name "init", it is called with only the default arguments (see the
135 section about @c CALL) when an input context is created for the input
136 method. If a @c FUNCTION has name "fini", it is called with only the
137 default arguments when an input context is destroyed.
140 STATE-LIST ::= '(' 'state' STATE * ')'
142 STATE ::= '(' STATE-NAME BRANCH * ')'
144 STATE-NAME ::= SYMBOL
146 BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
147 | '(' nil BRANCH-ACTION * ')'
148 | '(' t BRANCH-ACTION * ')'
151 In the first form of @c BRANCH, @c MAP-NAME must be an item that appears
152 in @c MAP. In this case, if a key sequence matching one of @c
153 KEYSEQs of @c MAP-NAME is typed, @c BRANCH-ACTIONs are executed.
155 In the second form of @c BRANCH, @c BRANCH-ACTIONs are executed if a
156 key sequence that doesn't match any of @c Branch's of the current
159 In the third form of @c BRANCH, @c BRANCH-ACTIONs are executed when we
160 shift to the current state. If the current state is the initial
161 state, @c BRANCH-ACTIONs are executed also when an input context of
162 the input method is created.
165 BRANCH-ACTION ::= ACTION
168 An input method has the following two lists of symbols.
173 A marker is a symbol indicating a character position in the preediting
174 text. The @c MARK action assigns a position to a marker. The
175 position of a marker is referred by the @c MOVE and the @c DELETE actions.
179 A variable is a symbol associated with an integer value. The value of
180 a variable is set by the @c SET action, and is referred by the @c SET,
181 the @c INSERT, and the @c IF actions. All variables are implicitly
186 Each @c PREDEFINED-SYMBOL has a special meaning when used as a marker.
189 <li> @c @@0, @c @@1, @c @@2, @c @@3, @c @@4, @c @@5, @c @@6, @c @@7, @c @@8, @c @@9
191 The 0th, 1st, 2nd, ... 9th position respectively.
193 <li> @c @@<, @c @@=, @c @@>
195 The first, the current, and the last position.
199 The previous and the next position.
203 The previous and the next position where a candidate list changes.
206 Some of the @c PREDEFINED-SYMBOL has a special meaning when used as a candidate
207 index in the @c SELECT action.
211 <li> @c @@<, @c @@=, @c @@>
213 The first, the current, and the last candidate of the current candidate group.
217 The previous candidate. If the current candidate is the first one in
218 the current candidate group, then it means the last candidate in the
219 previous candidate group.
223 The next candidate. If the current candidate is the last one in the
224 current candidate group, then it means the first candidate in the next
229 The candidate in the previous and the next candidate group having the same
230 candidate index as the current one.
233 And, this also has a special meaning.
238 Number of handled keys at that moment.
242 The arguments and the behavior of each action are listed below.
245 INSERT ::= '(' 'insert' MTEXT ')'
248 | '(' 'insert' SYMBOL ')'
249 | '(' 'insert' '(' CANDIDATES * ')' ')'
250 | '(' CANDIDATES * ')'
252 CANDIDATES ::= MTEXT | '(' MTEXT * ')'
255 The first and second forms insert @c MTEXT before the current position.
257 The third form inserts the character @c INTEGER before the current
260 The fourth form treats @c SYMBOL as a variable, and inserts its value
261 (if it is a valid character code) before the current position.
263 In the fifth and sixth forms, each @c CANDIDATES represents a
264 candidate group, and each element of @c CANDIDATES represents a
265 candidate, i.e. if @c CANDIDATES is an M-text, the candidates are the
266 characters in the M-text; if @c CANDIDATES is a list of M-texts, the
267 candidates are the M-texts in the list.
269 These forms insert the first candidate before the current position.
270 The inserted string is associated with the list of candidates and
271 the information indicating the currently selected candidate.
273 The marker positions affected by the insertion are automatically relocated.
276 DELETE ::= '(' 'delete' SYMBOL ')'
277 | '(' 'delete' INTEGER ')'
280 The first form treats @c SYMBOL as a marker, and deletes characters
281 between the current position and the marker position.
283 The second form treats @c INTEGER as a character position, and deletes
284 characters between the current position and the character position.
286 The marker positions affected by the deletion are automatically relocated.
289 SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
290 | '(' 'select' INTEGER ')'
293 This action first checks if the character just before the current position
294 belongs to a string that is associated with a candidate list. If it is,
295 the action replaces that string with a candidate specified by the
298 The first form treats @c PREDEFINED-SYMBOL as a candidate index (as
299 described above) that specifies a new candidate in the candidate list.
301 The second form treats @c INTEGER as a candidate index that specifies a
302 new candidate in the candidate list.
308 This actions instructs the input method driver to display a candidate
309 list associated with the string before the current position.
315 This action instructs the input method driver to hide the currently
316 displayed candidate list.
319 MOVE ::= '(' 'move' SYMBOL ')'
320 | '(' 'move' INTEGER ')'
323 The first form treats @c SYMBOL as a marker, and makes the marker
324 position be the new current position.
326 The second form treats @c INTEGER as a character position, and makes
327 that position be the new current position.
330 MARK ::= '(' 'mark' SYMBOL ')'
333 This action treats @c SYMBOL as a marker, and sets its position to the
334 current position. @c SYMBOL must not be a @c PREDEFINED-SYMBOL.
338 PUSHBACK :: = '(' 'pushback' INTEGER ')'
339 | '(' 'pushback' KEYSEQ ')'
342 The first form pushes back the latest @c INTEGER number of key events
343 to the event queue if @c INTEGER is positive, and pushes back all key
344 events if @c INTEGER is zero.
346 The second form pushes back keys in KEYSEQ to the event queue.
349 UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
352 If there's no argument, this action cancels the last two key events
353 (i.e. the one that invoked this command, and the previous one).
355 If there's an integer argument NUM, it must be positive or negative
356 (not zero). If positive, the NUMth event to the last one are
357 cancelled. If negative the last (- NUM) events are cancelled.
359 If there's a symbol argument, it must be resolved to an integer number
360 and the number is treated as the actual argument as above.
363 UNHANDLE :: = '(unhandle)'
366 This action commit the current preedit and return the last key as
370 SHIFT :: = '(' 'shift' STATE-NAME ')'
373 This action shifts the current state to @c STATE-NAME. @c
374 STATE-NAME must appear in @c STATE-LIST.
377 CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'
379 ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
382 This action calls the function @c FUNCTION of external module @c
383 MODULE-NAME. @c MODULE-NAME and @c FUNCTION must appear in @c
386 The function is called with an argument of the type (#MPlist *). The
387 key of the first element is #Mt and its value is a pointer to an
388 object of the type #MInputContext. The key of the second element is
389 #Msymbol and its value is the current state name. @c ARGs are used as
390 the value of the third and later elements. Their keys are determined
391 automatically; if an @c ARG is an integer, the corresponding key is
392 #Minteger; if an @c ARG is a symbol, the corresponding key is
395 The function must return NULL or a value of the type (#MPlist *) that
396 represents a list of actions to take.
399 SET ::= '(' CMD SYMBOL1 EXPRESSION ')'
401 CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'
403 EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERAND EXPRESSION * ')'
405 OPERAND ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
406 | '=' | '<' | '>' | '<=' | '>='
410 This action treats @c SYMBOL1 and @c SYMBOL2 as variables and sets the
411 value of @c SYMBOL1 as below.
413 If @c CMD is 'set', it sets the value of @c SYMBOL1 to the value of @c
416 If @c CMD is 'add', it increments the value of @c SYMBOL1 by the value
419 If @c CMD is 'sub', it decrements the value of @c SYMBOL1 by the value
422 If @c CMD is 'mul', it multiplies the value of @c SYMBOL1 by the value
425 If @c CMD is 'div', it divides the value of @c SYMBOL1 by the value of
429 IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ')'
431 CONDITION ::= [ '=' | '<' | '>' | '<=' | '>=' ] EXPRESSION1 EXPRESSION2
433 ACTION-LIST1 ::= '(' ACTION * ')'
435 ACTION-LIST2 ::= '(' ACTION * ')'
438 This action performs actions in @c ACTION-LIST1 if @c CONDITION is
439 true, and performs @c ACTION-LIST2 (if any) otherwise.
441 @c SYMBOL1 and @c SYMBOL2 are treated as variables.
444 COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
447 This action performs the first actions @c ACTION whose corresponding
448 @c EXPRESSION has nonzero value.
452 @section im-example1 EXAMPLE 1
454 This is a very simple example for inputting Latin characters with
455 diacritical marks (acute and cedilla). For instance, when you type:
457 Comme'die-Franc,aise, chic,,
462 Commédie-Française, chic,
467 \hskip5mm\texttt{\footnotesize Comm\'{e}die-Fran\c{c}aise, chic,}
471 The definition of the input method is very simple as below, and it is
472 quite straight forward to extend it to cover all Latin characters.
476 (title "latin-postfix")
479 ("a'" ?á) ("e'" ?é) ("i'" ?í) ("o'" ?ó) ("u'" ?ú) ("c," ?ç)
480 ("A'" ?Á) ("E'" ?É) ("I'" ?Í) ("O'" ?Ó) ("U'" ?Ú) ("C," ?Ç)
481 ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")
483 ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")
492 \texttt{\footnotesize
493 \hskip2mm(title "latin-postfix")\\
496 \hskip6mm ("a'" ?\'{a}) ("e'" ?\'{e}) ("i'" ?\'{i}) ("o'" ?\'{o})
497 ("u'" ?\'{u}) ("c," ?\c{c})\\
498 \hskip6mm ("A'" ?\'{A}) ("E'" ?\'{E}) ("I'" ?\'{I}) ("O'" ?\'{O})
499 ("U'" ?\'{U}) ("C," ?\c{C})\\
500 \hskip6mm ("a''" "a'") ("e''" "e'") ("i''" "i'") ("o''" "o'") ("u''" "u'")\\
501 \hskip6mm ("c,," "c,")\\
502 \hskip6mm ("A''" "A'") ("E''" "E'") ("I''" "I'") ("O''" "O'") ("U''" "U'")\\
503 \hskip6mm ("C,," "C,")))\\
510 @section im-example2 EXAMPLE 2
512 This example is for inputting Unicode characters by typing C-u
513 (Control-u) followed by four hexadecimal numbers. For instance, when
514 you type ("^u" means Control-u):
516 ^u2190^u2191^u2192^u2193
518 you will get this (Unicode arrow symbols):
523 The definition utilizes @c SET and @c IF commands as below:
530 ("0" ?0) ("1" ?1) ... ("9" ?9) ("a" ?A) ("b" ?B) ... ("f" ?F)))
533 (starter (set code 0) (set count 0) (shift unicode)))
539 (mul code 16) (add code this)
542 ((delete @<) (insert code) (shift init))))))
545 @section im-example3 EXAMPLE 3
547 This example is for inputting Chinese characters by typing PinYin key
550 For instance, when you type:
559 The definition utilizes @c CANDIDATE and @c SELECT commands as below.
560 Note that this is just an example, and it ignores such important key
567 ;; The initial character of Pinyin.
569 ("a") ("b") ... ("h") ("j") ... ("t") ("w") ("x") ("y") ("z"))
571 ;; Big table of Pinyin vs the corresponding Chinese characters.
574 ("bei" ("被北备背悲辈杯倍贝碑" ...))
575 ("hao" ("好号毫豪浩耗皓嚎昊郝" ...))
576 ("jing" ("经京精境警竟静惊景敬" ...))
577 ("ni" ("你呢尼泥逆倪匿拟腻妮" ...))
579 ;; Typing 1, 2, ..., 0 selects the 0th, 1st, ..., 9th candidate.
581 ("1" (select 0)) ("2" (select 1)) ... ("9" (select 8)) ("0" (select 9))))
585 ;; When an initial character of Pinyin is typed, re-handle it in
586 ;; "main" state. Anything else is just produced as is.
587 (starter (show) (pushback 1) (shift main)))
590 ;; When a complete Pinyin sequence is typed, shift to "select" state
591 ;; to allow users to select one from the candidates.
592 (pinyin (shift select))
594 ;; When anything else is typed, produce the current candidate (if
595 ;; any), and re-handle the last input in "init" state.
596 (nil (hide) (shift init)))
599 ;; When a number is typed, select the corresponding canidate,
600 ;; produce it, and shift to "init" state.
601 (choose (hide) (shift init))
603 ;; When anything else is typed, produce the current candidate,
604 ;; and re-handle the last input in "init" state.
605 (nil (hide) (shift init))))
611 \fbox{This example is readable only in the documentation of HTML version.}
618 @section im-seealso SEE ALSO
620 @ref mim-list "Input Methods provided by the m17n database",
621 @ref mdbGeneral "mdbGeneral(5)"
625 Copyright (C) 2003, 2004, 2005
626 National Institute of Advanced Industrial Science and Technology (AIST)
627 Registration Number H15PRO112
629 This file is part of the m17n database; a sub-part of the m17n
632 The m17n library is free software; you can redistribute it and/or
633 modify it under the terms of the GNU Lesser General Public License
634 as published by the Free Software Foundation; either version 2.1 of
635 the License, or (at your option) any later version.
637 The m17n library is distributed in the hope that it will be useful,
638 but WITHOUT ANY WARRANTY; without even the implied warranty of
639 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
640 Lesser General Public License for more details.
642 You should have received a copy of the GNU Lesser General Public
643 License along with the m17n library; if not, write to the Free
644 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
648 /* Local Variables: */