1 ;;; characters.el --- set syntax and category for multibyte characters
3 ;; Copyright (C) 1997, 2000-2015 Free Software Foundation, Inc.
4 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
5 ;; 2005, 2006, 2007, 2008, 2009, 2010, 2011
6 ;; National Institute of Advanced Industrial Science and Technology (AIST)
7 ;; Registration Number H14PRO021
9 ;; National Institute of Advanced Industrial Science and Technology (AIST)
10 ;; Registration Number H13PRO009
12 ;; Keywords: multibyte character, character set, syntax, category
14 ;; This file is part of GNU Emacs.
16 ;; GNU Emacs is free software: you can redistribute it and/or modify
17 ;; it under the terms of the GNU General Public License as published by
18 ;; the Free Software Foundation, either version 3 of the License, or
19 ;; (at your option) any later version.
21 ;; GNU Emacs is distributed in the hope that it will be useful,
22 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
23 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 ;; GNU General Public License for more details.
26 ;; You should have received a copy of the GNU General Public License
27 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
33 ;;; Predefined categories.
35 ;; For each character set.
37 (define-category ?a "ASCII
38 ASCII graphic characters 32-126 (ISO646 IRV:1983[4/0])")
39 (define-category ?l "Latin")
40 (define-category ?t "Thai")
41 (define-category ?g "Greek")
42 (define-category ?b "Arabic")
43 (define-category ?w "Hebrew")
44 (define-category ?y "Cyrillic")
45 (define-category ?k "Katakana
47 (define-category ?r "Roman
49 (define-category ?c "Chinese")
50 (define-category ?j "Japanese")
51 (define-category ?h "Korean")
52 (define-category ?e "Ethiopic
54 (define-category ?v "Viet
56 (define-category ?i "Indian")
57 (define-category ?o "Lao")
58 (define-category ?q "Tibetan")
60 ;; For each group (row) of 2-byte character sets.
62 (define-category ?A "2-byte alnum
63 Alpha-numeric characters of 2-byte character sets")
64 (define-category ?C "2-byte han
65 Chinese (Han) characters of 2-byte character sets")
66 (define-category ?G "2-byte Greek
67 Greek characters of 2-byte character sets")
68 (define-category ?H "2-byte Hiragana
69 Japanese Hiragana characters of 2-byte character sets")
70 (define-category ?K "2-byte Katakana
71 Japanese Katakana characters of 2-byte character sets")
72 (define-category ?N "2-byte Korean
73 Korean Hangul characters of 2-byte character sets")
74 (define-category ?Y "2-byte Cyrillic
75 Cyrillic characters of 2-byte character sets")
76 (define-category ?I "Indian Glyphs")
78 ;; For phonetic classifications.
80 (define-category ?0 "consonant")
81 (define-category ?1 "base vowel
82 Base (independent) vowel")
83 (define-category ?2 "upper diacritic
84 Upper diacritical mark (including upper vowel)")
85 (define-category ?3 "lower diacritic
86 Lower diacritical mark (including lower vowel)")
87 (define-category ?4 "combining tone
89 (define-category ?5 "symbol")
90 (define-category ?6 "digit")
91 (define-category ?7 "vowel diacritic
92 Vowel-modifying diacritical mark")
93 (define-category ?8 "vowel-signs")
94 (define-category ?9 "semivowel lower")
97 (define-category ?| "line breakable
98 While filling, we can break a line at this character.")
100 ;; For indentation calculation.
103 This character counts as a space for indentation purposes.")
105 ;; Keep the following for `kinsoku' processing. See comments in
107 (define-category ?> "Not at bol
108 A character which can't be placed at beginning of line.")
109 (define-category ?< "Not at eol
110 A character which can't be placed at end of line.")
112 ;; Base and Combining
113 (define-category ?. "Base
114 Base characters (Unicode General Category L,N,P,S,Zs)")
115 (define-category ?^ "Combining
116 Combining diacritic or mark (Unicode General Category M)")
119 (define-category ?R "Right-to-left (strong)
120 Characters with \"strong\" right-to-left directionality, i.e.
121 with R, AL, RLE, or RLO Unicode bidi character type.")
123 (define-category ?L "Left-to-right (strong)
124 Characters with \"strong\" left-to-right directionality, i.e.
125 with L, LRE, or LRO Unicode bidi character type.")
128 ;;; Setting syntax and category.
132 ;; All ASCII characters have the category `a' (ASCII) and `l' (Latin).
133 (modify-category-entry '(32 . 127) ?a)
134 (modify-category-entry '(32 . 127) ?l)
136 ;; Deal with the CJK charsets first. Since the syntax of blocks is
137 ;; defined per charset, and the charsets may contain e.g. Latin
138 ;; characters, we end up with the wrong syntax definitions if we're
141 ;; Chinese characters (Unicode)
142 (modify-category-entry '(#x2E80 . #x312F) ?|)
143 (modify-category-entry '(#x3190 . #x33FF) ?|)
144 (modify-category-entry '(#x3400 . #x4DBF) ?C)
145 (modify-category-entry '(#x4E00 . #x9FAF) ?C)
146 (modify-category-entry '(#x3400 . #x9FAF) ?c)
147 (modify-category-entry '(#x3400 . #x9FAF) ?|)
148 (modify-category-entry '(#xF900 . #xFAFF) ?C)
149 (modify-category-entry '(#xF900 . #xFAFF) ?c)
150 (modify-category-entry '(#xF900 . #xFAFF) ?|)
151 (modify-category-entry '(#x20000 . #x2FFFF) ?|)
152 (modify-category-entry '(#x20000 . #x2FFFF) ?C)
153 (modify-category-entry '(#x20000 . #x2FFFF) ?c)
156 ;; Chinese character set (GB2312)
158 (map-charset-chars #'modify-syntax-entry 'chinese-gb2312 "_" #x2121 #x217E)
159 (map-charset-chars #'modify-syntax-entry 'chinese-gb2312 "_" #x2221 #x227E)
160 (map-charset-chars #'modify-syntax-entry 'chinese-gb2312 "_" #x2921 #x297E)
162 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?c)
163 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?A #x2330 #x2339)
164 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?A #x2341 #x235A)
165 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?A #x2361 #x237A)
166 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?H #x2421 #x247E)
167 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?K #x2521 #x257E)
168 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?G #x2621 #x267E)
169 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?Y #x2721 #x277E)
170 (map-charset-chars #'modify-category-entry 'chinese-gb2312 ?C #x3021 #x7E7E)
172 ;; Chinese character set (BIG5)
174 (map-charset-chars #'modify-category-entry 'big5 ?c)
175 (map-charset-chars #'modify-category-entry 'big5 ?C #xA259 #xA261)
176 (map-charset-chars #'modify-category-entry 'big5 ?C #xA440 #xC67E)
177 (map-charset-chars #'modify-category-entry 'big5 ?C #xC940 #xF9DC)
179 ;; Chinese character set (CNS11643)
181 (dolist (c '(chinese-cns11643-1 chinese-cns11643-2 chinese-cns11643-3
182 chinese-cns11643-4 chinese-cns11643-5 chinese-cns11643-6
184 (map-charset-chars #'modify-category-entry c ?c)
185 (if (eq c 'chinese-cns11643-1)
186 (map-charset-chars #'modify-category-entry c ?C #x4421 #x7E7E)
187 (map-charset-chars #'modify-category-entry c ?C)))
189 ;; Japanese character set (JISX0201, JISX0208, JISX0212, JISX0213)
191 (map-charset-chars #'modify-category-entry 'katakana-jisx0201 ?k)
193 (map-charset-chars #'modify-category-entry 'latin-jisx0201 ?r)
195 (dolist (l '(katakana-jisx0201 japanese-jisx0208 japanese-jisx0212
196 japanese-jisx0213-1 japanese-jisx0213-2
198 (map-charset-chars #'modify-category-entry l ?j))
200 ;; Fullwidth characters
201 (modify-category-entry '(#xff01 . #xff60) ?\|)
203 ;; Unicode equivalents of JISX0201-kana
204 (let ((range '(#xff61 . #xff9f)))
205 (modify-category-entry range ?k)
206 (modify-category-entry range ?j)
207 (modify-category-entry range ?\|))
210 (modify-category-entry '(#x3099 . #x309C) ?K)
211 (modify-category-entry '(#x30A0 . #x30FF) ?K)
212 (modify-category-entry '(#x31F0 . #x31FF) ?K)
213 (modify-category-entry '(#x30A0 . #x30FA) ?\|)
214 (modify-category-entry #x30FF ?\|)
217 (modify-category-entry '(#x3040 . #x309F) ?H)
218 (modify-category-entry '(#x3040 . #x3096) ?\|)
219 (modify-category-entry #x309F ?\|)
220 (modify-category-entry #x30A0 ?H)
221 (modify-category-entry #x30FC ?H)
225 (map-charset-chars #'modify-syntax-entry 'japanese-jisx0208 "_" #x2121 #x227E)
226 (map-charset-chars #'modify-syntax-entry 'japanese-jisx0208 "_" #x2821 #x287E)
227 (let ((chars '(?ー ?゛ ?゜ ?ヽ ?ヾ ?ゝ ?ゞ ?〃 ?仝 ?々 ?〆 ?〇)))
229 (modify-syntax-entry elt "w")))
231 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?A #x2321 #x237E)
232 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?H #x2421 #x247E)
233 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?K #x2521 #x257E)
234 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?G #x2621 #x267E)
235 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?Y #x2721 #x277E)
236 (map-charset-chars #'modify-category-entry 'japanese-jisx0208 ?C #x3021 #x7E7E)
237 (let ((chars '(?仝 ?々 ?〆 ?〇)))
239 (modify-category-entry (car chars) ?C)
240 (setq chars (cdr chars))))
244 (map-charset-chars #'modify-syntax-entry 'japanese-jisx0212 "_" #x2121 #x237E)
248 (let ((chars '(?。 ?、 ?・)))
250 (modify-syntax-entry (car chars) ".")
251 (setq chars (cdr chars))))
253 (modify-syntax-entry ?\「 "(」")
254 (modify-syntax-entry ?\」 "(「")
256 ;; Korean character set (KSC5601)
258 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?h)
260 (map-charset-chars #'modify-syntax-entry 'korean-ksc5601 "_" #x2121 #x227E)
261 (map-charset-chars #'modify-syntax-entry 'korean-ksc5601 "_" #x2621 #x277E)
262 (map-charset-chars #'modify-syntax-entry 'korean-ksc5601 "_" #x2830 #x287E)
263 (map-charset-chars #'modify-syntax-entry 'korean-ksc5601 "_" #x2930 #x297E)
264 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?A #x2330 #x2339)
265 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?A #x2341 #x235A)
266 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?A #x2361 #x237A)
267 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?G #x2521 #x257E)
268 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?H #x2A21 #x2A7E)
269 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?K #x2B21 #x2B7E)
270 (map-charset-chars #'modify-category-entry 'korean-ksc5601 ?Y #x2C21 #x2C7E)
272 ;; These are in more than one charset.
273 (let ((parens (concat "〈〉《》「」『』【】〔〕〖〗〘〙〚〛"
277 (dotimes (i (/ (length parens) 2))
278 (setq open (aref parens (* i 2))
279 close (aref parens (1+ (* i 2))))
280 (modify-syntax-entry open (format "(%c" close))
281 (modify-syntax-entry close (format ")%c" open))))
283 ;; Arabic character set
285 (let ((charsets '(arabic-iso8859-6
290 (map-charset-chars #'modify-category-entry (car charsets) ?b)
291 (setq charsets (cdr charsets))))
292 (modify-category-entry '(#x600 . #x6ff) ?b)
293 (modify-category-entry '(#xfb50 . #xfdff) ?b)
294 (modify-category-entry '(#xfe70 . #xfefe) ?b)
296 ;; Cyrillic character set (ISO-8859-5)
298 (modify-syntax-entry ?№ ".")
300 ;; Ethiopic character set
302 (modify-category-entry '(#x1200 . #x1399) ?e)
303 (modify-category-entry '(#x2d80 . #x2dde) ?e)
304 (let ((chars '(?፡ ?። ?፣ ?፤ ?፥ ?፦ ?፧ ?፨)))
306 (modify-syntax-entry (car chars) ".")
307 (setq chars (cdr chars))))
308 (map-charset-chars #'modify-category-entry 'ethiopic ?e)
310 ;; Hebrew character set (ISO-8859-8)
312 (modify-syntax-entry #x5be ".") ; MAQAF
313 (modify-syntax-entry #x5c0 ".") ; PASEQ
314 (modify-syntax-entry #x5c3 ".") ; SOF PASUQ
315 (modify-syntax-entry #x5f3 ".") ; GERESH
316 (modify-syntax-entry #x5f4 ".") ; GERSHAYIM
318 ;; Indian character set (IS 13194 and other Emacs original Indian charsets)
320 (modify-category-entry '(#x901 . #x970) ?i)
321 (map-charset-chars #'modify-category-entry 'indian-is13194 ?i)
322 (map-charset-chars #'modify-category-entry 'indian-2-column ?i)
326 (modify-category-entry '(#xe80 . #xeff) ?o)
327 (map-charset-chars #'modify-category-entry 'lao ?o)
329 (let ((deflist '(("ກ-ຮ" "w" ?0) ; consonant
330 ("ະາຳຽເ-ໄ" "w" ?1) ; vowel base
331 ("ັິ-ືົໍ" "w" ?2) ; vowel upper
332 ("ຸູ" "w" ?3) ; vowel lower
333 ("່-໋" "w" ?4) ; tone mark
334 ("ຼຽ" "w" ?9) ; semivowel lower
335 ("໐-໙" "w" ?6) ; digit
336 ("ຯໆ" "_" ?5) ; symbol
338 elm chars len syntax category to ch i)
340 (setq elm (car deflist))
341 (setq chars (car elm)
347 (if (= (aref chars i) ?-)
350 (setq ch (aref chars i)
353 (unless (string-equal syntax "w")
354 (modify-syntax-entry ch syntax))
355 (modify-category-entry ch category)
358 (setq deflist (cdr deflist))))
360 ;; Thai character set (TIS620)
362 (modify-category-entry '(#xe00 . #xe7f) ?t)
363 (map-charset-chars #'modify-category-entry 'thai-tis620 ?t)
365 (let ((deflist '(;; chars syntax category
366 ("ก-รลว-ฮ" "w" ?0) ; consonant
367 ("ฤฦะาำเ-ๅ" "w" ?1) ; vowel base
368 ("ัิ-ื็๎" "w" ?2) ; vowel upper
369 ("ุ-ฺ" "w" ?3) ; vowel lower
370 ("่-ํ" "w" ?4) ; tone mark
371 ("๐-๙" "w" ?6) ; digit
372 ("ฯๆ฿๏๚๛" "_" ?5) ; symbol
374 elm chars len syntax category to ch i)
376 (setq elm (car deflist))
377 (setq chars (car elm)
383 (if (= (aref chars i) ?-)
386 (setq ch (aref chars i)
389 (unless (string-equal syntax "w")
390 (modify-syntax-entry ch syntax))
391 (modify-category-entry ch category)
394 (setq deflist (cdr deflist))))
396 ;; Tibetan character set
398 (modify-category-entry '(#xf00 . #xfff) ?q)
399 (map-charset-chars #'modify-category-entry 'tibetan ?q)
400 (map-charset-chars #'modify-category-entry 'tibetan-1-column ?q)
402 (let ((deflist '(;; chars syntax category
403 ("ཀ-ཀྵཪ" "w" ?0) ; consonant
405 ("ིེཻོཽྀ" "w" ?2) ; upper vowel
406 ("ཾྂྃ྆྇ྈྉྊྋ" "w" ?2) ; upper modifier
407 ("྄ཱུ༙༵༷" "w" ?3) ; lower vowel/modifier
408 ("" "w" ?3) ; invisible vowel a
409 ("༠-༩༪-༳" "w" ?6) ; digit
410 ("་།-༒༔ཿ" "." ?|) ; line-break char
412 ("༈་།-༒༔ཿ༽༴" "." ?>) ; prohibition
414 ("ༀ-༊༼࿁࿂྅" "." ?<) ; prohibition
415 ("༓༕-༘༚-༟༶༸-༻༾༿྾྿-࿏" "." ?q) ; others
417 elm chars len syntax category to ch i)
419 (setq elm (car deflist))
420 (setq chars (car elm)
426 (if (= (aref chars i) ?-)
429 (setq ch (aref chars i)
432 (unless (string-equal syntax "w")
433 (modify-syntax-entry ch syntax))
434 (modify-category-entry ch category)
437 (setq deflist (cdr deflist))))
439 ;; Vietnamese character set
441 ;; To make a word with Latin characters
442 (map-charset-chars #'modify-category-entry 'vietnamese-viscii-lower ?l)
443 (map-charset-chars #'modify-category-entry 'vietnamese-viscii-lower ?v)
445 (map-charset-chars #'modify-category-entry 'vietnamese-viscii-upper ?l)
446 (map-charset-chars #'modify-category-entry 'vietnamese-viscii-upper ?v)
448 (let ((tbl (standard-case-table))
451 (let* ((char (decode-char 'vietnamese-viscii-upper i))
452 (charl (decode-char 'vietnamese-viscii-lower i))
453 (uc (encode-char char 'ucs))
454 (lc (encode-char charl 'ucs)))
455 (set-case-syntax-pair char (decode-char 'vietnamese-viscii-lower i)
457 (if uc (modify-category-entry uc ?v))
458 (if lc (modify-category-entry lc ?v)))
462 (let ((deflist '(;; chars syntax category
463 ((?ꪀ. ?ꪯ) "w" ?0) ; consonant
464 ("ꪱꪵꪶ" "w" ?1) ; vowel base
465 ((?ꪹ . ?ꪽ) "w" ?1) ; vowel base
466 ("ꪰꪲꪳꪷꪸꪾ" "w" ?2) ; vowel upper
467 ("ꪴ" "w" ?3) ; vowel lower
468 ("ꫀꫂ" "w" ?1) ; non-combining tone-mark
469 ("꪿꫁" "w" ?4) ; combining tone-mark
470 ((?ꫛ . ?꫟) "_" ?5) ; symbol
472 (dolist (elm deflist)
473 (let ((chars (car elm))
475 (category (nth 2 elm)))
478 (modify-syntax-entry chars syntax)
479 (modify-category-entry chars category))
481 (modify-syntax-entry x syntax)
482 (modify-category-entry x category))
487 ;; If bootstrapping without generated uni-*.el files, table not defined.
488 (let ((table (unicode-property-table-internal 'bidi-class)))
490 (map-char-table (lambda (key val)
492 ((memq val '(R AL RLO RLE))
493 (modify-category-entry key ?R))
494 ((memq val '(L LRE LRO))
495 (modify-category-entry key ?L))))
498 ;; Load uni-mirrored.el and uni-brackets.el if available, so that they
499 ;; get dumped into Emacs. This allows to start Emacs with
500 ;; force-load-messages in ~/.emacs, and avoid infinite recursion in
501 ;; bidi_initialize, which needs to load uni-mirrored.el and
502 ;; uni-brackets.el in order to display the "Loading" messages.
503 (unicode-property-table-internal 'mirroring)
504 (unicode-property-table-internal 'bracket-type)
508 (modify-category-entry '(#x80 . #x024F) ?l)
510 (let ((tbl (standard-case-table)) c)
514 ;; Fixme: Some of the non-word syntaxes here perhaps should be
515 ;; reviewed. (Note that the following all implicitly have word
516 ;; syntax: ¢£¤¥¨ª¯²³´¶¸¹º.) There should be a well-defined way of
517 ;; relating Unicode categories to Emacs syntax codes.
519 ;; NBSP isn't semantically interchangeable with other whitespace chars,
520 ;; so it's more like punctuation.
521 (set-case-syntax ? "." tbl)
522 (set-case-syntax ?¡ "." tbl)
523 (set-case-syntax ?¦ "_" tbl)
524 (set-case-syntax ?§ "." tbl)
525 (set-case-syntax ?© "_" tbl)
527 ;; (set-case-syntax-delims ?« ?» tbl)
529 ;; (set-case-syntax-delims ?» ?« tbl)
530 ;; So let's stay neutral and let users set these up if/when they want to.
531 (set-case-syntax ?« "." tbl)
532 (set-case-syntax ?» "." tbl)
533 (set-case-syntax ?¬ "_" tbl)
534 (set-case-syntax ? "_" tbl)
535 (set-case-syntax ?® "_" tbl)
536 (set-case-syntax ?° "_" tbl)
537 (set-case-syntax ?± "_" tbl)
538 (set-case-syntax ?µ "_" tbl)
539 (set-case-syntax ?· "_" tbl)
540 (set-case-syntax ?¼ "_" tbl)
541 (set-case-syntax ?½ "_" tbl)
542 (set-case-syntax ?¾ "_" tbl)
543 (set-case-syntax ?¿ "." tbl)
546 (set-case-syntax-pair c (+ c 32) tbl)
548 (set-case-syntax ?× "_" tbl)
549 (set-case-syntax ?ß "w" tbl)
550 (set-case-syntax ?÷ "_" tbl)
553 ;; Latin Extended-A, Latin Extended-B
556 (modify-category-entry c ?l)
559 (let ((pair-ranges '((#x0100 . #x012F)
584 (dolist (elt pair-ranges)
585 (let ((from (car elt)) (to (cdr elt)))
587 (set-case-syntax-pair from (1+ from) tbl)
588 (setq from (+ from 2))))))
590 (set-case-syntax-pair ?Ÿ ?ÿ tbl)
592 ;; In some languages, such as Turkish, U+0049 LATIN CAPITAL LETTER I
593 ;; and U+0131 LATIN SMALL LETTER DOTLESS I make a case pair, and so
594 ;; do U+0130 LATIN CAPITAL LETTER I WITH DOT ABOVE and U+0069 LATIN
597 ;; We used to set up half of those correspondence unconditionally,
598 ;; but that makes searches slow. So now we don't set up either half
599 ;; of these correspondences by default.
601 ;; (set-downcase-syntax ?İ ?i tbl)
602 ;; (set-upcase-syntax ?I ?ı tbl)
604 (set-case-syntax-pair ?Ɓ ?ɓ tbl)
605 (set-case-syntax-pair ?Ɔ ?ɔ tbl)
606 (set-case-syntax-pair ?Ɖ ?ɖ tbl)
607 (set-case-syntax-pair ?Ɗ ?ɗ tbl)
608 (set-case-syntax-pair ?Ǝ ?ǝ tbl)
609 (set-case-syntax-pair ?Ə ?ə tbl)
610 (set-case-syntax-pair ?Ɛ ?ɛ tbl)
611 (set-case-syntax-pair ?Ɠ ?ɠ tbl)
612 (set-case-syntax-pair ?Ɣ ?ɣ tbl)
613 (set-case-syntax-pair ?Ɩ ?ɩ tbl)
614 (set-case-syntax-pair ?Ɨ ?ɨ tbl)
615 (set-case-syntax-pair ?Ɯ ?ɯ tbl)
616 (set-case-syntax-pair ?Ɲ ?ɲ tbl)
617 (set-case-syntax-pair ?Ɵ ?ɵ tbl)
618 (set-case-syntax-pair ?Ʀ ?ʀ tbl)
619 (set-case-syntax-pair ?Ʃ ?ʃ tbl)
620 (set-case-syntax-pair ?Ʈ ?ʈ tbl)
621 (set-case-syntax-pair ?Ʊ ?ʊ tbl)
622 (set-case-syntax-pair ?Ʋ ?ʋ tbl)
623 (set-case-syntax-pair ?Ʒ ?ʒ tbl)
624 (set-case-syntax-pair ?DŽ ?dž tbl)
625 (set-case-syntax-pair ?Dž ?dž tbl)
626 (set-case-syntax-pair ?LJ ?lj tbl)
627 (set-case-syntax-pair ?Lj ?lj tbl)
628 (set-case-syntax-pair ?NJ ?nj tbl)
629 (set-case-syntax-pair ?Nj ?nj tbl)
631 ;; 01F0; F; 006A 030C; # LATIN SMALL LETTER J WITH CARON
632 (set-case-syntax-pair ?DZ ?dz tbl)
633 (set-case-syntax-pair ?Dz ?dz tbl)
634 (set-case-syntax-pair ?Ƕ ?ƕ tbl)
635 (set-case-syntax-pair ?Ƿ ?ƿ tbl)
636 (set-case-syntax-pair ?Ⱥ ?ⱥ tbl)
637 (set-case-syntax-pair ?Ƚ ?ƚ tbl)
638 (set-case-syntax-pair ?Ⱦ ?ⱦ tbl)
639 (set-case-syntax-pair ?Ƀ ?ƀ tbl)
640 (set-case-syntax-pair ?Ʉ ?ʉ tbl)
641 (set-case-syntax-pair ?Ʌ ?ʌ tbl)
643 ;; Latin Extended Additional
644 (modify-category-entry '(#x1e00 . #x1ef9) ?l)
648 (or (<= c #x1e94) (>= c #x1ea0))
649 (set-case-syntax-pair c (1+ c) tbl))
653 (modify-category-entry '(#x0370 . #x03ff) ?g)
656 (if (or (and (>= c #x0391) (<= c #x03a1))
657 (and (>= c #x03a3) (<= c #x03ab)))
658 (set-case-syntax-pair c (+ c 32) tbl))
662 (set-case-syntax-pair c (1+ c) tbl))
664 (set-case-syntax-pair ?Ά ?ά tbl)
665 (set-case-syntax-pair ?Έ ?έ tbl)
666 (set-case-syntax-pair ?Ή ?ή tbl)
667 (set-case-syntax-pair ?Ί ?ί tbl)
668 (set-case-syntax-pair ?Ό ?ό tbl)
669 (set-case-syntax-pair ?Ύ ?ύ tbl)
670 (set-case-syntax-pair ?Ώ ?ώ tbl)
675 (set-case-syntax-pair c (+ c #x30) tbl)
679 (modify-category-entry '(#x1f00 . #x1fff) ?g)
682 (and (<= (logand c #x000f) 7)
684 (not (memq c '(#x1f16 #x1f17 #x1f56 #x1f57
685 #x1f50 #x1f52 #x1f54 #x1f56)))
686 (/= (logand c #x00f0) #x70)
687 (set-case-syntax-pair (+ c 8) c tbl))
689 (set-case-syntax-pair ?Ᾰ ?ᾰ tbl)
690 (set-case-syntax-pair ?Ᾱ ?ᾱ tbl)
691 (set-case-syntax-pair ?Ὰ ?ὰ tbl)
692 (set-case-syntax-pair ?Ά ?ά tbl)
693 (set-case-syntax-pair ?ᾼ ?ᾳ tbl)
694 (set-case-syntax-pair ?Ὲ ?ὲ tbl)
695 (set-case-syntax-pair ?Έ ?έ tbl)
696 (set-case-syntax-pair ?Ὴ ?ὴ tbl)
697 (set-case-syntax-pair ?Ή ?ή tbl)
698 (set-case-syntax-pair ?ῌ ?ῃ tbl)
699 (set-case-syntax-pair ?Ῐ ?ῐ tbl)
700 (set-case-syntax-pair ?Ῑ ?ῑ tbl)
701 (set-case-syntax-pair ?Ὶ ?ὶ tbl)
702 (set-case-syntax-pair ?Ί ?ί tbl)
703 (set-case-syntax-pair ?Ῠ ?ῠ tbl)
704 (set-case-syntax-pair ?Ῡ ?ῡ tbl)
705 (set-case-syntax-pair ?Ὺ ?ὺ tbl)
706 (set-case-syntax-pair ?Ύ ?ύ tbl)
707 (set-case-syntax-pair ?Ῥ ?ῥ tbl)
708 (set-case-syntax-pair ?Ὸ ?ὸ tbl)
709 (set-case-syntax-pair ?Ό ?ό tbl)
710 (set-case-syntax-pair ?Ὼ ?ὼ tbl)
711 (set-case-syntax-pair ?Ώ ?ώ tbl)
712 (set-case-syntax-pair ?ῼ ?ῳ tbl)
715 (modify-category-entry '(#x0400 . #x04FF) ?y)
720 (set-case-syntax-pair c (+ c 80) tbl))
723 (set-case-syntax-pair c (+ c 32) tbl))
725 (or (and (>= c #x0460) (<= c #x0480))
726 (and (>= c #x048c) (<= c #x04be))
727 (and (>= c #x04d0) (<= c #x04f4)))
728 (set-case-syntax-pair c (1+ c) tbl))
730 (set-case-syntax-pair ?Ӂ ?ӂ tbl)
731 (set-case-syntax-pair ?Ӄ ?ӄ tbl)
732 (set-case-syntax-pair ?Ӈ ?ӈ tbl)
733 (set-case-syntax-pair ?Ӌ ?ӌ tbl)
734 (set-case-syntax-pair ?Ӹ ?ӹ tbl)
736 ;; general punctuation
739 (set-case-syntax c " " tbl)
742 (set-case-syntax c "." tbl)
744 ;; Fixme: These aren't all right:
747 (set-case-syntax c "_" tbl)
749 ;; Punctuation syntax for quotation marks (like `)
751 (set-case-syntax c "." tbl)
753 ;; Fixme: These aren't all right:
755 (set-case-syntax c "_" tbl)
758 (set-case-syntax c "." tbl)
764 (set-case-syntax-pair c (+ c #x10) tbl)
767 ;; Fixme: The following blocks might be better as symbol rather than
772 (set-case-syntax c "." tbl)
774 ;; Mathematical Operators
776 (set-case-syntax c "." tbl)
778 ;; Miscellaneous Technical
780 (set-case-syntax c "." tbl)
784 (set-case-syntax c "_" tbl)
790 (set-case-syntax-pair c (+ c 26) tbl)
791 (modify-category-entry c ?l)
792 (modify-category-entry (+ c 26) ?l)
796 (let ((pair-ranges '((#x2C80 . #x2CE2)
798 (dolist (elt pair-ranges)
799 (let ((from (car elt)) (to (cdr elt)))
801 (set-case-syntax-pair from (1+ from) tbl)
802 (setq from (+ from 2))))))
803 ;; There's no Coptic category. However, Coptic letters that are
804 ;; part of the Greek block above get the Greek category, and those
805 ;; in this block are derived from Greek letters, so let's be
806 ;; consistent about their category.
807 (modify-category-entry '(#x2C80 . #x2CFF) ?g)
812 (set-case-syntax-pair c (+ c #x20) tbl)
813 (modify-category-entry c ?l)
814 (modify-category-entry (+ c #x20) ?l)
817 ;; Combining diacritics
818 (modify-category-entry '(#x300 . #x362) ?^)
820 (modify-category-entry '(#x20d0 . #x20ff) ?^)
822 ;; Fixme: syntax for symbols &c
826 '("⁅⁆" ; U+2045 U+2046
880 (modify-syntax-entry (aref elt 0) (string ?\( (aref elt 1)))
881 (modify-syntax-entry (aref elt 1) (string ?\) (aref elt 0)))))
884 ;; For each character set, put the information of the most proper
885 ;; coding system to encode it by `preferred-coding-system' property.
887 ;; Fixme: should this be junked?
888 (let ((l '((latin-iso8859-1 . iso-latin-1)
889 (latin-iso8859-2 . iso-latin-2)
890 (latin-iso8859-3 . iso-latin-3)
891 (latin-iso8859-4 . iso-latin-4)
892 (thai-tis620 . thai-tis620)
893 (greek-iso8859-7 . greek-iso-8bit)
894 (arabic-iso8859-6 . iso-2022-7bit)
895 (hebrew-iso8859-8 . hebrew-iso-8bit)
896 (katakana-jisx0201 . japanese-shift-jis)
897 (latin-jisx0201 . japanese-shift-jis)
898 (cyrillic-iso8859-5 . cyrillic-iso-8bit)
899 (latin-iso8859-9 . iso-latin-5)
900 (japanese-jisx0208-1978 . iso-2022-jp)
901 (chinese-gb2312 . chinese-iso-8bit)
902 (chinese-gbk . chinese-gbk)
903 (gb18030-2-byte . chinese-gb18030)
904 (gb18030-4-byte-bmp . chinese-gb18030)
905 (gb18030-4-byte-smp . chinese-gb18030)
906 (gb18030-4-byte-ext-1 . chinese-gb18030)
907 (gb18030-4-byte-ext-2 . chinese-gb18030)
908 (japanese-jisx0208 . iso-2022-jp)
909 (korean-ksc5601 . iso-2022-kr)
910 (japanese-jisx0212 . iso-2022-jp)
911 (chinese-big5-1 . chinese-big5)
912 (chinese-big5-2 . chinese-big5)
913 (chinese-sisheng . iso-2022-7bit)
914 (ipa . iso-2022-7bit)
915 (vietnamese-viscii-lower . vietnamese-viscii)
916 (vietnamese-viscii-upper . vietnamese-viscii)
917 (arabic-digit . iso-2022-7bit)
918 (arabic-1-column . iso-2022-7bit)
920 (arabic-2-column . iso-2022-7bit)
921 (indian-is13194 . devanagari)
922 (indian-glyph . devanagari)
923 (tibetan-1-column . tibetan)
924 (ethiopic . iso-2022-7bit)
925 (chinese-cns11643-1 . iso-2022-cn)
926 (chinese-cns11643-2 . iso-2022-cn)
927 (chinese-cns11643-3 . iso-2022-cn)
928 (chinese-cns11643-4 . iso-2022-cn)
929 (chinese-cns11643-5 . iso-2022-cn)
930 (chinese-cns11643-6 . iso-2022-cn)
931 (chinese-cns11643-7 . iso-2022-cn)
932 (indian-2-column . devanagari)
934 (latin-iso8859-14 . iso-latin-8)
935 (latin-iso8859-15 . iso-latin-9))))
937 (put-charset-property (car (car l)) 'preferred-coding-system (cdr (car l)))
941 ;; Setup auto-fill-chars for charsets that should invoke auto-filling.
942 ;; SPACE and NEWLINE are already set.
944 (set-char-table-range auto-fill-chars '(#x3041 . #x30FF) t)
945 (set-char-table-range auto-fill-chars '(#x3400 . #x4DB5) t)
946 (set-char-table-range auto-fill-chars '(#x4e00 . #x9fbb) t)
947 (set-char-table-range auto-fill-chars '(#xF900 . #xFAFF) t)
948 (set-char-table-range auto-fill-chars '(#xFF00 . #xFF9F) t)
949 (set-char-table-range auto-fill-chars '(#x20000 . #x2FFFF) t)
952 ;;; Setting char-width-table. The default is 1.
954 ;; 0: non-spacing, enclosing combining, formatting, Hangul Jamo medial
955 ;; and final characters.
956 (let ((l '((#x0300 . #x036F)
1079 (#xE0001 . #xE01EF))))
1081 (set-char-table-range char-width-table elt 0)))
1083 ;; 2: East Asian Wide and Full-width characters.
1084 (let ((l '((#x1100 . #x115F)
1094 (#x30000 . #x3FFFF))))
1096 (set-char-table-range char-width-table elt 2)))
1098 ;; Other double width
1099 ;;(map-charset-chars
1100 ;; (lambda (range ignore) (set-char-table-range char-width-table range 2))
1102 ;; (map-charset-chars
1103 ;; (lambda (range ignore) (set-char-table-range char-width-table range 2))
1106 (lambda (range _ignore) (set-char-table-range char-width-table range 2))
1109 (lambda (range _ignore) (set-char-table-range char-width-table range 2))
1112 ;; Internal use only.
1113 ;; Alist of locale symbol vs charsets. In a language environment
1114 ;; corresponding to the locale, width of characters in the charsets is
1115 ;; set to 2. Each element has the form:
1116 ;; (LOCALE TABLE (CHARSET (FROM-CODE . TO-CODE) ...) ...)
1117 ;; LOCALE: locale symbol
1118 ;; TABLE: char-table used for char-width-table, initially nil.
1119 ;; CHARSET: character set
1120 ;; FROM-CODE, TO-CODE: range of code-points in CHARSET
1122 (defvar cjk-char-width-table-list
1123 '((ja_JP nil (japanese-jisx0208 (#x2121 . #x287E))
1124 (cp932-2-byte (#x8140 . #x879F)))
1125 (zh_CN nil (chinese-gb2312 (#x2121 . #x297E)))
1126 (zh_HK nil (big5-hkscs (#xA140 . #xA3FE) (#xC6A0 . #xC8FE)))
1127 (zh_TW nil (big5 (#xA140 . #xA3FE))
1128 (chinese-cns11643-1 (#x2121 . #x427E)))
1129 (ko_KR nil (korean-ksc5601 (#x2121 . #x2C7E)))))
1131 ;; Internal use only.
1132 ;; Setup char-width-table appropriate for a language environment
1133 ;; corresponding to LOCALE-NAME (symbol).
1135 (defun use-cjk-char-width-table (locale-name)
1136 (while (char-table-parent char-width-table)
1137 (setq char-width-table (char-table-parent char-width-table)))
1138 (let ((slot (assq locale-name cjk-char-width-table-list)))
1139 (or slot (error "Unknown locale for CJK language environment: %s"
1141 (unless (nth 1 slot)
1142 (let ((table (make-char-table nil)))
1143 (dolist (charset-info (nthcdr 2 slot))
1144 (let ((charset (car charset-info)))
1145 (dolist (code-range (cdr charset-info))
1146 (map-charset-chars #'(lambda (range _arg)
1147 (set-char-table-range table range 2))
1149 (car code-range) (cdr code-range)))))
1150 (optimize-char-table table)
1151 (set-char-table-parent table char-width-table)
1152 (setcar (cdr slot) table)))
1153 (setq char-width-table (nth 1 slot))))
1155 (defun use-default-char-width-table ()
1157 Setup char-width-table appropriate for non-CJK language environment."
1158 (while (char-table-parent char-width-table)
1159 (setq char-width-table (char-table-parent char-width-table))))
1161 (optimize-char-table (standard-case-table))
1162 (optimize-char-table (standard-syntax-table))
1165 ;; Setting char-script-table.
1167 ;; The data is compiled from Blocks.txt and Scripts.txt in the
1168 ;; "Unicode Character Database", simplified to lump together all the
1169 ;; blocks belonging to the same language. E.g., "Basic Latin",
1170 ;; "Latin-1 Supplement", "Latin Extended-A", etc. are all lumped
1171 ;; together under "latin".
1173 ;; The Unicode blocks actually extend past some of these ranges with
1174 ;; undefined codepoints.
1176 ;; Last update: http://www.unicode.org/Public/8.0.0/ucd/Blocks-8.0.0d3.txt
1177 (let ((script-list nil))
1180 '((#x0000 #x007F latin)
1181 (#x00A0 #x024F latin)
1182 (#x0250 #x02AF phonetic) ; IPA Extensions
1183 (#x02B0 #x036F latin) ; Spacing Modifiers and Diacriticals
1184 (#x0370 #x03E1 greek)
1185 (#x03E2 #x03EF coptic)
1186 (#x03F0 #x03FF greek)
1187 (#x0400 #x052F cyrillic)
1188 (#x0530 #x058F armenian)
1189 (#x0590 #x05FF hebrew)
1190 (#x0600 #x06FF arabic)
1191 (#x0700 #x074F syriac)
1192 (#x0750 #x077F arabic) ; Arabic Supplement
1193 (#x0780 #x07BF thaana)
1195 (#x0800 #x083F samaritan)
1196 (#x0840 #x085F mandaic)
1197 (#x08A0 #x08FF arabic) ; Arabic Extended-A
1198 (#x0900 #x097F devanagari)
1199 (#x0980 #x09FF bengali)
1200 (#x0A00 #x0A7F gurmukhi)
1201 (#x0A80 #x0AFF gujarati)
1202 (#x0B00 #x0B7F oriya)
1203 (#x0B80 #x0BFF tamil)
1204 (#x0C00 #x0C7F telugu)
1205 (#x0C80 #x0CFF kannada)
1206 (#x0D00 #x0D7F malayalam)
1207 (#x0D80 #x0DFF sinhala)
1208 (#x0E00 #x0E7F thai)
1210 (#x0F00 #x0FFF tibetan)
1211 (#x1000 #x109F burmese) ; Myanmar
1212 (#x10A0 #x10FF georgian)
1213 (#x1100 #x11FF hangul)
1214 (#x1200 #x139F ethiopic) ; Ethiopic and Ethiopic Supplement
1215 (#x13A0 #x13FF cherokee)
1216 (#x1400 #x167F canadian-aboriginal)
1217 (#x1680 #x169F ogham)
1218 (#x16A0 #x16FF runic)
1219 (#x1700 #x171F tagalog)
1220 (#x1720 #x173F hanunoo)
1221 (#x1740 #x175F buhid)
1222 (#x1760 #x177F tagbanwa)
1223 (#x1780 #x17FF khmer)
1224 (#x1800 #x18AF mongolian)
1225 (#x18B0 #x18FF canadian-aboriginal) ; Canadian Aboriginal Syllabics Extended
1226 (#x1900 #x194F limbu)
1227 (#x1950 #x197F tai-le)
1228 (#x1980 #x19DF tai-lue) ; New Tai Lue
1229 (#x19E0 #x19FF khmer) ; Khmer Symbols
1230 (#x1A00 #x1A1F buginese)
1231 (#x1A20 #x1AAF tai-tham)
1232 (#x1AB0 #x1AFF latin) ; Combining Diacritical Marks Extended
1233 (#x1B00 #x1B7F balinese)
1234 (#x1B80 #x1BBF sundanese)
1235 (#x1BC0 #x1BFF batak)
1236 (#x1C00 #x1C4F lepcha)
1237 (#x1C50 #x1C7F ol-chiki)
1238 (#x1CC0 #x1CCF sundanese)
1239 (#x1CD0 #x1CFF vedic)
1240 (#x1D00 #x1DBF phonetic) ; Phonetic Extensions & Supplement
1241 (#x1DC0 #x1EFF latin) ; Latin Extended Additional
1242 (#x1F00 #x1FFF greek) ; Greek Extended
1243 (#x2000 #x27FF symbol)
1244 (#x2800 #x28FF braille)
1245 (#x2900 #x2BFF symbol)
1246 (#x2C00 #x2C5F glagolitic)
1247 (#x2C60 #x2C7F latin) ; Latin Extended-C
1248 (#x2C80 #x2CFF coptic)
1249 (#x2D00 #x2D2F georgian) ; Georgian Supplement
1250 (#x2D30 #x2D7F tifinagh)
1251 (#x2D80 #x2DDF ethiopic) ; Ethiopic Extended
1252 (#x2DE0 #x2DFF cyrillic) ; Cyrillic Extended-A
1253 (#x2E00 #x2E7F symbol)
1255 (#x2FF0 #x2FFF ideographic-description)
1256 (#x3000 #x303F cjk-misc)
1257 (#x3040 #x30FF kana) ; Hiragana and Katakana
1258 (#x3100 #x312F bopomofo)
1259 (#x3130 #x318F hangul) ; Hangul Compatibility Jamo
1260 (#x3190 #x319F kanbun)
1261 (#x31A0 #x31BF bopomofo) ; Bopomofo Extended
1262 (#x31C0 #x31EF cjk-misc) ; CJK Strokes
1263 (#x31F0 #x31FF kana) ; Katakana Phonetic Extensions
1266 (#xA4D0 #xA4FF lisu)
1268 (#xA640 #xA69F cyrillic) ; Cyrillic Extended-B
1269 (#xA6A0 #xA6FF bamum)
1270 (#xA700 #xA7FF latin)
1271 (#xA800 #xA82F syloti-nagri)
1272 (#xA830 #xA83F north-indic-number)
1273 (#xA840 #xA87F phags-pa)
1274 (#xA880 #xA8DF saurashtra)
1275 (#xA8E0 #xA8FF devanagari) ; Devanagari Extended
1276 (#xA900 #xA92F kayah-li)
1277 (#xA930 #xA95F rejang)
1278 (#xA960 #xA97F hangul) ; Hangul Jamo Extended
1279 (#xA980 #xA9DF javanese)
1280 (#xA9E0 #xA9FF burmese) ; Myanmar Extended-B
1281 (#xAA00 #xAA5F cham)
1282 (#xAA60 #xAA7F burmese) ; Myanmar Extended-A
1283 (#xAA80 #xAADF tai-viet)
1284 (#xAAE0 #xAAFF meetei-mayek) ; Meetei Mayek Extensions
1285 (#xAB00 #xAB2F ethiopic) ; Ethiopic Extended-A
1286 (#xAB30 #xAB6F latin) ; Latin Extended-E
1287 (#xAB70 #xABBF cherokee) ; Cherokee Supplement
1288 (#xABC0 #xABFF meetei-mayek)
1289 (#xAC00 #xD7FF hangul)
1291 (#xFB00 #xFB06 latin) ; Latin ligatures
1292 (#xFB13 #xFB17 armenian) ; Armenian ligatures
1293 (#xFB1D #xFB4F hebrew) ; Alphabetic Presentation Forms
1294 (#xFB50 #xFDFF arabic) ; Arabic Presentation Forms-A
1295 (#xFE10 #xFE1F vertical-form)
1296 (#xFE20 #xFE2F latin) ; Combining Half Marks
1298 (#xFE50 #xFE6F symbol) ; Small Form Variants
1299 (#xFE70 #xFEFF arabic) ; Arabic Presentation Forms-B
1300 (#xFF00 #xFF60 cjk-misc)
1301 (#xFF61 #xFF9F kana)
1302 (#xFFA0 #xFFDF hangul)
1303 (#xFFE0 #xFFEF cjk-misc)
1304 (#x10000 #x100FF linear-b)
1305 (#x10100 #x1013F aegean-number)
1306 (#x10140 #x1018F ancient-greek-number)
1307 (#x10190 #x101CF ancient-symbol)
1308 (#x101D0 #x101FF phaistos-disc)
1309 (#x10280 #x1029F lycian)
1310 (#x102A0 #x102DF carian)
1311 (#x102E0 #x102FF coptic) ; Coptic Epact Numbers
1312 (#x10300 #x1032F old-italic)
1313 (#x10330 #x1034F gothic)
1314 (#x10350 #x1037F old-permic)
1315 (#x10380 #x1039F ugaritic)
1316 (#x103A0 #x103DF old-persian)
1317 (#x10400 #x1044F deseret)
1318 (#x10450 #x1047F shavian)
1319 (#x10480 #x104AF osmanya)
1320 (#x10500 #x1052F elbasan)
1321 (#x10530 #x1056F caucasian-albanian)
1322 (#x10600 #x1077F linear-a)
1323 (#x10800 #x1083F cypriot-syllabary)
1324 (#x10840 #x1085F aramaic)
1325 (#x10860 #x1087F palmyrene)
1326 (#x10880 #x108AF nabataean)
1327 (#x108E0 #x108FF hatran)
1328 (#x10900 #x1091F phoenician)
1329 (#x10920 #x1093F lydian)
1330 (#x10980 #x109FF meroitic)
1331 (#x10A00 #x10A5F kharoshthi)
1332 (#x10A60 #x10A7F old-south-arabian)
1333 (#x10A80 #x10A9F old-north-arabian)
1334 (#x10AC0 #x10AFF manichaean)
1335 (#x10B00 #x10B3F avestan)
1336 (#x10B40 #x10B5F inscriptional-parthian)
1337 (#x10B60 #x10B7F inscriptional-pahlavi)
1338 (#x10B80 #x10BAF psalter-pahlavi)
1339 (#x10C00 #x10C4F old-turkic)
1340 (#x10C80 #x10CFF old-hungarian)
1341 (#x10E60 #x10E7F rumi-number)
1342 (#x11000 #x1107F brahmi)
1343 (#x11080 #x110CF kaithi)
1344 (#x110D0 #x110FF sora-sompeng)
1345 (#x11100 #x1114F chakma)
1346 (#x11150 #x1117F mahajani)
1347 (#x11180 #x111DF sharada)
1348 (#x111E0 #x111FF sinhala-archaic-number)
1349 (#x11200 #x1124F khojki)
1350 (#x11280 #x112AF multani)
1351 (#x112B0 #x112FF khudawadi)
1352 (#x11300 #x1137F grantha)
1353 (#x11480 #x114DF tirhuta)
1354 (#x11580 #x115FF siddham)
1355 (#x11600 #x1165F modi)
1356 (#x11680 #x116CF takri)
1357 (#x11700 #x1173F ahom)
1358 (#x118A0 #x118FF warang-citi)
1359 (#x11AC0 #x11AFF pau-cin-hau)
1360 (#x12000 #x123FF cuneiform)
1361 (#x12400 #x1247F cuneiform-numbers-and-punctuation)
1362 (#x12480 #x1254F cuneiform) ; Early Dynastic Cuneiform
1363 (#x13000 #x1342F egyptian)
1364 (#x14400 #x1467F anatolian)
1365 (#x16800 #x16A3F bamum)
1366 (#x16A40 #x16A6F mro)
1367 (#x16AD0 #x16AFF bassa-vah)
1368 (#x16B00 #x16B8F pahawh-hmong)
1369 (#x16F00 #x16F9F miao)
1370 (#x1B000 #x1B0FF kana) ; Kana Supplement
1371 (#x1BC00 #x1BCAF duployan-shorthand)
1372 (#x1D000 #x1D0FF byzantine-musical-symbol)
1373 (#x1D100 #x1D1FF musical-symbol)
1374 (#x1D200 #x1D24F ancient-greek-musical-notation)
1375 (#x1D300 #x1D35F tai-xuan-jing-symbol)
1376 (#x1D360 #x1D37F counting-rod-numeral)
1377 (#x1D400 #x1D7FF mathematical)
1378 (#x1D800 #x1DAAF sutton-sign-writing)
1379 (#x1E800 #x1E8DF mende-kikakui)
1380 (#x1EE00 #x1EEFF arabic) ; Arabic Mathematical Alphabetic Symbols
1381 (#x1F000 #x1F02F mahjong-tile)
1382 (#x1F030 #x1F09F domino-tile)
1383 (#x1F0A0 #x1F0FF playing-cards)
1384 (#x1F100 #x1F1FF symbol) ; Enclosed Alphanumeric Supplement
1385 (#x1F200 #x1F2FF han) ; Enclosed Ideographic Supplement
1386 (#x1F300 #x1F9FF symbol)
1387 (#x20000 #x2A6DF han)
1388 (#x2A700 #x2CEAF han)
1389 (#x2F800 #x2FA1F han)))
1390 (set-char-table-range char-script-table
1391 (cons (car elt) (nth 1 elt)) (nth 2 elt))
1392 (or (memq (nth 2 elt) script-list)
1393 (setq script-list (cons (nth 2 elt) script-list))))
1394 (set-char-table-extra-slot char-script-table 0 (nreverse script-list)))
1397 #'(lambda (range _ignore)
1398 (set-char-table-range char-script-table range 'tibetan))
1402 ;;; Setting unicode-category-table.
1404 (when (setq unicode-category-table
1405 (unicode-property-table-internal 'general-category))
1406 (map-char-table #'(lambda (key val)
1408 (cond ((or (and (/= (aref (symbol-name val) 0) ?M)
1409 (/= (aref (symbol-name val) 0) ?C))
1411 (modify-category-entry key ?.))
1413 (modify-category-entry key ?^)))))
1414 unicode-category-table))
1416 (optimize-char-table (standard-category-table))
1419 ;; Display of glyphless characters.
1421 (defvar char-acronym-table
1422 (make-char-table 'char-acronym-table nil)
1423 "Char table of acronyms for non-graphic characters.")
1425 (let ((c0-acronyms '("NUL" "SOH" "STX" "ETX" "EOT" "ENQ" "ACK" "BEL"
1426 "BS" nil nil "VT" "FF" "CR" "SO" "SI"
1427 "DLE" "DC1" "DC2" "DC3" "DC4" "NAK" "SYN" "ETB"
1428 "CAN" "EM" "SUB" "ESC" "FC" "GS" "RS" "US")))
1430 (aset char-acronym-table i (car c0-acronyms))
1431 (setq c0-acronyms (cdr c0-acronyms))))
1433 (let ((c1-acronyms '("XXX" "XXX" "BPH" "NBH" "IND" "NEL" "SSA" "ESA"
1434 "HTS" "HTJ" "VTS" "PLD" "PLU" "R1" "SS2" "SS1"
1435 "DCS" "PU1" "PU2" "STS" "CCH" "MW" "SPA" "EPA"
1436 "SOS" "XXX" "SC1" "CSI" "ST" "OSC" "PM" "APC")))
1438 (aset char-acronym-table (+ #x0080 i) (car c1-acronyms))
1439 (setq c1-acronyms (cdr c1-acronyms))))
1441 (aset char-acronym-table #x17B4 "KIVAQ") ; KHMER VOWEL INHERENT AQ
1442 (aset char-acronym-table #x17B5 "KIVAA") ; KHMER VOWEL INHERENT AA
1443 (aset char-acronym-table #x200B "ZWSP") ; ZERO WIDTH SPACE
1444 (aset char-acronym-table #x200C "ZWNJ") ; ZERO WIDTH NON-JOINER
1445 (aset char-acronym-table #x200D "ZWJ") ; ZERO WIDTH JOINER
1446 (aset char-acronym-table #x200E "LRM") ; LEFT-TO-RIGHT MARK
1447 (aset char-acronym-table #x200F "RLM") ; RIGHT-TO-LEFT MARK
1448 (aset char-acronym-table #x202A "LRE") ; LEFT-TO-RIGHT EMBEDDING
1449 (aset char-acronym-table #x202B "RLE") ; RIGHT-TO-LEFT EMBEDDING
1450 (aset char-acronym-table #x202C "PDF") ; POP DIRECTIONAL FORMATTING
1451 (aset char-acronym-table #x202D "LRO") ; LEFT-TO-RIGHT OVERRIDE
1452 (aset char-acronym-table #x202E "RLO") ; RIGHT-TO-LEFT OVERRIDE
1453 (aset char-acronym-table #x2060 "WJ") ; WORD JOINER
1454 (aset char-acronym-table #x206A "ISS") ; INHIBIT SYMMETRIC SWAPPING
1455 (aset char-acronym-table #x206B "ASS") ; ACTIVATE SYMMETRIC SWAPPING
1456 (aset char-acronym-table #x206C "IAFS") ; INHIBIT ARABIC FORM SHAPING
1457 (aset char-acronym-table #x206D "AAFS") ; ACTIVATE ARABIC FORM SHAPING
1458 (aset char-acronym-table #x206E "NADS") ; NATIONAL DIGIT SHAPES
1459 (aset char-acronym-table #x206F "NODS") ; NOMINAL DIGIT SHAPES
1460 (aset char-acronym-table #xFEFF "ZWNBSP") ; ZERO WIDTH NO-BREAK SPACE
1461 (aset char-acronym-table #xFFF9 "IAA") ; INTERLINEAR ANNOTATION ANCHOR
1462 (aset char-acronym-table #xFFFA "IAS") ; INTERLINEAR ANNOTATION SEPARATOR
1463 (aset char-acronym-table #xFFFB "IAT") ; INTERLINEAR ANNOTATION TERMINATOR
1464 (aset char-acronym-table #x1D173 "BEGBM") ; MUSICAL SYMBOL BEGIN BEAM
1465 (aset char-acronym-table #x1D174 "ENDBM") ; MUSICAL SYMBOL END BEAM
1466 (aset char-acronym-table #x1D175 "BEGTIE") ; MUSICAL SYMBOL BEGIN TIE
1467 (aset char-acronym-table #x1D176 "END") ; MUSICAL SYMBOL END TIE
1468 (aset char-acronym-table #x1D177 "BEGSLR") ; MUSICAL SYMBOL BEGIN SLUR
1469 (aset char-acronym-table #x1D178 "ENDSLR") ; MUSICAL SYMBOL END SLUR
1470 (aset char-acronym-table #x1D179 "BEGPHR") ; MUSICAL SYMBOL BEGIN PHRASE
1471 (aset char-acronym-table #x1D17A "ENDPHR") ; MUSICAL SYMBOL END PHRASE
1472 (aset char-acronym-table #xE0001 "|->TAG") ; LANGUAGE TAG
1473 (aset char-acronym-table #xE0020 "SP TAG") ; TAG SPACE
1475 (aset char-acronym-table (+ #xE0021 i) (format " %c TAG" (+ 33 i))))
1476 (aset char-acronym-table #xE007F "->|TAG") ; CANCEL TAG
1478 (defun update-glyphless-char-display (&optional variable value)
1479 "Make the setting of `glyphless-char-display-control' take effect.
1480 This function updates the char-table `glyphless-char-display'."
1482 (set-default variable value))
1484 (let ((target (car elt))
1486 (or (memq method '(zero-width thin-space empty-box acronym hex-code))
1487 (error "Invalid glyphless character display method: %s" method))
1488 (cond ((eq target 'c0-control)
1489 (glyphless-set-char-table-range glyphless-char-display
1491 ;; Users will not expect their newlines and TABs be
1492 ;; displayed as anything but themselves, so exempt those
1493 ;; two characters from c0-control.
1494 (set-char-table-range glyphless-char-display #x9 nil)
1495 (set-char-table-range glyphless-char-display #xa nil))
1496 ((eq target 'c1-control)
1497 (glyphless-set-char-table-range glyphless-char-display
1499 ((eq target 'format-control)
1500 (when unicode-category-table
1502 #'(lambda (char category)
1503 (if (eq category 'Cf)
1504 (let ((this-method method)
1507 (setq from (car char) to (cdr char))
1508 (setq from char to char))
1510 (when (/= from #xAD)
1511 (if (eq method 'acronym)
1513 (aref char-acronym-table from)))
1514 (set-char-table-range glyphless-char-display
1516 (setq from (1+ from))))))
1517 unicode-category-table)))
1518 ((eq target 'no-font)
1519 (set-char-table-extra-slot glyphless-char-display 0 method))
1521 (error "Invalid glyphless character group: %s" target))))))
1523 (defun glyphless-set-char-table-range (chartable from to method)
1524 (if (eq method 'acronym)
1527 (set-char-table-range chartable i (aref char-acronym-table i))
1529 (set-char-table-range chartable (cons from to) method)))
1531 ;;; Control of displaying glyphless characters.
1532 (defcustom glyphless-char-display-control
1533 '((format-control . thin-space)
1534 (no-font . hex-code))
1535 "List of directives to control display of glyphless characters.
1537 Each element has the form (GROUP . METHOD), where GROUP is a
1538 symbol specifying the character group, and METHOD is a symbol
1539 specifying the method of displaying characters belonging to that
1542 GROUP must be one of these symbols:
1543 `c0-control': U+0000..U+001F, but excluding newline and TAB.
1544 `c1-control': U+0080..U+009F.
1545 `format-control': Characters of Unicode General Category `Cf',
1546 such as U+200C (ZWNJ), U+200E (LRM), but
1547 excluding characters that have graphic images,
1548 such as U+00AD (SHY).
1549 `no-font': characters for which no suitable font is found.
1550 For character terminals, characters that cannot
1551 be encoded by `terminal-coding-system'.
1553 METHOD must be one of these symbols:
1554 `zero-width': don't display.
1555 `thin-space': display a thin (1-pixel width) space. On character
1556 terminals, display as 1-character space.
1557 `empty-box': display an empty box.
1558 `acronym': display an acronym of the character in a box. The
1559 acronym is taken from `char-acronym-table', which see.
1560 `hex-code': display the hexadecimal character code in a box.
1562 Do not set its value directly from Lisp; the value takes effect
1563 only via a custom `:set'
1564 function (`update-glyphless-char-display'), which updates
1565 `glyphless-char-display'."
1567 :type '(alist :key-type (symbol :tag "Character Group")
1568 :value-type (symbol :tag "Display Method"))
1569 :options '((c0-control
1570 (choice (const :tag "Don't display" zero-width)
1571 (const :tag "Display as thin space" thin-space)
1572 (const :tag "Display as empty box" empty-box)
1573 (const :tag "Display acronym" acronym)
1574 (const :tag "Display hex code in a box" hex-code)))
1576 (choice (const :tag "Don't display" zero-width)
1577 (const :tag "Display as thin space" thin-space)
1578 (const :tag "Display as empty box" empty-box)
1579 (const :tag "Display acronym" acronym)
1580 (const :tag "Display hex code in a box" hex-code)))
1582 (choice (const :tag "Don't display" zero-width)
1583 (const :tag "Display as thin space" thin-space)
1584 (const :tag "Display as empty box" empty-box)
1585 (const :tag "Display acronym" acronym)
1586 (const :tag "Display hex code in a box" hex-code)))
1588 (choice (const :tag "Don't display" zero-width)
1589 (const :tag "Display as thin space" thin-space)
1590 (const :tag "Display as empty box" empty-box)
1591 (const :tag "Display acronym" acronym)
1592 (const :tag "Display hex code in a box" hex-code))))
1593 :set 'update-glyphless-char-display
1597 ;;; Setting word boundary.
1599 (setq word-combining-categories
1605 (setq word-separating-categories ; (2-byte character sets)
1606 '((?H . ?K) ; Hiragana - Katakana
1613 ;;; characters.el ends here