Fully re-written.
[m17n/m17n-db.git] / MIM / vi-viqr.mim
index 5d93bce..138a8f5 100644 (file)
 
 (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