[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 メーリングリストの案内