Mercurial > emacs
annotate lisp/international/kinsoku.el @ 94037:d864a5e618e0
(Fexpand_file_name): Tighten the scope of `p' and `o' vars.
Relocate `nm' after calling DECODE_FILE, in case the GC was run.
author | Stefan Monnier <monnier@iro.umontreal.ca> |
---|---|
date | Sat, 12 Apr 2008 05:12:18 +0000 |
parents | 1e3a407766b9 |
children | 889bc336b89b |
rev | line source |
---|---|
38414
67b464da13ec
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
23492
diff
changeset
|
1 ;;; kinsoku.el --- `Kinsoku' processing funcs -*- coding: iso-2022-7bit; -*- |
17052 | 2 |
79709 | 3 ;; Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
74544 | 4 ;; Free Software Foundation, Inc. |
74605
6ee41fdd69ff
Update AIST copyright years.
Kenichi Handa <handa@m17n.org>
parents:
74544
diff
changeset
|
5 ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, |
79709 | 6 ;; 2005, 2006, 2007, 2008 |
62274 | 7 ;; National Institute of Advanced Industrial Science and Technology (AIST) |
8 ;; Registration Number H14PRO021 | |
17052 | 9 |
18377
8b4a66c66dd6
Change copyright notice.
Richard M. Stallman <rms@gnu.org>
parents:
17759
diff
changeset
|
10 ;; Keywords: mule, kinsoku |
17052 | 11 |
12 ;; This file is part of GNU Emacs. | |
13 | |
14 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
15 ;; it under the terms of the GNU General Public License as published by | |
78310
2daf9c28b3a4
Restore comma mistakenly removed in last change.
Glenn Morris <rgm@gnu.org>
parents:
78301
diff
changeset
|
16 ;; the Free Software Foundation; either version 3, or (at your option) |
17052 | 17 ;; any later version. |
18 | |
19 ;; GNU Emacs is distributed in the hope that it will be useful, | |
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 ;; GNU General Public License for more details. | |
23 | |
24 ;; You should have received a copy of the GNU General Public License | |
17071 | 25 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
64085 | 26 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
27 ;; Boston, MA 02110-1301, USA. | |
17052 | 28 |
29 ;;; Commentary: | |
30 | |
31 ;; `Kinsoku' processing is to prohibit specific characters to be | |
32 ;; placed at beginning of line or at end of line. Characters not to | |
33 ;; be placed at beginning and end of line have character category `>' | |
34 ;; and `<' respectively. This restriction is dissolved by making a | |
35 ;; line longer or shorter. | |
36 ;; | |
37 ;; `Kinsoku' is a Japanese word which originally means ordering to | |
38 ;; stay in one place, and is used for the text processing described | |
39 ;; above in the context of text formatting. | |
40 | |
41 ;;; Code: | |
42 | |
43 (defvar kinsoku-limit 4 | |
44 "How many more columns we can make lines longer by `kinsoku' processing. | |
45 The value 0 means there's no limitation.") | |
46 | |
47 ;; Setting character category `>' for characters which should not be | |
48 ;; placed at beginning of line. | |
49 (let* ((kinsoku-bol | |
50 (concat | |
51 ;; ASCII | |
52 "!)-_~}]:;',.?" | |
17759
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
53 ;; Latin JISX0201 |
23196 | 54 ;; Instead of putting Latin JISX0201 string directly, we |
17759
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
55 ;; generate the string as below to avoid character |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
56 ;; unification problem. |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
57 (let* ((str1 "!)-_~}]:;',.?") |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
58 (len (length str1)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
59 (idx 0) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
60 (str2 "") |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
61 ch) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
62 (while (< idx len) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
63 (setq ch (make-char 'latin-jisx0201 (aref str1 idx)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
64 str2 (concat str2 (char-to-string ch)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
65 idx (1+ idx))) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
66 str2) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
67 ;; Katakana JISX0201 |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
68 "(I!#'()*+,-./0^_(B" |
17052 | 69 ;; Japanese JISX0208 |
70 "$B!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>(B\ | |
71 $B!?!@!A!B!C!D!E!G!I!K!M!O!Q!S!U!W!Y![!k!l!m!n(B\ | |
72 $B$!$#$%$'$)$C$c$e$g$n%!%#%%%'%)%C%c%e%g%n%u%v(B" | |
73 ;; Chinese GB2312 | |
74 "$A!"!##.#,!$!%!&!'!(!)!*!+!,!-!/!1#)!3!5!7!9!;!=(B\ | |
75 $A!?#;#:#?#!!@!A!B!C!c!d!e!f#/#\#"#_#~#|(e(B" | |
76 ;; Chinese BIG5 | |
77 "$(0!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2(B\ | |
78 $(0!3!4!5!6!7!8!9!:!;!<!=!?!A!C!E!G!I!K(B\ | |
23431 | 79 $(0!M!O!Q!S!U!W!Y![!]!_!a!c!e!g!i!k!q(B\ |
17052 | 80 $(0"#"$"%"&"'"(")"*"+","2"3"4"j"k"l"x%7(B")) |
81 (len (length kinsoku-bol)) | |
82 (idx 0) | |
83 ch) | |
84 (while (< idx len) | |
20843 | 85 (setq ch (aref kinsoku-bol idx) |
86 idx (1+ idx)) | |
17052 | 87 (modify-category-entry ch ?>))) |
88 | |
89 ;; Setting character category `<' for characters which should not be | |
90 ;; placed at end of line. | |
91 (let* ((kinsoku-eol | |
92 (concat | |
93 ;; ASCII | |
94 "({[`" | |
17759
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
95 ;; Latin JISX0201 |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
96 ;; See the comment above. |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
97 (let* ((str1 "({[`") |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
98 (len (length str1)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
99 (idx 0) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
100 (str2 "") |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
101 ch) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
102 (while (< idx len) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
103 (setq ch (make-char 'latin-jisx0201 (aref str1 idx)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
104 str2 (concat str2 (char-to-string ch)) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
105 idx (1+ idx))) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
106 str2) |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
107 ;; JISX0201 Katakana |
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
108 "(I"(B" |
17052 | 109 ;; Japanese JISX0208 |
110 "$B!F!H!J!L!N!P!R!T!V!X!Z!k!l!m!n!w!x(B\ | |
111 $A!.!0#"#(!2!4!6!8!:!<!>!c!d!e#@!f!l(B" | |
112 ;; Chinese GB2312 | |
113 "$A(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(h(B\ | |
67333
99f4a941eb41
(kinsoku-longer): Check eolp, not eobp.
Kenichi Handa <handa@m17n.org>
parents:
64085
diff
changeset
|
114 \$(0!>!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b(B" |
17052 | 115 ;; Chinese BIG5 |
116 "$(0!d!f!h!j!k!q!p"i"j"k"n"x$u$v$w$x$y$z${(B\ | |
117 $(0$|$}$~%!%"%#%$%%%&%'%(%)%*%+%:(B")) | |
118 (len (length kinsoku-eol)) | |
119 (idx 0) | |
120 ch) | |
121 (while (< idx len) | |
20843 | 122 (setq ch (aref kinsoku-eol idx) |
123 idx (1+ idx)) | |
17052 | 124 (modify-category-entry ch ?<))) |
125 | |
126 ;; Try to resolve `kinsoku' restriction by making the current line longer. | |
127 (defun kinsoku-longer () | |
52362
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
128 (let ((pos-and-column |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
129 (save-excursion |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
130 (forward-char 1) |
67333
99f4a941eb41
(kinsoku-longer): Check eolp, not eobp.
Kenichi Handa <handa@m17n.org>
parents:
64085
diff
changeset
|
131 (while (and (not (eolp)) |
52362
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
132 (or (aref (char-category-set (following-char)) ?>) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
133 ;; protect non-kinsoku words |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
134 (not (or (eq (preceding-char) ? ) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
135 (aref (char-category-set (preceding-char)) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
136 ?|))))) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
137 (forward-char 1)) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
138 (cons (point) (current-column))))) |
17052 | 139 (if (or (<= kinsoku-limit 0) |
140 (< (cdr pos-and-column) (+ (current-fill-column) kinsoku-limit))) | |
141 (goto-char (car pos-and-column))))) | |
142 | |
143 ;; Try to resolve `kinsoku' restriction by making the current line shorter. | |
17759
ef12c80a8a1e
Set category of kinsoku-bol and kinsoku-eol for
Kenichi Handa <handa@m17n.org>
parents:
17071
diff
changeset
|
144 ;; The line can't be broken before the buffer position LINEBEG. |
17052 | 145 (defun kinsoku-shorter (linebeg) |
146 (let ((pos (save-excursion | |
147 (forward-char -1) | |
52362
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
148 (while (and |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
149 (< linebeg (point)) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
150 (or (aref (char-category-set (preceding-char)) ?<) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
151 (aref (char-category-set (following-char)) ?>) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
152 ;; protect non-kinsoku words |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
153 (not (or (eq (preceding-char) ? ) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
154 (aref (char-category-set (preceding-char)) |
28bd29f9f91c
(kinsoku-longer, kinsoku-shorter): Do not choose a
Kenichi Handa <handa@m17n.org>
parents:
49598
diff
changeset
|
155 ?|))))) |
17052 | 156 (forward-char -1)) |
157 (point)))) | |
158 (if (< linebeg pos) | |
159 (goto-char pos)))) | |
160 | |
161 ;;;###autoload | |
162 (defun kinsoku (linebeg) | |
163 "Go to a line breaking position near point by doing `kinsoku' processing. | |
164 LINEBEG is a buffer position we can't break a line before. | |
165 | |
166 `Kinsoku' processing is to prohibit specific characters to be placed | |
167 at beginning of line or at end of line. Characters not to be placed | |
168 at beginning and end of line have character category `>' and `<' | |
169 respectively. This restriction is dissolved by making a line longer or | |
170 shorter. | |
171 | |
172 `Kinsoku' is a Japanese word which originally means ordering to stay | |
173 in one place, and is used for the text processing described above in | |
174 the context of text formatting." | |
23492
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
175 (if enable-kinsoku |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
176 (if (or (and |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
177 ;; The character after point can't be placed at beginning |
49598
0d8b17d428b5
Trailing whitepace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents:
38414
diff
changeset
|
178 ;; of line. |
23492
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
179 (aref (char-category-set (following-char)) ?>) |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
180 ;; We at first try to dissolve this situation by making a |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
181 ;; line longer. If it fails, then try making a line |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
182 ;; shorter. |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
183 (not (kinsoku-longer))) |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
184 ;; The character before point can't be placed at end of line. |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
185 (aref (char-category-set (preceding-char)) ?<)) |
dc49b662b956
(kinsoku): Check the variable enable-kinsoku.
Kenichi Handa <handa@m17n.org>
parents:
23431
diff
changeset
|
186 (kinsoku-shorter linebeg)))) |
17052 | 187 |
93975
1e3a407766b9
Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
79709
diff
changeset
|
188 ;; arch-tag: e6b036bc-9e5b-4e9f-a22c-4ed04e37777e |
38414
67b464da13ec
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
23492
diff
changeset
|
189 ;;; kinsoku.el ends here |