Skip site navigation (1)Skip section navigation (2)

FreeBSD Manual Pages

  
 
  

home | help
mdbIM(5)			The m17n Library			mdbIM(5)

NAME
     mdbIM - Input Method

DESCRIPTION
     The  m17n	library provides a driver for input methods that are dynamically
     loadable from the m17n database (see m17nInputMethod ).

     This section describes the data format that defines those input methods.

SYNTAX and SEMANTICS
     The following data format defines an input method. The driver loads a defi-
     nition from a file, a stream, etc. The definition	is  converted  into  the
     form of plist in the driver.

     INPUT-METHOD ::=
	 IM-DECLARATION ? IM-DESCRIPTION ? TITLE ?
	  VARIABLE-LIST ? COMMAND-LIST ?  MODULE-LIST ?
	  MACRO-LIST ? MAP-LIST ? STATE-LIST ?

     IM-DECLARATION ::= '(' 'input-method' LANGUAGE NAME EXTRA-ID ? VERSION ? ')'
     LANGUAGE ::= SYMBOL
     NAME ::= SYMBOL
     EXTRA-ID ::= SYMBOL
     VERSION ::= '(' 'version' VERSION-NUMBER ')'

     IM-DESCRIPTION ::= '(' 'description' DESCRIPTION ')'
     DESCRIPTION ::= MTEXT-OR-GETTEXT | 'nil'
     MTEXT-OR-GETTEXT ::=  [ MTEXT | '(' '_' MTEXT ')']

     TITLE ::= '(' 'title' TITLE-TEXT ')'
     TITLE-TEXT ::= MTEXT

     VARIABLE-LIST ::= '(' 'variable' VARIABLE-DECLARATION * ')'
     VARIABLE-DECLARATION ::=  '(' VAR-NAME [ DESCRIPTION VALUE VALUE-CANDIDATE * ]')'
     VAR-NAME ::= SYMBOL
     VALUE ::= MTEXT | SYMBOL | INTEGER
     VALUE-CANDIDATE ::= VALUE | '(' RANGE-FROM RANGE-TO ')'
     RANGE-FROM ::= INTEGER
     RANGE-TO ::= INTEGER

     COMMAND-LIST ::= '(' 'command' COMMAND-DECLARATION * ')'
     COMMAND-DECLARATION ::=  '(' CMD-NAME [ DESCRIPTION KEYSEQ * ] ')'
     CMD-NAME ::= SYMBOL.fi

     IM-DECLARATION specifies the language and name of this input method.

     When LANGUAGE is t, the use of the input method is not limited to one language.

     When NAME is nil, the input method is not standalone, but is expected to be used in other input methods. In such cases, EXTRA-ID is required to identify the input method.

     VERSION specifies the required minimum version number of the m17n library. The format is 'XX.YY.ZZ' where XX is a major version number, YY is a minor version number, and ZZ is a patch level.

     DESCRIPTION, if not nil, specifies the description text of an input method, a variable or a command. If MTEXT-OR-GETTEXT takes the second form, the text is translated according to the current locale by 'gettext' (if the translation is provided).

     TITLE-TEXT is a text displayed on the screen when this input method is active.

     There is one special input method file 'global.mim' that declares common variables and commands. The input method driver always loads this file and other input methods can inherit the variables and the commands.

     VARIABLE-DECLARATION declares a variable used in this input method. If a variable must be initialized to the default value, or is to be customized by a user, it must be declared here. The declaration can be used in two ways. One is to introduce a new variable. In that case, VALUE must not be omitted. Another is to inherit the variable from what declared in 'global.mim', and to give the different default value and/or to make the variable customizable specially for the current input method. In the latter case, VALUE can be omitted.

     COMMAND-DECLARATION declares a command used in this input method. If a command must be bound to the default key sequence, or is to be customized by a user, it must be declared here. Like VARIABLE-DECLARATION, the declaration can be used in two ways. One is to introduce a new command. In that case, KEYSEQ must not be omitted. Another is to inherit the command from what declared in 'global.mim', and to give the different key binding and/or to make the command customizable specially for the current input method. In the latter case, KEYSEQ can be omitted.

     MODULE-LIST ::= '(' 'module' MODULE * ')'

     MODULE ::= '(' MODULE-NAME FUNCTION * ')'

     MODULE-NAME ::= SYMBOL

     FUNCTION ::= SYMBOL

     Each  MODULE declares the name of an external module (i.e. dynamic library)
     and function names exported by the module. If a FUNCTION has  name  'init',
     it  is  called with only the default arguments (see the section about CALL)
     when an input context is created for the input method. If	a  FUNCTION  has
     name  'fini',  it	is  called with only the default arguments when an input
     context is destroyed.

     MACRO-LIST ::=  MACRO-INCLUSION ? '(' 'macro' MACRO * ')' MACRO-INCLUSION ?

     MACRO ::= '(' MACRO-NAME MACRO-ACTION * ')'

     MACRO-NAME ::= SYMBOL

     MACRO-ACTION ::= ACTION

     TAGS ::= `(` LANGUAGE NAME EXTRA-ID ? `)`

     MACRO-INCLUSION ::= '(' 'include' TAGS 'macro' MACRO-NAME ? ')'.fi

     MACRO-INCLUSION includes macros from another input method specified by TAGS. When MACRO-NAME is not given, all macros from the input method are included.

     MAP-LIST ::= MAP-INCLUSION ? '(' 'map' MAP * ')'
     MAP-INCLUSION ?

     MAP ::= '(' MAP-NAME RULE * ')'

     MAP-NAME ::= SYMBOL

     RULE ::= '(' KEYSEQ MAP-ACTION * ')'

     KEYSEQ ::= MTEXT | '(' [ SYMBOL | INTEGER ] * ')'

     MAP-INCLUSION ::= '(' 'include' TAGS 'map' MAP-NAME ? ')'.fi

     When an input method is never standalone and always included in another method, MAP-LIST can be omitted.

     SYMBOL in the definitions of MAP-NAME must not be t nor nil.

     MTEXT in the definition of KEYSEQ consists of characters that can be generated by a keyboard. Therefore MTEXT usually contains only ASCII characters. However, if the input method is intended to be used, for instance, with a West European keyboard, MTEXT may contain Latin-1 characters.

     SYMBOL in the definition of KEYSEQ must be the return value of the minput_event_to_key() function. Under the X window system, you can quickly check the value using the xev command. For example, the return key, the backspace key, and the 0 key on the keypad are represented as (Return) , (BackSpace) , and (KP_0) respectively. If the shift, control, meta, alt, super, and hyper modifiers are used, they are represented by the S- , C- , M- , A- , s- , and H- prefixes respectively in this order. Thus, 'return with
     shift with meta with hyper' is (S-M-H-Return) . Note that 'a with
     shift' .. 'z with shift' are represented simply as A .. Z . Thus 'a
     with shift with meta with hyper' is (M-H-A) .

     INTEGER in the definition of KEYSEQ must be a valid character code.

     MAP-INCLUSION includes maps from another input method specified by TAGS. When MAP-NAME is not given, all maps from the input method are included.

     MAP-ACTION ::= ACTION

     ACTION ::= INSERT | DELETE | SELECT | MOVE | MARK
		| SHOW | HIDE | PUSHBACK | POP | UNDO
	    | COMMIT | UNHANDLE | SHIFT | CALL
	    | SET | IF | COND | '(' MACRO-NAME ')'

     PREDEFINED-SYMBOL ::=
	 '@0' | '@1' | '@2' | '@3' | '@4'
	 | '@5' | '@6' | '@7' | '@8' | '@9'
	 | '@<' | '@=' | '@>' | '@-' | '@+' | '@[' | '@]'
	 | '@@'
	 | '@-0' | '@-N' | '@+N'

     STATE-LIST ::= STATE-INCUSION ? '(' 'state' STATE * ')'  STATE-INCUSION ?

     STATE ::= '(' STATE-NAME [ STATE-TITLE-TEXT ] BRANCH * ')'

     STATE-NAME ::= SYMBOL

     STATE-TITLE-TEXT ::= MTEXT

     BRANCH ::= '(' MAP-NAME BRANCH-ACTION * ')'
	    | '(' 'nil' BRANCH-ACTION * ')'
	    | '(' 't' BRANCH-ACTION * ')'

     STATE-INCLUSION ::= '(' 'include' TAGS 'state' STATE-NAME ? ')'.fi

     When an input system is never standalone and always included in another system, STATE-LIST can be omitted.

     STATE-INCLUSION includes states from another input method specified by TAGS. When STATE-NAME is not given, all states from the input method are included.

     The optional STATE-TITLE-TEXT specifies a title text displayed on the screen when the input method is in this state. If STATE-TITLE-TEXT is omitted, TITLE-TEXT is used.

     In the first form of BRANCH, MAP-NAME must be an item that appears in MAP. In this case, if a key sequence matching one of KEYSEQs of MAP-NAME is typed, BRANCH-ACTIONs are executed.

     In the second form of BRANCH, BRANCH-ACTIONs are executed if a key sequence that doesn't match any of Branch's of the current state is typed.

     If there is no BRANCH beginning with nil and the typed key sequence does not match any of the current BRANCHs, the input method transits to the initial state.

     In the third form of BRANCH, BRANCH-ACTIONs are executed when shifted to the current state. If the current state is the initial state, BRANCH-ACTIONs are executed also when an input context of the input method is created.

     BRANCH-ACTION ::= ACTION

     An input method has the following two lists of symbols.

     * marker list
     A marker is a symbol indicating a	character  position  in  the  preediting
     text.  The  MARK  action  assigns a position to a marker. The position of a
     marker is referred by the MOVE and the DELETE actions.
     * variable list
     A variable is a symbol associated with an integer, a symbol, or  an  M-text
     value.  The  integer value of a variable can be set and referred by the SET
     action. It can be referred by the SET, the INSERT, the  SELECT,  the  UNDO,
     the IF, the COND actions. The M-text value of a variable can be referred by
     the  INSERT  action. The symbol value of a variable can not be referred di-
     rectly, is used the library implicitly (e.g. candidates-charset). All vari-
     ables are implicitly initialized to the integer value zero.
     Each PREDEFINED-SYMBOL has a special meaning when used as a marker.
     * @0, @1, @2, @3, @4, @5, @6, @7, @8, @9
     The 0th, 1st, 2nd, ... 9th position respectively.
     * @<, @=, @>
     The first, the current, and the last position.
     * @-, @+
     The previous and the next position.
     * @[, @]
     The previous and the next position where a candidate list changes.
     Some of the PREDEFINED-SYMBOL has a special meaning when used as  a  candi-
     date index in the SELECT action.
     * @<, @=, @>
     The  first,  the  current,  and the last candidate of the current candidate
     group.
     * @-
     The previous candidate. If the current candidate is the first  one  in  the
     current  candidate  group, then it means the last candidate in the previous
     candidate group.
     * @+
     The next candidate. If the current candidate is the last one in the current
     candidate group, then it means the first candidate in  the  next  candidate
     group.
     * @[, @]
     The  candidate in the previous and the next candidate group having the same
     candidate index as the current one.
     And, this also has a special meaning.
     * @@
     Number of handled keys at that moment.
     These are for supporting surround text handling.
     * @-0
     -1 if surrounding text is supported, -2 if not.
     * @-N
     Here, N is a positive integer. The value is the Nth previous  character  in
     the  preedit  buffer.  If there are only M (M<N) previous characters in it,
     the value is the (N-M)th previous character from the inputting  spot.  When
     this  is  used as the argument of delete action, it specifies the number of
     characters to be deleted.
     * @+N
     Here, N is a positive integer. The value is the Nth following character  in
     the  preedit  buffer. If there are only M (M<N) following characters in it,
     the value is the (N-M)th following character from the inputting spot.  When
     this  is  used as the argument of delete action, it specifies the number of
     characters to be deleted.
     The arguments and the behavior of each action are listed below.
     INSERT ::= '(' 'insert' MTEXT ')'
		| MTEXT
	    | INTEGER
	    | SYMBOL
		| '(' 'insert' SYMBOL ')'
		| '(' 'insert' '(' CANDIDATES * ')' ')'
		| '(' CANDIDATES * ')'

     CANDIDATES ::= MTEXT | '(' MTEXT * ')'
     The first and second forms insert MTEXT before the current position.
     The third form inserts the character INTEGER before the current position.
     The fourth and fith form treats SYMBOL as a variable, and inserts its value
     (if it is a valid character code) before the current position.
     In the sixth and seventh forms,  each  CANDIDATES	represents  a  candidate
     group,  and each element of CANDIDATES represents a candidate, i.e. if CAN-
     DIDATES is an M-text, the candidates are the characters in the  M-text;  if
     CANDIDATES  is  a	list  of  M-texts, the candidates are the M-texts in the
     list.
     These forms insert the first candidate before the current position. The in-
     serted string is associated with the list of candidates and the information
     indicating the currently selected candidate.
     The marker positions affected by the insertion are automatically relocated.
     DELETE ::= '(' 'delete' SYMBOL ')'
		| '(' 'delete' INTEGER ')'
     The first form treats SYMBOL as a marker, and  deletes  characters  between
     the current position and the marker position.
     The second form treats INTEGER as a character position, and deletes charac-
     ters between the current position and the character position.
     The marker positions affected by the deletion are automatically relocated.
     SELECT ::= '(' 'select' PREDEFINED-SYMBOL ')'
		| '(' 'select' INTEGER ')'
	    | '(' 'select' SYMBOL ')'
     This  action first checks if the character just before the current position
     belongs to a string that is associated with a candidate list. If it is, the
     action replaces that string with a candidate specified by the argument.
     The first form treats PREDEFINED-SYMBOL as a candidate index (as  described
     above) that specifies a new candidate in the candidate list.
     The  second  form	treats INTEGER as a candidate index that specifies a new
     candidate in the candidate list.
     In the third form, SYMBOL must have a integer value, and it is treated as a
     candidate index.
     SHOW ::= '(show)' .fi
     This actions instructs the input method driver to display a candidate list associated with the string before the current position.
     HIDE ::= '(hide)'
     This action instructs the input method driver to hide  the  currently  dis-
     played candidate list.
     MOVE ::= '(' 'move' SYMBOL ')'
	      | '(' 'move' INTEGER ')'
     The  first form treats SYMBOL as a marker, and makes the marker position be
     the new current position.
     The second form treats INTEGER as a character position, and makes that  po-
     sition be the new current position.
     MARK ::= '(' 'mark' SYMBOL ')'
     This action treats SYMBOL as a marker, and sets its position to the current
     position. SYMBOL must not be a PREDEFINED-SYMBOL.
     PUSHBACK :: = '(' 'pushback' INTEGER ')'
		   | '(' 'pushback' KEYSEQ ')'
     The  first  form pushes back the latest INTEGER number of key events to the
     event queue if INTEGER is positive, and pushes back all key events if INTE-
     GER is zero.
     The second form pushes back keys in KEYSEQ to the event queue.
     POP ::= '(' 'pop' ')'
     This action pops the first key event that is not yet handled from the event
     queue.
     UNDO :: = '(' 'undo' [ INTEGER | SYMBOL ] ')'
     If there's no argument, this action cancels the last two key  events  (i.e.
     the one that invoked this command, and the previous one).
     If  there's  an  integer argument NUM, it must be positive or negative (not
     zero). If positive, from the NUMth to the last events are canceled. If neg-
     ative, the last (- NUM) events are canceled.
     If there's a symbol argument, it must be resolved to an integer number  and
     the number is treated as the actual argument as above.
     COMMIT :: = '(commit)'
     This action commits the current preedit.
     UNHANDLE :: = '(unhandle)'
     This  action commits the current preedit and returns the last key as unhan-
     dled.
     SHIFT :: = '(' 'shift' STATE-NAME ')'
     If STATE-NAME is t, this action shifts the current state  to  the	previous
     one, otherwise it shifts to STATE-NAME. In the latter case, STATE-NAME must
     appear in STATE-LIST.
     CALL ::= '(' 'call' MODULE-NAME FUNCTION ARG * ')'

     ARG ::= INTEGER | SYMBOL | MTEXT | PLIST
     This  action  calls  the  function FUNCTION of external module MODULE-NAME.
     MODULE-NAME and FUNCTION must appear in MODULE-LIST.
     The function is called with an argument of the type (#MPlist *). The key of
     the first element is #Mt and its value is a pointer to  an  object  of  the
     type  #MInputContext.  The  key  of  the second element is #Msymbol and its
     value is the current state name. ARGs are used as the value  of  the  third
     and  later  elements. Their keys are determined automatically; if an ARG is
     an integer, the corresponding key is #Minteger; if an ARG is a symbol,  the
     corresponding key is #Msymbol, etc.
     The  function must return NULL or a value of the type (#MPlist *) that rep-
     resents a list of actions to take.
     SET ::= '(' CMD SYMBOL1 EXPRESSION ')'

     CMD ::= 'set' | 'add' | 'sub' | 'mul' | 'div'

     EXPRESSION ::= INTEGER | SYMBOL2 | '(' OPERATOR EXPRESSION * ')'

     OPERATOR ::= '+' | '-' | '*' | '/' | '|' | '&' | '!'
		 | '=' | '<' | '>' | '<=' | '>='.fi
     This action treats SYMBOL1 and SYMBOL2 as variables and sets the value of SYMBOL1 as below.
     If CMD is 'set', it sets the value of SYMBOL1 to the value of EXPRESSION.
     If CMD is 'add', it increments the value of SYMBOL1 by the value of EXPRESSION.
     If CMD is 'sub', it decrements the value of SYMBOL1 by the value of EXPRESSION.
     If CMD is 'mul', it multiplies the value of SYMBOL1 by the value of EXPRESSION.
     If CMD is 'div', it divides the value of SYMBOL1 by the value of EXPRESSION.
     IF ::= '(' CONDITION ACTION-LIST1 ACTION-LIST2 ? ')'

     CONDITION ::= [ '=' | '<' | '>' | '<=' | '>=' ] EXPRESSION1 EXPRESSION2

     ACTION-LIST1 ::= '(' ACTION * ')'

     ACTION-LIST2 ::= '(' ACTION * ')'
     This action performs actions in ACTION-LIST1 if CONDITION is true, and per-
     forms ACTION-LIST2 (if any) otherwise.
     COND ::= '(' 'cond' [ '(' EXPRESSION ACTION * ') ] * ')'
     This action performs the first action ACTION whose corresponding EXPRESSION
     has nonzero value.
EXAMPLE 1
     This is a very simple example for inputting Latin characters with diacriti-
     cal marks (acute and cedilla). For instance, when you type:
	 Comme'die-Franc,aise, chic,,

     you will get this:
     The definition of the input method is very simple as below, and it is quite
     straight forward to extend it to cover all Latin characters.
EXAMPLE 2
     This example is for inputting Unicode characters by typing C-u  (Control-u)
     followed  by  four  hexadecimal  digits.  For instance, when you type ('^u'
     means Control-u):
	 ^u2190^u2191^u2192^u2193

     you will get this (Unicode arrow symbols):
     The definition utilizes SET and IF commands as below:
     (title "UNICODE")
     (map
      (starter
       ((C-U) "U+"))
      (hex
       ("0" ?0) ("1" ?1) ... ("9" ?9) ("a" ?A) ("b" ?B) ... ("f" ?F)))
     (state
      (init
       (starter (set code 0) (set count 0) (shift unicode)))
      (unicode
       (hex (set this @-)
	    (< this ?A
	   ((sub this 48))
	   ((sub this 55)))
	    (mul code 16) (add code this)
	    (add count 1)
	    (= count 4
	   ((delete @<) (insert code) (shift init))))))

EXAMPLE 3
     This example is for inputting Chinese characters by typing PinYin	key  se-
     quence.
SEE ALSO
     Input Methods provided by the m17n database, mdbGeneral(5)
COPYRIGHT
     Copyright (C) 2001 Information-technology Promotion Agency (IPA)
     Copyright	(C)  2001-2011 National Institute of Advanced Industrial Science
     and Technology (AIST)
     Permission is granted to copy, distribute and/or modify this document under
     the terms of the GNU  Free  Documentation	License  <http://www.gnu.org/li-
     censes/fdl.html>.

Version 1.8.4			 Mon Sep 25 2023			mdbIM(5)

Want to link to this manual page? Use this URL:
<https://man.freebsd.org/cgi/man.cgi?query=mdbIM&sektion=5&manpath=FreeBSD+Ports+15.1.quarterly>

home | help