(input-method vi viqr)
-(description "Vietnames input method using the VIQR key sequence.
-")
+(description (_"Vietnames input method using the VIQR 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 "Ắ(VIQR)")
+
+(variable
+ (tone-mark-on-last
+ (_"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))
+
+(include (t nil vi-base) macro)
+(include (t nil vi-base) map)
-(title "ắ")
(map
- (map
- ("a('" "ắ")
- ("a(`" "ằ")
- ("a(." "ặ")
- ("a^'" "ấ")
- ("a^`" "ầ")
- ("a^?" "ẩ")
- ("a^." "ậ")
- ("e~" "ẽ")
- ("e." "ẹ")
- ("e^'" "ế")
- ("e^`" "ề")
- ("e^?" "ể")
- ("e^~" "ễ")
- ("e^." "ệ")
- ("o^'" "ố")
- ("o^`" "ồ")
- ("o^?" "ổ")
- ("o^~" "ỗ")
- ("o^." "ộ")
- ("o+`" "ờ")
- ("o+?" "ở")
- ("i." "ị")
- ("o+" "ơ")
- ("o+'" "ớ")
- ("a(?" "ẳ")
- ("a(~" "ẵ")
- ("y`" "ỳ")
- ("u+'" "ứ")
- ("a." "ạ")
- ("y?" "ỷ")
- ("u+`" "ừ")
- ("u+?" "ử")
- ("y~" "ỹ")
- ("y." "ỵ")
- ("o+~" "ỡ")
- ("u+" "ư")
- ("a`" "à")
- ("a'" "á")
- ("a^" "â")
- ("a~" "ã")
- ("a?" "ả")
- ("a(" "ă")
- ("u+~" "ữ")
- ("a^~" "ẫ")
- ("e`" "è")
- ("e'" "é")
- ("e^" "ê")
- ("e?" "ẻ")
- ("i`" "ì")
- ("i'" "í")
- ("i~" "ĩ")
- ("i?" "ỉ")
- ("dd" "đ")
- ("u+." "ự")
- ("o`" "ò")
- ("o'" "ó")
- ("o^" "ô")
- ("o~" "õ")
- ("o?" "ỏ")
- ("o." "ọ")
- ("u." "ụ")
- ("u`" "ù")
- ("u'" "ú")
- ("u~" "ũ")
- ("u?" "ủ")
- ("y'" "ý")
- ("o+." "ợ")
- ("A('" "Ắ")
- ("A(`" "Ằ")
- ("A(." "Ặ")
- ("A^'" "Ấ")
- ("A^`" "Ầ")
- ("A^?" "Ẩ")
- ("A^." "Ậ")
- ("E~" "Ẽ")
- ("E." "Ẹ")
- ("E^'" "Ế")
- ("E^`" "Ề")
- ("E^?" "Ể")
- ("E^~" "Ễ")
- ("E^." "Ệ")
- ("O^'" "Ố")
- ("O^`" "Ồ")
- ("O^?" "Ổ")
- ("O^~" "Ỗ")
- ("O^." "Ộ")
- ("O+`" "Ờ")
- ("O+?" "Ở")
- ("I." "Ị")
- ("O+" "Ơ")
- ("O+'" "Ớ")
- ("A(?" "Ẳ")
- ("A(~" "Ẵ")
- ("Y`" "Ỳ")
- ("U+'" "Ứ")
- ("A." "Ạ")
- ("Y?" "Ỷ")
- ("U+`" "Ừ")
- ("U+?" "Ử")
- ("Y~" "Ỹ")
- ("Y." "Ỵ")
- ("O+~" "Ỡ")
- ("U+" "Ư")
- ("A`" "À")
- ("A'" "Á")
- ("A^" "Â")
- ("A~" "Ã")
- ("A?" "Ả")
- ("A(" "Ă")
- ("U+~" "Ữ")
- ("A^~" "Ẫ")
- ("E`" "È")
- ("E'" "É")
- ("E^" "Ê")
- ("E?" "Ẻ")
- ("I`" "Ì")
- ("I'" "Í")
- ("I~" "Ĩ")
- ("I?" "Ỉ")
- ("DD" "Đ")
- ("dD" "Đ")
- ("Dd" "Đ")
- ("U+." "Ự")
- ("O`" "Ò")
- ("O'" "Ó")
- ("O^" "Ô")
- ("O~" "Õ")
- ("O?" "Ỏ")
- ("O." "Ọ")
- ("U." "Ụ")
- ("U`" "Ù")
- ("U'" "Ú")
- ("U~" "Ũ")
- ("U?" "Ủ")
- ("Y'" "Ý")
- ("O+." "Ợ")
- ("\\(" "(")
- ("\\^" "^")
- ("\\+" "+")
- ("\\'" "'")
- ("\\`" "`")
- ("\\?" "?")
- ("\\~" "~")
- ("\\." ".")
- ("\\d" "d")
- ("\\\\" "\\")))
+ (vowel-ext
+ ("a^" ("âấầẩẫậ")) ("A^" ("ÂẤẦẨẪẬ"))
+ ("a(" ("ăắằẳẵặ")) ("A(" ("ĂẮẰẲẴẶ"))
+ ("e^" ("êếềểễệ")) ("E^" ("ÊẾỀỂỄỆ"))
+ ("o^" ("ôốồổỗộ")) ("O^" ("ÔỐỒỔỖỘ"))
+ ("o+" ("ơớờởỡợ")) ("O+" ("ƠỚỜỞỠỢ"))
+ ("u+" ("ưứừửữự")) ("U+" ("ƯỨỪỬỮỰ")))
+
+ (consonant-ext
+ ("dd" ?đ) ("DD" ?Đ) ("Dd" ?Đ))
+
+ (tone-mark
+ ("0" (set SELECT 0) ?0)
+ ("'" (set SELECT 1) ?1)
+ ("`" (set SELECT 2) ?2)
+ ("?" (set SELECT 3) ?3)
+ ("~" (set SELECT 4) ?4)
+ ("." (set SELECT 5) ?5))
+
+ (temporary-escape
+ ("a^^" "a^") ("A^^" "A^")
+ ("a((" "a(") ("A((" "A(")
+ ("e^^" "e^") ("E^^" "E^")
+ ("o^^" "o^") ("O^^" "O^")
+ ("o++" "o+") ("O++" "O+")
+ ("u++" "u+") ("U++" "U+")))
(state
(init
- (map)))
+ ;; Initialize variables. C is the initial consonant. V-N is the
+ ;; (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)
+ (set SELECT 0))
+
+ (consonant (set C @-1))
+ (consonant-ext (set C @-1))
+ ;; Mark M remembers the preedit position after the last vowel.
+ (vowel (mark M) (set V-2 V-1) (set V-1 @-1) (shift after-v))
+ (vowel-ext (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 a vowel is typed.
+ (after-v
+ (consonant (shift after-vc))
+ (consonant-ext (shift after-vc))
+ (vowel (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1)
+ (move T) (select 0) (handle-mark) (move M))
+ (vowel-ext (mark M) (set V-3 V-2) (set V-2 V-1) (set V-1 @-1)
+ (move T) (select 0) (handle-mark) (move M))
+ (tone-mark (delete @-) (pushback 1) (shift after-t))
+ (backspace (delete @-)
+ (cond (V-3 (set V-1 V-2) (set V-2 V-3) (set V-3 0)
+ (cond ((> TPLACE 2) (set SELECT 0))))
+ (V-2 (set V-1 V-2) (set V-2 0)
+ (cond ((> TPLACE 1) (set SELECT 0))))
+ (1 (shift init)))))
+
+ ;; The state shifted to when a consonant is typed after a vowel.
+ (after-vc
+ (t (set C-AFTER-V 1))
+ (consonant (add C-AFTER-V 1))
+ (consonant-ext (add C-AFTER-V 1))
+ (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
+ (t (set CURRENT-SELECT -1))
+ (tone-mark (cond ((= CURRENT-SELECT SELECT) (move T) (select 0) (move @>)
+ (shift temporary-escape))
+ (1 (delete @-) (handle-mark) (set CURRENT-SELECT SELECT))))
+ (nil (cond (C-AFTER-V (shift after-vc))
+ (1 (shift after-v)))))
+
+ (temporary-escape
+ "en"
+ (t (commit))
+ (alnum (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 (unhandle)))
+
+ (escape-in-permanent-escape
+ "Ắ"
+ (permanent-escape (insert "\\") (commit) (shift permanent-escape))
+ ;; Any other key force shifting to init
+ ))
;; Local Variables:
;; coding: utf-8