[xyzzy:09031] Re: fillの質問
- Subject: [xyzzy:09031] Re: fillの質問
- From: southly <southly@xxxxxxxxxxxx>
- X-mailer: AL-Mail32 Version 1.13
こんにちは、NANRIです。
山本さんがすでに回答なさってますが、別解ってことで。
> ◆質問1
>
> テキストモードでfillを使っているのですが、行頭から書いた場合と行の途中か
> ら書いた場合で振る舞いが異なっています。
>
> 行頭から書いた場合は、例にありますように、1行目の先頭の「・」分、2行目
> 以降は、ちゃんと先頭にスペースを入れてくれます。
> (常にこうなって欲しいのです。)
do-auto-fill には mode-specific-indent-command を実行する部分があるので、
そこを利用して以下のようなものを考えてみました。
;;;; ここから
(defun text-indent-line ()
(let ((col 0))
(save-excursion
(when (next-line -1)
(goto-bol)
(skip-chars-forward " \t・")
(setq col (current-column))))
(indent-to col)))
(add-hook '*text-mode-hook*
#'(lambda ()
(make-local-variable 'mode-specific-indent-command)
(setq mode-specific-indent-command 'text-indent-line)))
;;;; ここまで
> ◆質問2
> それから、漢字の場合は、リターンキー(漢字を確定した瞬間)で改行してくれ
> ますが、アルファベットの場合、スペースキーじゃないと改行してくれません。
> アルファベットもリターンキーで改行させたい場合はどうしたらよいのでしょう
> か?
この辺は自分も前から気になってました。
山本さんがおっしゃっていることよりも致命的だと自分が思うのは
do-auto-fill が実行されるタイミングが文字を挿入した後なので、
改行を挿入した後では
(>= (current-column) fill-column) が真になることがありえないということです。
この辺りを場当たり的に対処したのが以下の do-auto-fill です。
;;;; ここから
(in-package "editor")
(defun do-auto-fill (c)
(unless (plusp fill-column)
(return-from do-auto-fill nil))
(when (and (or (member c '(#\SPC #\TAB #\LFD))
(and (or (kanji-char-p c)
(kana-char-p c))
(not (listen *keyboard*))))
(>= (1+ (save-excursion (forward-char -1) (current-column))) fill-column))
(when (= (save-excursion
(forward-char -1)
(kinsoku-goto-column fill-column *fill-kinsoku-mode*)
(when (eolp)
(return-from do-auto-fill nil))
(forward-char 1)
(prog1
(point)
(insert #\LFD)))
(point))
(forward-char 1))
(when mode-specific-indent-command
(save-excursion
(forward-char -1)
(goto-bol)
(funcall mode-specific-indent-command))
(when (bolp)
(skip-chars-forward " \t")))
(when fill-prefix
(if (bolp)
(insert fill-prefix)
(save-excursion
(goto-bol)
(insert fill-prefix))))
(run-hooks 'auto-fill-hook)))
;;;;; ここまで
本当は *auto-fill-hook を実行するタイミングの方を変えたほうがいいのかもしれませんが、
境界辺りの動作を検証するのが大変そうなのでやってません。
-----
南里 征興 (NANRI Masaoki)
southly@xxxxxxxxxxxx