|
|
1.1 root 1: Date: 25 Apr 1983 10:29-PDT (Monday)
2: From: Jim Rees <jim@uw-beaver>
3: Subject: rnews.ml
4: Message-Id: <83/04/25 1029.783@uw-beaver>
5:
6: Emacs Readnews Distribution
7:
8: This is an mlisp package, rnews.ml, for reading the news in Gosling
9: Emacs. It is similar to rmail.ml, and in fact depends on some of the
10: functions in rmail.ml. Our rmail.ml is modified, but I think this will
11: also work with the unmodified rmail.ml.
12:
13: This version is for use with news 2.10. There is a different version for
14: use with news 2.9.
15:
16: To install rnews, install rnews.ml in your emacs/maclib directory. In your
17: profile, put an autoload for rnews.ml:
18:
19: (autoload "rnews" "rnews.ml")
20:
21: Then enter emacs and do ESC-X-rnews.
22:
23: The rnews directory is kept in your ~/Messages directory, so if you
24: don't use rmail you might have to make this directory before you can
25: use rnews.
26:
27: There is an info page, written by grkermit!chris. To install it, change to
28: your Emacs databases directory and run "dbadd info emacs:rnews" with the
29: info page as standard input. To be complete you should change all the info
30: nodes pointing to rnews, for example "up", "previous", and "next", but it
31: will work if you don't change them.
32:
33: If you have any suggestions or criticisms, or want your name added to the
34: distribution list for new releases and updates, send mail to
35: emacs-rnews-request at uw-beaver via uucp or Arpanet. You can send mail to
36: the list by mailing to emacs-rnews at uw-beaver.
37:
38: Here are the info page and rnews.ml:
39:
40: File: emacs Node: rnews Up: Packages
41:
42: Unix Emacs readnews facility.
43:
44: "rnews" is used for reading news. Executing it places your news
45: directory into a window and enters a special command interpretation loop.
46: The commands that it understands are:
47:
48: p move to the previous article.
49: n move to the next article.
50: f move forward in the current article.
51: b and <backspace>
52: move backward in the current article.
53: d delete the current article. (the one indicated by '>')
54: u undelete the current article.
55: D delete the article at the cursor.
56: U undelete the article at the cursor.
57: r reply to the current article.
58: m enter smail, to send mail.
59: a append the current article to a file.
60: F Post a followup to the current article.
61: P Post an article.
62: q quit out of Rnews, saving undeleted articles.
63: ? display the info page for rnews
64: < go to the first article
65: > go to the last article
66: s asks for a number, skips down that number of articles
67: g asks for a number, goes to the article that many lines from the top
68: ` decrypts a net.jokes "rot 13" article
69: H show the entire article header, including "junk" lines
70: ^X-U unsubscribe to the current group
71: : execute an emacs extended command
72: <space> and <return>
73: make the article at the cursor be the current article
74:
75: When in Post mode:
76:
77: ^Xd positions you in the Distribution: field of the message,
78: creating it if necessary.
79:
80:
81: While in rnews, the current article is indicated with an ">" on the left
82: margin. You can move the cursor around with C-N, C-P, C-V, arrow keys,
83: searches etc. If you move the cursor, and want to see an article far from
84: the current article, <space> or <return> makes the article at the cursor
85: current.
86:
87: If you provide an argument to the rnews command (usually with ^U) you will
88: be put into rnews, but the directory will not be updated to include new
89: articles. This is much faster and is useful, for example, if you just want
90: to post a new article or re-read an old one.
91:
92: ------------------------------ Rnews.ml----------------------------------
93: (if (! (is-bound rmail-default-log))
94: (load "rmail.ml"))
95: (message "Loading the news system, please wait...")
96: (sit-for 0)
97:
98: ; Unix Emacs readnews facility.
99:
100: ; "rnews" is used for reading news. Executing it places your news
101: ; directory into a window and enters a special command interpretation loop.
102: ; The commands that it understands are:
103: ; p move to the previous message.
104: ; n move to the next message.
105: ; f move forward in the current message.
106: ; b move backward in the current message.
107: ; d delete the current message.
108: ; u undelete the last deleted message.
109: ; D delete the article at the cursor.
110: ; U undelete the article at the cursor.
111: ; r reply to the current message.
112: ; m enter smail, to send mail.
113: ; a append the current message to a file.
114: ; F Post a followup to the current message.
115: ; P Post a message.
116: ; q quit out of RMail, appending all undeleted messages to mbox.
117: ; ? display the info page for rnews
118: ; < go to the first article
119: ; > go to the last article
120: ; s asks for a number, skips down that number of articles
121: ; g asks for a number, goes to the article that many lines from the top
122: ; ` decrypts a net.jokes "rot 13" article
123: ; H show the entire article header, including "junk" lines
124: ; ^X-U unsubscribe to the current group
125: ; : execute an emacs extended command
126: ; <space> and <return>
127: ; make the article at the cursor be the current article
128:
129: ; When in Post mode,
130: ; ^Xd positions you in the Distribution: field of the message,
131: ; creating it if necessary.
132:
133: ; If you want replies sent back along the path by which they arrived,
134: ; change the 1 in (setq internet-replies 1) to 0. You will need to do
135: ; this if your mail program doesn't do automatic uucp routing.
136:
137: ; "smail" is used for sending mail. It places you in a buffer for
138: ; constructing the message and locally defines a few commands:
139: ; ^X^S send the mail -- if all went well the window will disappear,
140: ; otherwise a message indicating which addresses failed will appear
141: ; at the bottom of the acreen. Unfortunatly, the way the mailers on
142: ; Unix work, the message will have been sent to those addresses which
143: ; succeded and not to the others, so you have to delete some
144: ; addresses and fix up the others before you resend the message.
145: ; ^Xt positions you in the To: field of the message.
146: ; ^Xc positions you in the Cc: field of the message, creating it if it
147: ; doesn't already exist.
148: ; The abbrev facility is used for mail address expansion,
149: ; the file /usr/local/lib/emacs/RMailAbbrevs should contain
150: ; abbrev definitions to expand login names to their
151: ; proper mail address. This gets used at CMU since we have
152: ; 7 VAXen, 4 10's and countless 11's; remembering where a
153: ; person usually logs in is nearly impossible.
154: ; ^Xs positions you in the Subject: field of the message.
155: ; ^Xa positions you to the end of the body of the message, ready to
156: ; append more text.
157:
158: (defun
159: (rnews nbx internet-replies
160: this-from this-id this-length
161:
162: (setq internet-replies 1)
163: (setq nbx (concat (getenv "HOME") "/Messages/Newsbox"))
164: (message "Please wait while I read the news...")
165: (sit-for 0)
166: (save-window-excursion
167: (pop-to-buffer "rnews-directory")
168: (setq mode-line-format
169: (concat " News from message file "
170: (substr nbx 1 -1)
171: " %M %[%p%]"))
172: (setq mode-string "RNews")
173: (erase-buffer)
174: (set-mark)
175: (if (! prefix-argument-provided)
176: (filter-region (concat "readnews -e >> " nbx)))
177: (read-file nbx)
178: (end-of-file)
179: (setq case-fold-search 0)
180: (if (error-occured (re-search-reverse "^[>N ]"))
181: (beginning-of-file)
182: (next-line)
183: )
184: (error-occured
185: (re-replace-string "^" "N "))
186: (setq case-fold-search 1)
187: (save-excursion
188: (temp-use-buffer "Full Header")
189: (setq needs-checkpointing 0)
190: )
191: (rnews-position)
192: (rnews-mark)
193: (sit-for 0)
194: (message "Type ^C to exit rnews; ? for help")
195: (recursive-edit)
196: (pop-to-buffer "rnews-directory")
197: (rnews-erase-messages)
198: (if buffer-is-modified (write-current-file))
199: (temp-use-buffer "current-message")
200: (setq buffer-is-modified 0)
201: )
202: (novalue)
203: )
204: )
205:
206: (defun
207: (rnews-position
208: (beginning-of-line)
209: (if (! (looking-at "^>"))
210: (progn
211: (beginning-of-file)
212: (if (error-occured (re-search-forward "^>"))
213: (if (error-occured (re-search-forward "^N"))
214: (progn
215: (end-of-file)
216: (previous-line)
217: )
218: )
219: )
220: (beginning-of-line)
221: )
222: )
223: )
224: )
225:
226: (defun
227: (rnews-pickup rnews-file
228: (beginning-of-line)
229: (save-excursion
230: (provide-prefix-argument 2 (forward-character))
231: (set-mark)
232: (search-forward " ")
233: (backward-character)
234: (copy-region-to-buffer "Scratch Stuff")
235: (temp-use-buffer "Scratch Stuff")
236: (setq needs-checkpointing 0)
237: (beginning-of-file)
238: (set-mark)
239: (error-occured
240: (replace-string "." "/"))
241: (end-of-line)
242: (setq rnews-file (region-to-string))
243: (pop-to-buffer "current-message")
244: (setq needs-checkpointing 0)
245: (setq this-from "")
246: (setq this-length "")
247: (setq this-id "")
248: (if (error-occured
249: (read-file (concat "/usr/spool/news/" rnews-file)))
250: (progn
251: (erase-buffer)
252: (setq mode-line-format
253: (concat "Expired article " rnews-file)))
254: (progn
255: (setq case-fold-search 1)
256: (beginning-of-file)
257: (if (error-occured (search-forward "\n\n"))
258: (message "Garbled header")
259: (rnews-fix-header))
260: (set-rnews-mode-line-format))
261: )
262: )
263: )
264:
265: (rnews-fix-header
266: (set-mark)
267: (beginning-of-file)
268: (copy-region-to-buffer "Full Header")
269: (narrow-region)
270: (convert-head "Posted:" "Date:")
271: (convert-head "Title:" "Subject:")
272: (convert-head "Article-I.D.:" "Message-ID:")
273: (error-occured
274: (re-search-forward "^From:[ \t]")
275: (end-of-line)
276: (set-mark)
277: (re-search-reverse "[!:@]")
278: (re-search-reverse "[!: ]")
279: (forward-character)
280: (setq this-from (region-to-string))
281: (beginning-of-file)
282: )
283: (error-occured
284: (re-search-forward "^Lines:[ \t]*\\(.*\\)")
285: (region-around-match 1)
286: (setq this-length (region-to-string))
287: (beginning-of-file)
288: (re-replace-string "^Lines:.*\n" "")
289: (beginning-of-file)
290: )
291: (error-occured
292: (re-search-forward "^Message-ID:[ \t]*\\(.*\\)")
293: (region-around-match 1)
294: (setq this-id (region-to-string))
295: (beginning-of-file)
296: (re-replace-string "^Message-ID:.*\n" "")
297: (beginning-of-file)
298: )
299: (error-occured (re-replace-string "^.*-version:.*\n" ""))
300: (error-occured (re-replace-string "^Path:.*\n" ""))
301: (error-occured (re-replace-string "^Sender:.*\n" ""))
302: (error-occured (re-replace-string "^.*received:.*\n" ""))
303: (widen-region)
304: (if (= (length this-length) 0)
305: ; The constant 38 comes from the average
306: ; line length of 356 articles in net.*
307: (setq this-length (concat "~" (/ (buffer-size) 38))))
308: )
309:
310: (convert-head re1 re2
311: (setq re1 (concat "^" (arg 1)))
312: (setq re2 (concat "^" (arg 2)))
313: (if (error-occured (re-search-forward re2))
314: (error-occured (re-replace-string re1 (arg 2)))
315: (beginning-of-file))
316: (error-occured (re-replace-string (concat re1 ".*\n") ""))
317: )
318:
319: (rnews-show-full-header
320: (save-window-excursion
321: (temp-use-buffer "current-message")
322: (beginning-of-file)
323: (set-mark)
324: (error-occured
325: (search-forward "\n\n")
326: (erase-region)
327: (yank-buffer "Full Header")
328: )
329: )
330: )
331:
332: (rnews-next-page
333: (save-excursion
334: (pop-to-buffer "current-message")
335: (next-page)
336: (set-rnews-mode-line-format)
337: )
338: )
339:
340: (rnews-previous-page
341: (save-excursion
342: (pop-to-buffer "current-message")
343: (previous-page)
344: (set-rnews-mode-line-format)
345: )
346: )
347:
348: (set-rnews-mode-line-format from
349: (save-excursion
350: (temp-use-buffer "Scratch Stuff")
351: (erase-buffer)
352: (insert-string this-from)
353: (set-mark)
354: (beginning-of-line)
355: (error-occured (replace-string "%" "%%"))
356: (setq from (region-to-string))
357: (use-old-buffer "current-message")
358: (end-of-file)
359: (setq mode-line-format
360: (concat
361: "From: " from
362: (if (!= (length this-length) 0)
363: (concat " Lines: " this-length)
364: "")
365: " %[%p%]"
366: (if (dot-is-visible)
367: ""
368: " --More--")
369: )))
370: )
371: )
372:
373: (defun
374: (rnews-erase-messages
375: (save-excursion
376: (pop-to-buffer "rnews-directory")
377: (beginning-of-file)
378: (error-occured
379: (while 1
380: (re-search-forward "^.D")
381: (beginning-of-line)
382: (set-mark)
383: (end-of-line)
384: (forward-character)
385: (erase-region)
386: )
387: )
388: )
389: )
390: )
391:
392: (defun
393: (rnews-com
394: (argc)
395: (rnews)
396: (exit-emacs)
397: )
398:
399: (rnews-next-message
400: (rnews-position)
401: (delete-next-character)
402: (insert-character ' ')
403: (beginning-of-line)
404: (next-line)
405: (if (eobp) (progn (previous-line)
406: (message "You're at the last message already")))
407: (delete-next-character)
408: (insert-character '>')
409: (rnews-pickup)
410: )
411:
412: (rnews-previous-message
413: (rnews-position)
414: (delete-next-character)
415: (insert-character ' ')
416: (previous-line)
417: (beginning-of-line)
418: (delete-next-character)
419: (insert-character '>')
420: (rnews-pickup)
421: )
422:
423: (rnews-delete-message
424: (rnews-position)
425: (forward-character)
426: (delete-next-character)
427: (insert-character 'D')
428: (beginning-of-line)
429: )
430:
431: (rnews-undelete-message
432: (rnews-position)
433: (forward-character)
434: (delete-next-character)
435: (insert-character ' ')
436: (beginning-of-line)
437: )
438:
439: (rnews-delete-message-at-cursor
440: (beginning-of-line)
441: (forward-character)
442: (delete-next-character)
443: (insert-character 'D')
444: (beginning-of-line)
445: )
446:
447: (rnews-undelete-message-at-cursor
448: (beginning-of-line)
449: (forward-character)
450: (delete-next-character)
451: (insert-character ' ')
452: (beginning-of-line)
453: )
454:
455: (rnews-goto-message n
456: (setq n (get-tty-string "Goto message number: "))
457: (rnews-unmark)
458: (beginning-of-file)
459: (provide-prefix-argument n (next-line))
460: (rnews-mark)
461: )
462: )
463:
464: (defun
465: (rnews-help
466: (&info "emacs" "rnews")))
467:
468: (defun
469: (rnews-reply subject dest excess refs
470: (setq subject "")
471: (setq dest "")
472: (setq excess "")
473: (save-window-excursion
474: (pop-to-buffer "current-message")
475: (setq case-fold-search 1)
476: (beginning-of-file)
477: (search-forward "\n\n")
478: (set-mark)
479: (beginning-of-file)
480: (narrow-region)
481: (error-occured
482: (re-search-forward "^Subject:[ \t]*\\(.*\\)")
483: (region-around-match 1)
484: (setq subject (region-to-string))
485: (if (!= (substr subject 1 3) "Re:")
486: (setq subject (concat "Re: " subject))
487: )
488: )
489: (save-excursion
490: (temp-use-buffer "Full Header")
491: (beginning-of-file)
492: (if internet-replies
493: (if (error-occured (re-search-forward
494: "^Reply-To:[ \t]*\\(.*\\)"))
495: (setq dest this-from)
496: (progn
497: (region-around-match 1)
498: (setq dest (region-to-string)))
499: )
500: (progn
501: (if (error-occured (re-search-forward
502: "^Path:[ \t]*[^ \t!]*!\\(.*\\)"))
503: (re-search-forward
504: "^From:[ \t]*[^ \t!]*!\\(.*\\)"))
505: (region-around-match 1)
506: (setq dest (region-to-string))))
507: )
508: (beginning-of-file)
509: (error-occured edest
510: (save-excursion
511: (temp-use-buffer "Scratch Stuff")
512: (setq needs-checkpointing 0)
513: (erase-buffer)
514: (insert-string dest)
515: (set-mark)
516: (beginning-of-file)
517: (if (! (error-occured
518: (re-search-forward " (\\(.*\\))")))
519: (progn
520: (region-around-match 1)
521: (setq dest (region-to-string))
522: (beginning-of-file)
523: (insert-string (concat dest " <"))
524: (re-replace-string " *(.*" ">")
525: (end-of-line)
526: (set-mark)
527: (beginning-of-line)
528: (setq dest (region-to-string))
529: )
530: )
531: (error-occured
532: (re-replace-string
533: " *at *[^,\n]*\\| *@ *[^,\n]*\\| *([^)\n]*)\\| *<[^>\n]*>"
534: ""))
535: (error-occured
536: (re-replace-string ".*!" ""))
537: (setq edest (region-to-string))
538: )
539: (error-occured
540: (re-search-forward "^Date:[ \t]*\\(.*\\)")
541: (region-around-match 1)
542: )
543: (setq excess (concat
544: "In-Reply-To: "
545: edest "'s message of "
546: (region-to-string)
547: "\n"))
548: (beginning-of-file)
549: (if (error-occured
550: (re-search-forward "^References:[ \t]*\\(.*\\)")
551: (region-around-match 1)
552: (setq refs (concat (region-to-string) " " this-id)))
553: (setq refs this-id))
554: )
555: (widen-region)
556: (pop-to-buffer "send-mail")
557: (setq needs-checkpointing 0)
558: (setq case-fold-search 1)
559: (erase-buffer)
560: (insert-string subject)
561: (newline)
562: (insert-string dest)
563: (newline)
564: (insert-string excess)
565: (insert-string (concat "References: " refs "\n"))
566: (do-mail-setup)
567: )
568: (rnews-position)
569: (if (looking-at "^>")
570: (progn
571: (forward-character)
572: (delete-next-character)
573: (insert-character 'A')
574: (beginning-of-line)))
575: )
576: )
577:
578: (defun
579: (rnews-followup newsgroups subject refs
580: (setq newsgroups "")
581: (setq subject "")
582: (setq refs "")
583: (save-window-excursion
584: (pop-to-buffer "current-message")
585: (beginning-of-file)
586: (search-forward "\n\n")
587: (set-mark)
588: (beginning-of-file)
589: (narrow-region)
590: (error-occured
591: (re-search-forward "^Newsgroups:[ \t]*\\(.*\\)")
592: (region-around-match 1)
593: (setq newsgroups (region-to-string))
594: )
595: (save-excursion
596: (temp-use-buffer "Scratch Stuff")
597: (setq needs-checkpointing 0)
598: (erase-buffer)
599: (insert-string newsgroups)
600: (beginning-of-file)
601: (error-occured
602: (replace-string "general" "followup"))
603: (set-mark)
604: (end-of-file)
605: (setq newsgroups (region-to-string))
606: )
607: (beginning-of-file)
608: (error-occured
609: (re-search-forward "^Subject:[ \t]*\\(.*\\)")
610: (region-around-match 1)
611: (setq subject (region-to-string))
612: (if (!= (substr subject 1 3) "Re:")
613: (setq subject (concat "Re: " subject))
614: )
615: )
616: (beginning-of-file)
617: (if (error-occured
618: (re-search-forward "^References:[ \t]*\\(.*\\)")
619: (region-around-match 1)
620: (setq refs (concat (region-to-string) " " this-id)))
621: (setq refs this-id))
622: (beginning-of-file)
623: (widen-region)
624: (pop-to-buffer "send-mail")
625: (setq needs-checkpointing 0)
626: (setq case-fold-search 1)
627: (erase-buffer)
628: (insert-string (concat "Newsgroups: " newsgroups))
629: (newline)
630: (insert-string (concat "Subject: " subject))
631: (newline)
632: (insert-string (concat "References: " refs))
633: (newline)
634: (newline)
635: (rnews-do-post)
636: )
637: (rnews-position)
638: (if (looking-at "^>")
639: (progn
640: (forward-character)
641: (delete-next-character)
642: (insert-character 'F')
643: (beginning-of-line)))
644: )
645:
646: (rnews-post
647: (save-window-excursion
648: (pop-to-buffer "send-mail")
649: (setq needs-checkpointing 0)
650: (setq case-fold-search 1)
651: (erase-buffer)
652: (insert-string "Newsgroups: \nSubject: \n\n")
653: (beginning-of-file)
654: (end-of-line)
655: (rnews-do-post)
656: )
657: )
658:
659: (rnews-do-post rnews-do-send
660: (setq rnews-do-send 1)
661: (setq right-margin 72)
662: (local-bind-to-key "exit-emacs" "\^X\^S")
663: (local-bind-to-key "exit-emacs" "\^X\^F")
664: (local-bind-to-key "rnews-abort-send" "\^X\^A")
665: (local-bind-to-key "justify-paragraph" "\ej")
666: (local-bind-to-key "rnews-post-goto-dist" "\^Xd")
667: (while (= rnews-do-send 1)
668: (progn
669: (recursive-edit)
670: (if (= rnews-do-send 1)
671: (rnews-call-inews))))
672: )
673:
674: (rnews-post-goto-dist ; Move to the "Distribution:" field
675: (beginning-of-file)
676: (if (error-occured (re-search-forward "^Distribution:.*"))
677: (progn (re-search-forward "\n\n\\|^Subject:.*\n.")
678: (backward-character)
679: (backward-character)
680: (insert-string "\nDistribution: ")))
681: )
682:
683: (rnews-call-inews inews-errors
684: (save-excursion
685: (beginning-of-file)
686: (set-mark)
687: (end-of-file)
688: (copy-region-to-buffer "Delivery-errors")
689: )
690: (message "Sending...")
691: (sit-for 0)
692: (save-window-excursion
693: (temp-use-buffer "Delivery-errors")
694: (setq needs-checkpointing 0)
695: (beginning-of-file)
696: (set-mark)
697: (end-of-file)
698: (filter-region "inews -h")
699: (beginning-of-file)
700: (set-mark)
701: (error-occured (re-replace-string "\n\n* *" "; "))
702: (end-of-line)
703: (setq inews-errors (region-to-string))
704: (if (= (length inews-errors) 0)
705: (progn
706: (setq rnews-do-send 0)
707: (message "Posted")
708: )
709: (message inews-errors)
710: )
711: )
712: )
713:
714: (rnews-abort-send
715: (if (!= "y" (substr (get-tty-string
716: "Do you really want to abort the message? ")
717: 1 1))
718: (error-message "Turkey!"))
719: (setq rnews-do-send 0)
720: (exit-emacs)
721: )
722: )
723:
724: (defun
725: (rnews-unmark
726: (error-occured
727: (rnews-position)
728: (delete-next-character)
729: (insert-character ' ')
730: (beginning-of-line)))
731:
732: (rnews-mark
733: (beginning-of-line)
734: (if (error-occured
735: (if (eobp)
736: (re-search-reverse "^.")
737: (progn
738: (re-search-forward "^.")
739: (beginning-of-line)))
740: )
741: (message "No messages")
742: (progn
743: (delete-next-character)
744: (insert-character '>')
745: (rnews-pickup))
746: )
747: )
748:
749: (rnews-first-message
750: (rnews-unmark)
751: (beginning-of-file)
752: (rnews-mark)
753: )
754:
755: (rnews-last-message
756: (rnews-unmark)
757: (end-of-file)
758: (rnews-mark)
759: )
760:
761: (rnews-skip n
762: (setq n (get-tty-string "Skip messages: "))
763: (rnews-unmark)
764: (provide-prefix-argument n (next-line))
765: (rnews-mark)
766: )
767:
768: (rnews-this-message save-dot
769: (setq save-dot (dot))
770: (rnews-unmark)
771: (goto-character save-dot)
772: (rnews-mark)
773: )
774:
775: (rnews-decrypt-joke
776: (save-window-excursion
777: (temp-use-buffer "current-message")
778: (beginning-of-file)
779: (search-forward "\n\n")
780: (set-mark)
781: (end-of-file)
782: (filter-region "tr a-zA-Z n-za-mN-ZA-M")
783: )
784: )
785:
786: (rnews-unsubscribe group newsrc
787: (beginning-of-line)
788: (save-excursion
789: (provide-prefix-argument 2 (forward-character))
790: (set-mark)
791: (search-forward " ")
792: (search-reverse "/")
793: (setq group (region-to-string))
794: (temp-use-buffer ".newsrc")
795: (if (error-occured (setq newsrc (getenv "NEWSRC")))
796: (setq newsrc (concat (getenv "HOME") "/.newsrc")))
797: (read-file newsrc)
798: (if (error-occured (search-forward (concat group ":")))
799: (message "Already unsubscribed")
800: (progn
801: (delete-previous-character)
802: (insert-character '!')
803: (write-current-file)
804: (message (concat "Unsubscribed from " group))))
805: )
806: )
807: )
808:
809: (save-excursion i
810: (temp-use-buffer "rnews-directory")
811: (setq i ' ')
812: (while (< i 128)
813: (local-bind-to-key "illegal-operation" i)
814: (setq i (+ i 1)))
815: (local-bind-to-key "rnews-next-page" 'f')
816: (local-bind-to-key "rnews-previous-page" 'b')
817: (local-bind-to-key "rnews-previous-page" '^H')
818: (local-bind-to-key "rnews-next-message" 'n')
819: (local-bind-to-key "rnews-previous-message" 'p')
820: (local-bind-to-key "rnews-delete-message" 'd')
821: (local-bind-to-key "rnews-undelete-message" 'u')
822: (local-bind-to-key "rnews-delete-message-at-cursor" 'D')
823: (local-bind-to-key "rnews-undelete-message-at-cursor" 'U')
824: (local-bind-to-key "rnews-help" '?')
825: (local-bind-to-key "exit-emacs" 'q')
826: (local-bind-to-key "rnews-reply" 'r')
827: (local-bind-to-key "rnews-followup" 'F')
828: (local-bind-to-key "rnews-post" 'P')
829: (local-bind-to-key "smail" 'm')
830: (local-bind-to-key "rnews-goto-message" 'g')
831: (local-bind-to-key "rnews-first-message" '<')
832: (local-bind-to-key "rnews-last-message" '>')
833: (local-bind-to-key "rnews-skip" 's')
834: (local-bind-to-key "rmail-append" 'a')
835: (local-bind-to-key "rmail-shell" '!')
836: (local-bind-to-key "execute-extended-command" ':')
837: (local-bind-to-key "rnews-this-message" ' ')
838: (local-bind-to-key "rnews-this-message" '\r')
839: (local-bind-to-key "rnews-decrypt-joke" '`')
840: (local-bind-to-key "rnews-show-full-header" 'H')
841: (local-bind-to-key "rnews-unsubscribe" "\^Xu")
842: )
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.