diff options
Diffstat (limited to 'lisp/textmodes/fill.el')
-rw-r--r-- | lisp/textmodes/fill.el | 65 |
1 files changed, 35 insertions, 30 deletions
diff --git a/lisp/textmodes/fill.el b/lisp/textmodes/fill.el index e5b3a64db84..6aae79a825f 100644 --- a/lisp/textmodes/fill.el +++ b/lisp/textmodes/fill.el @@ -368,15 +368,29 @@ and `fill-nobreak-invisible'." (looking-at paragraph-start)))) (run-hook-with-args-until-success 'fill-nobreak-predicate))))) -;; Put `fill-find-break-point-function' property to charsets which -;; require special functions to find line breaking point. -(dolist (pair '((katakana-jisx0201 . kinsoku) - (chinese-gb2312 . kinsoku) - (japanese-jisx0208 . kinsoku) - (japanese-jisx0212 . kinsoku) - (chinese-big5-1 . kinsoku) - (chinese-big5-2 . kinsoku))) - (put-charset-property (car pair) 'fill-find-break-point-function (cdr pair))) +(defvar fill-find-break-point-function-table (make-char-table nil) + "Char-table of special functions to find line breaking point.") + +(defvar fill-nospace-between-words-table (make-char-table nil) + "Char-table of characters that don't use space between words.") + +(progn + ;; Register `kinsoku' for scripts HAN, KANA, BOPOMPFO, and CJK-MISS. + ;; Also tell that they don't use space between words. + (map-char-table + #'(lambda (key val) + (when (memq val '(han kana bopomofo cjk-misc)) + (set-char-table-range fill-find-break-point-function-table + key 'kinsoku) + (set-char-table-range fill-nospace-between-words-table + key t))) + char-script-table) + ;; Do the same thing also for full width characters and half + ;; width kana variants. + (set-char-table-range fill-find-break-point-function-table + '(#xFF01 . #xFFE6) 'kinsoku) + (set-char-table-range fill-nospace-between-words-table + '(#xFF01 . #xFFE6) 'kinsoku)) (defun fill-find-break-point (limit) "Move point to a proper line breaking position of the current line. @@ -387,15 +401,9 @@ after or before a non-ASCII character. If the charset of the character has the property `fill-find-break-point-function', this function calls the property value as a function with one arg LINEBEG. If the charset has no such property, do nothing." - (let* ((ch (following-char)) - (charset (char-charset ch)) - func) - (if (eq charset 'ascii) - (setq ch (preceding-char) - charset (char-charset ch))) - (if (charsetp charset) - (setq func - (get-charset-property charset 'fill-find-break-point-function))) + (let ((func (or + (aref fill-find-break-point-function-table (following-char)) + (aref fill-find-break-point-function-table (preceding-char))))) (if (and func (fboundp func)) (funcall func limit)))) @@ -454,14 +462,13 @@ Point is moved to just past the fill prefix on the first line." (goto-char from) (if enable-multibyte-characters ;; Delete unnecessay newlines surrounded by words. The - ;; character category `|' means that we can break a line - ;; at the character. And, charset property - ;; `nospace-between-words' tells how to concatenate - ;; words. If the value is non-nil, never put spaces - ;; between words, thus delete a newline between them. - ;; If the value is nil, delete a newline only when a - ;; character preceding a newline has text property - ;; `nospace-between-words'. + ;; character category `|' means that we can break a line at the + ;; character. And, char-table + ;; `fill-nospace-between-words-table' tells how to concatenate + ;; words. If a character has non-nil value in the table, never + ;; put spaces between words, thus delete a newline between them. + ;; Otherwise, delete a newline only when a character preceding a + ;; newline has non-nil value in that table. (while (search-forward "\n" to t) (if (get-text-property (match-beginning 0) 'fill-space) (replace-match (get-text-property (match-beginning 0) 'fill-space)) @@ -469,10 +476,8 @@ Point is moved to just past the fill prefix on the first line." (next (following-char))) (if (and (or (aref (char-category-set next) ?|) (aref (char-category-set prev) ?|)) - (or (get-charset-property (char-charset prev) - 'nospace-between-words) - (get-text-property (1- (match-beginning 0)) - 'nospace-between-words))) + (or (aref fill-nospace-between-words-table next) + (aref fill-nospace-between-words-table prev))) (delete-char -1)))))) (goto-char from) |