Mercurial > hg > xemacs-beta
diff man/mule/quail.texi @ 70:131b0175ea99 r20-0b30
Import from CVS: tag r20-0b30
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:02:59 +0200 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/man/mule/quail.texi Mon Aug 13 09:02:59 2007 +0200 @@ -0,0 +1,261 @@ +\input texinfo @c -*-texinfo-*- +@setfilename ../info/quail +@settitle QUAIL -- Imputting methods of multilingual text + +@titlepage +@sp 6 +@center @titlefont{QUAIL -- Imputting methods of multilingual text} +@sp 4 +@center Version 2.0 +@sp 5 +@center Ken'ichi HANDA +@center handa@@etl.go.jp +@page + +@end titlepage + +@node Top, , , (mule) +@section QUAIL -- Imputting methods of multilingual text + +Quail is a simple key-translation system which allows users +to input any multilingual text from normal ASCII keyboard. + +We provide several quail-packages, each package corresponds +to one inputting methods. For instance, the file +lisp/quail/py.el provides a package for inputting Chinese by +PinYin. lisp/quail/hangul.el provides a package for +inputting Korean. + +@menu +* Usage of Quail:: +* Structure of Quail:: For quail package writers. +@end menu + +@node Usage of Quail, Structure of Quail, , Top +@section Usage of Quail + +You can load several packages at once but only the +translation rules defined in the current package are +effective. Quail-mode is toggled by C-]. When you enter in +quail-mode, the current package is shown at the left of modeline as: +@quotation +@code{[xxxxx]} +@end quotation +where xxxxx is the multilingual text for the current +package. In quail-mode, M-s changes the current package +(normal completion is performed by hitting <SPC> or <TAB>). + +In quail-mode, all graphic keys you type is translated +according to the rules of the current package. Brief +description about the rules and key-bindings are shown by +M-z. + +While there are more than one candidates for what you type, +the first candidate is shown in buffer with underscore. By +M-n and M-p you can select any other candidate. M-i shows +list of candidates (showing each candidate with index number +[two digits]). You can select one also by typing these +digits. + +Once you select a desired candidate, please just type a key +for another character. The underscore moves to the next key +automatically. But, in some packages (e.g. hangul), +there are rules something like: +@example + ab -> A + aba -> B + b -> C +@end example + +In this case, if you type "abab", quail will enter "AA". If +what you want is "BC", you must explicitly tell the division +point of the character by hitting <SPC>. In this example, +you should have typed "aba<SPC>b". + +Here's the summary of command keys: +@example +------------------------------------------------------------ +C-]: Exit from quail-mode. +DEL: Delete characters backward in quail-mode. +M-i: Show list of candidates. +M-n: Select next candidate. +M-p: Select previous candidate. +M-s: Select quail-package. +M-z: Show brief description of the current quail-pacakge. +------------------------------------------------------------ +@end example + +@node Structure of Quail, , Usage of Quail, Top +@section Structure of Quail + +#### NOT COMPLETED, NOT UPDATED #### + +This section is intended to help emacslisper who try to +debug or enhance 'quail' system. The original code quail.el +is located under the directory mule/lisp/quail.el. + +Quail serves as a front end processor for inputing +multilingual text from normal ASCII keyboard. By defining a +translation table which maps ASCII string to multilingual +string, you can input any text from ASCII keyboard. + +For the momemnt, translation table for Chinese inputing +distributed with X.V11R5/contrib/cxterm are supported in +mule/lisp/quail/XXXX.el files. You can use the system also +for inputing various Korean/European characters. + +Quail system registers translation table in keymap of Emacs, +thus table lookup is done just by calling function +@code{lookup-key}, and new registration is done just by calling +function 'define-key'. Keymap is represented as a +structured association list. For instance, a translation +table of the form ("a" -> "A" or "a", "ab" -> "AB", "c" -> +"C") is represented as follows: + +@example + (keymap . ((?a . (keymap . ((?\377 . '(0 "A" "a") + (?b . (keymap . ((?\377 . '(0 "AB"))))))))) + (?c . (keymap . ((?\377 . '(0 "C"))))))) +@end example + +As you see, the final string of translation is registered +under the tag of ?\377. Hence, the following program +creates the map above. + +@example + (setq m (make-sparce-keymap)) + (define-key m "a\377" '(0 "A" "a") t) + (define-key m "ab\377" '(0 "AB") t) + (define-key m "c\377" '(0 "C") t) +@end example + +Each '0' means that the first candidate in the list is +selected at first. In this case, according to your typing, +buffer contents changes as follows: + +@example + Type: a M-n b c a b + Buffer: A a AB ABc ABca ABcab + Uline: - - -- - - +@end example + +where Uline shows which characters are displayed with +underline. While underline is shown, we say that quail is +in 'translation state'. We assumed that M-n is bound to +@code{quail-next-candidate}. + +The last argument of @code{define-key} 't' means that meta +characters in the key-string are processed as is (not as ESC ++ char), which is a Mule specific facility. Since keymaps +can be nested, you can share one keymap (say m) with two +other keymaps (say m1 and m2) by: + +@example + (define-key m1 "x" m) + (define-key m2 "y" m) +@end example + +This means the translation ("xa" -> "A" or "a", "xab" -> +"AB", "xac" -> "C") in map m1 and ("ya" -> "A" or "a", "yab" +-> "AB", "yac" -> "C") in m2. + +We call a keymap which satisfies the description above as a +'quail-map' here after. Quail handles a quail-map with +additional information as a 'quail-package'. Each +quail-package holds the following information as a list: + +@enumerate +@item +name (string [ASCII only]): Name of the package. + +@item +prompt (string [any characters]): +A string shown in mode-line as a name of quail mode. + +@item +quail-map: A quail map described above. + +@item +showkey (alist): +An alist of character typed and corresponding string to be shown in echo +area. For instance, quail-package namede "ccdospy" has the following +showkey: + +@example + '((?a . "zh") (?f . "en") (?g ."eng") (?h . "ang") (?i . "ch") (?j . "an") + (?k . "ao") (?l . "ai") (?s . "ong") (?u . "sh") (?y . "ing") (?v . "yu")) +@end example + +This says that if you type 'a', "zh" is shown in echo area. +If 'f' is followed by 'a', "zhen" is shown. + +@item +document (string): A document shown by quail-help command. + +@item +mode-map (keymap): +A keymap to control quail mode. This defaults to +@code{quail-mode-default-map}. Prefix character is restricted to ESC only, +which means you can not define such key sequence as "\C-xi" in this map. +In addition, defining '!' through '~' are no use because those keys are +overridden by @code{quail-self-insert-command}. + +@item +nolearn (flag): +A flag to control learning facility of quail. If this flag is non-nil, +quail does not remeber the last selection of candidate string for the +later selection. + +@item +deterministic (flag): +A flag to specify that only one target string is defined in the +quail-map for each key sequence (i.e. no alternative candidates). If +this flag is non-nil, quail automatically exit from the translation +state when a target string for a key sequence is found. +@end enumerate + +All packages defined are in @code{quail-package-alist} (see +document of quail-define-package). + +Users are recommended not to modify quail-map directly but +to use quail-defrule function (see document of quail-defrule). + +You may find the example of defining quail package and +defining translation rule of the package in +lisp/quail/latin.el + +Quail system works as one of a minor mode so that it works +under any major modes. But, the way of handling non-quail +commands are very different from that of the other minor +modes. All keys typed are eaten by the system because, in +quail mode, keys except for invoking quail specific commands +are bound to 'quail-non-quail-command. The function, at +first, resets quail translation status (we'll explain it +below), then, checks the original binding of the key in +local map or global map and invokes the command bound to the +key. + +Quail keeps the current state of transformation with the +following variables: + +@itemize +@item @code{quail-overlay} + +Keep points of start and end of a string inserted by +the system. The string is one of below. + +@item @code{quail-current-key} + +A key string typed so far for the current translation. +When there's no translation for the key, this string +is inserted in a buffer temporally. + +@item @code{quail-current-str} + +A string translated from @code{quail-current-key}. In addition, +attribute region is set automatically around the sting inserted in a +buffer. +@end itemize + +@contents +@bye