Commit | Line | Data |
---|---|---|
60370d40 | 1 | ;;; kinsoku.el --- `Kinsoku' processing funcs -*- coding: iso-2022-7bit; -*- |
4ed46869 | 2 | |
e3fe4da0 | 3 | ;; Copyright (C) 1997, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008 |
d4877ac1 | 4 | ;; Free Software Foundation, Inc. |
7976eda0 | 5 | ;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, |
e3fe4da0 | 6 | ;; 2005, 2006, 2007, 2008 |
2fd125a3 KH |
7 | ;; National Institute of Advanced Industrial Science and Technology (AIST) |
8 | ;; Registration Number H14PRO021 | |
4ed46869 | 9 | |
fa526c4a | 10 | ;; Keywords: mule, kinsoku |
4ed46869 KH |
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 | |
d7142f3e | 16 | ;; the Free Software Foundation; either version 3, or (at your option) |
4ed46869 KH |
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 | |
369314dc | 25 | ;; along with GNU Emacs; see the file COPYING. If not, write to the |
3a35cf56 LK |
26 | ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
27 | ;; Boston, MA 02110-1301, USA. | |
4ed46869 KH |
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 | "!)-_~}]:;',.?" | |
a09244e6 | 53 | ;; Latin JISX0201 |
e8dd0160 | 54 | ;; Instead of putting Latin JISX0201 string directly, we |
a09244e6 KH |
55 | ;; generate the string as below to avoid character |
56 | ;; unification problem. | |
57 | (let* ((str1 "!)-_~}]:;',.?") | |
58 | (len (length str1)) | |
59 | (idx 0) | |
60 | (str2 "") | |
61 | ch) | |
62 | (while (< idx len) | |
63 | (setq ch (make-char 'latin-jisx0201 (aref str1 idx)) | |
64 | str2 (concat str2 (char-to-string ch)) | |
65 | idx (1+ idx))) | |
66 | str2) | |
67 | ;; Katakana JISX0201 | |
68 | "\e(I!#'()*+,-./0^_\e(B" | |
4ed46869 KH |
69 | ;; Japanese JISX0208 |
70 | "\e$B!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2!3!4!5!6!7!8!9!:!;!<!=!>\e(B\ | |
71 | \e$B!?!@!A!B!C!D!E!G!I!K!M!O!Q!S!U!W!Y![!k!l!m!n\e(B\ | |
72 | \e$B$!$#$%$'$)$C$c$e$g$n%!%#%%%'%)%C%c%e%g%n%u%v\e(B" | |
73 | ;; Chinese GB2312 | |
74 | "\e$A!"!##.#,!$!%!&!'!(!)!*!+!,!-!/!1#)!3!5!7!9!;!=\e(B\ | |
75 | \e$A!?#;#:#?#!!@!A!B!C!c!d!e!f#/#\#"#_#~#|(e\e(B" | |
76 | ;; Chinese BIG5 | |
77 | "\e$(0!"!#!$!%!&!'!(!)!*!+!,!-!.!/!0!1!2\e(B\ | |
78 | \e$(0!3!4!5!6!7!8!9!:!;!<!=!?!A!C!E!G!I!K\e(B\ | |
4c0f6426 | 79 | \e$(0!M!O!Q!S!U!W!Y![!]!_!a!c!e!g!i!k!q\e(B\ |
4ed46869 KH |
80 | \e$(0"#"$"%"&"'"(")"*"+","2"3"4"j"k"l"x%7\e(B")) |
81 | (len (length kinsoku-bol)) | |
82 | (idx 0) | |
83 | ch) | |
84 | (while (< idx len) | |
4a027a0d KH |
85 | (setq ch (aref kinsoku-bol idx) |
86 | idx (1+ idx)) | |
4ed46869 KH |
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 | "({[`" | |
a09244e6 KH |
95 | ;; Latin JISX0201 |
96 | ;; See the comment above. | |
97 | (let* ((str1 "({[`") | |
98 | (len (length str1)) | |
99 | (idx 0) | |
100 | (str2 "") | |
101 | ch) | |
102 | (while (< idx len) | |
103 | (setq ch (make-char 'latin-jisx0201 (aref str1 idx)) | |
104 | str2 (concat str2 (char-to-string ch)) | |
105 | idx (1+ idx))) | |
106 | str2) | |
107 | ;; JISX0201 Katakana | |
108 | "\e(I"\e(B" | |
4ed46869 KH |
109 | ;; Japanese JISX0208 |
110 | "\e$B!F!H!J!L!N!P!R!T!V!X!Z!k!l!m!n!w!x\e(B\ | |
111 | \e$A!.!0#"#(!2!4!6!8!:!<!>!c!d!e#@!f!l\e(B" | |
112 | ;; Chinese GB2312 | |
113 | "\e$A(E(F(G(H(I(J(K(L(M(N(O(P(Q(R(S(T(U(V(W(X(Y(h\e(B\ | |
522d8129 | 114 | \\e$(0!>!@!B!D!F!H!J!L!N!P!R!T!V!X!Z!\!^!`!b\e(B" |
4ed46869 KH |
115 | ;; Chinese BIG5 |
116 | "\e$(0!d!f!h!j!k!q!p"i"j"k"n"x$u$v$w$x$y$z${\e(B\ | |
117 | \e$(0$|$}$~%!%"%#%$%%%&%'%(%)%*%+%:\e(B")) | |
118 | (len (length kinsoku-eol)) | |
119 | (idx 0) | |
120 | ch) | |
121 | (while (< idx len) | |
4a027a0d KH |
122 | (setq ch (aref kinsoku-eol idx) |
123 | idx (1+ idx)) | |
4ed46869 KH |
124 | (modify-category-entry ch ?<))) |
125 | ||
126 | ;; Try to resolve `kinsoku' restriction by making the current line longer. | |
127 | (defun kinsoku-longer () | |
acafeff7 KH |
128 | (let ((pos-and-column |
129 | (save-excursion | |
130 | (forward-char 1) | |
522d8129 | 131 | (while (and (not (eolp)) |
acafeff7 KH |
132 | (or (aref (char-category-set (following-char)) ?>) |
133 | ;; protect non-kinsoku words | |
134 | (not (or (eq (preceding-char) ? ) | |
135 | (aref (char-category-set (preceding-char)) | |
136 | ?|))))) | |
137 | (forward-char 1)) | |
138 | (cons (point) (current-column))))) | |
4ed46869 KH |
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. | |
a09244e6 | 144 | ;; The line can't be broken before the buffer position LINEBEG. |
4ed46869 KH |
145 | (defun kinsoku-shorter (linebeg) |
146 | (let ((pos (save-excursion | |
147 | (forward-char -1) | |
acafeff7 KH |
148 | (while (and |
149 | (< linebeg (point)) | |
150 | (or (aref (char-category-set (preceding-char)) ?<) | |
151 | (aref (char-category-set (following-char)) ?>) | |
152 | ;; protect non-kinsoku words | |
153 | (not (or (eq (preceding-char) ? ) | |
154 | (aref (char-category-set (preceding-char)) | |
155 | ?|))))) | |
4ed46869 KH |
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." | |
11e60d92 KH |
175 | (if enable-kinsoku |
176 | (if (or (and | |
177 | ;; The character after point can't be placed at beginning | |
a1506d29 | 178 | ;; of line. |
11e60d92 KH |
179 | (aref (char-category-set (following-char)) ?>) |
180 | ;; We at first try to dissolve this situation by making a | |
181 | ;; line longer. If it fails, then try making a line | |
182 | ;; shorter. | |
183 | (not (kinsoku-longer))) | |
184 | ;; The character before point can't be placed at end of line. | |
185 | (aref (char-category-set (preceding-char)) ?<)) | |
186 | (kinsoku-shorter linebeg)))) | |
4ed46869 | 187 | |
cbee283d | 188 | ;; arch-tag: e6b036bc-9e5b-4e9f-a22c-4ed04e37777e |
60370d40 | 189 | ;;; kinsoku.el ends here |