]> code.delx.au - gnu-emacs/blobdiff - lisp/international/characters.el
(case table): Do nothing special for i and I.
[gnu-emacs] / lisp / international / characters.el
index 8ce6e4b5638339aa0a83819371cbd7b3076babee..3522b57d5d9bd2947a540a2d2cdfa4dc3eec7df2 100644 (file)
@@ -1,7 +1,10 @@
 ;;; characters.el --- set syntax and category for multibyte characters
 
-;; Copyright (C) 1995 Free Software Foundation, Inc.
-;; Copyright (C) 1995 Electrotechnical Laboratory, JAPAN.
+;; Copyright (C) 1997, 2000, 2001, 2002, 2003, 2004
+;;   Free Software Foundation, Inc.
+;; Copyright (C) 1995, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005
+;;   National Institute of Advanced Industrial Science and Technology (AIST)
+;;   Registration Number H14PRO021
 
 ;; Keywords: multibyte character, character set, syntax, category
 
 ;; GNU General Public License for more details.
 
 ;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING.  If not, write to
-;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+;; along with GNU Emacs; see the file COPYING.  If not, write to the
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 ;; This file contains multibyte characters.  Save this file always in
-;; `coding-system-iso-2022-7'.
+;; the coding system `iso-2022-7bit'.
+
+;; This file does not define the syntax for Latin-N character sets;
+;; those are defined by the files latin-N.el.
+
+;;; Code:
+
+;; We must set utf-translate-cjk-mode to nil while loading this file
+;; to avoid translating CJK characters in decode-char.
+(defvar saved-utf-translate-cjk-mode utf-translate-cjk-mode)
+(setq utf-translate-cjk-mode nil)
 
 ;;; Predefined categories.
 
 (define-category ?e "Ethiopic (Ge'ez)")
 (define-category ?v "Vietnamese")
 (define-category ?i "Indian")
+(define-category ?o "Lao")
+(define-category ?q "Tibetan")
 
 ;; For each group (row) of 2-byte character sets.
 
-(define-category ?A "Alpha numeric characters of 2-byte character sets")
+(define-category ?A "Alpha-numeric characters of 2-byte character sets")
 (define-category ?C "Chinese (Han) characters of 2-byte character sets")
-(define-category ?G "Greek characters of 2-byte characters sets")
+(define-category ?G "Greek characters of 2-byte character sets")
 (define-category ?H "Japanese Hiragana characters of 2-byte character sets")
 (define-category ?K "Japanese Katakana characters of 2-byte character sets")
 (define-category ?N "Korean Hangul characters of 2-byte character sets")
-(define-category ?Y "Cyrillic character of 2-byte character sets")
+(define-category ?Y "Cyrillic characters of 2-byte character sets")
 (define-category ?I "Indian Glyphs")
 
 ;; For phonetic classifications.
 
 (define-category ?0 "consonant")
-(define-category ?1 "base vowel")
+(define-category ?1 "base (independent) vowel")
 (define-category ?2 "upper diacritical mark (including upper vowel)")
 (define-category ?3 "lower diacritical mark (including lower vowel)")
 (define-category ?4 "tone mark")
-(define-category ?5 "vowel")
+(define-category ?5 "symbol")
 (define-category ?6 "digit")
 (define-category ?7 "vowel-modifying diacritical mark")
-(define-category ?8 "vowel-signs.")
+(define-category ?8 "vowel-signs")
+(define-category ?9 "semivowel lower")
 
 ;; For filling.
 (define-category ?| "While filling, we can break a line at this character.")
 
-;; Keep the followings for `kinsoku' processing.  See comments in
+;; For indentation calculation.
+(define-category ?\s
+  "This character counts as a space for indentation purposes.")
+
+;; Keep the following for `kinsoku' processing.  See comments in
 ;; kinsoku.el.
 (define-category ?> "A character which can't be placed at beginning of line.")
 (define-category ?< "A character which can't be placed at end of line.")
 
+;; Combining
+(define-category ?^ "Combining diacritic or mark")
 \f
 ;;; Setting syntax and category.
 
                  arabic-1-column
                  arabic-2-column)))
   (while charsets
-    (modify-syntax-entry (make-char (car charsets)) "w")
+;;     (modify-syntax-entry (make-char (car charsets)) "w")
     (modify-category-entry (make-char (car charsets)) ?b)
     (setq charsets (cdr charsets))))
+(let ((ch #x600))
+  (while (<= ch #x6ff)
+    (modify-category-entry (decode-char 'ucs ch) ?b)
+    (setq ch (1+ ch)))
+  (setq ch #xfb50)
+  (while (<= ch #xfdff)
+    (modify-category-entry (decode-char 'ucs ch) ?b)
+    (setq ch (1+ ch)))
+  (setq ch #xfe70)
+  (while (<= ch #xfefe)
+    (modify-category-entry (decode-char 'ucs ch) ?b)
+    (setq ch (1+ ch))))
 
 ;; Chinese character set (GB2312)
 
-(modify-syntax-entry (make-char 'chinese-gb2312) "w")
+;; (modify-syntax-entry (make-char 'chinese-gb2312) "w")
 (modify-syntax-entry (make-char 'chinese-gb2312 33) "_")
 (modify-syntax-entry (make-char 'chinese-gb2312 34) "_")
 (modify-syntax-entry (make-char 'chinese-gb2312 41) "_")
 (modify-syntax-entry ?\\e$A!:\e(B "(\e$A!;\e(B")
 (modify-syntax-entry ?\\e$A!<\e(B "(\e$A!=\e(B")
 (modify-syntax-entry ?\\e$A!>\e(B "(\e$A!?\e(B")
+(modify-syntax-entry ?\\e$A#(\e(B "(\e$A#)\e(B")
+(modify-syntax-entry ?\\e$A#{\e(B "(\e$A#}\e(B")
+(modify-syntax-entry ?\\e$A#[\e(B "(\e$A#]\e(B")
 (modify-syntax-entry ?\\e$A!3\e(B ")\e$A!2\e(B")
 (modify-syntax-entry ?\\e$A!5\e(B ")\e$A!4\e(B")
 (modify-syntax-entry ?\\e$A!7\e(B ")\e$A!6\e(B")
 (modify-syntax-entry ?\\e$A!;\e(B ")\e$A!:\e(B")
 (modify-syntax-entry ?\\e$A!=\e(B ")\e$A!<\e(B")
 (modify-syntax-entry ?\\e$A!?\e(B ")\e$A!>\e(B")
+(modify-syntax-entry ?\\e$A#)\e(B ")\e$A#(\e(B")
+(modify-syntax-entry ?\\e$A#}\e(B ")\e$A#{\e(B")
+(modify-syntax-entry ?\\e$A#]\e(B ")\e$A#[\e(B")
+
+(let ((chars "\e$A#,!"!##.!$#;#:#?#!!C!-!'#|#_!.!/!0!1#"!e#`!d\e(B"))
+  (dotimes (i (length chars))
+    (modify-syntax-entry (aref chars i) ".")))
 
 (modify-category-entry (make-char 'chinese-gb2312) ?c)
 (modify-category-entry (make-char 'chinese-gb2312) ?\|)
 (modify-category-entry (make-char 'chinese-gb2312 37) ?K)
 (modify-category-entry (make-char 'chinese-gb2312 38) ?G)
 (modify-category-entry (make-char 'chinese-gb2312 39) ?Y)
-(modify-category-entry (make-char 'chinese-gb2312 35) ?A)
 (let ((row 48))
   (while (< row 127)
     (modify-category-entry (make-char 'chinese-gb2312 row) ?C)
     (setq row (1+ row))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x23 (+ #x41 i))
+                         (make-char 'chinese-gb2312 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x26 (+ #x21 i))
+                         (make-char 'chinese-gb2312 #x26 (+ #x41 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'chinese-gb2312 #x27 (+ #x21 i))
+                         (make-char 'chinese-gb2312 #x27 (+ #x51 i)) tbl)))
+
 ;; Chinese character set (BIG5)
 
+(let ((from (decode-big5-char #xA141))
+      (to (decode-big5-char #xA15D)))
+  (while (< from to)
+    (modify-syntax-entry from ".")
+    (setq from (1+ from))))
+(let ((from (decode-big5-char #xA1A5))
+      (to (decode-big5-char #xA1AD)))
+  (while (< from to)
+    (modify-syntax-entry from ".")
+    (setq from (1+ from))))
+(let ((from (decode-big5-char #xA1AD))
+      (to (decode-big5-char #xA2AF)))
+  (while (< from to)
+    (modify-syntax-entry from "_")
+    (setq from (1+ from))))
+
+(let ((parens "\e$(0!>!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c\e(B")
+      open close)
+  (dotimes (i (/ (length parens) 2))
+    (setq open (aref parens (* i 2))
+         close (aref parens (1+ (* i 2))))
+    (modify-syntax-entry open (format "(%c" close))
+    (modify-syntax-entry close (format ")%c" open))))
+
 (let ((generic-big5-1-char (make-char 'chinese-big5-1))
       (generic-big5-2-char (make-char 'chinese-big5-2)))
-  (modify-syntax-entry generic-big5-1-char "w")
-  (modify-syntax-entry generic-big5-2-char "w")
+;;   (modify-syntax-entry generic-big5-1-char "w")
+;;   (modify-syntax-entry generic-big5-2-char "w")
 
   (modify-category-entry generic-big5-1-char ?c)
   (modify-category-entry generic-big5-2-char ?c)
   (modify-category-entry generic-big5-1-char ?\|)
   (modify-category-entry generic-big5-2-char ?\|))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 22)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2CF i))
+                         (decode-big5-char (+ #xA2CF i 26)) tbl))
+  (dotimes (i 4)
+    (set-case-syntax-pair (decode-big5-char (+ #xA2E4 i))
+                         (decode-big5-char (+ #xA340 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (decode-big5-char (+ #xA344 i))
+                         (decode-big5-char (+ #xA344 i 24)) tbl)))
+
 
 ;; Chinese character set (CNS11643)
 
       generic-char)
   (while cns-list
     (setq generic-char (make-char (car cns-list)))
-    (modify-syntax-entry generic-char "w")
+;;     (modify-syntax-entry generic-char "w")
     (modify-category-entry generic-char ?c)
     (modify-category-entry generic-char ?C)
     (modify-category-entry generic-char ?|)
     (setq cns-list (cdr cns-list))))
 
+(let ((parens "\e$(G!>!?!@!A!B!C!D!E!F!G!H!I!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![!\!]!^!_!`!a!b!c\e(B")
+      open close)
+  (dotimes (i (/ (length parens) 2))
+    (setq open (aref parens (* i 2))
+         close (aref parens (1+ (* i 2))))
+    (modify-syntax-entry open (format "(%c" close))
+    (modify-syntax-entry close (format ")%c" open))))
+
 ;; Cyrillic character set (ISO-8859-5)
 
 (modify-category-entry (make-char 'cyrillic-iso8859-5) ?y)
 
-(let ((c 160))
-  (while (< c 256)
-    (modify-syntax-entry (make-char 'cyrillic-iso8859-5 c) "w")
-    (setq c (1+ c))))
+(modify-syntax-entry (make-char 'cyrillic-iso8859-5 160) " ")
 (modify-syntax-entry ?\e,L-\e(B ".")
 (modify-syntax-entry ?\e,Lp\e(B ".")
 (modify-syntax-entry ?\e,L}\e(B ".")
+(let ((tbl (standard-case-table)))
+  (set-case-syntax-pair ?\e,L!\e(B ?\e,Lq\e(B tbl)
+  (set-case-syntax-pair ?\e,L"\e(B ?\e,Lr\e(B tbl)
+  (set-case-syntax-pair ?\e,L#\e(B ?\e,Ls\e(B tbl)
+  (set-case-syntax-pair ?\e,L$\e(B ?\e,Lt\e(B tbl)
+  (set-case-syntax-pair ?\e,L%\e(B ?\e,Lu\e(B tbl)
+  (set-case-syntax-pair ?\e,L&\e(B ?\e,Lv\e(B tbl)
+  (set-case-syntax-pair ?\e,L'\e(B ?\e,Lw\e(B tbl)
+  (set-case-syntax-pair ?\e,L(\e(B ?\e,Lx\e(B tbl)
+  (set-case-syntax-pair ?\e,L)\e(B ?\e,Ly\e(B tbl)
+  (set-case-syntax-pair ?\e,L*\e(B ?\e,Lz\e(B tbl)
+  (set-case-syntax-pair ?\e,L+\e(B ?\e,L{\e(B tbl)
+  (set-case-syntax-pair ?\e,L,\e(B ?\e,L|\e(B tbl)
+  (set-case-syntax-pair ?\e,L.\e(B ?\e,L~\e(B tbl)
+  (set-case-syntax-pair ?\e,L/\e(B ?\e,L\7f\e(B tbl)
+  (set-case-syntax-pair ?\e,L0\e(B ?\e,LP\e(B tbl)
+  (set-case-syntax-pair ?\e,L1\e(B ?\e,LQ\e(B tbl)
+  (set-case-syntax-pair ?\e,L2\e(B ?\e,LR\e(B tbl)
+  (set-case-syntax-pair ?\e,L3\e(B ?\e,LS\e(B tbl)
+  (set-case-syntax-pair ?\e,L4\e(B ?\e,LT\e(B tbl)
+  (set-case-syntax-pair ?\e,L5\e(B ?\e,LU\e(B tbl)
+  (set-case-syntax-pair ?\e,L6\e(B ?\e,LV\e(B tbl)
+  (set-case-syntax-pair ?\e,L7\e(B ?\e,LW\e(B tbl)
+  (set-case-syntax-pair ?\e,L8\e(B ?\e,LX\e(B tbl)
+  (set-case-syntax-pair ?\e,L9\e(B ?\e,LY\e(B tbl)
+  (set-case-syntax-pair ?\e,L:\e(B ?\e,LZ\e(B tbl)
+  (set-case-syntax-pair ?\e,L;\e(B ?\e,L[\e(B tbl)
+  (set-case-syntax-pair ?\e,L<\e(B ?\e,L\\e(B tbl)
+  (set-case-syntax-pair ?\e,L=\e(B ?\e,L]\e(B tbl)
+  (set-case-syntax-pair ?\e,L>\e(B ?\e,L^\e(B tbl)
+  (set-case-syntax-pair ?\e,L?\e(B ?\e,L_\e(B tbl)
+  (set-case-syntax-pair ?\e,L@\e(B ?\e,L`\e(B tbl)
+  (set-case-syntax-pair ?\e,LA\e(B ?\e,La\e(B tbl)
+  (set-case-syntax-pair ?\e,LB\e(B ?\e,Lb\e(B tbl)
+  (set-case-syntax-pair ?\e,LC\e(B ?\e,Lc\e(B tbl)
+  (set-case-syntax-pair ?\e,LD\e(B ?\e,Ld\e(B tbl)
+  (set-case-syntax-pair ?\e,LE\e(B ?\e,Le\e(B tbl)
+  (set-case-syntax-pair ?\e,LF\e(B ?\e,Lf\e(B tbl)
+  (set-case-syntax-pair ?\e,LG\e(B ?\e,Lg\e(B tbl)
+  (set-case-syntax-pair ?\e,LH\e(B ?\e,Lh\e(B tbl)
+  (set-case-syntax-pair ?\e,LI\e(B ?\e,Li\e(B tbl)
+  (set-case-syntax-pair ?\e,LJ\e(B ?\e,Lj\e(B tbl)
+  (set-case-syntax-pair ?\e,LK\e(B ?\e,Lk\e(B tbl)
+  (set-case-syntax-pair ?\e,LL\e(B ?\e,Ll\e(B tbl)
+  (set-case-syntax-pair ?\e,LM\e(B ?\e,Lm\e(B tbl)
+  (set-case-syntax-pair ?\e,LN\e(B ?\e,Ln\e(B tbl)
+  (set-case-syntax-pair ?\e,LO\e(B ?\e,Lo\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(!\e(B ?\e$,1(q\e(B tbl)
+  (set-case-syntax-pair ?\e$,1("\e(B ?\e$,1(r\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(#\e(B ?\e$,1(s\e(B tbl)
+  (set-case-syntax-pair ?\e$,1($\e(B ?\e$,1(t\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(%\e(B ?\e$,1(u\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(&\e(B ?\e$,1(v\e(B tbl)
+  (set-case-syntax-pair ?\e$,1('\e(B ?\e$,1(w\e(B tbl)
+  (set-case-syntax-pair ?\e$,1((\e(B ?\e$,1(x\e(B tbl)
+  (set-case-syntax-pair ?\e$,1()\e(B ?\e$,1(y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(*\e(B ?\e$,1(z\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(+\e(B ?\e$,1({\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(,\e(B ?\e$,1(|\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(.\e(B ?\e$,1(~\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(/\e(B ?\e$,1(\7f\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(0\e(B ?\e$,1(P\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(1\e(B ?\e$,1(Q\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(2\e(B ?\e$,1(R\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(3\e(B ?\e$,1(S\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(4\e(B ?\e$,1(T\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(5\e(B ?\e$,1(U\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(6\e(B ?\e$,1(V\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(7\e(B ?\e$,1(W\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(8\e(B ?\e$,1(X\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(9\e(B ?\e$,1(Y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(:\e(B ?\e$,1(Z\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(;\e(B ?\e$,1([\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(<\e(B ?\e$,1(\\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(=\e(B ?\e$,1(]\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(>\e(B ?\e$,1(^\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(?\e(B ?\e$,1(_\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(@\e(B ?\e$,1(`\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(A\e(B ?\e$,1(a\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(B\e(B ?\e$,1(b\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(C\e(B ?\e$,1(c\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(D\e(B ?\e$,1(d\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(E\e(B ?\e$,1(e\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(F\e(B ?\e$,1(f\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(G\e(B ?\e$,1(g\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(H\e(B ?\e$,1(h\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(I\e(B ?\e$,1(i\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(J\e(B ?\e$,1(j\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(K\e(B ?\e$,1(k\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(L\e(B ?\e$,1(l\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(M\e(B ?\e$,1(m\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(N\e(B ?\e$,1(n\e(B tbl)
+  (set-case-syntax-pair ?\e$,1(O\e(B ?\e$,1(o\e(B tbl))
+
+;; Devanagari character set
+
+;;; Commented out since the categories appear not to be used anywhere
+;;; and word syntax is the default.
+;; (let ((deflist      '(;; chars      syntax  category
+;;               ("\e$(5!!!"!#\e(B"      "w"     ?7) ; vowel-modifying diacritical mark
+;;                                         ; chandrabindu, anuswar, visarga
+;;               ("\e$(5!$\e(B-\e$(5!2\e(B"        "w"     ?1) ; independent vowel
+;;               ("\e$(5!3\e(B-\e$(5!X\e(B"        "w"     ?0) ; consonant
+;;               ("\e$(5!Z\e(B-\e$(5!g\e(B"        "w"     ?8) ; matra
+;;               ("\e$(5!q\e(B-\e$(5!z\e(B"        "w"     ?6) ; digit
+;;               ;; Unicode equivalents
+;;               ("\e$,15A5B5C\e(B"      "w"     ?7) ; vowel-modifying diacritical mark
+;;                                         ; chandrabindu, anuswar, visarga
+;;               ("\e$,15E\e(B-\e$,15M\e(B"        "w"     ?1) ; independent vowel
+;;               ("\e$,15U\e(B-\e$,15y\e(B"        "w"     ?0) ; consonant
+;;               ("\e$,15~\e(B-\e$,16)\e(B"        "w"     ?8) ; matra
+;;               ("\e$,16F\e(B-\e$,16O\e(B"        "w"     ?6) ; digit
+;;               ))
+;;       elm chars len syntax category to ch i)
+;;   (while deflist
+;;     (setq elm (car deflist))
+;;     (setq chars (car elm)
+;;       len (length chars)
+;;       syntax (nth 1 elm)
+;;       category (nth 2 elm)
+;;       i 0)
+;;     (while (< i len)
+;;       (if (= (aref chars i) ?-)
+;;       (setq i (1+ i)
+;;             to (aref chars i))
+;;     (setq ch (aref chars i)
+;;           to ch))
+;;       (while (<= ch to)
+;;     (modify-syntax-entry ch syntax)
+;;     (modify-category-entry ch category)
+;;     (setq ch (1+ ch)))
+;;       (setq i (1+ i)))
+;;     (setq deflist (cdr deflist))))
 
 ;; Ethiopic character set
 
 (modify-category-entry (make-char 'ethiopic) ?e)
-
-;; European character set (Latin-1,2,3,4,5)
-
-(modify-category-entry (make-char 'latin-iso8859-1) ?l)
-(modify-category-entry (make-char 'latin-iso8859-2) ?l)
-(modify-category-entry (make-char 'latin-iso8859-3) ?l)
-(modify-category-entry (make-char 'latin-iso8859-4) ?l)
-(modify-category-entry (make-char 'latin-iso8859-9) ?l)
-
-;; ISO-8859-1 (Latin-1)
-(let ((c 64))
-  (while (< c 128)                     ; from '\e,A@\e(B' to '\e,A\7f\e(B'
-    (modify-syntax-entry (make-char 'latin-iso8859-1 c) "w")
-    (setq c (1+ c)))
-  (modify-syntax-entry (make-char 'latin-iso8859-1 32) "w") ; NBSP
-  (modify-syntax-entry ?\e,AW\e(B "_")
-  (modify-syntax-entry ?\e,Aw\e(B "_")
-  )
-
-;; ISO-8859-2 (Latin-2)
-(let ((c 190))
-  (while (< c 255)
-    (modify-syntax-entry (make-char 'latin-iso8859-2 c) "w")
-    (setq c (1+ c))))
-(let ((chars '(?\e,B!\e(B ?\e,B#\e(B ?\e,B%\e(B ?\e,B&\e(B ?\e,B)\e(B ?\e,B*\e(B ?\e,B+\e(B ?\e,B,\e(B ?\e,B.\e(B ?\e,B/\e(B ?\e,B1\e(B ?\e,B3\e(B ?\e,B5\e(B ?\e,B6\e(B ?\e,B9\e(B ?\e,B:\e(B ?\e,B;\e(B ?\e,B<\e(B)))
+;; (modify-syntax-entry (make-char 'ethiopic) "w")
+(dotimes (i (1+ (- #x137c #x1200)))
+  (modify-category-entry (decode-char 'ucs (+ #x1200 i)) ?e))
+(let ((chars '(?\e$(3$h\e(B ?\e$(3$i\e(B ?\e$(3$j\e(B ?\e$(3$k\e(B ?\e$(3$l\e(B ?\e$(3$m\e(B ?\e$(3$n\e(B ?\e$(3$o\e(B ?\e$(3%i\e(B ?\e$(3%t\e(B ?\e$(3%u\e(B ?\e$(3%v\e(B ?\e$(3%w\e(B ?\e$(3%x\e(B
+              ;; Unicode equivalents of the above:
+              ?\e$,1Q!\e(B ?\e$,1Q"\e(B ?\e$,1Q#\e(B ?\e$,1Q$\e(B ?\e$,1Q%\e(B ?\e$,1Q&\e(B ?\e$,1Q'\e(B ?\e$,1Q(\e(B ?\e$,3op\e(B ?\e$,3o{\e(B ?\e$,3o|\e(B ?\e$,3o}\e(B ?\e$,3o~\e(B ?\e$,3o\7f\e(B)))
   (while chars
-    (modify-syntax-entry (car chars) "w")
+    (modify-syntax-entry (car chars) ".")
     (setq chars (cdr chars))))
-(modify-syntax-entry (make-char 'latin-iso8859-2 160) "w") ; NBSP
-(modify-syntax-entry ?\e,BW\e(B ".")
-(modify-syntax-entry ?\e,Bw\e(B ".")
 
 ;; Greek character set (ISO-8859-7)
 
 (modify-category-entry (make-char 'greek-iso8859-7) ?g)
-
-(let ((c 182))
-  (while (< c 255)
-    (modify-syntax-entry (make-char 'greek-iso8859-7 c) "w")
+(let ((c #x370))
+  (while (<= c #x3ff)
+    (modify-category-entry (decode-char 'ucs c) ?g)
     (setq c (1+ c))))
-(modify-syntax-entry (make-char 'greek-iso8859-7 160) "w") ; NBSP
+
+;; (let ((c 182))
+;;   (while (< c 255)
+;;     (modify-syntax-entry (make-char 'greek-iso8859-7 c) "w")
+;;     (setq c (1+ c))))
+;; (modify-syntax-entry (make-char 'greek-iso8859-7 160) "w") ; NBSP
 (modify-syntax-entry ?\e,F7\e(B ".")
 (modify-syntax-entry ?\e,F;\e(B ".")
 (modify-syntax-entry ?\e,F=\e(B ".")
+(let ((tbl (standard-case-table)))
+  ;; Fixme: non-letter syntax copied from latin-1, but that's dubious
+  ;; in several cases.
+  (set-case-syntax ?\e,F!\e(B "." tbl)
+  (set-case-syntax ?\e,F"\e(B "." tbl)
+  (set-case-syntax ?\e,F&\e(B "." tbl)
+  (set-case-syntax ?\e,F&\e(B "_" tbl)
+  (set-case-syntax ?\e,F'\e(B "." tbl)
+  (set-case-syntax ?\e,F)\e(B "_" tbl)
+  (set-case-syntax ?\e,F+\e(B "." tbl)
+  (set-case-syntax ?\e,F,\e(B "_" tbl)
+  (set-case-syntax ?\e,F-\e(B "_" tbl)
+  (set-case-syntax ?\e,F/\e(B "." tbl)
+  (set-case-syntax ?\e,F0\e(B "_" tbl)
+  (set-case-syntax ?\e,F1\e(B "_" tbl)
+;;  (set-case-syntax ?\e,F7\e(B "_" tbl)
+;;  (set-case-syntax ?\e,F=\e(B "_" tbl)
+  (set-case-syntax-pair ?\e,FA\e(B ?\e,Fa\e(B tbl)
+  (set-case-syntax-pair ?\e,FB\e(B ?\e,Fb\e(B tbl)
+  (set-case-syntax-pair ?\e,FC\e(B ?\e,Fc\e(B tbl)
+  (set-case-syntax-pair ?\e,FD\e(B ?\e,Fd\e(B tbl)
+  (set-case-syntax-pair ?\e,FE\e(B ?\e,Fe\e(B tbl)
+  (set-case-syntax-pair ?\e,FF\e(B ?\e,Ff\e(B tbl)
+  (set-case-syntax-pair ?\e,FG\e(B ?\e,Fg\e(B tbl)
+  (set-case-syntax-pair ?\e,FH\e(B ?\e,Fh\e(B tbl)
+  (set-case-syntax-pair ?\e,FI\e(B ?\e,Fi\e(B tbl)
+  (set-case-syntax-pair ?\e,FJ\e(B ?\e,Fj\e(B tbl)
+  (set-case-syntax-pair ?\e,FK\e(B ?\e,Fk\e(B tbl)
+  (set-case-syntax-pair ?\e,FL\e(B ?\e,Fl\e(B tbl)
+  (set-case-syntax-pair ?\e,FM\e(B ?\e,Fm\e(B tbl)
+  (set-case-syntax-pair ?\e,FN\e(B ?\e,Fn\e(B tbl)
+  (set-case-syntax-pair ?\e,FO\e(B ?\e,Fo\e(B tbl)
+  (set-case-syntax-pair ?\e,FP\e(B ?\e,Fp\e(B tbl)
+  (set-case-syntax-pair ?\e,FQ\e(B ?\e,Fq\e(B tbl)
+  (set-upcase-syntax    ?\e,FS\e(B ?\e,Fr\e(B tbl)
+  (set-case-syntax-pair ?\e,FS\e(B ?\e,Fs\e(B tbl)
+  (set-case-syntax-pair ?\e,FT\e(B ?\e,Ft\e(B tbl)
+  (set-case-syntax-pair ?\e,FU\e(B ?\e,Fu\e(B tbl)
+  (set-case-syntax-pair ?\e,FV\e(B ?\e,Fv\e(B tbl)
+  (set-case-syntax-pair ?\e,FW\e(B ?\e,Fw\e(B tbl)
+  (set-case-syntax-pair ?\e,FX\e(B ?\e,Fx\e(B tbl)
+  (set-case-syntax-pair ?\e,FY\e(B ?\e,Fy\e(B tbl)
+  (set-case-syntax-pair ?\e,FZ\e(B ?\e,Fz\e(B tbl)
+  (set-case-syntax-pair ?\e,F[\e(B ?\e,F{\e(B tbl)
+  (set-case-syntax-pair ?\e,F?\e(B ?\e,F~\e(B tbl)
+  (set-case-syntax-pair ?\e,F>\e(B ?\e,F}\e(B tbl)
+  (set-case-syntax-pair ?\e,F<\e(B ?\e,F|\e(B tbl)
+  (set-case-syntax-pair ?\e,F6\e(B ?\e,F\\e(B tbl)
+  (set-case-syntax-pair ?\e,F8\e(B ?\e,F]\e(B tbl)
+  (set-case-syntax-pair ?\e,F9\e(B ?\e,F^\e(B tbl)
+  (set-case-syntax-pair ?\e,F:\e(B ?\e,F_\e(B tbl)
+  ;; Unicode equivalents
+  (set-case-syntax-pair ?\e$,1&q\e(B ?\e$,1'1\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&r\e(B ?\e$,1'2\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&s\e(B ?\e$,1'3\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&t\e(B ?\e$,1'4\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&u\e(B ?\e$,1'5\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&v\e(B ?\e$,1'6\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&w\e(B ?\e$,1'7\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&x\e(B ?\e$,1'8\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&y\e(B ?\e$,1'9\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&z\e(B ?\e$,1':\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&{\e(B ?\e$,1';\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&|\e(B ?\e$,1'<\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&}\e(B ?\e$,1'=\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&~\e(B ?\e$,1'>\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&\7f\e(B ?\e$,1'?\e(B tbl)
+  (set-case-syntax-pair ?\e$,1' \e(B ?\e$,1'@\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'!\e(B ?\e$,1'A\e(B tbl)
+  (set-upcase-syntax    ?\e$,1'#\e(B ?\e$,1'B\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'#\e(B ?\e$,1'C\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'$\e(B ?\e$,1'D\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'%\e(B ?\e$,1'E\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'&\e(B ?\e$,1'F\e(B tbl)
+  (set-case-syntax-pair ?\e$,1''\e(B ?\e$,1'G\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'(\e(B ?\e$,1'H\e(B tbl)
+  (set-case-syntax-pair ?\e$,1')\e(B ?\e$,1'I\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'*\e(B ?\e$,1'J\e(B tbl)
+  (set-case-syntax-pair ?\e$,1'+\e(B ?\e$,1'K\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&o\e(B ?\e$,1'N\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&n\e(B ?\e$,1'M\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&l\e(B ?\e$,1'L\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&f\e(B ?\e$,1',\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&h\e(B ?\e$,1'-\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&i\e(B ?\e$,1'.\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&j\e(B ?\e$,1'/\e(B tbl))
 
 ;; Hebrew character set (ISO-8859-8)
 
 (modify-category-entry (make-char 'hebrew-iso8859-8) ?w)
-
-(let ((c 224))
-  (while (< c 251)
-    (modify-syntax-entry (make-char 'hebrew-iso8859-8 c) "w")
+(let ((c #x591))
+  (while (<= c #x5f4)
+    (modify-category-entry (decode-char 'ucs c) ?w)
     (setq c (1+ c))))
-(modify-syntax-entry (make-char 'hebrew-iso8859-8 160) "w") ; NBSP
+
+(modify-syntax-entry (make-char 'hebrew-iso8859-8 208) ".") ; PASEQ
+(modify-syntax-entry (make-char 'hebrew-iso8859-8 211) ".") ; SOF PASUQ
+(modify-syntax-entry (decode-char 'ucs #x5be) ".") ; MAQAF
+(modify-syntax-entry (decode-char 'ucs #x5c0) ".") ; PASEQ
+(modify-syntax-entry (decode-char 'ucs #x5c3) ".") ; SOF PASUQ
+(modify-syntax-entry (decode-char 'ucs #x5f3) ".") ; GERESH
+(modify-syntax-entry (decode-char 'ucs #x5f4) ".") ; GERSHAYIM
+
+;; (let ((c 224))
+;;   (while (< c 251)
+;;     (modify-syntax-entry (make-char 'hebrew-iso8859-8 c) "w")
+;;     (setq c (1+ c))))
+;; (modify-syntax-entry (make-char 'hebrew-iso8859-8 160) "w") ; NBSP
 
 ;; Indian character set (IS 13194 and other Emacs original Indian charsets)
 
 (modify-category-entry (make-char 'indian-is13194) ?i)
 (modify-category-entry (make-char 'indian-2-column) ?I)
-(modify-category-entry (make-char 'indian-1-column) ?I)
+(modify-category-entry (make-char 'indian-glyph) ?I)
+;; Unicode Devanagari block
+(let ((c #x901))
+  (while (<= c #x970)
+    (modify-category-entry (decode-char 'ucs c) ?i)
+    (setq c (1+ c))))
+
+(let ((l '(;; RANGE   CATEGORY         MEANINGS
+          (#x01 #x03 ?7)               ; vowel modifier
+          (#x05 #x14 ?1)               ; base vowel
+          (#x15 #x39 ?0)               ; consonants
+          (#x3e #x4d ?8)               ; vowel modifier
+          (#x51 #x54 ?4)               ; stress/tone mark
+          (#x58 #x5f ?0)               ; consonants
+          (#x60 #x61 ?1)               ; base vowel
+          (#x62 #x63 ?8)               ; vowel modifier
+          (#x66 #x6f ?6)               ; digits
+          )))
+  (dolist (elt1 '(#x900 #x980 #xa00 #xa80 #xb00 #xb80 #xc00 #xc80 #xd00))
+    (dolist (elt2 l)
+      (let* ((from (car elt2))
+            (counts (1+ (- (nth 1 elt2) from)))
+            (category (nth 2 elt2)))
+       (dotimes (i counts)
+         (modify-category-entry (decode-char 'ucs (+ elt1 from i)) 
+                                category))))))
 
 ;; Japanese character set (JISX0201-kana, JISX0201-roman, JISX0208, JISX0212)
 
 (modify-category-entry (make-char 'katakana-jisx0201) ?k)
+(modify-category-entry (make-char 'katakana-jisx0201) ?j)
 (modify-category-entry (make-char 'latin-jisx0201) ?r)
 (modify-category-entry (make-char 'japanese-jisx0208) ?j)
 (modify-category-entry (make-char 'japanese-jisx0212) ?j)
+(modify-category-entry (make-char 'katakana-jisx0201) ?\|)
 (modify-category-entry (make-char 'japanese-jisx0208) ?\|)
+(modify-category-entry (make-char 'japanese-jisx0212) ?\|)
+
+;; Unicode equivalents of JISX0201-kana
+(let ((c #xff61))
+  (while (<= c #xff9f)
+    (modify-category-entry (decode-char 'ucs c) ?k)
+    (modify-category-entry (decode-char 'ucs c) ?j)
+    (modify-category-entry (decode-char 'ucs c) ?\|)
+    (setq c (1+ c))))
+
+;; Katakana block
+(let ((c #x30a0))
+  (while (<= c #x30ff)
+    ;; ?K is double width, ?k isn't specified
+    (modify-category-entry (decode-char 'ucs c) ?k)
+    (modify-category-entry (decode-char 'ucs c) ?j)
+    (modify-category-entry (decode-char 'ucs c) ?\|)
+    (setq c (1+ c))))
+
+;; Hiragana block
+(let ((c #x3040))
+  (while (<= c #x309f)
+    ;; ?H is actually defined to be double width
+    (modify-category-entry (decode-char 'ucs c) ?H)
+    ;;(modify-category-entry (decode-char 'ucs c) ?j)
+    (modify-category-entry (decode-char 'ucs c) ?\|)
+    (setq c (1+ c))))
 
 ;; JISX0208
-(modify-syntax-entry (make-char 'japanese-jisx0208) "w")
+;; (modify-syntax-entry (make-char 'japanese-jisx0208) "w")
 (modify-syntax-entry (make-char 'japanese-jisx0208 33) "_")
 (modify-syntax-entry (make-char 'japanese-jisx0208 34) "_")
 (modify-syntax-entry (make-char 'japanese-jisx0208 40) "_")
   (while chars
     (modify-syntax-entry (car chars) "w")
     (setq chars (cdr chars))))
-(modify-syntax-entry ?\\e$B!J\e(B "(\e$B!K\e(B")
-(modify-syntax-entry ?\\e$B!N\e(B "(\e$B!O\e(B")
-(modify-syntax-entry ?\\e$B!P\e(B "(\e$B!Q\e(B")
-(modify-syntax-entry ?\\e$B!V\e(B "(\e$B!W\e(B")
-(modify-syntax-entry ?\\e$B!X\e(B "(\e$B!Y\e(B")
-(modify-syntax-entry ?\\e$B!K\e(B ")\e$B!J\e(B")
-(modify-syntax-entry ?\\e$B!O\e(B ")\e$B!N\e(B")
-(modify-syntax-entry ?\\e$B!Q\e(B ")\e$B!P\e(B")
-(modify-syntax-entry ?\\e$B!W\e(B ")\e$B!V\e(B")
-(modify-syntax-entry ?\\e$B!Y\e(B ")\e$B!X\e(B")
+(let ((parens "\e$B!J!K!L!M!N!O!P!Q!R!S!T!U!V!W!X!Y!Z![\e(B" )
+      open close)
+  (dotimes (i (/ (length parens) 2))
+    (setq open (aref parens (* i 2))
+         close (aref parens (1+ (* i 2))))
+    (modify-syntax-entry open (format "(%c" close))
+    (modify-syntax-entry close (format ")%c" open))))
 
 (modify-category-entry (make-char 'japanese-jisx0208 35) ?A)
 (modify-category-entry (make-char 'japanese-jisx0208 36) ?H)
   (while (< row 127)
     (modify-category-entry (make-char 'japanese-jisx0208 row) ?C)
     (setq row (1+ row))))
-(let ((chars '(?\e$B!<\e(B ?\e$B!+\e(B ?\e$B!,\e(B)))
+(modify-category-entry ?\e$B!<\e(B ?K)
+(let ((chars '(?\e$B!+\e(B ?\e$B!,\e(B)))
   (while chars
     (modify-category-entry (car chars) ?K)
     (modify-category-entry (car chars) ?H)
     (modify-category-entry (car chars) ?C)
     (setq chars (cdr chars))))
 
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x23 (+ #x41 i))
+                         (make-char 'japanese-jisx0208 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x26 (+ #x21 i))
+                         (make-char 'japanese-jisx0208 #x26 (+ #x41 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'japanese-jisx0208 #x27 (+ #x21 i))
+                         (make-char 'japanese-jisx0208 #x27 (+ #x51 i)) tbl)))
+
 ;; JISX0212
-(modify-syntax-entry (make-char 'japanese-jisx0212) "w")
+;; (modify-syntax-entry (make-char 'japanese-jisx0212) "w")
 (modify-syntax-entry (make-char 'japanese-jisx0212 33) "_")
 (modify-syntax-entry (make-char 'japanese-jisx0212 34) "_")
 (modify-syntax-entry (make-char 'japanese-jisx0212 35) "_")
 (modify-category-entry (make-char 'japanese-jisx0212 ) ?C)
 
 ;; JISX0201-Kana
-(modify-syntax-entry (make-char 'katakana-jisx0201) "w")
-(let ((chars '(?\e(I!\e(B ?\e(I"\e(B ?\e(I#\e(B ?\e(I$\e(B ?\e(I%\e(B)))
+;; (modify-syntax-entry (make-char 'katakana-jisx0201) "w")
+(let ((chars '(?\e(I!\e(B ?\e(I$\e(B ?\e(I%\e(B
+              ;; Unicode:
+              ?\e$,3sa\e(B ?\e$,3sd\e(B ?\e$,3se\e(B)))
   (while chars
     (modify-syntax-entry (car chars) ".")
     (setq chars (cdr chars))))
 
+(modify-syntax-entry ?\\e(I"\e(B "(\e(I#\e(B")
+(modify-syntax-entry ?\\e(I#\e(B "(\e(I"\e(B")
+
 ;; Korean character set (KSC5601)
 
-(modify-syntax-entry (make-char 'korean-ksc5601) "w")
+;; (modify-syntax-entry (make-char 'korean-ksc5601) "w")
 (modify-syntax-entry (make-char 'korean-ksc5601 33) "_")
 (modify-syntax-entry (make-char 'korean-ksc5601 34) "_")
 (modify-syntax-entry (make-char 'korean-ksc5601 38) "_")
 (modify-category-entry (make-char 'korean-ksc5601 43) ?K)
 (modify-category-entry (make-char 'korean-ksc5601 44) ?Y)
 
+(let ((parens "\e$(C!2!3!4!5!6!7!8!9!:!;!<!=#(#)#[#]#{#}\e(B" )
+      open close)
+  (dotimes (i (/ (length parens) 2))
+    (setq open (aref parens (* i 2))
+         close (aref parens (1+ (* i 2))))
+    (modify-syntax-entry open (format "(%c" close))
+    (modify-syntax-entry close (format ")%c" open))))
+
+(let ((tbl (standard-case-table)))
+  (dotimes (i 26)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x23 (+ #x41 i))
+                         (make-char 'korean-ksc5601 #x23 (+ #x61 i)) tbl))
+  (dotimes (i 10)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x25 (+ #x21 i))
+                         (make-char 'korean-ksc5601 #x25 (+ #x30 i)) tbl))
+  (dotimes (i 24)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x25 (+ #x41 i))
+                         (make-char 'korean-ksc5601 #x25 (+ #x61 i)) tbl))
+  (dotimes (i 33)
+    (set-case-syntax-pair (make-char 'korean-ksc5601 #x2C (+ #x21 i))
+                         (make-char 'korean-ksc5601 #x2C (+ #x51 i)) tbl)))
+
+;; Latin character set (latin-1,2,3,4,5,8,9)
+
+(modify-category-entry (make-char 'latin-iso8859-1) ?l)
+(modify-category-entry (make-char 'latin-iso8859-2) ?l)
+(modify-category-entry (make-char 'latin-iso8859-3) ?l)
+(modify-category-entry (make-char 'latin-iso8859-4) ?l)
+(modify-category-entry (make-char 'latin-iso8859-9) ?l)
+(modify-category-entry (make-char 'latin-iso8859-14) ?l)
+(modify-category-entry (make-char 'latin-iso8859-15) ?l)
+
+(modify-category-entry (make-char 'latin-iso8859-1 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-2 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-3 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-4 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-9 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-14 160) ?\ )
+(modify-category-entry (make-char 'latin-iso8859-15 160) ?\ )
+
+;; Lao character set
+
+(modify-category-entry (make-char 'lao) ?o)
+(dotimes (i (1+ (- #xeff #xe80)))
+  (modify-category-entry (decode-char 'ucs (+ i #xe80)) ?o))
+
+(let ((deflist '(;; chars      syntax  category
+                 ("\e(1!\e(B-\e(1N\e(B"    "w"     ?0) ; consonant
+                 ("\e(1PRS]`\e(B-\e(1d\e(B"        "w"     ?1) ; vowel base
+                 ("\e(1QT\e(B-\e(1W[m\e(B" "w"     ?2) ; vowel upper
+                 ("\e(1XY\e(B"           "w"     ?3) ; vowel lower
+                 ("\e(1h\e(B-\e(1l\e(B"    "w"     ?4) ; tone mark
+                 ("\e(1\\e(B"            "w"     ?9) ; semivowel lower
+                 ("\e(1p\e(B-\e(1y\e(B"    "w"     ?6) ; digit
+                 ("\e(1Of\e(B"           "_"     ?5) ; symbol
+                 ;; Unicode equivalents
+                 ("\e$,1D!\e(B-\e$,1DN\e(B"        "w"     ?0) ; consonant
+                 ("\e$,1DPDRDSD]D`\e(B-\e$,1Dd\e(B"        "w"     ?1) ; vowel base
+                 ("\e$,1DQDT\e(B-\e$,1DWD[Dm\e(B"  "w"     ?2) ; vowel upper
+                 ("\e$,1DXDY\e(B"        "w"     ?3) ; vowel lower
+                 ("\e$,1Dh\e(B-\e$,1Dk\e(B"        "w"     ?4) ; tone mark
+                 ("\e$,1D\D]\e(B"        "w"     ?9) ; semivowel lower
+                 ("\e$,1Dp\e(B-\e$,1Dy\e(B"        "w"     ?6) ; digit
+                 ("\e$,1DODf\e(B"        "_"     ?5) ; symbol
+                 ))
+      elm chars len syntax category to ch i)
+  (while deflist
+    (setq elm (car deflist))
+    (setq chars (car elm)
+         len (length chars)
+         syntax (nth 1 elm)
+         category (nth 2 elm)
+         i 0)
+    (while (< i len)
+      (if (= (aref chars i) ?-)
+         (setq i (1+ i)
+               to (aref chars i))
+       (setq ch (aref chars i)
+             to ch))
+      (while (<= ch to)
+       (unless (string-equal syntax "w")
+         (modify-syntax-entry ch syntax))
+       (modify-category-entry ch category)
+       (setq ch (1+ ch)))
+      (setq i (1+ i)))
+    (setq deflist (cdr deflist))))
+
 ;; Thai character set (TIS620)
 
 (modify-category-entry (make-char 'thai-tis620) ?t)
+(dotimes (i (1+ (- #xe7f #xe00)))
+  (modify-category-entry (decode-char 'ucs (+ i #xe00)) ?t))
 
 (let ((deflist '(;; chars      syntax  category
                  ("\e,T!\e(B-\e,TCEG\e(B-\e,TN\e(B"  "w"     ?0) ; consonant
                  ("\e,TDFPRS`\e(B-\e,Te\e(B"       "w"     ?1) ; vowel base
                  ("\e,TQT\e(B-\e,TWgn\e(B" "w"     ?2) ; vowel upper
                  ("\e,TX\e(B-\e,TZ\e(B"    "w"     ?3) ; vowel lower
-                 ("\e,Th\e(B-\e,Tm\e(B"    "w"     ?4) ; tone mark 
-                 ("\e,TOfp\e(B-\e,Ty\e(B"  "w"     ?0) ; digit and misc
-                 ("\e,T_oz{\e(B" "_"     ?0) ; symbol
+                 ("\e,Th\e(B-\e,Tm\e(B"    "w"     ?4) ; tone mark
+                 ("\e,Tp\e(B-\e,Ty\e(B"    "w"     ?6) ; digit
+                 ("\e,TOf_oz{\e(B"       "_"     ?5) ; symbol
+                 ;; Unicode equivalents
+                 ("\e$,1Ba\e(B-\e$,1C#C%C'\e(B-\e$,1C.\e(B"  "w"     ?0) ; consonant
+                 ("\e$,1C$C&C0C2C3C@\e(B-\e$,1CE\e(B"      "w"     ?1) ; vowel base
+                 ("\e$,1C1C4\e(B-\e$,1C7CGCN\e(B"  "w"     ?2) ; vowel upper
+                 ("\e$,1C8\e(B-\e$,1C:\e(B"        "w"     ?3) ; vowel lower
+                 ("\e$,1CH\e(B-\e$,1CM\e(B"        "w"     ?4) ; tone mark
+                 ("\e$,1CP\e(B-\e$,1CY\e(B"        "w"     ?6) ; digit
+                 ("\e$,1C/CFC?COCZC[\e(B"        "_"     ?5) ; symbol
                  ))
       elm chars len syntax category to ch i)
   (while deflist
     (while (< i len)
       (if (= (aref chars i) ?-)
          (setq i (1+ i)
-               to (sref chars i))
-       (setq ch (sref chars i)
+               to (aref chars i))
+       (setq ch (aref chars i)
              to ch))
       (while (<= ch to)
-       (modify-syntax-entry ch syntax)
+       (unless (string-equal syntax "w")
+         (modify-syntax-entry ch syntax))
        (modify-category-entry ch category)
        (setq ch (1+ ch)))
-      (setq i (+ i (char-bytes to))))
+      (setq i (1+ i)))
+    (setq deflist (cdr deflist))))
+
+;; Tibetan character set
+
+(modify-category-entry (make-char 'tibetan) ?q)
+(modify-category-entry (make-char 'tibetan-1-column) ?q)
+(dotimes (i (1+ (- #xfff #xf00)))
+  (modify-category-entry (decode-char 'ucs (+ i #xf00)) ?q))
+
+(let ((deflist '(;; chars             syntax category
+                 ("\e4\e$(7"!\e0"!\e1\e(B-\e4\e$(7"J\e0"J\e1\e4"K\e0"K\e1\e(B"              "w"     ?0) ; consonant
+                 ("\e$(7#!\e(B-\e$(7#J#K#L#M!"!#\e(B"       "w"     ?0) ;
+                 ("\e$(7$!\e(B-\e$(7$e\e(B"              "w"     ?0) ;
+                 ("\e$(7%!\e(B-\e$(7%u\e(B"              "w"     ?0) ;
+                 ("\e$(7"S"["\"]"^"a\e(B"       "w"      ?2) ; upper vowel
+                 ("\e$(7"_"c"d"g"h"i"j"k"l\e(B" "w"      ?2) ; upper modifier
+                 ("\e$(7!I"Q"R"U"e!e!g\e(B"       "w"    ?3) ; lowel vowel/modifier
+                 ("\e$(7!P\e(B-\e$(7!Y!Z\e(B-\e$(7!c\e(B"            "w"     ?6) ; digit
+                 ("\e$(7!;!=\e(B-\e$(7!B!D"`\e(B"        "."     ?|) ; line-break char
+                 ("\e$(8!;!=!?!@!A!D"`\e(B"            "."     ?|) ;
+                 ("\e$(7!8!;!=\e(B-\e$(7!B!D"`!m!d\e(B"  "."     ?>) ; prohibition
+                 ("\e$(8!;!=!?!@!A!D"`\e(B"            "."     ?>) ;
+                 ("\e$(7!0\e(B-\e$(7!:!l#R#S"f\e(B"      "."     ?<) ; prohibition
+                 ("\e$(7!C!E\e(B-\e$(7!H!J\e(B-\e$(7!O!f!h\e(B-\e$(7!k!n!o#O#P\e(B-\e$(7#`\e(B" "." ?q) ; others
+
+                 ;; Unicode version (not complete)
+                 ("\e$,1F \e(B-\e$,1FIFJ\e(B"              "w"     ?0) ; consonant
+                 ("\e$,1Fp\e(B-\e$,1G9G:G;G<\e(B"       "w"     ?0) ;
+                 ("\e$,1FRFZF[F\F]F`\e(B"       "w"      ?2) ; upper vowel
+                 ("\e$,1F^FbFcFfFgFhFiFjFk\e(B" "w"      ?2) ; upper modifier
+                 ("\e$,1EYFPFQFTFdEuEw\e(B"       "w"    ?3) ; lowel vowel/modifier
+                 ("\e$,1E`\e(B-\e$,1EiEj\e(B-\e$,1Es\e(B"            "w"     ?6) ; digit
+                 ("\e$,1EKEM\e(B-\e$,1ERETF_\e(B"        "."     ?|) ; line-break char
+                 ("\e$,1EHEKEM\e(B-\e$,1ERETF_E}Et\e(B"  "."     ?>) ; prohibition
+                 ("\e$,1E@\e(B-\e$,1EJE|GAGBFe\e(B"      "."     ?<) ; prohibition
+                 ("\e$,1ESEU\e(B-\e$,1EXEZ\e(B-\e$,1E_EvEx\e(B-\e$,1E{E~E\7fG>G?\e(B-\e$,1GO\e(B" "." ?q) ; others
+                 ))
+      elm chars len syntax category to ch i)
+  (while deflist
+    (setq elm (car deflist))
+    (setq chars (car elm)
+         len (length chars)
+         syntax (nth 1 elm)
+         category (nth 2 elm)
+         i 0)
+    (while (< i len)
+      (if (= (aref chars i) ?-)
+         (setq i (1+ i)
+               to (aref chars i))
+       (setq ch (aref chars i)
+             to ch))
+      (while (<= ch to)
+       (unless (string-equal syntax "w")
+         (modify-syntax-entry ch syntax))
+       (modify-category-entry ch category)
+       (setq ch (1+ ch)))
+      (setq i (1+ i)))
     (setq deflist (cdr deflist))))
 
 ;; Vietnamese character set
 
 (let ((lower (make-char 'vietnamese-viscii-lower))
       (upper (make-char 'vietnamese-viscii-upper)))
-  (modify-syntax-entry lower "w")
-  (modify-syntax-entry upper "w")
+;;   (modify-syntax-entry lower "w")
+;;   (modify-syntax-entry upper "w")
   (modify-category-entry lower ?v)
   (modify-category-entry upper ?v)
   (modify-category-entry lower ?l)     ; To make a word with
   (modify-category-entry upper ?l)     ; latin characters.
   )
 
+(let ((tbl (standard-case-table))
+      (i 32))
+  (while (< i 128)
+    (set-case-syntax-pair (make-char 'vietnamese-viscii-upper i)
+                         (make-char 'vietnamese-viscii-lower i)
+                         tbl)
+    (setq i (1+ i))))
+
+;; Unicode (mule-unicode-0100-24ff)
+
+(let ((tbl (standard-case-table)) c)
+
+  ;; Latin Extended-A, Latin Extended-B
+  (setq c #x0100)
+  (while (<= c #x0233)
+    (modify-category-entry (decode-char 'ucs c) ?l)
+    (and (or (<= c #x012e)
+            (and (>= c #x014a) (<= c #x0177)))
+        (zerop (% c 2))
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (1+ c)) tbl))
+    (and (>= c #x013a)
+        (<= c #x0148)
+        (zerop (% c 2))
+        (set-case-syntax-pair
+         (decode-char 'ucs (1- c)) (decode-char 'ucs c) tbl))
+    (setq c (1+ c)))
+
+
+  ;; In some languages, such as Turkish, U+0049 LATIN CAPITAL LETTER I
+  ;; and U+0131 LATIN SMALL LETTER DOTLESS I make a case pair, and so
+  ;; do U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE and U+0069 LATIN
+  ;; SMALL LETTER I.
+
+  ;; We used to set up half of those correspondence unconditionally,
+  ;; but that makes searches slow.  So now we don't set up either half
+  ;; of these correspondences by default.
+
+  ;;  (set-downcase-syntax  ?\e$,1 P\e(B ?i tbl)
+  ;;  (set-upcase-syntax    ?I ?\e$,1 Q\e(B tbl)
+
+  (set-case-syntax-pair ?\e$,1 R\e(B ?\e$,1 S\e(B tbl)
+  (set-case-syntax-pair ?\e$,1 T\e(B ?\e$,1 U\e(B tbl)
+  (set-case-syntax-pair ?\e$,1 V\e(B ?\e$,1 W\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!8\e(B ?\e,A\7f\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!9\e(B ?\e$,1!:\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!;\e(B ?\e$,1!<\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!=\e(B ?\e$,1!>\e(B tbl)
+
+  ;; Latin Extended-B
+  (set-case-syntax-pair ?\e$,1!A\e(B ?\e$,1#S\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!B\e(B ?\e$,1!C\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!D\e(B ?\e$,1!E\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!F\e(B ?\e$,1#T\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!G\e(B ?\e$,1!H\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!I\e(B ?\e$,1#V\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!J\e(B ?\e$,1#W\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!K\e(B ?\e$,1!L\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!N\e(B ?\e$,1"=\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!O\e(B ?\e$,1#Y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!P\e(B ?\e$,1#[\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!Q\e(B ?\e$,1!R\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!S\e(B ?\e$,1#`\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!T\e(B ?\e$,1#c\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!V\e(B ?\e$,1#i\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!W\e(B ?\e$,1#h\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!X\e(B ?\e$,1!Y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!\\e(B ?\e$,1#o\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!]\e(B ?\e$,1#r\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!_\e(B ?\e$,1#u\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!`\e(B ?\e$,1!a\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!b\e(B ?\e$,1!c\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!d\e(B ?\e$,1!e\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!f\e(B ?\e$,1$ \e(B tbl)
+  (set-case-syntax-pair ?\e$,1!g\e(B ?\e$,1!h\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!i\e(B ?\e$,1$#\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!l\e(B ?\e$,1!m\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!n\e(B ?\e$,1$(\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!o\e(B ?\e$,1!p\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!q\e(B ?\e$,1$*\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!r\e(B ?\e$,1$+\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!s\e(B ?\e$,1!t\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!u\e(B ?\e$,1!v\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!w\e(B ?\e$,1$2\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!x\e(B ?\e$,1!y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1!|\e(B ?\e$,1!}\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"$\e(B ?\e$,1"&\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"%\e(B ?\e$,1"&\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"'\e(B ?\e$,1")\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"(\e(B ?\e$,1")\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"*\e(B ?\e$,1",\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"+\e(B ?\e$,1",\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"-\e(B ?\e$,1".\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"/\e(B ?\e$,1"0\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"1\e(B ?\e$,1"2\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"3\e(B ?\e$,1"4\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"5\e(B ?\e$,1"6\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"7\e(B ?\e$,1"8\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"9\e(B ?\e$,1":\e(B tbl)
+  (set-case-syntax-pair ?\e$,1";\e(B ?\e$,1"<\e(B tbl)
+  (set-case-syntax-pair ?\e$,1">\e(B ?\e$,1"?\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"@\e(B ?\e$,1"A\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"B\e(B ?\e$,1"C\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"D\e(B ?\e$,1"E\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"F\e(B ?\e$,1"G\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"H\e(B ?\e$,1"I\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"J\e(B ?\e$,1"K\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"L\e(B ?\e$,1"M\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"N\e(B ?\e$,1"O\e(B tbl)
+  ;; 01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON
+  (set-case-syntax-pair ?\e$,1"Q\e(B ?\e$,1"S\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"R\e(B ?\e$,1"S\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"T\e(B ?\e$,1"U\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"V\e(B ?\e$,1!U\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"W\e(B ?\e$,1!\7f\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"X\e(B ?\e$,1"Y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"Z\e(B ?\e$,1"[\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"\\e(B ?\e$,1"]\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"^\e(B ?\e$,1"_\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"`\e(B ?\e$,1"a\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"b\e(B ?\e$,1"c\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"d\e(B ?\e$,1"e\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"f\e(B ?\e$,1"g\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"h\e(B ?\e$,1"i\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"j\e(B ?\e$,1"k\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"l\e(B ?\e$,1"m\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"n\e(B ?\e$,1"o\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"p\e(B ?\e$,1"q\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"r\e(B ?\e$,1"s\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"t\e(B ?\e$,1"u\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"v\e(B ?\e$,1"w\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"x\e(B ?\e$,1"y\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"z\e(B ?\e$,1"{\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"|\e(B ?\e$,1"}\e(B tbl)
+  (set-case-syntax-pair ?\e$,1"~\e(B ?\e$,1"\7f\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#"\e(B ?\e$,1##\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#$\e(B ?\e$,1#%\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#&\e(B ?\e$,1#'\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#(\e(B ?\e$,1#)\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#*\e(B ?\e$,1#+\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#,\e(B ?\e$,1#-\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#.\e(B ?\e$,1#/\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#0\e(B ?\e$,1#1\e(B tbl)
+  (set-case-syntax-pair ?\e$,1#2\e(B ?\e$,1#3\e(B tbl)
+
+  ;; Latin Extended Additional
+  (setq c #x1e00)
+  (while (<= c #x1ef9)
+    (modify-category-entry (decode-char 'ucs c) ?l)
+    (and (zerop (% c 2))
+        (or (<= c #x1e94) (>= c #x1ea0))
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (1+ c)) tbl))
+    (setq c (1+ c)))
+
+  ;; Greek
+  (setq c #x0370)
+  (while (<= c #x03ff)
+    (modify-category-entry (decode-char 'ucs c) ?g)
+    (if (or (and (>= c #x0391) (<= c #x03a1))
+           (and (>= c #x03a3) (<= c #x03ab)))
+       (set-case-syntax-pair
+        (decode-char 'ucs c) (decode-char 'ucs (+ c 32)) tbl))
+    (and (>= c #x03da)
+        (<= c #x03ee)
+        (zerop (% c 2))
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (1+ c)) tbl))
+    (setq c (1+ c)))
+  (set-case-syntax-pair ?\e$,1&f\e(B ?\e$,1',\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&h\e(B ?\e$,1'-\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&i\e(B ?\e$,1'.\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&j\e(B ?\e$,1'/\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&l\e(B ?\e$,1'L\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&n\e(B ?\e$,1'M\e(B tbl)
+  (set-case-syntax-pair ?\e$,1&o\e(B ?\e$,1'N\e(B tbl)
+
+  ;; Armenian
+  (setq c #x531)
+  (while (<= c #x556)
+    (set-case-syntax-pair (decode-char 'ucs c)
+                         (decode-char 'ucs (+ c #x30)) tbl)
+    (setq c (1+ c)))
+
+  ;; Greek Extended
+  (setq c #x1f00)
+  (while (<= c #x1fff)
+    (modify-category-entry (decode-char 'ucs c) ?g)
+    (and (<= (logand c #x000f) 7)
+        (<= c #x1fa7)
+        (not (memq c '(#x1f50 #x1f52 #x1f54 #x1f56)))
+        (/= (logand c #x00f0) 7)
+        (set-case-syntax-pair
+         (decode-char 'ucs (+ c 8)) (decode-char 'ucs c) tbl))
+    (setq c (1+ c)))
+  (set-case-syntax-pair ?\e$,1qx\e(B ?\e$,1qp\e(B tbl)
+  (set-case-syntax-pair ?\e$,1qy\e(B ?\e$,1qq\e(B tbl)
+  (set-case-syntax-pair ?\e$,1qz\e(B ?\e$,1q0\e(B tbl)
+  (set-case-syntax-pair ?\e$,1q{\e(B ?\e$,1q1\e(B tbl)
+  (set-case-syntax-pair ?\e$,1q|\e(B ?\e$,1qs\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r(\e(B ?\e$,1q2\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r)\e(B ?\e$,1q3\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r*\e(B ?\e$,1q4\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r+\e(B ?\e$,1q5\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r,\e(B ?\e$,1r#\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r8\e(B ?\e$,1r0\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r9\e(B ?\e$,1r1\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r:\e(B ?\e$,1q6\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r;\e(B ?\e$,1q7\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rH\e(B ?\e$,1r@\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rI\e(B ?\e$,1rA\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rJ\e(B ?\e$,1q:\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rK\e(B ?\e$,1q;\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rL\e(B ?\e$,1rE\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rX\e(B ?\e$,1q8\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rY\e(B ?\e$,1q9\e(B tbl)
+  (set-case-syntax-pair ?\e$,1rZ\e(B ?\e$,1q<\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r[\e(B ?\e$,1q=\e(B tbl)
+  (set-case-syntax-pair ?\e$,1r\\e(B ?\e$,1rS\e(B tbl)
+
+  ;; cyrillic
+  (setq c #x0400)
+  (while (<= c #x04ff)
+    (modify-category-entry (decode-char 'ucs c) ?y)
+    (and (>= c #x0400)
+        (<= c #x040f)
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (+ c 80)) tbl))
+    (and (>= c #x0410)
+        (<= c #x042f)
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (+ c 32)) tbl))
+    (and (zerop (% c 2))
+        (or (and (>= c #x0460) (<= c #x0480))
+            (and (>= c #x048c) (<= c #x04be))
+            (and (>= c #x04d0) (<= c #x04f4)))
+        (set-case-syntax-pair
+         (decode-char 'ucs c) (decode-char 'ucs (1+ c)) tbl))
+    (setq c (1+ c)))
+  (set-case-syntax-pair ?\e$,1*!\e(B ?\e$,1*"\e(B tbl)
+  (set-case-syntax-pair ?\e$,1*#\e(B ?\e$,1*$\e(B tbl)
+  (set-case-syntax-pair ?\e$,1*'\e(B ?\e$,1*(\e(B tbl)
+  (set-case-syntax-pair ?\e$,1*+\e(B ?\e$,1*,\e(B tbl)
+  (set-case-syntax-pair ?\e$,1*X\e(B ?\e$,1*Y\e(B tbl)
+
+  ;; general punctuation
+  (setq c #x2000)
+  (while (<= c #x200b)
+    (set-case-syntax (decode-char 'ucs c) " " tbl)
+    (setq c (1+ c)))
+  (setq c #x2010)
+  (while (<= c #x2016)
+    (set-case-syntax (decode-char 'ucs c) "_" tbl)
+    (setq c (1+ c)))
+  ;; Punctuation syntax for quotation marks (like `)
+  (while (<= c #x201f)
+    (set-case-syntax (decode-char 'ucs c) "." tbl)
+    (setq c (1+ c)))
+  (while (<= c #x2027)
+    (set-case-syntax (decode-char 'ucs c) "_" tbl)
+    (setq c (1+ c)))
+
+  ;; Roman numerals
+  (setq c #x2160)
+  (while (<= c #x216f)
+    (set-case-syntax-pair (decode-char 'ucs c)
+                         (decode-char 'ucs (+ c #x10)) tbl)
+    (setq c (1+ c)))
+
+  ;; Circled Latin
+  (setq c #x24b6)
+  (while (<= c #x24cf)
+    (set-case-syntax-pair (decode-char 'ucs c)
+                         (decode-char 'ucs (+ c 26)) tbl)
+    (modify-category-entry (decode-char 'ucs c) ?l)
+    (modify-category-entry (decode-char 'ucs (+ c 26)) ?l)
+    (setq c (1+ c)))
+
+  ;; Fullwidth Latin
+  (setq c #xff21)
+  (while (<= c #xff3a)
+    (set-case-syntax-pair (decode-char 'ucs c)
+                         (decode-char 'ucs (+ c #x20)) tbl)
+    (modify-category-entry (decode-char 'ucs c) ?l)
+    (modify-category-entry (decode-char 'ucs (+ c #x20)) ?l)
+    (setq c (1+ c)))
+
+  ;; Combining diacritics
+  (setq c #x300)
+  (while (<= c #x362)
+    (modify-category-entry (decode-char 'ucs c) ?^)
+    (setq c (1+ c)))
+
+  ;; Combining marks
+  (setq c #x20d0)
+  (while (<= c #x20e3)
+    (modify-category-entry (decode-char 'ucs c) ?^)
+    (setq c (1+ c)))
+
+  ;; Fixme: syntax for symbols &c
+  )
+
+(let ((pairs
+       '("\e$,1sEsF\e(B"                         ; U+2045 U+2046
+        "\e$,1s}s~\e(B"                          ; U+207D U+207E
+        "\e$,1t-t.\e(B"                          ; U+208D U+208E
+        "\e$,1{){*\e(B"                          ; U+2329 U+232A
+        "\e$,1|T|U\e(B"                          ; U+23B4 U+23B5
+        "\e$,2&H&I\e(B"                          ; U+2768 U+2769
+        "\e$,2&J&K\e(B"                          ; U+276A U+276B
+        "\e$,2&L&M\e(B"                          ; U+276C U+276D
+        "\e$,2&P&Q\e(B"                          ; U+2770 U+2771
+        "\e$,2&R&S\e(B"                          ; U+2772 U+2773
+        "\e$,2&T&U\e(B"                          ; U+2774 U+2775
+        "\e$,2'f'g\e(B"                          ; U+27E6 U+27E7
+        "\e$,2'h'i\e(B"                          ; U+27E8 U+27E9
+        "\e$,2'j'k\e(B"                          ; U+27EA U+27EB
+        "\e$,2,#,$\e(B"                          ; U+2983 U+2984
+        "\e$,2,%,&\e(B"                          ; U+2985 U+2986
+        "\e$,2,',(\e(B"                          ; U+2987 U+2988
+        "\e$,2,),*\e(B"                          ; U+2989 U+298A
+        "\e$,2,+,,\e(B"                          ; U+298B U+298C
+        "\e$,2,-,.\e(B"                          ; U+298D U+298E
+        "\e$,2,/,0\e(B"                          ; U+298F U+2990
+        "\e$,2,1,2\e(B"                          ; U+2991 U+2992
+        "\e$,2,3,4\e(B"                          ; U+2993 U+2994
+        "\e$,2,5,6\e(B"                          ; U+2995 U+2996
+        "\e$,2,7,8\e(B"                          ; U+2997 U+2998
+        "\e$,2-<-=\e(B"                          ; U+29FC U+29FD
+        "\e$,2=H=I\e(B"                          ; U+3008 U+3009
+        "\e$,2=J=K\e(B"                          ; U+300A U+300B
+        "\e$,2=L=M\e(B"                          ; U+300C U+300D
+        "\e$,2=N=O\e(B"                          ; U+300E U+300F
+        "\e$,2=P=Q\e(B"                          ; U+3010 U+3011
+        "\e$,2=T=U\e(B"                          ; U+3014 U+3015
+        "\e$,2=V=W\e(B"                          ; U+3016 U+3017
+        "\e$,2=X=Y\e(B"                          ; U+3018 U+3019
+        "\e$,2=Z=[\e(B"                          ; U+301A U+301B
+        "\e$,3m~m\7f\e(B"                          ; U+FD3E U+FD3F
+        "\e$,3pUpV\e(B"                          ; U+FE35 U+FE36
+        "\e$,3pWpX\e(B"                          ; U+FE37 U+FE38
+        "\e$,3pYpZ\e(B"                          ; U+FE39 U+FE3A
+        "\e$,3p[p\\e(B"                          ; U+FE3B U+FE3C
+        "\e$,3p]p^\e(B"                          ; U+FE3D U+FE3E
+        "\e$,3p_p`\e(B"                          ; U+FE3F U+FE40
+        "\e$,3papb\e(B"                          ; U+FE41 U+FE42
+        "\e$,3pcpd\e(B"                          ; U+FE43 U+FE44
+        "\e$,3pypz\e(B"                          ; U+FE59 U+FE5A
+        "\e$,3p{p|\e(B"                          ; U+FE5B U+FE5C
+        "\e$,3p}p~\e(B"                          ; U+FE5D U+FE5E
+        "\e$,3rhri\e(B"                          ; U+FF08 U+FF09
+        "\e$,3s;s=\e(B"                          ; U+FF3B U+FF3D
+        "\e$,3s[s]\e(B"                          ; U+FF5B U+FF5D
+        "\e$,3s_s`\e(B"                          ; U+FF5F U+FF60
+        "\e$,3sbsc\e(B"                          ; U+FF62 U+FF63
+        )))
+  (dolist (elt pairs)
+    (modify-syntax-entry (aref elt 0) (string ?\( (aref elt 1)))
+    (modify-syntax-entry (aref elt 1) (string ?\) (aref elt 0)))))
+
 \f
 ;;; Setting word boundary.
 
 (setq word-combining-categories
-      '((?l . ?l)))
+      '((?l . ?l)
+       (?C . ?C)
+       (?C . ?H)
+       (?C . ?K)))
 
 (setq word-separating-categories       ;  (2-byte character sets)
       '((?A . ?K)                      ; Alpha numeric - Katakana
        (?C . ?A)                       ; Chinese - Alpha numeric
        (?C . ?K)                       ; Chinese - Katakana
        ))
+
+\f
+;; For each character set, put the information of the most proper
+;; coding system to encode it by `preferred-coding-system' property.
+
+(let ((l '((latin-iso8859-1    . iso-latin-1)
+          (latin-iso8859-2     . iso-latin-2)
+          (latin-iso8859-3     . iso-latin-3)
+          (latin-iso8859-4     . iso-latin-4)
+          (thai-tis620         . thai-tis620)
+          (greek-iso8859-7     . greek-iso-8bit)
+          (arabic-iso8859-6    . iso-2022-7bit)
+          (hebrew-iso8859-8    . hebrew-iso-8bit)
+          (katakana-jisx0201   . japanese-shift-jis)
+          (latin-jisx0201      . japanese-shift-jis)
+          (cyrillic-iso8859-5  . cyrillic-iso-8bit)
+          (latin-iso8859-9     . iso-latin-5)
+          (japanese-jisx0208-1978 . iso-2022-jp)
+          (chinese-gb2312      . cn-gb-2312)
+          (japanese-jisx0208   . iso-2022-jp)
+          (korean-ksc5601      . iso-2022-kr)
+          (japanese-jisx0212   . iso-2022-jp)
+          (chinese-cns11643-1  . iso-2022-cn)
+          (chinese-cns11643-2  . iso-2022-cn)
+          (chinese-big5-1      . chinese-big5)
+          (chinese-big5-2      . chinese-big5)
+          (chinese-sisheng     . iso-2022-7bit)
+          (ipa                 . iso-2022-7bit)
+          (vietnamese-viscii-lower . vietnamese-viscii)
+          (vietnamese-viscii-upper . vietnamese-viscii)
+          (arabic-digit        . iso-2022-7bit)
+          (arabic-1-column     . iso-2022-7bit)
+          (ascii-right-to-left . iso-2022-7bit)
+          (lao                 . lao)
+          (arabic-2-column     . iso-2022-7bit)
+          (indian-is13194      . devanagari)
+          (indian-glyph        . devanagari)
+          (tibetan-1-column    . tibetan)
+          (ethiopic            . iso-2022-7bit)
+          (chinese-cns11643-3  . iso-2022-cn)
+          (chinese-cns11643-4  . iso-2022-cn)
+          (chinese-cns11643-5  . iso-2022-cn)
+          (chinese-cns11643-6  . iso-2022-cn)
+          (chinese-cns11643-7  . iso-2022-cn)
+          (indian-2-column     . devanagari)
+          (tibetan             . tibetan)
+          (latin-iso8859-14    . iso-latin-8)
+          (latin-iso8859-15    . iso-latin-9))))
+  (while l
+    (put-charset-property (car (car l)) 'preferred-coding-system (cdr (car l)))
+    (setq l (cdr l))))
+
+\f
+;; Setup auto-fill-chars for charsets that should invoke auto-filling.
+;; SPACE and NEWLINE are already set.  Also put `nospace-between-words'
+;; property on the charsets.
+(let ((l '(katakana-jisx0201
+          japanese-jisx0208 japanese-jisx0212
+          chinese-gb2312 chinese-big5-1 chinese-big5-2)))
+  (while l
+    (aset auto-fill-chars (make-char (car l)) t)
+    (put-charset-property (car l) 'nospace-between-words t)
+    (setq l (cdr l))))
+
+\f
+(setq utf-translate-cjk-mode saved-utf-translate-cjk-mode)
+(makunbound 'saved-utf-translate-cjk-mode)
+
+;;; Local Variables:
+;;; coding: iso-2022-7bit
+;;; End:
+
+;;; arch-tag: 85889c35-9f4d-4912-9bf5-82de31b0d42d
+;;; characters.el ends here