annotate lisp/composite.el @ 95767:efe53e2a05b0

Correct copyright years to reflect the original newsticker.el from which most of this code was extracted, not the year it was moved into this file. Header formatting fix.
author Glenn Morris <rgm@gnu.org>
date Tue, 10 Jun 2008 03:21:37 +0000
parents e22dd2392947
children 66839d3799fe
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37232
diff changeset
1 ;;; composite.el --- support character composition
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
2
79721
73661ddc7ac7 Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78299
diff changeset
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
73661ddc7ac7 Add 2008 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 78299
diff changeset
4 ;; 2008
67658
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 64530
diff changeset
5 ;; National Institute of Advanced Industrial Science and Technology (AIST)
547f2b420666 Copyright fixed
Kenichi Handa <handa@m17n.org>
parents: 64530
diff changeset
6 ;; Registration Number H14PRO021
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
7
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
8 ;; Keywords: mule, multilingual, character composition
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
9
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
11
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92026
diff changeset
12 ;; GNU Emacs is free software: you can redistribute it and/or modify
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92026
diff changeset
14 ;; the Free Software Foundation, either version 3 of the License, or
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92026
diff changeset
15 ;; (at your option) any later version.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
16
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
21
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
22 ;; You should have received a copy of the GNU General Public License
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 92026
diff changeset
23 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
24
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37232
diff changeset
25 ;;; Commentary:
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37232
diff changeset
26
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
27 ;;; Code:
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
28
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
29 (defconst reference-point-alist
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
30 '((tl . 0) (tc . 1) (tr . 2)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
31 (Bl . 3) (Bc . 4) (Br . 5)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
32 (bl . 6) (bc . 7) (br . 8)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
33 (cl . 9) (cc . 10) (cr . 11)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
34 (top-left . 0) (top-center . 1) (top-right . 2)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
35 (base-left . 3) (base-center . 4) (base-right . 5)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
36 (bottom-left . 6) (bottom-center . 7) (bottom-right . 8)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
37 (center-left . 9) (center-center . 10) (center-right . 11)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
38 ;; For backward compatibility...
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
39 (ml . 3) (mc . 10) (mr . 5)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
40 (mid-left . 3) (mid-center . 10) (mid-right . 5))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
41 "Alist of symbols vs integer codes of glyph reference points.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
42 A glyph reference point symbol is to be used to specify a composition
89497
76c9d23be7a1 Doc fixes.
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
43 rule in COMPONENTS argument to such functions as `compose-region'.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
44
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
45 Meanings of glyph reference point codes are as follows:
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
46
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
47 0----1----2 <---- ascent 0:tl or top-left
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
48 | | 1:tc or top-center
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
49 | | 2:tr or top-right
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
50 | | 3:Bl or base-left 9:cl or center-left
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
51 9 10 11 <---- center 4:Bc or base-center 10:cc or center-center
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
52 | | 5:Br or base-right 11:cr or center-right
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
53 --3----4----5-- <-- baseline 6:bl or bottom-left
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
54 | | 7:bc or bottom-center
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
55 6----7----8 <---- descent 8:br or bottom-right
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
56
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
57 Glyph reference point symbols are to be used to specify composition
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
58 rule of the form \(GLOBAL-REF-POINT . NEW-REF-POINT), where
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
59 GLOBAL-REF-POINT is a reference point in the overall glyphs already
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
60 composed, and NEW-REF-POINT is a reference point in the new glyph to
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
61 be added.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
62
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
63 For instance, if GLOBAL-REF-POINT is `br' (bottom-right) and
37232
cebd635be09b (reference-point-alist): Doc fix.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 35075
diff changeset
64 NEW-REF-POINT is `tc' (top-center), the overall glyph is updated as
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
65 follows (the point `*' corresponds to both reference points):
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
66
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
67 +-------+--+ <--- new ascent
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
68 | | |
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
69 | global| |
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
70 | glyph | |
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
71 -- | | |-- <--- baseline \(doesn't change)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
72 +----+--*--+
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
73 | | new |
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
74 | |glyph|
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
75 +----+-----+ <--- new descent
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
76
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
77 A composition rule may have the form \(GLOBAL-REF-POINT
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
78 NEW-REF-POINT XOFF YOFF), where XOFF and YOFF specifies how much
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
79 to shift NEW-REF-POINT from GLOBAL-REF-POINT. In this case, XOFF
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
80 and YOFF are integers in the range -100..100 representing the
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
81 shifting percentage against the font size.")
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
82
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
83
56985
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
84 ;;;###autoload
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
85 (defun encode-composition-rule (rule)
56985
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
86 "Encode composition rule RULE into an integer value.
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
87 RULE is a cons of global and new reference point symbols
64530
87bf9c446836 (compose-string, encode-composition-rule, compose-last-chars):
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
88 \(see `reference-point-alist')."
56985
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
89
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
90 ;; This must be compatible with C macro COMPOSITION_ENCODE_RULE
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
91 ;; defined in composite.h.
5eac7cd6d213 (encode-composition-rule): Add autoload cooky.
Kenichi Handa <handa@m17n.org>
parents: 54433
diff changeset
92
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
93 (if (and (integerp rule) (< rule 144))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
94 ;; Already encoded.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
95 rule
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
96 (if (consp rule)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
97 (let ((gref (car rule))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
98 (nref (cdr rule))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
99 xoff yoff)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
100 (if (consp nref) ; (GREF NREF XOFF YOFF)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
101 (progn
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
102 (setq xoff (nth 1 nref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
103 yoff (nth 2 nref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
104 nref (car nref))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
105 (or (and (>= xoff -100) (<= xoff 100)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
106 (>= yoff -100) (<= yoff 100))
92026
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
107 (error "Invalid composition rule: %s" rule))
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
108 (setq xoff (+ xoff 128) yoff (+ yoff 128)))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
109 ;; (GREF . NREF)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
110 (setq xoff 0 yoff 0))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
111 (or (integerp gref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
112 (setq gref (cdr (assq gref reference-point-alist))))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
113 (or (integerp nref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
114 (setq nref (cdr (assq nref reference-point-alist))))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
115 (or (and (>= gref 0) (< gref 12) (>= nref 0) (< nref 12))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
116 (error "Invalid composition rule: %S" rule))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
117 (logior (lsh xoff 16) (lsh yoff 8) (+ (* gref 12) nref)))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
118 (error "Invalid composition rule: %S" rule))))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
119
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
120 ;; Decode encoded composition rule RULE-CODE. The value is a cons of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
121 ;; global and new reference point symbols.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
122 ;; This must be compatible with C macro COMPOSITION_DECODE_RULE
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
123 ;; defined in composite.h.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
124
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
125 (defun decode-composition-rule (rule-code)
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
126 (or (and (natnump rule-code) (< rule-code #x1000000))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
127 (error "Invalid encoded composition rule: %S" rule-code))
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
128 (let ((xoff (lsh rule-code -16))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
129 (yoff (logand (lsh rule-code -8) #xFF))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
130 gref nref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
131 (setq rule-code (logand rule-code #xFF)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
132 gref (car (rassq (/ rule-code 12) reference-point-alist))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
133 nref (car (rassq (% rule-code 12) reference-point-alist)))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
134 (or (and gref (symbolp gref) nref (symbolp nref))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
135 (error "Invalid composition rule code: %S" rule-code))
89722
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
136 (if (and (= xoff 0) (= yoff 0))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
137 (cons gref nref)
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
138 (setq xoff (- xoff 128) yoff (- yoff 128))
eee9d99444cc (reference-point-alist): Doc fixed.
Kenichi Handa <handa@m17n.org>
parents: 89664
diff changeset
139 (list gref xoff yoff nref))))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
140
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
141 ;; Encode composition rules in composition components COMPONENTS. The
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
142 ;; value is a copy of COMPONENTS, where composition rules (cons of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
143 ;; global and new glyph reference point symbols) are replaced with
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
144 ;; encoded composition rules. Optional 2nd argument NOCOPY non-nil
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
145 ;; means don't make a copy but modify COMPONENTS directly.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
146
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
147 (defun encode-composition-components (components &optional nocopy)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
148 (or nocopy
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
149 (setq components (copy-sequence components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
150 (if (vectorp components)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
151 (let ((len (length components))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
152 (i 1))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
153 (while (< i len)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
154 (aset components i
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
155 (encode-composition-rule (aref components i)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
156 (setq i (+ i 2))))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
157 (let ((tail (cdr components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
158 (while tail
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
159 (setcar tail
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
160 (encode-composition-rule (car tail)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
161 (setq tail (nthcdr 2 tail)))))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
162 components)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
163
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
164 ;; Decode composition rule codes in composition components COMPONENTS.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
165 ;; The value is a copy of COMPONENTS, where composition rule codes are
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
166 ;; replaced with composition rules (cons of global and new glyph
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
167 ;; reference point symbols). Optional 2nd argument NOCOPY non-nil
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
168 ;; means don't make a copy but modify COMPONENTS directly.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
169 ;; It is assumed that COMPONENTS is a vector and is for rule-base
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
170 ;; composition, thus (2N+1)th elements are rule codes.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
171
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
172 (defun decode-composition-components (components &optional nocopy)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
173 (or nocopy
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
174 (setq components (copy-sequence components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
175 (let ((len (length components))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
176 (i 1))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
177 (while (< i len)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
178 (aset components i
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
179 (decode-composition-rule (aref components i)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
180 (setq i (+ i 2))))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
181 components)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
182
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
183 (defun compose-region (start end &optional components modification-func)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
184 "Compose characters in the current region.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
185
46963
4427c4b0ed3c *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 46513
diff changeset
186 Characters are composed relatively, i.e. composed by overstricking or
4427c4b0ed3c *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 46513
diff changeset
187 stacking depending on ascent, descent and other properties.
4427c4b0ed3c *** empty log message ***
Kenichi Handa <handa@m17n.org>
parents: 46513
diff changeset
188
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
189 When called from a program, expects these four arguments.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
190
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
191 First two arguments START and END are positions (integers or markers)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
192 specifying the region.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
193
89497
76c9d23be7a1 Doc fixes.
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
194 Optional 3rd argument COMPONENTS, if non-nil, is a character, a string
76c9d23be7a1 Doc fixes.
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
195 or a vector or list of integers and rules.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
196
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
197 If it is a character, it is an alternate character to display instead
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
198 of the text in the region.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
199
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
200 If it is a string, the elements are alternate characters.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
201
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
202 If it is a vector or list, it is a sequence of alternate characters and
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
203 composition rules, where (2N)th elements are characters and (2N+1)th
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
204 elements are composition rules to specify how to compose (2N+2)th
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
205 elements with previously composed N glyphs.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
206
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
207 A composition rule is a cons of global and new glyph reference point
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
208 symbols. See the documentation of `reference-point-alist' for more
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
209 detail.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
210
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
211 Optional 4th argument MODIFICATION-FUNC is a function to call to
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
212 adjust the composition when it gets invalid because of a change of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
213 text in the composition."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
214 (interactive "r")
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
215 (let ((modified-p (buffer-modified-p))
81073
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
216 (inhibit-read-only t))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
217 (if (or (vectorp components) (listp components))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
218 (setq components (encode-composition-components components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
219 (compose-region-internal start end components modification-func)
54433
a5520bf073bb (compose-region): Use restore-buffer-modified-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
220 (restore-buffer-modified-p modified-p)))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
221
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
222 (defun decompose-region (start end)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
223 "Decompose text in the current region.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
224
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
225 When called from a program, expects two arguments,
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
226 positions (integers or markers) specifying the region."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
227 (interactive "r")
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
228 (let ((modified-p (buffer-modified-p))
81073
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
229 (inhibit-read-only t))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
230 (remove-text-properties start end '(composition nil))
81073
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
231 (restore-buffer-modified-p modified-p)))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
232
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
233 (defun compose-string (string &optional start end components modification-func)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
234 "Compose characters in string STRING.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
235
88808
8219830269aa (compose-string): Doc fix.
Dave Love <fx@gnu.org>
parents: 38414
diff changeset
236 The return value is STRING with the `composition' property put on all
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
237 the characters in it.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
238
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
239 Optional 2nd and 3rd arguments START and END specify the range of
64530
87bf9c446836 (compose-string, encode-composition-rule, compose-last-chars):
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
240 STRING to be composed. They default to the beginning and the end of
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
241 STRING respectively.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
242
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
243 Optional 4th argument COMPONENTS, if non-nil, is a character or a
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
244 sequence (vector, list, or string) of integers. See the function
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
245 `compose-region' for more detail.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
246
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
247 Optional 5th argument MODIFICATION-FUNC is a function to call to
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
248 adjust the composition when it gets invalid because of a change of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
249 text in the composition."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
250 (if (or (vectorp components) (listp components))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
251 (setq components (encode-composition-components components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
252 (or start (setq start 0))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
253 (or end (setq end (length string)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
254 (compose-string-internal string start end components modification-func)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
255 string)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
256
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
257 (defun decompose-string (string)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
258 "Return STRING where `composition' property is removed."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
259 (remove-text-properties 0 (length string) '(composition nil) string)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
260 string)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
261
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
262 (defun compose-chars (&rest args)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
263 "Return a string from arguments in which all characters are composed.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
264 For relative composition, arguments are characters.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
265 For rule-based composition, Mth \(where M is odd) arguments are
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
266 characters, and Nth \(where N is even) arguments are composition rules.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
267 A composition rule is a cons of glyph reference points of the form
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
268 \(GLOBAL-REF-POINT . NEW-REF-POINT). See the documentation of
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
269 `reference-point-alist' for more detail."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
270 (let (str components)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
271 (if (consp (car (cdr args)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
272 ;; Rule-base composition.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
273 (let ((len (length args))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
274 (tail (encode-composition-components args 'nocopy)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
275
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
276 (while tail
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
277 (setq str (cons (car tail) str))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
278 (setq tail (nthcdr 2 tail)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
279 (setq str (concat (nreverse str))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
280 components args))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
281 ;; Relative composition.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
282 (setq str (concat args)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
283 (compose-string-internal str 0 (length str) components)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
284
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
285 (defun find-composition (pos &optional limit string detail-p)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
286 "Return information about a composition at or nearest to buffer position POS.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
287
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
288 If the character at POS has `composition' property, the value is a list
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
289 of FROM, TO, and VALID-P.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
290
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
291 FROM and TO specify the range of text that has the same `composition'
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
292 property, VALID-P is non-nil if and only if this composition is valid.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
293
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
294 If there's no composition at POS, and the optional 2nd argument LIMIT
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
295 is non-nil, search for a composition toward LIMIT.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
296
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
297 If no composition is found, return nil.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
298
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
299 Optional 3rd argument STRING, if non-nil, is a string to look for a
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
300 composition in; nil means the current buffer.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
301
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
302 If a valid composition is found and the optional 4th argument DETAIL-P
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
303 is non-nil, the return value is a list of FROM, TO, COMPONENTS,
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
304 RELATIVE-P, MOD-FUNC, and WIDTH.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
305
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
306 COMPONENTS is a vector of integers, the meaning depends on RELATIVE-P.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
307
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
308 RELATIVE-P is t if the composition method is relative, else nil.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
309
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
310 If RELATIVE-P is t, COMPONENTS is a vector of characters to be
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
311 composed. If RELATIVE-P is nil, COMPONENTS is a vector of characters
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
312 and composition rules as described in `compose-region'.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
313
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
314 MOD-FUNC is a modification function of the composition.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
315
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
316 WIDTH is a number of columns the composition occupies on the screen."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
317 (let ((result (find-composition-internal pos limit string detail-p)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
318 (if (and detail-p result (nth 2 result) (not (nth 3 result)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
319 ;; This is a valid rule-base composition.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
320 (decode-composition-components (nth 2 result) 'nocopy))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
321 result))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
322
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
323
33244
59edd748e69a (composition-function-table): Variable declaration
Kenichi Handa <handa@m17n.org>
parents: 30485
diff changeset
324 (defun compose-chars-after (pos &optional limit object)
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
325 "Compose characters in current buffer after position POS.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
326
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
327 It looks up the char-table `composition-function-table' (which
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
328 see) by a character at POS, and compose characters after POS
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
329 according to the contents of `composition-function-table'.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
330
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
331 Optional 2nd arg LIMIT, if non-nil, limits characters to compose.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
332
33244
59edd748e69a (composition-function-table): Variable declaration
Kenichi Handa <handa@m17n.org>
parents: 30485
diff changeset
333 Optional 3rd arg OBJECT, if non-nil, is a string that contains the
89497
76c9d23be7a1 Doc fixes.
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
334 text to compose. In that case, POS and LIMIT index into the string.
33244
59edd748e69a (composition-function-table): Variable declaration
Kenichi Handa <handa@m17n.org>
parents: 30485
diff changeset
335
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
336 This function is the default value of `compose-chars-after-function'."
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
337 (let ((tail (aref composition-function-table (char-after pos)))
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
338 (font-obj (and (display-multi-font-p)
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
339 (and (not (stringp object))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
340 (font-at pos (selected-window)))))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
341 pattern func result)
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
342 (or limit
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
343 (setq limit (if (stringp object) (length object) (point-max))))
94955
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
344 (when (and font-obj tail)
30485
5551289a9329 (compose-chars-after): Preserve match data.
Kenichi Handa <handa@m17n.org>
parents: 29551
diff changeset
345 (save-match-data
5551289a9329 (compose-chars-after): Preserve match data.
Kenichi Handa <handa@m17n.org>
parents: 29551
diff changeset
346 (save-excursion
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
347 (while tail
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
348 (if (functionp (car tail))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
349 (setq pattern nil func (car tail))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
350 (setq pattern (car (car tail))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
351 func (cdr (car tail))))
30485
5551289a9329 (compose-chars-after): Preserve match data.
Kenichi Handa <handa@m17n.org>
parents: 29551
diff changeset
352 (goto-char pos)
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
353 (if pattern
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
354 (if (and (if (stringp object)
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
355 (eq (string-match pattern object) 0)
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
356 (looking-at pattern))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
357 (<= (match-end 0) limit))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
358 (setq result
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
359 (funcall func pos (match-end 0) font-obj object)))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
360 (setq result (funcall func pos limit font-obj object)))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
361 (if result (setq tail nil))))))
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
362 result))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
363
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
364 (defun compose-last-chars (args)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
365 "Compose last characters.
35075
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
366 The argument is a parameterized event of the form
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
367 \(compose-last-chars N COMPONENTS),
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
368 where N is the number of characters before point to compose,
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
369 COMPONENTS, if non-nil, is the same as the argument to `compose-region'
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
370 \(which see). If it is nil, `compose-chars-after' is called,
64530
87bf9c446836 (compose-string, encode-composition-rule, compose-last-chars):
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
371 and that function finds a proper rule to compose the target characters.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
372 This function is intended to be used from input methods.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
373 The global keymap binds special event `compose-last-chars' to this
35075
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
374 function. Input method may generate an event (compose-last-chars N COMPONENTS)
64530
87bf9c446836 (compose-string, encode-composition-rule, compose-last-chars):
Juanma Barranquero <lekktu@gmail.com>
parents: 64091
diff changeset
375 after a sequence of character events."
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
376 (interactive "e")
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
377 (let ((chars (nth 1 args)))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
378 (if (and (numberp chars)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
379 (>= (- (point) (point-min)) chars))
35075
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
380 (if (nth 2 args)
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
381 (compose-region (- (point) chars) (point) (nth 2 args))
f49c90fa95d7 (compose-last-chars): New argument COMPONENTS. It
Kenichi Handa <handa@m17n.org>
parents: 33244
diff changeset
382 (compose-chars-after (- (point) chars) (point))))))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
383
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
384 (global-set-key [compose-last-chars] 'compose-last-chars)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
385
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
386
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
387 ;;; Automatic character composition.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
388
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
389 (defvar composition-function-table
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
390 (make-char-table nil)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
391 "Char table of functions for automatic character composition.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
392 For each character that has to be composed automatically with
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
393 preceding and/or following characters, this char table contains
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
394 a function to call to compose that character.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
395
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
396 An element, if non-nil, is FUNC or an alist of PATTERNs vs FUNCs,
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
397 where PATTERNs are regular expressions and FUNCs are functions.
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
398 If the element is FUNC, FUNC itself determines the region to
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
399 compose.
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
400
91861
d42d584a8a30 (composition-function-table): Doc fix.
Glenn Morris <rgm@gnu.org>
parents: 91327
diff changeset
401 Each function is called with 4 arguments, FROM, TO, FONT-OBJECT,
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
402 and STRING.
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
403
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
404 If STRING is nil, FROM and TO are positions specifying the region
92026
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
405 matching with PATTERN in the current buffer, and the function has
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
406 to compose character in that region (possibly with characters
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
407 preceding FROM). FONT-OBJECT may be nil if not
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
408 available (e.g. for the case of terminal). The return value of
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
409 the function is the end position where characters are composed,
92026
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
410 or nil if no composition is made.
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
411
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
412 Otherwise, STRING is a string, and FROM and TO are indices into
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
413 the string. In this case, the function has to compose a
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
414 character in the string. The others are the same as above.
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
415
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
416 See also the documentation of `auto-composition-mode'.")
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
417
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
418 ;; Copied from font-lock.el.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
419 (eval-when-compile
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
420 ;; Borrowed from lazy-lock.el.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
421 ;; We use this to preserve or protect things when modifying text properties.
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
422 (defmacro save-buffer-state (varlist &rest body)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
423 "Bind variables according to VARLIST and eval BODY restoring buffer state."
89307
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
424 `(let* ,(append varlist
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
425 '((modified (buffer-modified-p)) (buffer-undo-list t)
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
426 (inhibit-read-only t) (inhibit-point-motion-hooks t)
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
427 (inhibit-modification-hooks t)
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
428 deactivate-mark buffer-file-name buffer-file-truename))
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
429 ,@body
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
430 (unless modified
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
431 (restore-buffer-modified-p nil))))
89497
76c9d23be7a1 Doc fixes.
Dave Love <fx@gnu.org>
parents: 89483
diff changeset
432 ;; Fixme: This makes bootstrapping fail with this error.
89307
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
433 ;; Symbol's function definition is void: eval-defun
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
434 ;;(def-edebug-spec save-buffer-state let)
2cf77d6e4261 Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89290
diff changeset
435 )
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
436
89651
65f1f8091f15 (auto-compose-chars): Don't do unnecessary save-exclusion and
Kenichi Handa <handa@m17n.org>
parents: 89608
diff changeset
437 (put 'save-buffer-state 'lisp-indent-function 1)
65f1f8091f15 (auto-compose-chars): Don't do unnecessary save-exclusion and
Kenichi Handa <handa@m17n.org>
parents: 89608
diff changeset
438
91296
391d41e86eda (terminal-composition-function): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 91276
diff changeset
439 (defun terminal-composition-function (from to font-object string)
90637
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
440 "General composition function used on terminal.
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
441 Non-spacing characters are composed with the preceding spacing
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
442 character. All non-spacing characters has this function in
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
443 `terminal-composition-function-table'."
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
444 (let ((pos (1+ from)))
90637
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
445 (if string
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
446 (progn
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
447 (while (and (< pos to)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
448 (= (aref char-width-table (aref string pos)) 0))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
449 (setq pos (1+ pos)))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
450 (if (> from 0)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
451 (compose-string string (1- from) pos)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
452 (compose-string string from pos
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
453 (concat " " (buffer-substring from pos)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
454 (while (and (< pos to)
90637
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
455 (= (aref char-width-table (char-after pos)) 0))
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
456 (setq pos (1+ pos)))
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
457 (if (> from (point-min))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
458 (compose-region (1- from) pos (buffer-substring from pos))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
459 (compose-region from pos
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
460 (concat " " (buffer-substring from pos)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
461 pos))
90637
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
462
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
463 (defvar terminal-composition-function-table
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
464 (let ((table (make-char-table nil)))
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
465 (map-char-table
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
466 #'(lambda (key val)
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
467 (if (= val 0) (set-char-table-range table key
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
468 'terminal-composition-function)))
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
469 char-width-table)
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
470 table)
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
471 "Char table of functions for automatic character composition on terminal.
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
472 This is like `composition-function-table' but used when Emacs is running
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
473 on a terminal.")
042336f13176 (terminal-composition-function): New function.
Kenichi Handa <handa@m17n.org>
parents: 90627
diff changeset
474
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
475 (defun auto-compose-chars (from to window string)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
476 "Compose characters in the region between FROM and TO.
91152
6a5d0cc191af (auto-compose-chars): Argument font-object changed
Kenichi Handa <handa@m17n.org>
parents: 90996
diff changeset
477 WINDOW is a window displaying the current buffer.
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
478 If STRING is non-nil, it is a string, and FROM and TO are indices
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
479 into the string. In that case, compose characters in the string.
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
480
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
481 This function is the default value of `auto-composition-function' (which see)."
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
482 (save-buffer-state nil
89659
91f056b94e70 (auto-compose-chars): Fix previous change.
Kenichi Handa <handa@m17n.org>
parents: 89651
diff changeset
483 (save-excursion
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
484 (save-restriction
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
485 (save-match-data
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
486 (let ((table (if (display-graphic-p)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
487 composition-function-table
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
488 terminal-composition-function-table))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
489 (start from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
490 (setq to (or (text-property-any (1+ from) to 'auto-composed t
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
491 string)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
492 to))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
493 (if string
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
494 (while (< from to)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
495 (let* ((ch (aref string from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
496 (elt (aref table ch))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
497 font-obj newpos)
94955
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
498 (when (and elt
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
499 (setq font-obj (font-at from window string)))
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
500 (if (functionp elt)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
501 (setq newpos (funcall elt from to font-obj string))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
502 (while (and elt
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
503 (or (not (eq (string-match (caar elt) string
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
504 from)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
505 from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
506 (not (setq newpos
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
507 (funcall (cdar elt) from
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
508 (match-end 0)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
509 font-obj string)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
510 (setq elt (cdr elt)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
511 (if (and newpos (> newpos from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
512 (setq from newpos)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
513 (setq from (1+ from)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
514 (narrow-to-region from to)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
515 (while (< from to)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
516 (let* ((ch (char-after from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
517 (elt (aref table ch))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
518 func pattern font-obj newpos)
94955
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
519 (when (and elt
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
520 (setq font-obj (font-at from window)))
91276
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
521 (if (functionp elt)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
522 (setq newpos (funcall elt from to font-obj nil))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
523 (goto-char from)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
524 (while (and elt
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
525 (or (not (looking-at (caar elt)))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
526 (not (setq newpos
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
527 (funcall (cdar elt) from
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
528 (match-end 0)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
529 font-obj nil)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
530 (setq elt (cdr elt)))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
531 (if (and newpos (> newpos from))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
532 (setq from newpos)
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
533 (setq from (1+ from))))))
1d8d51129d26 (composition-function-table): Fix docstring.
Kenichi Handa <handa@m17n.org>
parents: 91227
diff changeset
534 (put-text-property start to 'auto-composed t string)))))))
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
535
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
536 (make-variable-buffer-local 'auto-composition-function)
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
537
90307
a2899387f787 (auto-composition-mode): Add autoload cookie.
Kenichi Handa <handa@m17n.org>
parents: 90306
diff changeset
538 ;;;###autoload
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
539 (define-minor-mode auto-composition-mode
92026
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
540 "Toggle Auto Composition mode.
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
541 With ARG, turn Auto Composition mode off if and only if ARG is a non-positive
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
542 number; if ARG is nil, toggle Auto Composition mode; anything else turns Auto
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
543 Composition on.
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
544
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
545 When Auto Composition is enabled, text characters are automatically composed
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
546 by functions registered in `composition-function-table' (which see).
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
547
92026
4ad14ee0d40a (encode-composition-rule): Fix typo in error message.
Glenn Morris <rgm@gnu.org>
parents: 92000
diff changeset
548 You can use `global-auto-composition-mode' to turn on
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
549 Auto Composition mode in all buffers (this is the default)."
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
550 nil nil nil
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
551 (if noninteractive
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
552 (setq auto-composition-mode nil))
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
553 (cond (auto-composition-mode
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
554 (add-hook 'after-change-functions 'auto-composition-after-change nil t)
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
555 (setq auto-composition-function 'auto-compose-chars))
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
556 (t
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
557 (remove-hook 'after-change-functions 'auto-composition-after-change t)
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
558 (setq auto-composition-function nil)))
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
559 (save-buffer-state nil
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
560 (save-restriction
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
561 (widen)
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
562 (remove-text-properties (point-min) (point-max) '(auto-composed nil))
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
563 (decompose-region (point-min) (point-max)))))
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
564
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
565 (defun auto-composition-after-change (start end old-len)
90315
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
566 (save-buffer-state nil
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
567 (if (< start (point-min))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
568 (setq start (point-min)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
569 (if (> end (point-max))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
570 (setq end (point-max)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
571 (when (and auto-composition-mode (not memory-full))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
572 (let (func1 func2)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
573 (when (and (> start (point-min))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
574 (setq func2 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
575 (char-after (1- start))))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
576 (or (= start (point-max))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
577 (not (setq func1 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
578 (char-after start))))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
579 (eq func1 func2)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
580 (setq start (1- start)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
581 func1 func2)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
582 (while (eq func1 func2)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
583 (if (> start (point-min))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
584 (setq start (1- start)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
585 func2 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
586 (char-after start)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
587 (setq func2 nil))))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
588 (when (and (< end (point-max))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
589 (setq func2 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
590 (char-after end)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
591 (or (= end (point-min))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
592 (not (setq func1 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
593 (char-after (1- end)))))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
594 (eq func1 func2)))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
595 (setq end (1+ end)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
596 func1 func2)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
597 (while (eq func1 func2)
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
598 (if (< end (point-max))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
599 (setq func2 (aref composition-function-table
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
600 (char-after end))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
601 end (1+ end))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
602 (setq func2 nil))))
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
603 (if (< start end)
90612
e3f4e9ea5df6 (auto-composition-after-change): Remove
Kenichi Handa <handa@m17n.org>
parents: 90543
diff changeset
604 (remove-text-properties start end '(auto-composed nil)))))))
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
605
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
606 (defun turn-on-auto-composition-if-enabled ()
90315
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
607 (if enable-multibyte-characters
7ddbac913d1a (auto-composition-after-change): Use
Kenichi Handa <handa@m17n.org>
parents: 90307
diff changeset
608 (auto-composition-mode 1)))
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
609
90307
a2899387f787 (auto-composition-mode): Add autoload cookie.
Kenichi Handa <handa@m17n.org>
parents: 90306
diff changeset
610 ;;;###autoload
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
611 (define-global-minor-mode global-auto-composition-mode
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
612 auto-composition-mode turn-on-auto-composition-if-enabled
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
613 :extra-args (dummy)
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
614 :initialize 'custom-initialize-safe-default
90627
f13e98b07b9c (global-auto-composition-mode): Make the initial
Kenichi Handa <handa@m17n.org>
parents: 90612
diff changeset
615 :init-value (not noninteractive)
90306
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
616 :group 'auto-composition
696f125c3c6a (auto-composition-function): Make it buffer local.
Kenichi Handa <handa@m17n.org>
parents: 90261
diff changeset
617 :version "23.1")
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
618
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
619 (defun toggle-auto-composition (&optional arg)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
620 "Change whether automatic character composition is enabled in this buffer.
94734
6fbc8341e153 (toggle-auto-composition): Don't use `iff' in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 94678
diff changeset
621 With arg, enable it if and only if arg is positive."
89290
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
622 (interactive "P")
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
623 (let ((enable (if (null arg) (not auto-composition-function)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
624 (> (prefix-numeric-value arg) 0))))
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
625 (if enable
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
626 (kill-local-variable 'auto-composition-function)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
627 (make-local-variable 'auto-composition-function)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
628 (setq auto-composition-function nil)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
629 (save-buffer-state nil
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
630 (save-restriction
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
631 (widen)
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
632 (decompose-region (point-min) (point-max)))))
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
633
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
634 (save-buffer-state nil
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
635 (save-restriction
adbc95471ef8 Remove all autoload cookies.
Kenichi Handa <handa@m17n.org>
parents: 88808
diff changeset
636 (widen)
90612
e3f4e9ea5df6 (auto-composition-after-change): Remove
Kenichi Handa <handa@m17n.org>
parents: 90543
diff changeset
637 (remove-text-properties (point-min) (point-max)
e3f4e9ea5df6 (auto-composition-after-change): Remove
Kenichi Handa <handa@m17n.org>
parents: 90543
diff changeset
638 '(auto-composed nil))))))
89528
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
639
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
640 (defun auto-compose-region (from to)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
641 "Force automatic character composition on the region FROM and TO."
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
642 (save-excursion
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
643 (if (get-text-property from 'auto-composed)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
644 (setq from (next-single-property-change from 'auto-composed nil to)))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
645 (goto-char from)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
646 (let ((modified-p (buffer-modified-p))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
647 (inhibit-read-only '(composition auto-composed))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
648 (stop (next-single-property-change (point) 'auto-composed nil to)))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
649 (while (< (point) to)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
650 (if (= (point) stop)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
651 (progn
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
652 (goto-char (next-single-property-change (point)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
653 'auto-composed nil to))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
654 (setq stop (next-single-property-change (point)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
655 'auto-composed nil to)))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
656 (let ((func (aref composition-function-table (following-char)))
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
657 (font-obj (and (display-multi-font-p)
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
658 (font-at (point) (selected-window))))
89528
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
659 (pos (point)))
94955
e22dd2392947 (compose-chars-after): Assume that WINDOW is always non-nil.
Kenichi Handa <handa@m17n.org>
parents: 94734
diff changeset
660 (if (and (functionp func) font-obj)
92000
501d20267e59 (compose-chars-after): Fix arguments for a function
Kenichi Handa <handa@m17n.org>
parents: 91861
diff changeset
661 (goto-char (funcall func (point) to font-obj nil)))
89528
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
662 (if (<= (point) pos)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
663 (forward-char 1)))))
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
664 (put-text-property from to 'auto-composed t)
c75e3c6b608a (auto-compose-region): New function.
Kenichi Handa <handa@m17n.org>
parents: 89497
diff changeset
665 (set-buffer-modified-p modified-p))))
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
666
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
667
81073
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
668 ;; The following codes are only for backward compatibility with Emacs
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
669 ;; 20.4 and earlier.
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
670
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
671 (defun decompose-composite-char (char &optional type with-composition-rule)
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
672 "Convert CHAR to string.
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
673
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
674 If optional 2nd arg TYPE is non-nil, it is `string', `list', or
49512
6a0305153436 (decompose-composite-char): Fix docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 46963
diff changeset
675 `vector'. In this case, CHAR is converted to string, list of CHAR, or
6a0305153436 (decompose-composite-char): Fix docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 46963
diff changeset
676 vector of CHAR respectively.
6a0305153436 (decompose-composite-char): Fix docstring.
Juanma Barranquero <lekktu@gmail.com>
parents: 46963
diff changeset
677 Optional 3rd arg WITH-COMPOSITION-RULE is ignored."
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
678 (cond ((or (null type) (eq type 'string)) (char-to-string char))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
679 ((eq type 'list) (list char))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
680 (t (vector char))))
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
681
29521
4ad26302d559 (decompose-composite-char): Declare it as obsolete.
Kenichi Handa <handa@m17n.org>
parents: 26880
diff changeset
682 (make-obsolete 'decompose-composite-char 'char-to-string "21.1")
4ad26302d559 (decompose-composite-char): Declare it as obsolete.
Kenichi Handa <handa@m17n.org>
parents: 26880
diff changeset
683
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
684
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 49588
diff changeset
685
81073
12cb550b10e4 (compose-region, decompose-region):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 75347
diff changeset
686 ;; arch-tag: ee703d77-1723-45d4-a31f-e9f0f867aa33
26880
98564c5250e4 New file.
Kenichi Handa <handa@m17n.org>
parents:
diff changeset
687 ;;; composite.el ends here