]> 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 c6baa4e35da89c0a54d18720916a726537190768..3522b57d5d9bd2947a540a2d2cdfa4dc3eec7df2 100644 (file)
@@ -1,8 +1,10 @@
 ;;; characters.el --- set syntax and category for multibyte characters
 
-;; Copyright (C) 1995, 1997 Electrotechnical Laboratory, JAPAN.
-;; Licensed to the Free Software Foundation.
-;; Copyright (C) 2001, 2002 Free Software Foundation, Inc.
+;; 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
 
@@ -20,8 +22,8 @@
 
 ;; 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, Inc., 59 Temple Place - Suite 330,
-;; Boston, MA 02111-1307, USA.
+;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
 
 ;;; Commentary:
 
 
 ;;; 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.
 
 ;; For each character set.
@@ -83,7 +90,7 @@
 (define-category ?| "While filling, we can break a line at this character.")
 
 ;; For indentation calculation.
-(define-category ? 
+(define-category ?\s
   "This character counts as a space for indentation purposes.")
 
 ;; Keep the following for `kinsoku' processing.  See comments in
 (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")
-;; Unicode equivalents of above
-(modify-syntax-entry ?\\e$,2=T\e(B "(\e$,2=U\e(B")
-(modify-syntax-entry ?\\e$,2=H\e(B "(\e$,2=I\e(B")
-(modify-syntax-entry ?\\e$,2=J\e(B "(\e$,2=K\e(B")
-(modify-syntax-entry ?\\e$,2=L\e(B "(\e$,2=M\e(B")
-(modify-syntax-entry ?\\e$,2=N\e(B "(\e$,2=O\e(B")
-(modify-syntax-entry ?\\e$,2=V\e(B "(\e$,2=W\e(B")
-(modify-syntax-entry ?\\e$,2=P\e(B "(\e$,2=Q\e(B")
-(modify-syntax-entry ?\\e$,2=U\e(B ")\e$,2=T\e(B")
-(modify-syntax-entry ?\\e$,2=I\e(B ")\e$,2=H\e(B")
-(modify-syntax-entry ?\\e$,2=K\e(B ")\e$,2=J\e(B")
-(modify-syntax-entry ?\\e$,2=M\e(B ")\e$,2=L\e(B")
-(modify-syntax-entry ?\\e$,2=O\e(B ")\e$,2=N\e(B")
-(modify-syntax-entry ?\\e$,2=W\e(B ")\e$,2=V\e(B")
-(modify-syntax-entry ?\\e$,2=Q\e(B ")\e$,2=P\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 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-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)
 
     (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)
   (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$,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)
     (modify-category-entry (decode-char 'ucs c) ?i)
     (setq c (1+ c))))
 
-;;; 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(52\e(B"    "w"     ?1) ; base (independent) vowel
-;;       ("\e(53\e(B-\e(5X\e(B"    "w"     ?0) ; consonant
-;;       ("\e(5Z\e(B-\e(5g\e(B"    "w"     ?8) ; matra
-;;       ("\e(5q\e(B-\e(5z\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))))
-
+(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)
 
     ;; ?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) ?\|) 
+    (modify-category-entry (decode-char 'ucs c) ?\|)
     (setq c (1+ c))))
 
 ;; Hiragana block
     ;; ?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) ?\|) 
+    (modify-category-entry (decode-char 'ucs c) ?\|)
     (setq c (1+ c))))
 
 ;; JISX0208
   (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)
     (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 33) "_")
 (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)
                  ("\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(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
                  ("\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$,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
                  ("\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,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$,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$,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
                  ))
 
 (let ((tbl (standard-case-table)) c)
 
-;; In some languages, 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.
-;; Thus we have to check language-environment to handle casing
-;; correctly.  Currently only I<->i is available.
-
   ;; Latin Extended-A, Latin Extended-B
   (setq c #x0100)
   (while (<= c #x0233)
         (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)    ; these two have different length!
+  (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)
             (and (>= c #x048c) (<= c #x04be))
             (and (>= c #x04d0) (<= c #x04f4)))
         (set-case-syntax-pair
-         (decode-char 'ucs c) (decode-char 'ucs (1+ c)) tbl))   
+         (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)
   ;; general punctuation
   (setq c #x2000)
   (while (<= c #x200b)
-    (set-case-syntax c " " tbl)
+    (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 c "_" tbl)
+    (set-case-syntax (decode-char 'ucs c) "_" tbl)
     (setq c (1+ c)))
 
   ;; Roman numerals
     (modify-category-entry (decode-char 'ucs (+ c #x20)) ?l)
     (setq c (1+ c)))
 
-  ;; Ohm, Kelvin, Angstrom
-  (set-case-syntax-pair ?\e$,1uf\e(B ?\e$,1'I\e(B tbl)
-;;;  These mess up the case conversion of k and \e,Ae\e(B.
-;;;  (set-case-syntax-pair ?\e$,1uj\e(B ?k tbl)
-;;;  (set-case-syntax-pair ?\e$,1uk\e(B ?\e,Ae\e(B tbl)
-
   ;; Combining diacritics
   (setq c #x300)
   (while (<= c #x362)
 
   ;; 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
     (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