From: handa Date: Fri, 8 Jun 2007 08:10:00 +0000 (+0000) Subject: Code simplified. Handle temporary escaping X-Git-Tag: REL-1-4-0~46 X-Git-Url: http://git.chise.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=602673008dd06879dbd0c98260b07251a0131d99;p=m17n%2Fm17n-db.git Code simplified. Handle temporary escaping to English mode. --- diff --git a/MIM/vi-telex.mim b/MIM/vi-telex.mim index a676c2c..69ab8cd 100644 --- a/MIM/vi-telex.mim +++ b/MIM/vi-telex.mim @@ -24,215 +24,192 @@ (input-method vi telex) (description "Vietnames input method using the TELEX key sequence. -") +Typing Backslash ('\\') toggles the normal mode and English mode. +The following variables are customizable: + tone-mark-on-last: control tone mark position in equivocal cases + backspace-is-undo: control the action of Backspace key (delete or undo)") (title "Ắ") (variable (tone-mark-on-last - "Flag to control tone mark position. + "Flag to control tone mark position in equivocal cases. If this variable is 0 (the default), put tone mark on the first vowel in such equivocal cases as \"oa\", \"oe\", \"uy\". Otherwise, put tone mark on the last vowel." + 0 0 1) + + (backspace-is-undo + "Flag to control the action of Backspace key (delete or undo). +If this variable is 0 (the default), Backspace key deletes the previous +character (e.g. \"q u a i s BS\" => \"quá\"). +If the value is 1, Backspace key undoes the previous key +\(e.g. \"q u a i s BS\" => \"quai\")." 0 0 1)) (macro (handle-mark (delete @-) - (cond (T - ;; We have already decided on which vowel to put a tone mark. - (move T)) - (V-3 + ;; At first, cancel the tone mark if already put. + (move T) (select 0) + (move M) + (cond (V-3 ;; Tripple-vowel - ;; Put a tone mark on the last vowel if it is e, ê, or ơ. + ;; Put a tone mark on the last vowel if it is ê, or ơ. ;; Otherwise put a tone mark on the second vowel. - (move M) - (cond ((| (= V-3 ?e) (= V-3 ?ê) (= V-3 ?ơ) - (= V-3 ?E) (= V-3 ?Ê) (= V-3 ?Ơ))) + (cond ((| (= V-1 ?ê) (= V-1 ?ơ) (= V-1 ?Ê) (= V-1 ?Ơ))) (1 (move @-)))) (V-2 ;; Double-vowel ;; Put a tone mark on the last vowel in the following cases: - ;; * The last vowel is â, ă, ê, ô, ơ, ư, or ư. + ;; * The last vowel is â, ă, ê, ô, ơ, ư, or ư (i.e. non-ASCII). ;; * The initial consonant and the first vowel is "gi" or "qu". - ;; * tone-mark-on-last is customized to 1 in a equivocal case. + ;; * tone-mark-on-last is customized to 1 in such equivocal + ;; cases as "oa", "oe", "oo", and "uy". ;; Otherwise put a tone mark on the first vowel. - (move M) - (cond ((| SPECIAL - (& (| (= C ?g) (= C ?G)) (| (= V-1 ?i) (= V-1 ?I))) - (& (| (= C ?q) (= C ?Q)) (| (= V-1 ?u) (= V-1 ?U))) + (cond ((| (> V-1 127) + (& (| (= C ?g) (= C ?G)) (| (= V-2 ?i) (= V-2 ?I))) + (& (| (= C ?q) (= C ?Q)) (| (= V-2 ?u) (= V-2 ?U))) (& (| tone-mark-on-last C-AFTER-V) - (| (& (| (= V-1 ?o) (= V-1 ?O)) - (| (= V-2 ?a) (= V-2 ?A) (= V-2 ?e) (= V-2 ?E))) - (& (| (= V-1 ?u) (= V-1 ?U)) - (| (= V-2 ?y) (= V-2 ?Y))))))) - (1 (move @-)))) - (V-1 - (move M))) + (| (& (| (= V-2 ?o) (= V-2 ?O)) + (| (= V-1 ?a) (= V-1 ?A) (= V-1 ?e) (= V-1 ?E) + (= V-1 ?o) (= V-1 ?O))) + (& (| (= V-2 ?u) (= V-2 ?U)) + (| (= V-1 ?y) (= V-1 ?Y))))))) + (1 (move @-))))) (select SELECT) (mark T) (move @>))) (map - (vowel1 ; sfrxj + (vowel ; sfrxj ("a" ("aáàảãạ")) ("A" ("AÁÀẢÃẠ")) ("e" ("eéèẻẽẹ")) ("E" ("EÉÈẺẼẸ")) ("i" ("iíìỉĩị")) ("I" ("IÍÌỈĨỊ")) ("o" ("oóòỏõọ")) ("O" ("OÓÒỎÕỌ")) ("u" ("uúùủũụ")) ("U" ("UÚÙỦŨỤ")) - ("y" ("yýỳỷỹỵ")) ("Y" ("YÝỲỶỸỴ"))) - - (vowel2 ; sfrxj -- put mark on them if they are the last vowel + ("y" ("yýỳỷỹỵ")) ("Y" ("YÝỲỶỸỴ")) ("aa" ("âấầẩẫậ")) ("AA" ("ÂẤẦẨẪẬ")) ("Aa" ("ÂẤẦẨẪẬ")) ("aw" ("ăắằẳẵặ")) ("AW" ("ĂẮẰẲẴẶ")) ("Aw" ("ĂẮẰẲẴẶ")) ("ee" ("êếềểễệ")) ("EE" ("ÊẾỀỂỄỆ")) ("Ee" ("ÊẾỀỂỄỆ")) ("oo" ("ôốồổỗộ")) ("OO" ("ÔỐỒỔỖỘ")) ("Oo" ("ÔỐỒỔỖỘ")) ("ow" ("ơớờởỡợ")) ("OW" ("ƠỚỜỞỠỢ")) ("Ow" ("ƠỚỜỞỠỢ")) ("uw" ("ưứừửữự")) ("UW" ("ƯỨỪỬỮỰ")) ("Uw" ("ƯỨỪỬỮỰ")) - ("w" ("ưứừửữự")) ("W" ("ƯỨỪỬỮỰ"))) - - (vowel3 - ("aaa" ("aáàảãạ") ("aáàảãạ")) - ("AAA" ("ÂẤẦẨẪẬ") ("ÂẤẦẨẪẬ")) ("Aaa" ("ÂẤẦẨẪẬ") ("âấầẩẫậ")) - ("eee" ("eéèẻẽẹ") ("eéèẻẽẹ")) - ("EEE" ("EÉÈẺẼẸ") ("EÉÈẺẼẸ")) ("Eee" ("EÉÈẺẼẸ") ("eéèẻẽẹ")) - ("ooo" ("oóòỏõọ") ("oóòỏõọ")) - ("OOO" ("OÓÒỎÕỌ") ("OÓÒỎÕỌ")) ("Ooo" ("OÓÒỎÕỌ") ("oóòỏõọ"))) - - (vowelw - ("aww" ("aáàảãạ") "w") ("AWW" ("AÁÀẢÃẠ") "W") ("Aww" ("AÁÀẢÃẠ") "w") - ("oww" ("oóòỏõọ") "w") ("OWW" ("OÓÒỎÕỌ") "W") ("Oww" ("OÓÒỎÕỌ") "w") - ("uww" ("uúùủũụ") "w") ("UWW" ("UÚÙỦŨỤ") "W") ("Uww" ("UÚÙỦŨỤ") "w")) + ("w" ("ưứừửữự")) ("W" ("ƯỨỪỬỮỰ")) + ("ooo" ("oóòỏõọ") ("oóòỏõọ") (set V-2 V-1) (set V-1 ?o)) + ("OOO" ("OÓÒỎÕỌ") ("OÓÒỎÕỌ") (set V-2 V-1) (set V-1 ?O)) + ("Ooo" ("OÓÒỎÕỌ") ("oóòỏõọ") (set V-2 V-1) (set V-1 ?O))) (tone-mark - ("z" (set SELECT 0) ?z (handle-mark)) ("Z" (set SELECT 0) ?Z (handle-mark)) - ("s" (set SELECT 1) ?s (handle-mark)) ("S" (set SELECT 1) ?S (handle-mark)) - ("f" (set SELECT 2) ?f (handle-mark)) ("F" (set SELECT 2) ?F (handle-mark)) - ("r" (set SELECT 3) ?r (handle-mark)) ("R" (set SELECT 3) ?R (handle-mark)) - ("x" (set SELECT 4) ?x (handle-mark)) ("X" (set SELECT 4) ?X (handle-mark)) - ("j" (set SELECT 5) ?j (handle-mark)) ("J" (set SELECT 5) ?J (handle-mark))) + ("z" (set SELECT 0) ?z) ("Z" (set SELECT 0) ?Z) + ("s" (set SELECT 1) ?s) ("S" (set SELECT 1) ?S) + ("f" (set SELECT 2) ?f) ("F" (set SELECT 2) ?F) + ("r" (set SELECT 3) ?r) ("R" (set SELECT 3) ?R) + ("x" (set SELECT 4) ?x) ("X" (set SELECT 4) ?X) + ("j" (set SELECT 5) ?j) ("J" (set SELECT 5) ?J)) (consonant-or-tone-mark ("z" ?z) ("s" ?s) ("f" ?f) ("r" ?r) ("x" ?x) ("j" ?j) ("Z" ?Z) ("S" ?S) ("F" ?F) ("R" ?R) ("X" ?X) ("J" ?J)) - (cancel-tone-mark - ("zz" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?z) - ("ss" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?s) - ("ff" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?f) - ("rr" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?r) - ("xx" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?x) - ("jj" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?j) - ("ZZ" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?Z) - ("SS" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?S) - ("FF" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?F) - ("RR" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?R) - ("XX" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?X) - ("JJ" (cond ((> V-1 0) (move M) (select 0) (move @>))) ?J)) - (consonant ("b" ?b) ("c" ?c) ("d" ?d) ("g" ?g) ("h" ?h) ("k" ?k) ("l" ?l) ("m" ?m) ("n" ?n) ("p" ?p) ("q" ?q) ("t" ?t) ("v" ?v) - ("dd" ?đ) ("ddd" "dd") ("ww" "w") + ("dd" ?đ) ("B" ?B) ("C" ?C) ("D" ?D) ("G" ?G) ("H" ?H) ("K" ?K) ("L" ?L) ("M" ?M) ("N" ?N) ("P" ?P) ("Q" ?Q) ("T" ?T) ("V" ?V) - ("DD" ?Đ) ("Dd" ?Đ) ("DDD" "DD") ("Ddd" "Dd") ("WW" "W") ("Ww" "W")) - - (escape + ("DD" ?Đ) ("Dd" ?Đ)) + + (temporary-escape + ("aaa" "aa") ("AAA" "AA") ("Aaa" "Aa") + ("eee" "ee") ("EEE" "EE") ("Eee" "Ee") + ("ddd" "dd") ("DDD" "DD") ("Ddd" "Dd") + ("ww" ?w) ("WW" ?W) ("Ww" ?W) + ("zz" ?z) ("ZZ" ?Z) ("Zz" ?Z) + ("ss" ?s) ("SS" ?S) ("Ss" ?S) + ("ff" ?f) ("FF" ?F) ("Ff" ?F) + ("rr" ?r) ("RR" ?R) ("Rr" ?R) + ("xx" ?x) ("XX" ?X) ("Xx" ?X) + ("jj" ?j) ("JJ" ?J) ("Jj" ?J)) + + (alphabet + ("a" ?a) ("b" ?b) ("c" ?c) ("d" ?d) ("e" ?e) ("f" ?f) ("g" ?g) + ("h" ?h) ("i" ?i) ("j" ?j) ("k" ?k) ("l" ?l) ("m" ?m) ("n" ?n) + ("o" ?o) ("p" ?p) ("q" ?q) ("r" ?r) ("s" ?s) ("t" ?t) ("u" ?u) + ("v" ?v) ("w" ?w) ("x" ?x) ("y" ?y) ("z" ?z)) + + (permanent-escape ("\\")) (backspace - ((BackSpace) (set KK (- K 1)) (undo KK)))) + ((BackSpace) (cond (backspace-is-undo (undo)))))) (state (init ;; Initialize variables. C is the initial consonant. V-N is the - ;; Nth vowel. C-AFTER-V is a flag set when a consonant is typed - ;; after vowel. T is a mark positioning after a tone-marked - ;; character. - (t (set C @-1) (set V-1 0) (set V-2 0) (set V-3 0) (set C-AFTER-V 0) - (set T 0) (cond (ESCAPE (shift escape)))) + ;; (N-1)th vowel from the last. C-AFTER-V is a number of consonants + ;; typed after vowel. + (t (set C @-1) (set V-1 0) (set V-2 0) (set V-3 0) (set C-AFTER-V 0)) - (consonant (set K @@) (set C @-1)) - (consonant-or-tone-mark (set K @@) (set C @-1)) + (consonant (set C @-1)) + (consonant-or-tone-mark (set C @-1)) ;; Mark M remembers the preedit position after the last vowel. - (vowel1 (set SPECIAL 0) (mark M) (set V-1 @-1) (set K @@) (shift after-v)) - (vowel2 (set SPECIAL 1) (mark M) (set V-1 @-1) (set K @@) (shift after-v)) - (vowel3 (set SPECIAL 0) (mark M) (set V-1 @-2) (set V-2 @-) - (set K @@) (shift after-vv)) - (vowelw (set SPECIAL 0) (move @-) (mark M) (move @>) (set V-1 @-2) - (set K @@) (shift after-vc)) - - (escape (shift escape))) + (vowel (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v)) + (temporary-escape (shift temporary-escape)) + (permanent-escape (shift escape-in-normal-mode))) - ;; The state shifted to when the first vowel is typed. + ;; The state shifted to when a vowel is typed. (after-v - (consonant (set K @@) (shift after-vc)) - (vowel1 (set SPECIAL 0) (mark M) (set V-2 @-1) (set K @@) (shift after-vv)) - (vowel2 (set SPECIAL 1) (mark M) (set V-2 @-1) (set K @@) (shift after-vv)) - (vowel3 (set SPECIAL 0) (mark M) (set V-1 V-2) (set V-2 @-2) (set V-3 @-1) - (set K @@) (shift after-vvv)) - (vowelw (set SPECIAL 0) (move @-) (mark M) (move @>) (set V-2 @-2) - (set K @@) (shift after-vc)) - - (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t)) - (backspace)) - - ;; The state shifted to when the second vowel is typed. - (after-vv - (consonant (set K @@) (shift after-vc)) - (vowel1 (set SPECIAL 0) (mark M) (set V-3 @-1) (set K @@) (shift after-vvv)) - (vowel2 (set SPECIAL 1) (mark M) (set V-3 @-1) (set K @@) (shift after-vvv)) - (vowel3 (set SPECIAL 0) (mark M) (set V-1 V-3) (set V-2 @-2) (set V-3 @-1) - (set K @@) (shift after-vvv)) - (vowelw (set SPECIAL 0) (move @-) (mark M) (move @>) (set V-3 @-2) - (set K @@) (shift after-vc)) - + (consonant (shift after-vc)) + (vowel (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1)) (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t)) - (backspace)) - - ;; The state shifted to when the third vowel is typed. - (after-vvv - (consonant (set K @@) (shift after-vc)) - (vowel1 (set SPECIAL 0) (mark M) (set V-1 V-2) (set V-2 V-3) (set V-3 @-1) - (set K @@)) - (vowel2 (set SPECIAL 0) (mark M) (set V-1 V-2) (set V-2 V-3) (set V-3 @-1) - (set K @@)) - (vowel3 (set SPECIAL 0) (mark M) (set V-1 V-3) (set V-2 @-2) (set V-3 @-1) - (set K @@)) - (vowelw (set SPECIAL 0) (move @-) (mark M) (move @>) - (set V-1 V-2) (set V-2 V-3) (set V-3 @-2) (shift after-vc) (set K @@)) - (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t)) - (backspace)) + (backspace (delete @-) + (cond (V-3 (set V-1 V-2) (set V-2 V-3) (set V-3 0)) + (V-2 (set V-1 V-2) (set V-2 0)) + (1 (shift init))))) - ;; The state shifted to when vowels and consonants are typed. + ;; The state shifted to when a consonant is typed after a vowel. (after-vc (t (set C-AFTER-V 1)) - (consonant (set K @@)) - (consonant-or-tone-mark (set K @@) (delete @-) (pushback 1) (shift after-t)) - (backspace)) + (consonant (add C-AFTER-V 1)) + (consonant-or-tone-mark (delete @-) (pushback 1) (shift after-t)) + (backspace (delete @-) + (sub C-AFTER-V 1) + (cond ((= C-AFTER-V 0) (shift after-v))))) ;; The state shifted to when a tone-mark is typed. (after-t - (tone-mark) - (cancel-tone-mark (cond (C-AFTER-V (shift after-vc)) - (V-3 (set C-AFTER-V 1) (shift after-vvv)) - (V-2 (set C-AFTER-V 1) (shift after-vv)) - (V-1 (set C-AFTER-V 1) (shift after-v)) - (1 (shift init)))) - (backspace) - (nil (shift init))) - - (escape - "E" - (t (set ESCAPE 0)) - (escape (cond ((= ESCAPE 0) (insert "\\") (shift init)) - ((= ESCAPE 1) (insert "\\") (commit) (set ESCAPE 2)) - (1 (set ESCAPE 1)))) + (t (set CURRENT-SELECT -1)) + (tone-mark (cond ((= CURRENT-SELECT SELECT) (move T) (select 0) (move @>) + (shift temporary-escape)) + (1 (handle-mark) (set CURRENT-SELECT SELECT)))) + (nil (cond (C-AFTER-V (shift after-vc)) + (1 (shift after-v))))) + + (temporary-escape + "en" + (t (commit)) + (alphabet (commit))) + + (escape-in-normal-mode + "EN" + (permanent-escape (insert "\\") (shift init)) + ;; Any other key force shifting to permanent-escape. + (nil (shift permanent-escape))) + + (permanent-escape + "EN" + (t (set ESCAPE 1)) + (permanent-escape (shift escape-in-permanent-escape)) ;; Unhandle any characters. - (nil (cond ((= ESCAPE 1) (set ESCAPE 0) (shift init)) - (1 (set ESCAPE 2) (unhandle)))) + (nil (unhandle))) + + (escape-in-permanent-escape + "Ắ" + (permanent-escape (insert "\\") (commit) (shift permanent-escape)) + ;; Any other key force shifting to init + )) ;; Local Variables: ;; coding: utf-8