;; vi-tcvn.mim -- Input method for Vietnames with TCVN6064 key sequence ;; Copyright (C) 2008 ;; National Institute of Advanced Industrial Science and Technology (AIST) ;; Registration Number H15PRO112 ;; This file is part of the m17n database; a sub-part of the m17n ;; library. ;; The m17n library is free software; you can redistribute it and/or ;; modify it under the terms of the GNU Lesser General Public License ;; as published by the Free Software Foundation; either version 2.1 of ;; the License, or (at your option) any later version. ;; The m17n library is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; Lesser General Public License for more details. ;; You should have received a copy of the GNU Lesser General Public ;; License along with the m17n library; if not, write to the Free ;; Software Foundation, Inc., 51 Franklin Street, Fifth Floor, ;; Boston, MA 02110-1301, USA. (input-method vi tcvn) (description (_"Vietnames input method using the TCVN6064 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 "Ắ(TCVN)") (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) (map (vowel-ext ("2" ("âấầẩẫậ")) ("@" ("ÂẤẦẨẪẬ")) ("1" ("ăắằẳẵặ")) ("!" ("ĂẮẰẲẴẶ")) ("3" ("êếềểễệ")) ("#" ("ÊẾỀỂỄỆ")) ("4" ("ôốồổỗộ")) ("$" ("ÔỐỒỔỖỘ")) ("]" ("ơớờởỡợ")) ("}" ("ƠỚỜỞỠỢ")) ("[" ("ưứừửữự")) ("{" ("ƯỨỪỬỮỰ"))) (consonant-ext ("0" ?đ) (")" ?Đ)) (tone-mark ("8" (set SELECT 1) ?1) ("5" (set SELECT 2) ?2) ("6" (set SELECT 3) ?3) ("7" (set SELECT 4) ?4) ("9" (set SELECT 5) ?5)) (misc ("=" ?₫) ("==" ?=) ((A-1) ?1) ((A-2) ?2) ((A-3) ?3) ((A-4) ?4) ((A-5) ?5) ((A-6) ?6) ((A-7) ?7) ((A-8) ?8) ((A-9) ?9) ((A-0) ?0) ((A--) ?-) ((A-=) ?=) ((A-\\) ?\\) ((A-\[) ?[) ((A-\]) ?]) ((A-!) ?!) ((A-@) ?@) ((A-\#) ?#) ((A-$) ?$) ((A-%) ?%) ((A-^) ?^) ((A-&) ?&) ((A-*) ?*) ((A-\() ?\() ((A-\)) ?\)) ((A-_) ?_) ((A-+) ?+) ((A-\|) ?\|) ((A-{) ?{) ((A-}) ?})) (temporary-escape ("22" "2") ("@@" "@") ("11" "1") ("!!" "!") ("33" "3") ("##" "##") ("44" "4") ("$$" "$") ("]]" "]") ("}}" "}") ("[[" "[") ("{{" "{") ("00" "0") ("))" ")"))) (state (init ;; 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. NST is 1 iff surrounding text is not supported. (t (set C @-1) (set V-1 0) (set V-2 0) (set V-3 0) (set C-AFTER-V 0) (set SELECT 0) (set NST (= @-0 -2))) (consonant (set C @-1) (cond (NST (shift after-c)))) (consonant-ext (set C @-1) (cond (NST (shift after-c)))) ;; 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)) (misc) (smart-quotes)) ;; The state shifted to when an initial consonants is typed and ;; surrounding text is not supported. (after-c (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))) ;; 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 ;; mode: lisp ;; End: