Code simplified. Handle temporary escaping
authorhanda <handa>
Fri, 8 Jun 2007 08:10:00 +0000 (08:10 +0000)
committerhanda <handa>
Fri, 8 Jun 2007 08:10:00 +0000 (08:10 +0000)
to English mode.

MIM/vi-telex.mim

index a676c2c..69ab8cd 100644 (file)
 (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