(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