2021-01-25 22:58:19 -05:00
|
|
|
|
;;; kinsoku.el --- `Kinsoku' processing funcs -*- lexical-binding: t; -*-
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
2024-01-02 09:47:10 +08:00
|
|
|
|
;; Copyright (C) 1997, 2001-2024 Free Software Foundation, Inc.
|
2006-12-13 01:13:58 +00:00
|
|
|
|
;; Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
|
2011-01-02 15:50:46 -08:00
|
|
|
|
;; 2005, 2006, 2007, 2008, 2009, 2010, 2011
|
2005-05-13 06:03:46 +00:00
|
|
|
|
;; National Institute of Advanced Industrial Science and Technology (AIST)
|
|
|
|
|
;; Registration Number H14PRO021
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
1997-06-22 08:57:18 +00:00
|
|
|
|
;; Keywords: mule, kinsoku
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
|
2008-05-06 04:29:13 +00:00
|
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 04:29:13 +00:00
|
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
;; (at your option) any later version.
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
|
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;; GNU General Public License for more details.
|
|
|
|
|
|
|
|
|
|
;; You should have received a copy of the GNU General Public License
|
2017-09-13 15:52:52 -07:00
|
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
|
|
;; `Kinsoku' processing is to prohibit specific characters to be
|
|
|
|
|
;; placed at beginning of line or at end of line. Characters not to
|
|
|
|
|
;; be placed at beginning and end of line have character category `>'
|
|
|
|
|
;; and `<' respectively. This restriction is dissolved by making a
|
|
|
|
|
;; line longer or shorter.
|
|
|
|
|
;;
|
|
|
|
|
;; `Kinsoku' is a Japanese word which originally means ordering to
|
|
|
|
|
;; stay in one place, and is used for the text processing described
|
|
|
|
|
;; above in the context of text formatting.
|
|
|
|
|
|
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
|
|
(defvar kinsoku-limit 4
|
|
|
|
|
"How many more columns we can make lines longer by `kinsoku' processing.
|
|
|
|
|
The value 0 means there's no limitation.")
|
|
|
|
|
|
|
|
|
|
;; Setting character category `>' for characters which should not be
|
|
|
|
|
;; placed at beginning of line.
|
|
|
|
|
(let* ((kinsoku-bol
|
|
|
|
|
(concat
|
|
|
|
|
;; ASCII
|
|
|
|
|
"!)-_~}]:;',.?"
|
1997-05-12 06:56:23 +00:00
|
|
|
|
;; Latin JISX0201
|
1998-09-06 14:31:49 +00:00
|
|
|
|
;; Instead of putting Latin JISX0201 string directly, we
|
1997-05-12 06:56:23 +00:00
|
|
|
|
;; generate the string as below to avoid character
|
|
|
|
|
;; unification problem.
|
|
|
|
|
(let* ((str1 "!)-_~}]:;',.?")
|
|
|
|
|
(len (length str1))
|
|
|
|
|
(idx 0)
|
|
|
|
|
(str2 "")
|
|
|
|
|
ch)
|
|
|
|
|
(while (< idx len)
|
|
|
|
|
(setq ch (make-char 'latin-jisx0201 (aref str1 idx))
|
|
|
|
|
str2 (concat str2 (char-to-string ch))
|
|
|
|
|
idx (1+ idx)))
|
|
|
|
|
str2)
|
|
|
|
|
;; Katakana JISX0201
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"。」ァィゥェォャュョッー゙゚"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Japanese JISX0208
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"、。,.・:;?!゛゜´`¨^ ̄_ヽヾゝゞ〃仝々〆〇ー—‐\
|
|
|
|
|
/\〜‖|…‥’”)〕]}〉》」』】°′″℃\
|
|
|
|
|
ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮヵヶ"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Chinese GB2312
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"、。.,・ˉˇ¨〃々―~‖…’”)〕〉》」』〗\
|
|
|
|
|
】;:?!±×÷∶°′″℃/\"_ ̄|ㄥ"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Chinese BIG5
|
2019-01-07 21:18:40 -05:00
|
|
|
|
",、。.‧;:?!︰…‥﹐﹑﹒·﹔\
|
|
|
|
|
﹕﹖﹗|–︱—︳╴︴﹏)︶}︸〕︺】\
|
|
|
|
|
︼》︾〉﹀」﹂』﹄﹚﹜﹞’”〞′〃\
|
|
|
|
|
¯ ̄_ˍ﹉﹊﹍﹎﹋﹌×÷±℃℉﹩°ㄥ"))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(len (length kinsoku-bol))
|
|
|
|
|
(idx 0)
|
|
|
|
|
ch)
|
|
|
|
|
(while (< idx len)
|
1998-02-04 11:25:47 +00:00
|
|
|
|
(setq ch (aref kinsoku-bol idx)
|
|
|
|
|
idx (1+ idx))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(modify-category-entry ch ?>)))
|
|
|
|
|
|
|
|
|
|
;; Setting character category `<' for characters which should not be
|
|
|
|
|
;; placed at end of line.
|
|
|
|
|
(let* ((kinsoku-eol
|
|
|
|
|
(concat
|
|
|
|
|
;; ASCII
|
|
|
|
|
"({[`"
|
1997-05-12 06:56:23 +00:00
|
|
|
|
;; Latin JISX0201
|
|
|
|
|
;; See the comment above.
|
|
|
|
|
(let* ((str1 "({[`")
|
|
|
|
|
(len (length str1))
|
|
|
|
|
(idx 0)
|
|
|
|
|
(str2 "")
|
|
|
|
|
ch)
|
|
|
|
|
(while (< idx len)
|
|
|
|
|
(setq ch (make-char 'latin-jisx0201 (aref str1 idx))
|
|
|
|
|
str2 (concat str2 (char-to-string ch))
|
|
|
|
|
idx (1+ idx)))
|
|
|
|
|
str2)
|
|
|
|
|
;; JISX0201 Katakana
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"「"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Japanese JISX0208
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"‘“(〔[{〈《「『【°′″℃@§"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Chinese GB2312
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"‘“"(〔〈《「『〖【°′″@℃§\
|
|
|
|
|
ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄨ\
|
|
|
|
|
\(︵{︷〔︹【︻《︽〈︿「﹁『﹃﹙﹛﹝"
|
1997-02-20 07:02:49 +00:00
|
|
|
|
;; Chinese BIG5
|
2019-01-07 21:18:40 -05:00
|
|
|
|
"‘“〝‵′〃§@℃℉﹫°ㄅㄆㄇㄈㄉㄊㄋ\
|
|
|
|
|
ㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄨ"))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(len (length kinsoku-eol))
|
|
|
|
|
(idx 0)
|
|
|
|
|
ch)
|
|
|
|
|
(while (< idx len)
|
1998-02-04 11:25:47 +00:00
|
|
|
|
(setq ch (aref kinsoku-eol idx)
|
|
|
|
|
idx (1+ idx))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(modify-category-entry ch ?<)))
|
|
|
|
|
|
|
|
|
|
;; Try to resolve `kinsoku' restriction by making the current line longer.
|
|
|
|
|
(defun kinsoku-longer ()
|
2003-08-29 12:10:48 +00:00
|
|
|
|
(let ((pos-and-column
|
|
|
|
|
(save-excursion
|
|
|
|
|
(forward-char 1)
|
2005-12-06 06:24:41 +00:00
|
|
|
|
(while (and (not (eolp))
|
2003-08-29 12:10:48 +00:00
|
|
|
|
(or (aref (char-category-set (following-char)) ?>)
|
|
|
|
|
;; protect non-kinsoku words
|
|
|
|
|
(not (or (eq (preceding-char) ? )
|
|
|
|
|
(aref (char-category-set (preceding-char))
|
|
|
|
|
?|)))))
|
|
|
|
|
(forward-char 1))
|
|
|
|
|
(cons (point) (current-column)))))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(if (or (<= kinsoku-limit 0)
|
|
|
|
|
(< (cdr pos-and-column) (+ (current-fill-column) kinsoku-limit)))
|
|
|
|
|
(goto-char (car pos-and-column)))))
|
|
|
|
|
|
|
|
|
|
;; Try to resolve `kinsoku' restriction by making the current line shorter.
|
1997-05-12 06:56:23 +00:00
|
|
|
|
;; The line can't be broken before the buffer position LINEBEG.
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(defun kinsoku-shorter (linebeg)
|
|
|
|
|
(let ((pos (save-excursion
|
|
|
|
|
(forward-char -1)
|
2003-08-29 12:10:48 +00:00
|
|
|
|
(while (and
|
|
|
|
|
(< linebeg (point))
|
|
|
|
|
(or (aref (char-category-set (preceding-char)) ?<)
|
|
|
|
|
(aref (char-category-set (following-char)) ?>)
|
|
|
|
|
;; protect non-kinsoku words
|
|
|
|
|
(not (or (eq (preceding-char) ? )
|
|
|
|
|
(aref (char-category-set (preceding-char))
|
|
|
|
|
?|)))))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
(forward-char -1))
|
|
|
|
|
(point))))
|
|
|
|
|
(if (< linebeg pos)
|
|
|
|
|
(goto-char pos))))
|
|
|
|
|
|
|
|
|
|
;;;###autoload
|
|
|
|
|
(defun kinsoku (linebeg)
|
|
|
|
|
"Go to a line breaking position near point by doing `kinsoku' processing.
|
|
|
|
|
LINEBEG is a buffer position we can't break a line before.
|
|
|
|
|
|
|
|
|
|
`Kinsoku' processing is to prohibit specific characters to be placed
|
|
|
|
|
at beginning of line or at end of line. Characters not to be placed
|
|
|
|
|
at beginning and end of line have character category `>' and `<'
|
|
|
|
|
respectively. This restriction is dissolved by making a line longer or
|
|
|
|
|
shorter.
|
|
|
|
|
|
|
|
|
|
`Kinsoku' is a Japanese word which originally means ordering to stay
|
|
|
|
|
in one place, and is used for the text processing described above in
|
|
|
|
|
the context of text formatting."
|
1998-10-19 00:40:10 +00:00
|
|
|
|
(if enable-kinsoku
|
|
|
|
|
(if (or (and
|
|
|
|
|
;; The character after point can't be placed at beginning
|
2003-02-04 13:24:35 +00:00
|
|
|
|
;; of line.
|
1998-10-19 00:40:10 +00:00
|
|
|
|
(aref (char-category-set (following-char)) ?>)
|
|
|
|
|
;; We at first try to dissolve this situation by making a
|
|
|
|
|
;; line longer. If it fails, then try making a line
|
|
|
|
|
;; shorter.
|
|
|
|
|
(not (kinsoku-longer)))
|
|
|
|
|
;; The character before point can't be placed at end of line.
|
|
|
|
|
(aref (char-category-set (preceding-char)) ?<))
|
|
|
|
|
(kinsoku-shorter linebeg))))
|
1997-02-20 07:02:49 +00:00
|
|
|
|
|
2020-08-23 10:10:47 +03:00
|
|
|
|
(provide 'kinsoku)
|
|
|
|
|
|
2001-07-15 19:53:53 +00:00
|
|
|
|
;;; kinsoku.el ends here
|