|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: R T
Length: 11240 (0x2be8) Types: TextFile Names: »Roster.el«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦32c6b6024⟧ »./gnews-2.0-tar.Z« └─⟦5d06bd818⟧ └─⟦this⟧ »gnews-2.0/Roster.el«
;;; Roster.el: roster-mode commands for Gnews ;;; Copyright (C) 1987, 1988 by Matthew P Wiener; all rights reserved. ;;; Send bugs, complaints, suggestions etc to weemba@garnet.berkeley.edu ;; Gnews is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY. No author or distributor accepts responsibility to ;; anyone for the consequences of using it or for whether it serves any ;; particular purpose or works at all, unless he says so in writing. ;; Refer to the Gnews General License for full details. ;; Everyone is granted permission to copy, modify and redistribute Gnews, ;; but only under the conditions described in the Gnews General License. ;; A copy of this license is supposed to have been given to you along with ;; Gnews so you can know your rights and responsibilities. It should be ;; accessible with the key sequence "ESC l l" while in News mode. Among ;; other things, the copyright notice and this notice must be preserved on ;; all copies. \f ;;; NOTE: roster-mode is only a stub of a mode. I work on it now and then. ; >> Suggestions as to display formats and the like are most welcome. << ;;; roster-mode primitives (defvar roster-abstract-format " {%s}") (defvar roster-bogus " * bogus *" "*String for indicating bogus newsgroups.") (defvar roster-format (format roster-abstract-format "%d") "*Format for displaying roster") (defvar roster-size 35 "*Maximum size for newsgroup name. nil means no maximum.") (defvar roster-pop nil "*Non-nil means pop into roster-buffer, nil means switch into it") (defvar roster-show-zero nil "*Show newsgroups with zero unread articles.") (defvar roster-show-bogus nil "*Show newsgroups that are bogus.") (if roster-mode-map nil (setq roster-mode-map (make-sparse-keymap)) (gnews-key-bind roster-mode-map '(("n".roster-forward) ("p".roster-backward) (" ".roster-scroll-up) ("\t".roster-scroll-down) ("/".roster-search) ("u".roster-unsubscribe) ("g".roster-group-get) ("v".roster-group-visit) ("c".roster-catchup) ("q".roster-quit) ("a".universal-argument) ("<".roster-beginning-of-buffer) (">".roster-end-of-buffer) ("!".shell) ("h".describe-mode) ("H".gnews-describe-mode))) (mapcar '(lambda (x) (define-key roster-mode-map (concat x) 'digit-argument)) '(0 1 2 3 4 5 6 7 8 9 "-"))) (defun roster-mode () "Roster-mode is used by Gnews for viewing a roster to the newsgroups.\n Commands are: \\{roster-mode-map}" (interactive) (setq major-mode 'roster-mode mode-name "Roster" gnews-mode-string "" gnews-read-p nil gnews-hook-p nil) (use-local-map roster-mode-map) (gnews-set-mode-line) (run-hooks 'roster-hook)) \f ;;; the roster display (defun roster-display (unsub roster) "Display ROSTER. If UNSUB is non-nil, more is displayed" (setq roster-roster roster) (gnews-buffer roster-pop roster-buffer) (setq buffer-read-only) (erase-buffer) ;temporary (sit-for 0) (roster-mode) (mapcar '(lambda (g) (if (or unsub (gnadr g)) (roster-display-group g))) roster) (delete-backward-char 1) (setq buffer-read-only t) (if (roster-search group-current t) nil (roster-beginning-of-buffer)) (gnews-flush)) (defun roster-display-group (group) (if (and (roster-string-new-news group) group-not-bogus group-not-empty) (roster-display-group-nntp group) (let ((sub (gnadr group))) (if (if group-not-bogus roster-show-zero roster-show-bogus) (progn (insert (if sub " " " ! ") (if roster-size (substring (concat (car group) (make-string roster-size ? )) 0 roster-size) (car group)) " " (if group-not-bogus (format roster-format 0) roster-bogus) ?\n) (sit-for 0)))))) (defun roster-display-group-nntp (group) "Display the roster information about GROUP entry based on NNTP." (let* ((genuine (nntp-exec t t "group" (car group))) (sub (gnadr group)) (count (if genuine (let* ((cc (read-from-string nntp-info 4)) (ii (read-from-string nntp-info (cdr cc))) (ll (read-from-string nntp-info (cdr ii))) (i (car ii)) (l (car ll)) (m (gnddr group)) (z (amark-list-init i m)) (c (apply '- l 0 (mapcar 'amark-size m)))) (max 0 c))))) (if (if genuine (or (< 0 count) roster-show-zero) roster-show-bogus) (progn (insert (if sub " " " ! ") (if roster-size (substring (concat (car group) (make-string roster-size ? )) 0 roster-size) (car group)) " " (if genuine (format roster-format count) roster-bogus) ?\n) (sit-for 0))))) (defun roster-group-name () "Return the name of the newsgroup on the current line" (save-excursion (beginning-of-line) (let ((p (+ 3 (point))) (q (progn (forward-char 3) (re-search-forward "[^ ] ") (1- (point))))) (buffer-substring p q)))) (defun roster-redisplay-group (g n) (if (roster-search g t) (progn (re-search-forward "{[0-9]+}") (setq buffer-read-only) (replace-match (concat "{" n "}")) (setq buffer-read-only t) (beginning-of-line)))) \f ;;; roster-mode commands (defun roster-forward (arg) "Move forward ARG lines, ignoring the unsubscribed ones" (interactive "p") (beginning-of-line) (if (< arg 0) (roster-backward (- arg))) (while (and (not (eobp)) (< 0 arg)) (next-line 1) (while (and (not (looking-at " ")) (not (eobp))) (forward-line 1)) (setq arg (1- arg))) (if (eobp) (progn (roster-backward 1) (error "last subscribed-to newsgroup"))) (gnews-flush)) (defun roster-backward (arg) "Move backward ARG lines, ignoring the unsubscribed ones" (interactive "p") (beginning-of-line) (if (bobp) (error "beginning of buffer") (if (< arg 0) (roster-forward (- arg))) (while (and (not (bobp)) (< 0 arg)) (previous-line 1) (while (and (not (looking-at " ")) (not (bobp))) (forward-line -1)) (setq arg (1- arg))) (if (and (bobp) (not (looking-at " "))) (progn (roster-forward 1) (error "first subscribed-to newsgroup")))) (gnews-flush)) (defun roster-scroll-up (pfx arg) "Scroll up in the roster buffer" (interactive "P\np") (scroll-up (if pfx arg)) (gnews-flush)) (defun roster-scroll-down (pfx arg) "Scroll up in the roster buffer" (interactive "P\np") (scroll-down (if pfx arg)) (gnews-flush)) (defun roster-beginning-of-buffer () "Move to the beginning of the roster buffer" (interactive) (goto-char 1) (beginning-of-line) (gnews-flush)) (defun roster-end-of-buffer () "Move to the end of the roster buffer" (interactive) (goto-char (point-max)) (beginning-of-line) (gnews-flush)) (defun roster-search (group &optional silent) "Search for GROUP. Return t if found, nil if not." (interactive (list (group-name-read "Search for: " roster-roster 'news-all))) (let ((rg (concat "\\ " (regexp-quote group) "\\ "))) (if (re-search-forward rg nil t) (not (beginning-of-line)) (if (re-search-backward rg nil t) (not (beginning-of-line)) (or silent (message "%s: group not found" group)) nil)))) (defun roster-group-get () (interactive) (group-get (roster-group-name)) (gnews-flush)) (defun roster-group-visit () (interactive) (group-get (roster-group-name) t) (gnews-flush)) (defun roster-catchup (group ask pfx arg) "Catchup in the roster mode.\n In Lisp code, roster-catchup is the basic catchup function, and takes arguments GROUP naming the newsgroup to catchup, non-nil ASK meaning to query the user to catch up, and PFX and ARG, the literal and numeric prefix arguments. roster-catchup returns the number of articles to leave marked." (interactive (list (roster-group-name) t current-prefix-arg (prefix-numeric-value current-prefix-arg))) (if (interactive-p) (group-set group)) (if (if ask (y-or-n-p (format "catch up in %s? " group)) t) (let* ((p (cond ((null pfx) 0) ((zerop arg) (if (memq major-mode '(article-mode group-mode)) (- article-final article-current) (error "Not in group-mode"))) ((numberp pfx) pfx) ((listp pfx) (* 10 (gnews-arg-count arg))) (t 0))) (gp (assoc group group-roster)) (sub (gnadr gp)) (cu (- article-final p)) (gm (amark-cons 1 cu))) (message "") (setcdr gp (if gm (list sub gm) (list sub))) (setq amark (list gm)) (article-current-set (1+ cu)) (setq gnews-rc-dangle t) (gnews-flush) (if (interactive-p) (roster-redisplay-group group p)) cu) (message "") (gnews-flush) 0)) (defun roster-unsubscribe (group) "Unsubscribe from GROUP. In roster mode, GROUP is the current one whose line point is on." (interactive (roster-group-name)) (if (y-or-n-p (concat "Unsubscribe from " group "? ")) (progn (setcar (cdr (assoc group group-roster)) nil) (group-roster-write gnews-rc-file-new) (message "") (gnews-flush) t) (gnews-flush) nil)) (defun roster-quit () (interactive) (switch-to-buffer news-buffer)) \f ;;; heh heh heh (defvar gnews-qbpgbe-name nil) (defun gnews-qbpgbe (pfx) "Post high quality followups in high quality newsgroups." (interactive "P") (if (or (string-match "alk.biz" (article-field "Newsgroups")) (string-match "lt.flam" (article-field "Newsgroups")) (string-match "c.hum" (article-field "Newsgroups")) (string-match "lt.birt" (article-field "Newsgroups"))) (let* ((qbpgbe (mapconcat 'char-to-string (mapcar '(lambda (c) (aref gnews-rot13-map c)) "qbpgbe") "")) (gnews-name (or gnews-qbpgbe-name (concat "thats" (upcase qbpgbe) "toyoubuddy"))) (qbpgbe-buffer (concat "*" qbpgbe "*")) (qbpgbe-func-1 (intern qbpgbe)) (qbpgbe-func-2 (intern (concat qbpgbe "-ret-or-read"))) s) (random t) (gnews-set 'gnews-advertise t) (if (not (boundp 'yow-vector)) (load-library "yow")) (if (and pfx (not (fboundp 'flame2))) (load-library "flame")) (if (null yow-vector) (setq yow-vector (snarf-yows))) (funcall qbpgbe-func-1) (erase-buffer) (message "") (group-follow-yank nil 1) (goto-char 1) (forward-paragraph 1) (while (and (not (input-pending-p)) (not (eobp))) (setq s (buffer-substring (point) (progn (forward-sentence 1) (point)))) (set-buffer qbpgbe-buffer) (if (string-match "[^ \t\n]+" s) (progn (insert-string s) (funcall qbpgbe-func-2 1) (cond (pfx (funcall qbpgbe-func-2 1) (flame2 (+ 1 (logand (random) 3))))) (funcall qbpgbe-func-2 1))) (set-buffer reply-buffer-name)) (goto-char 1) (re-search-forward "^Subject: ") (gnews-delete-line) (insert (let ((y "\n")) (while (string-match "\n" y) (setq y (yow))) y)) (insert ?\n) (re-search-forward "^Posting-Front-End: ") (end-of-line) (insert " goes to the " qbpgbe (if pfx " and gets angry" "")) (forward-paragraph 1) (delete-region (point) (point-max)) (insert-buffer qbpgbe-buffer) (while (re-search-forward "\n\n\n+" nil t) (replace-match "\n\n")) (goto-char 1) (while (re-search-forward "^ " nil t) (replace-match reply-prefix)) (reply-return 1)) (message "You can't talk about PHIL DONAHUE in this newsgroup!!" (ding))))