[Mew-Win32 01085] Re: ">" on draft

Hideyuki SHIRAI ( 白井秀行 ) shirai at example.com
1998年 12月 14日 (月) 17:38:25 JST


白井です。

From: Toru Ito <ito at example.com> さん曰く
Subject: [Mew-Win32 01084] Re: ">" on draft
Message-ID: <19981214161839O.ito at example.com>
Date: Mon, 14 Dec 1998 16:18:39 +0900 (JST)

白井>;; .emacs に以下のものをどうぞ。"C-cL" で region に含まれるライン、
白井>;; あるいは、region 指定していないときは、次のラインとくっつけま
白井>;; す。また、そのとき、第1ラインで fill-prefix とみなすものが2ラ
白井>;; イン目以降にあったら消してつなげます。これは、emacs-19.28 や
白井>;; XEmacs でも動くかもしれないです。(未確認)

伊藤>  こんな便利な物を作って下さっていたのですね!!
伊藤>  ただ今試させて頂きました。
伊藤>          「これですよ、これ、私が欲しかったのは!!」
伊藤>  って感じです。^^)v

おぉ、気に入ってくださった方が、まだいらしたとは……

# 私を含めて 3人目ですけどね。^^;

伊藤>  どうして読み飛ばしたのかはちょっと分からないのですが、遅れ馳せながら
伊藤>  ではありますが…御礼申し上げます。大変便利な物をありがとうございまし
伊藤>  た。m(__)m

ML ではまったく反響が無かったので、その後、細々と改造していました。:-)
以前のままだとエラーが結構出るので、とりあえず最新版をお届けします。

もともと、個人的な趣味の領域に合わせて書いたので、全ての人の趣味
にはあっていないと思いますが、適当に改造して使ってください。

# はら@リコーさんの改造と指摘も含まれます。その節は TNX です。


;; fill-prefix 関連
(setq-default indent-line-function 'indent-relative-maybe)

(defun mew-auto-fill ()
  "auto-fill-function に 自前のものを設定 ^^"
  (interactive)
  (setq auto-fill-function 'mew-draft-auto-fill-with-prefix))

;; (defvar mew-draft-prefix-regexp "\\(^[^ \t]*>[ \t]+[^ \t]*>[ \t]+\\)\\|\\(^[^ \t]*>[ \t]+[#;%/]+[ \t]+\\)\\|\\(^[^ \t]*>[ \t]+\\)\\|\\(^[ \t]*[#;%/]+[ \t]+\\)"
;;   "prefix とみなす regexp")

(defvar mew-draft-prefix-regexp
  "\\(^[^  \t]*>[  \t]+[^  \t]*>[  \t]+\\)\\|\\(^[^  \t]*>[  \t]+[#;%/]+[  \t]+\\)\\|\\(^[^  \t]*>[  \t]+\\)\\|\\(^[  \t]*[#;%/]+[  \t]+\\)"
  "prefix とみなす regexp")

(defvar mew-draft-prefix-regexp2 "\\(^[0-9]+[\\.:]+[ \t]+\\)\\|\\(^・\\)\\|\\(([*0-9][0-9]*)[ \t]\\)"
  "prefix とみなす regexp その2")

(defvar mew-draft-prefix-regexp3 "\\(^[0-9]+\\.[0-9]+\\.[ \t]+\\)"
  "prefix とみなす regexp その3")

(defvar mew-draft-line-connect-insert-space t
  "line をつなげるときに ASCII の前後に space を挿入")

(defvar mew-draft-line-connect-delete-space t
  "line をつなげるときに ASCII 以外の前後の space を削除")

(defun mew-draft-auto-fill-with-prefix ()
  (make-local-variable 'fill-prefix)
  (if (and (eq major-mode 'mew-draft-mode) (mew-in-header-p))
      (setq fill-prefix nil)
    (save-excursion
      (let (start end)
	(beginning-of-line)
	(setq start (point))
	(end-of-line)
	(save-restriction
	  (narrow-to-region start (point))
	  (beginning-of-line)
	  (if (looking-at mew-draft-prefix-regexp)
	      (setq fill-prefix (buffer-substring (match-beginning 0) (match-end 0)))
	    (beginning-of-line)
	    (if (looking-at mew-draft-prefix-regexp3)
		(setq fill-prefix "  ")
	      (if (looking-at mew-draft-prefix-regexp2)
		  (setq fill-prefix " ")
		(setq fill-prefix nil))))
	  (widen)))))
  (do-auto-fill)
  (if (and (eq major-mode 'mew-draft-mode) (mew-in-header-p))
      (save-excursion
	(beginning-of-line)
	(if (not (looking-at "[^ \t]+:\\|[ \t]"))
	    (insert "\t"))
	)))

(defun mew-draft-line-connect (arg)
  (interactive "P")
  (save-excursion
    (let (origin start end string-tmp fill-prefix-tmp len)
      (if (or (and (boundp 'mark-active) mark-active)
	      (and (functionp 'region-exists-p) (region-exists-p)))
	  (progn
	    (setq start (region-beginning)
		  end (region-end))
	    (setq start (progn (goto-char start) (beginning-of-line) (point))
		  end (progn (goto-char end) (end-of-line) (point))))
	(if arg
	    (setq end (progn (end-of-line) (point))
		  start (progn (forward-line -1) (beginning-of-line) (point)))
	  (setq start (progn (beginning-of-line) (point))
		end (progn (forward-line 1) (end-of-line) (point)))))
      (if (and (eq major-mode 'mew-draft-mode) (mew-in-header-p))
	  ()
	(goto-char start)
	(if (looking-at mew-draft-prefix-regexp)
	    (setq fill-prefix-tmp
		  (buffer-substring (match-beginning 0) (match-end 0)))))
      (save-restriction
	(narrow-to-region start end)
	(goto-char (point-min))
	(while (search-forward "\n" nil t)
	  (delete-backward-char 1)
	  (if (and (eq major-mode 'mew-draft-mode) (mew-in-header-p))
	      ()
	    (if (and fill-prefix-tmp
		     (looking-at (regexp-quote fill-prefix-tmp)))
		(delete-region (match-beginning 0) (match-end 0)))
	    (condition-case err
		(progn
		  (if mew-draft-line-connect-delete-space
		      (save-excursion
			(setq origin (point))
			(if (re-search-backward "[^ \t]" nil t)
			    (progn
			      (forward-char)
			      (setq start (point))
			      (if (re-search-forward "[^ \t]" nil t)
				  (progn
				    (backward-char)
				    (setq end (point))
				    (if (and
					 (= start origin)
					 (= end origin))
					()
				      (delete-region start end))))))))
		  (if mew-draft-line-connect-insert-space
		      (save-excursion
			(save-excursion
			  (setq start (progn (backward-char) (point))
				end (progn (forward-char 2) (point))))
			(setq string-tmp (buffer-substring start end))
			(setq len (mew-charlen (mew-aref string-tmp 0)))
			(let ((char0 (mew-aref string-tmp 0))
			      (char1 (mew-aref string-tmp len)))
			  (if (and
			       (not (string-match "[ \t]" string-tmp))
			       (or
				(and (>= char0 ?!)
				     (<= char0 ?~))
				(and (>= char1 ?!)
				     (<= char1 ?~)))
			       (not
				(or
				 (= char0 (string-to-char "。"))
				 (= char0 (string-to-char "、"))
				 (= char0 (string-to-char "."))
				 (= char0 (string-to-char ","))
				 (= char0 (string-to-char "「"))
				 (= char0 (string-to-char "『"))
				 (= char0 (string-to-char "("))
				 (= char0 (string-to-char "〈"))
				 (= char0 (string-to-char "《"))
				 (= char0 (string-to-char "【"))
				 (= char0 (string-to-char "{"))
				 (= char0 (string-to-char "["))
				 (= char1 (string-to-char "。"))
				 (= char1 (string-to-char "、"))
				 (= char1 (string-to-char "."))
				 (= char1 (string-to-char ","))
				 (= char1 (string-to-char "」"))
				 (= char1 (string-to-char "』"))
				 (= char1 (string-to-char ")"))
				 (= char1 (string-to-char "〉"))
				 (= char1 (string-to-char "》"))
				 (= char1 (string-to-char "】"))
				 (= char1 (string-to-char "}"))
				 (= char1 (string-to-char "]")))))
			      (insert " ")))))
		  )
	      (error nil))
	    ))
	(widen)
	))))

;; auto-fill 乗っ取り
(cond
 ((string-match "XEmacs" emacs-version)
  (add-hook 'mew-draft-mode-hook
	    (function
	     (lambda ()
	       (make-local-variable 'auto-fill-funciton)
	       (setq auto-fill-function 'mew-draft-auto-fill-with-prefix)))))
 (t
  (eval-after-load
      "mew"
    '(fset 'mew-draft-auto-fill 'mew-draft-auto-fill-with-prefix))))

(add-hook 'mew-draft-mode-hook
	  '(lambda ()
	     (auto-fill-mode 1)
	     (setq fill-column 64)
	     (define-key mew-draft-body-map "\C-cl" 'mew-draft-line-connect)
	     ))

(add-hook 'mew-caesar-xrot-mode-hook
	  '(lambda ()
	     (auto-fill-mode 1)
	     (setq fill-column 64)
	     (setq auto-fill-function
		   (function mew-draft-auto-fill-with-prefix))))

(defun mew-auto-fill-once ()
  "auto-fill-function で 自前のものを指定行のみ実行"
  (interactive)
  (mew-draft-auto-fill-with-prefix))

(global-set-key "\C-cd" 'mew-auto-fill-once)
(global-set-key "\C-cl" 'mew-draft-line-connect)
(global-set-key "\C-c\C-l" 'mew-draft-line-connect)


-- 
白井秀行 (Hideyuki SHIRAI)



Mew-win32 メーリングリストの案内