]> code.delx.au - gnu-emacs/blobdiff - lisp/textmodes/fill.el
Merge from emacs--devo--0
[gnu-emacs] / lisp / textmodes / fill.el
index 6a0eb7a42cc0f6b71070c32a8386cf24bcb60342..27c425de4483d9297c6b0c2c3e6eb69657ca2612 100644 (file)
@@ -374,15 +374,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.
@@ -393,15 +407,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))))
 
@@ -460,14 +468,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))
@@ -475,10 +482,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)