[Mew-dist 05016] Re: How to inc form news server

UMEKICHI / 梅吉 aumemura at example.com
1998年 6月 8日 (月) 23:22:56 JST


こんばんは。夜のプログラマ、梅吉です。
先日このMLに登録していただきました。

From: Sinichiro Dezawa <dezawa at example.com>
Subject: [Mew-dist 05013] How to inc form news server

> 出沢@フジフイルム です
> 
> 仕事の関係で news を議論に使う事になったのですが、
> いつの間にか Subject: がMIMEになっているものの多い事、、、
> 
> で、 im+mew で読む事にしたいのですが、
>   imget --src=hogehoge
> 
> を手で打つのもしんどくて。
> Mew のSummary で i とかで取り込む事はできるのでしょうか。

というわけで、私も同じように感じていたので、作ってみました。

次のパートにつけたファイルを、
どこか emacs-lisp のディレクトリにインストールして、
.emacs などに

(add-hook 'mew-init-hook
	  (function (lambda () (require 'mew-add))))

などと書いておきます。
あとは、I と押すと、現在のフォルダが "=" で始まるフォルダの場合は、
対応するニュースグループからニュースを取ってきます。
("+" のときは i と同じ、それ以外はどうなるかわかりません。)

ついでに、gnus の *Newsgroup* のように folder list を
表示するものも作りかけているのですが、これはまたそのうちに。

あと、この mew-add には、おまけとして、"=" を押したときに、
現在カーソルがあるメッセージと同じサブジェクトのメッセージに
"*" マークを付けるものが入っています。
個人的には、ちょっと threading の替わりになるので割と便利です。

ただ、これは、私と同じように 

Form=%5n %m%d/%y %-14f %S <<%b

でないと動かないでしょう。

それでは。
[[梅吉]]

-------------- next part --------------
;;;     mew-add.el
;;;     by Umekichi

(require 'mew)
;;;
(defvar mew-summary-subject-beginning-column 32)
(defvar mew-summary-subject-beginning-regexp nil)
(defvar mew-summary-subject-end-column nil)
(defvar mew-summary-subject-end-regexp (regexp-quote "<<"))

(defun mew-summary-current-lines-subject ()
  ;; return current line's subject
  (save-excursion
    (save-match-data
      (let (beg end str)
	(beginning-of-line)
	(setq beg (+ (point) mew-summary-subject-beginning-column))
	(end-of-line)
	(setq end (point))
	(setq str (buffer-substring beg end))
	(if (string-match mew-summary-subject-end-regexp str)
	    (setq str (substring str 0 (match-beginning 0))))
	;; skip mailing-list sequential number
	(if (string-match "^[ \t]*\\[.+\\] *" str)
	    (setq str (substring str (match-end 0))))
	;; skip "Re:"
	(if (string-match "^[ \t]*Re: *" str)
	    (setq str (substring str (match-end 0))))
	str))))

(defun mew-summary-mark-same-subject-messages ()
  "Mark messages that have as same subjects as current message."
  (interactive)
  (save-excursion
    (let ((subject 
	   (mew-summary-current-lines-subject)))
      (message "Search subject \"%s\" ..." subject)
      (goto-char (point-min))
      (while (search-forward subject nil t)
	(save-excursion
	  (if (null (mew-summary-marked-p))
	      (mew-summary-mark-weak mew-mark-review)))
	)
      (message "Search subject \"%s\" ...Done." subject)
      )))

(define-key mew-summary-mode-map "="
  'mew-summary-mark-same-subject-messages)


;;;;
(defvar mew-news-get-count nil)
  
(defun mew-summary-get-new-messages (&optional arg)
  "Get new messages asynchronously."
  (interactive "P")
  (if (not (mew-folder-local-newsp (buffer-name)))
      (mew-summary-get arg)
    (or arg (goto-char (point-max)))
    (mew-summary-scan-body2 mew-prog-imget
			    'mew-summary-mode
			    (buffer-name)
			    mew-cs-scan
			    nil nil nil nil
			    (list (format "--src=nntp:%s"
					  (mew-folder-to-newsgroup
					   (buffer-name)))
				  (format "--dst=%s" (buffer-name))
				  (if mew-news-get-count
				      (format "--count=%d" 
					      mew-news-get-count)
				    ""))
			    )))

(define-key mew-summary-mode-map "I" 'mew-summary-get-new-messages)

(defun mew-folder-to-newsgroup (folder)
  ;; convert local-news folder name to newsgroup name.
  (if (mew-folder-local-newsp folder)
      (let ((result ""))
	(setq folder (substring folder 1))
	(while (string-match "^\\([^/]+\\)/" folder)
	  (setq result (concat result (mew-match 1 folder) "."))
	  (setq folder (substring folder (match-end 0)))
	  )
	(concat result folder))
    (error "%s is not local news folder" folder)))

;;; This function can replace
;;; mew-summary-scan-body defined in mew-scan.el.
(defun mew-summary-scan-body2
  (prog mode folder read &optional range folders grep reviews args)
  "Arguments are PROG, MODE, FOLDER and READ. 
Optional arguments are RANGE FOLDERS GREP, REVIEWS and ARGS.
PROG is compared with mew-prog-imget and mew-prog-imls."
  (save-excursion
    (set-buffer (get-buffer-create folder))
    (buffer-disable-undo (current-buffer))
    (if (not (equal major-mode mode)) (funcall mode))
    (mew-window-configure (current-buffer) 'summary)
    (mew-current-set 'message nil)
    (mew-current-set 'part nil)
    (mew-current-set 'cache nil)
    (setq mew-summary-buffer-direction 'down)
    (mew-decode-syntax-delete)
    (if (not (mew-summary-exclusive-p))
	()
      (condition-case nil
	  (let ((process-connection-type mew-connection-type1))
	    (cond
	     ((string-match mew-prog-imget prog)
	      (if (string= mew-config-imget mew-config-default)
		  (message "Getting %s ..." folder)
		(message "Getting %s (%s)..." folder mew-config-imget)))
	     ((string-match mew-prog-imls prog)
	      (message "Listing %s ..." folder)
	      (if (or (equal 'erase (car (cdr range)))
		      (equal mode 'mew-virtual-mode))
		  (let ((buffer-read-only nil)) (erase-buffer))))
	     )
	    (setq mew-summary-buffer-start-point (point))
	    (setq mew-summary-buffer-string nil) ; just in case
	    (setq mew-summary-buffer-process
		  (apply (function start-process) 
			 prog;; name
			 (current-buffer) 
			 prog;; program
			 (format "--width=%d" (if mew-summary-scan-width
						  mew-summary-scan-width
						(if (< (window-width) 80)
						    80
						  (window-width))))
			 (append mew-prog-im-arg ;; xxx
				 (cond
				  ((string-match  mew-prog-imget prog)
				   (append
				    (list (concat "--config="
						  mew-config-imget))
				    mew-prog-imget-arg-list
				    args 
				    ))
				  ((string-match  mew-prog-imls prog)
				   (cond
				    ((equal mode 'mew-summary-mode)
				     (append
				      (list (format "--thread=%s"
						    (if (mew-folder-newsp folder) 
							"yes" "no")))
				      (list (concat "--src=" folder))
				      mew-prog-imls-arg-list
				      (if (listp (car range))
					  (car range)
					(list (car range)))))
				    ((equal mode 'mew-virtual-mode)
				     (list
				      (concat "--src=" (mew-join "," folders))
				      (concat "--grep=" grep)))
				    ))
				  ))
			 ))
	    (mew-set-process-cs mew-summary-buffer-process read mew-cs-noconv)
	    (set-process-filter mew-summary-buffer-process
				'mew-summary-scan-filter)
	    (set-process-sentinel mew-summary-buffer-process
				  'mew-summary-scan-sentinel)
	    (setq mew-summary-buffer-reviews reviews)
	    (process-kill-without-query mew-summary-buffer-process)
	    )
	(quit
	 (set-process-sentinel mew-summary-buffer-process nil)
	 (setq mew-summary-buffer-start-point nil)
	 (setq mew-summary-buffer-process nil)
	 (setq mew-summary-buffer-string nil)
	 (setq mew-summary-buffer-reviews nil)
	 ))
      )))

;;;
(provide 'mew-add)


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