Mercurial > emacs
diff lisp/obsolete/rnewspost.el @ 35063:5c3a343fb1ce
Obsolete.
author | Dave Love <fx@gnu.org> |
---|---|
date | Thu, 04 Jan 2001 19:21:36 +0000 |
parents | |
children | 253f761ad37b |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/obsolete/rnewspost.el Thu Jan 04 19:21:36 2001 +0000 @@ -0,0 +1,441 @@ +;;; rnewspost.el --- USENET news poster/mailer for GNU Emacs + +;; Copyright (C) 1985, 1986, 1987, 1995 Free Software Foundation, Inc. + +;; Maintainer: FSF +;; Keywords: mail, news + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; 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 +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +;;; Change Log: + +;; moved posting and mail code from rnews.el +;; tower@gnu.org Wed Oct 29 1986 +;; brought posting code almost up to the revision of RFC 850 for News 2.11 +;; - couldn't see handling the special meaning of the Keyword: poster +;; - not worth the code space to support the old A news Title: (which +;; Subject: replaced) and Article-I.D.: (which Message-ID: replaced) +;; tower@gnu.org Nov 86 +;; changed C-c C-r key-binding due to rename of news-caesar-buffer-body +;; tower@gnu.org 21 Nov 86 +;; added (require 'rnews) tower@gnu.org 22 Apr 87 +;; restricted call of news-show-all-headers in news-post-news & news-reply +;; tower@gnu.org 28 Apr 87 +;; commented out Posting-Front-End to save USENET bytes tower@gnu.org Jul 31 87 +;; commented out -n and -t args in news-inews tower@gnu.org 15 Oct 87 + +;Now in paths.el. +;(defvar news-inews-program "inews" +; "Function to post news.") + +;; Replying and posting news items are done by these functions. +;; imported from rmail and modified to work with rnews ... +;; Mon Mar 25,1985 at 03:07:04 ads@mit-hermes. +;; this is done so that rnews can operate independently from rmail.el and +;; sendmail and doesn't have to autoload these functions. +;; +;;; >> Nuked by Mly to autoload those functions again, as the duplication of +;;; >> code was making maintenance too difficult. + +;;; Code: + +(require 'sendmail) +(require 'rnews) + +(defvar news-reply-mode-map () "Mode map used by news-reply.") + +(or news-reply-mode-map + (progn + (setq news-reply-mode-map (make-keymap)) + (define-key news-reply-mode-map "\C-c\C-f\C-d" 'news-reply-distribution) + (define-key news-reply-mode-map "\C-c\C-f\C-k" 'news-reply-keywords) + (define-key news-reply-mode-map "\C-c\C-f\C-n" 'news-reply-newsgroups) + (define-key news-reply-mode-map "\C-c\C-f\C-f" 'news-reply-followup-to) + (define-key news-reply-mode-map "\C-c\C-f\C-s" 'mail-subject) + (define-key news-reply-mode-map "\C-c\C-f\C-a" 'news-reply-summary) + (define-key news-reply-mode-map "\C-c\C-t" 'mail-text) + (define-key news-reply-mode-map "\C-c\C-r" 'news-caesar-buffer-body) + (define-key news-reply-mode-map "\C-c\C-w" 'news-reply-signature) + (define-key news-reply-mode-map "\C-c\C-y" 'news-reply-yank-original) + (define-key news-reply-mode-map "\C-c\C-q" 'mail-fill-yanked-message) + (define-key news-reply-mode-map "\C-c\C-c" 'news-inews) + (define-key news-reply-mode-map "\C-c\C-s" 'news-inews) + (define-key news-reply-mode-map [menu-bar] (make-sparse-keymap)) + (define-key news-reply-mode-map [menu-bar fields] + (cons "Fields" (make-sparse-keymap "Fields"))) + (define-key news-reply-mode-map [menu-bar fields news-reply-distribution] + '("Distribution" . news-reply-distribution)) + (define-key news-reply-mode-map [menu-bar fields news-reply-keywords] + '("Keywords" . news-reply-keywords)) + (define-key news-reply-mode-map [menu-bar fields news-reply-newsgroups] + '("Newsgroups" . news-reply-newsgroups)) + (define-key news-reply-mode-map [menu-bar fields news-reply-followup-to] + '("Followup-to" . news-reply-followup-to)) + (define-key news-reply-mode-map [menu-bar fields mail-subject] + '("Subject" . mail-subject)) + (define-key news-reply-mode-map [menu-bar fields news-reply-summary] + '("Summary" . news-reply-summary)) + (define-key news-reply-mode-map [menu-bar fields mail-text] + '("Text" . mail-text)) + (define-key news-reply-mode-map [menu-bar news] + (cons "News" (make-sparse-keymap "News"))) + (define-key news-reply-mode-map [menu-bar news news-caesar-buffer-body] + '("Rot13" . news-caesar-buffer-body)) + (define-key news-reply-mode-map [menu-bar news news-reply-yank-original] + '("Yank Original" . news-reply-yank-original)) + (define-key news-reply-mode-map [menu-bar news mail-fill-yanked-message] + '("Fill Yanked Messages" . mail-fill-yanked-message)) + (define-key news-reply-mode-map [menu-bar news news-inews] + '("Send" . news-inews)))) + +(defun news-reply-mode () + "Major mode for editing news to be posted on USENET. +First-time posters are asked to please read the articles in newsgroup: + news.announce.newusers . +Like Text Mode but with these additional commands: + +C-c C-s news-inews (post the message) C-c C-c news-inews +C-c C-f move to a header field (and create it if there isn't): + C-c C-f C-n move to Newsgroups: C-c C-f C-s move to Subj: + C-c C-f C-f move to Followup-To: C-c C-f C-k move to Keywords: + C-c C-f C-d move to Distribution: C-c C-f C-a move to Summary: +C-c C-y news-reply-yank-original (insert current message, in NEWS). +C-c C-q mail-fill-yanked-message (fill what was yanked). +C-c C-r caesar rotate all letters by 13 places in the article's body (rot13)." + (interactive) + (kill-all-local-variables) + (make-local-variable 'mail-reply-buffer) + (setq mail-reply-buffer nil) + (set-syntax-table text-mode-syntax-table) + (use-local-map news-reply-mode-map) + (setq local-abbrev-table text-mode-abbrev-table) + (setq major-mode 'news-reply-mode) + (setq mode-name "News Reply") + (make-local-variable 'paragraph-separate) + (make-local-variable 'paragraph-start) + (run-hooks 'text-mode-hook 'news-reply-mode-hook)) + +(defvar news-reply-yank-from "" + "Save `From:' field for `news-reply-yank-original'.") + +(defvar news-reply-yank-message-id "" + "Save `Message-Id:' field for `news-reply-yank-original'.") + +(defun news-reply-yank-original (arg) + "Insert the message being replied to, if any (in Mail mode). +Puts point before the text and mark after. +Indents each nonblank line ARG spaces (default 3). +Just \\[universal-argument] as argument means don't indent +and don't delete any header fields." + (interactive "P") + (mail-yank-original arg) + (exchange-point-and-mark) + (run-hooks 'news-reply-header-hook)) + +(defvar news-reply-header-hook + (lambda () + (insert "In article " news-reply-yank-message-id + " " news-reply-yank-from " writes:\n\n")) + "Hook for inserting a header at the top of a yanked message.") + +(defun news-reply-newsgroups () + "Move point to end of `Newsgroups:' field. +RFC 850 constrains the `Newsgroups:' field to be a comma-separated list +of valid newsgroup names at your site. For example, + Newsgroups: news.misc,comp.misc,rec.misc" + (interactive) + (expand-abbrev) + (goto-char (point-min)) + (mail-position-on-field "Newsgroups")) + +(defun news-reply-followup-to () + "Move point to end of `Followup-To:' field. Create the field if none. +One usually requests followups to only one newsgroup. +RFC 850 constrains the `Followup-To:' field to be a comma-separated list +of valid newsgroups names at your site, and it must be a subset of the +`Newsgroups:' field. For example: + Newsgroups: news.misc,comp.misc,rec.misc,misc.misc,soc.misc + Followup-To: news.misc,comp.misc,rec.misc" + (interactive) + (expand-abbrev) + (or (mail-position-on-field "Followup-To" t) + (progn (mail-position-on-field "newsgroups") + (insert "\nFollowup-To: "))) + ;; @@ could do a completing read based on the Newsgroups: field to + ;; @@ fill in the Followup-To: field +) + +(defun news-reply-distribution () + "Move point to end of `Distribution:' optional field. +Create the field if none. Without this field the posting goes to all of +USENET. The field is used to restrict the posting to parts of USENET." + (interactive) + (expand-abbrev) + (mail-position-on-field "Distribution") + ;; @@could do a completing read based on the news library file: + ;; @@ ../distributions to fill in the field. + ) + +(defun news-reply-keywords () + "Move point to end of `Keywords:' optional field. Create the field if none. +Used as an aid to the news reader, it can contain a few, well selected keywords +identifying the message." + (interactive) + (expand-abbrev) + (mail-position-on-field "Keywords")) + +(defun news-reply-summary () + "Move point to end of `Summary:' optional field. Create the field if none. +Used as an aid to the news reader, it can contain a succinct +summary (abstract) of the message." + (interactive) + (expand-abbrev) + (mail-position-on-field "Summary")) + +(defun news-reply-signature () + "The inews program appends `~/.signature' automatically." + (interactive) + (message "Posting news will append your signature automatically.")) + +(defun news-setup (to subject in-reply-to newsgroups replybuffer) + "Set up the news reply or posting buffer with the proper headers and mode." + (setq mail-reply-buffer replybuffer) + (let ((mail-setup-hook nil) + ;; Avoid inserting a signature. + (mail-signature)) + (if (null to) + ;; this hack is needed so that inews wont be confused by + ;; the fcc: and bcc: fields + (let ((mail-self-blind nil) + (mail-archive-file-name nil)) + (mail-setup to subject in-reply-to nil replybuffer nil) + (beginning-of-line) + (delete-region (point) (progn (forward-line 1) (point))) + (goto-char (point-max))) + (mail-setup to subject in-reply-to nil replybuffer nil)) + ;;;(mail-position-on-field "Posting-Front-End") + ;;;(insert (emacs-version)) + (goto-char (point-max)) + (if (let ((case-fold-search t)) + (re-search-backward "^Subject:" (point-min) t)) + (progn (beginning-of-line) + (insert "Newsgroups: " (or newsgroups "") "\n") + (if (not newsgroups) + (backward-char 1) + (goto-char (point-max))))) + (let (actual-header-separator) + (rfc822-goto-eoh) + (setq actual-header-separator (buffer-substring + (point) + (save-excursion (end-of-line) (point)))) + (setq paragraph-start + (concat "^" actual-header-separator "$\\|" paragraph-start)) + (setq paragraph-separate + (concat "^" actual-header-separator "$\\|" paragraph-separate))) + (run-hooks 'news-setup-hook))) + +(defun news-inews () + "Send a news message using inews." + (interactive) + (let* (newsgroups subject + (case-fold-search nil)) + (save-excursion + (save-restriction + (narrow-to-region (point-min) (mail-header-end)) + (setq newsgroups (mail-fetch-field "newsgroups") + subject (mail-fetch-field "subject"))) + (widen) + (goto-char (point-min)) + (run-hooks 'news-inews-hook) + (mail-sendmail-undelimit-header) + (goto-char (point-max)) + ;; require a newline at the end for inews to append .signature to + (or (= (preceding-char) ?\n) + (insert ?\n)) + (message "Posting to USENET...") + (unwind-protect + (if (not (eq 0 + (call-process-region (point-min) (point-max) + news-inews-program nil 0 nil + "-h"))) ; take all header lines! + ;@@ setting of subject and newsgroups still needed? + ;"-t" subject + ;"-n" newsgroups + (error "Posting to USENET failed") + (message "Posting to USENET... done")) + (mail-sendmail-delimit-header) + (set-buffer-modified-p nil))) + (bury-buffer))) + +;@@ shares some code with news-reply and news-post-news +(defun news-mail-reply () + "Mail a reply to the author of the current article. +While composing the reply, use \\[news-reply-yank-original] to yank the +original message into it." + (interactive) + (let (from cc subject date to reply-to message-id + (buffer (current-buffer))) + (save-restriction + (narrow-to-region (point-min) (progn (goto-line (point-min)) + (search-forward "\n\n") + (- (point) 1))) + (setq from (mail-fetch-field "from") + subject (mail-fetch-field "subject") + reply-to (mail-fetch-field "reply-to") + date (mail-fetch-field "date") + message-id (mail-fetch-field "message-id"))) + (setq to from) + (pop-to-buffer "*mail*") + (mail nil + (if reply-to reply-to to) + subject + (let ((stop-pos (string-match " *at \\| *@ \\| *(\\| *<" from))) + (concat (if stop-pos (substring from 0 stop-pos) from) + "'s message " + (if message-id + (concat message-id " of ") + "of ") + date)) + nil + buffer))) + +;@@ the guts of news-reply and news-post-news should be combined. -tower +(defun news-reply () + "Compose and post a reply (aka a followup) to the current article on USENET. +While composing the followup, use \\[news-reply-yank-original] to yank the +original message into it." + (interactive) + (if (y-or-n-p "Are you sure you want to followup to all of USENET? ") + (let (from cc subject date to followup-to newsgroups message-of + references distribution message-id + (buffer (current-buffer))) + (save-restriction + (and (not (= 0 (buffer-size))) ;@@real problem is non-existence of + ;@@ of article file + (equal major-mode 'news-mode) ;@@ if rmail-mode, + ;@@ should show full headers + (progn + (news-show-all-headers) ;@@ should save/restore header state, + ;@@ but rnews.el lacks support + (narrow-to-region (point-min) (progn (goto-char (point-min)) + (search-forward "\n\n") + (- (point) 1))))) + (setq from (mail-fetch-field "from") + news-reply-yank-from from + ;; @@ not handling old Title: field + subject (mail-fetch-field "subject") + date (mail-fetch-field "date") + followup-to (mail-fetch-field "followup-to") + newsgroups (or followup-to + (mail-fetch-field "newsgroups")) + references (mail-fetch-field "references") + ;; @@ not handling old Article-I.D.: field + distribution (mail-fetch-field "distribution") + message-id (mail-fetch-field "message-id") + news-reply-yank-message-id message-id) + (pop-to-buffer "*post-news*") + (news-reply-mode) + (if (and (buffer-modified-p) + (not + (y-or-n-p "Unsent article being composed; erase it? "))) + () + (progn + (erase-buffer) + (and subject + (progn (if (string-match "\\`Re: " subject) + (while (string-match "\\`Re: " subject) + (setq subject (substring subject 4)))) + (setq subject (concat "Re: " subject)))) + (and from + (progn + (let ((stop-pos + (string-match " *at \\| *@ \\| *(\\| *<" from))) + (setq message-of + (concat + (if stop-pos (substring from 0 stop-pos) from) + "'s message " + (if message-id + (concat message-id " of ") + "of ") + date))))) + (news-setup + nil + subject + message-of + newsgroups + buffer) + (if followup-to + (progn (news-reply-followup-to) + (insert followup-to))) + (if distribution + (progn + (mail-position-on-field "Distribution") + (insert distribution))) + (mail-position-on-field "References") + (if references + (insert references)) + (if (and references message-id) + (insert " ")) + (if message-id + (insert message-id)) + (goto-char (point-max)))))) + (message ""))) + +;@@ the guts of news-reply and news-post-news should be combined. -tower +;;;###autoload +(defun news-post-news (&optional noquery) + "Begin editing a new USENET news article to be posted. +Type \\[describe-mode] once editing the article to get a list of commands. +If NOQUERY is non-nil, we do not query before doing the work." + (interactive) + (if (or noquery + (y-or-n-p "Are you sure you want to post to all of USENET? ")) + (let ((buffer (current-buffer))) + (save-restriction + (and (not (= 0 (buffer-size))) ;@@real problem is non-existence of + ;@@ of article file + (equal major-mode 'news-mode) ;@@ if rmail-mode, + ;@@ should show full headers + (progn + (news-show-all-headers) ;@@ should save/restore header state, + ;@@ but rnews.el lacks support + (narrow-to-region (point-min) (progn (goto-char (point-min)) + (search-forward "\n\n") + (- (point) 1))))) + (setq news-reply-yank-from (mail-fetch-field "from") + ;; @@ not handling old Article-I.D.: field + news-reply-yank-message-id (mail-fetch-field "message-id"))) + (pop-to-buffer "*post-news*") + (news-reply-mode) + (if (and (buffer-modified-p) + (not (y-or-n-p "Unsent article being composed; erase it? "))) + () ;@@ not saving point from last time + (progn (erase-buffer) + (news-setup () () () () buffer)))) + (message ""))) + +(defun news-mail-other-window () + "Send mail in another window. +While composing the message, use \\[news-reply-yank-original] to yank the +original message into it." + (interactive) + (mail-other-window nil nil nil nil nil (current-buffer))) + +(provide 'rnewspost) + +;;; rnewspost.el ends here