6 erc-user-full-name "Mark Wooding")
8 (if (not (memq 'truncate erc-modules))
9 (setq erc-modules (cons 'truncate erc-modules)))
11 (setq erc-fill-column 76
12 erc-timestamp-right-column 68
14 erc-max-buffer-size (* 60 3000))
16 (setq erc-track-exclude-types '("NICK" "JOIN" "PART"))
18 (setq erc-auto-query 'buffer)
20 (defun mdw-erc-turn-off-truncate-lines ()
21 (setq truncate-lines nil
22 truncate-partial-with-windows nil
24 wrap-prefix (concat (propertize " " 'face 'erc-prompt-face)
26 (add-hook 'erc-mode-hook 'mdw-erc-turn-off-truncate-lines)
29 erc-autojoin-domain-only nil
30 erc-autojoin-channels-alist
31 '(("chiark.greenend.org.uk" "#chiark")
32 ("irc.distorted.org.uk" "#distorted" "#jukebox")
33 ("irc.hstg.corp.good.com" "#hstg")))
36 (defvar mdw-erc-auto-greet-bots-alist nil
37 "*Alist of (SERVER-REGEXP BOT-NICK MESSAGE-FORM).
38 Evaluate MESSAGE-FORM and sent to BOT-NICK when connected to a server which
39 matches SERVER-REGEXP.")
41 (defvar mdw-erc-ircop-alist nil
42 "*Alist of (SERVER-REGEXP ACCT PASSWD).
43 Login details for claiming server admin rights.")
45 (defun mdw-remprop-nondestructive (indic plist)
46 "Return a plist like PLIST, only without the first entry for INDIC.
47 The PLIST is not itself modified."
48 (if (getf plist indic)
49 (let* ((head (cons nil nil))
51 (while (and plist (not (eq (car plist) indic)))
52 (let* ((i (pop plist)) (v (pop plist))
53 (vv (cons v nil)) (ii (cons i vv)))
56 (rplacd tail (cddr plist))
60 (defun* mdw-cons-replace
61 (item list &rest keys &key (key '#'identity) &allow-other-keys)
62 "Return LIST, with ITEM at the start, replacing any existing matching item.
63 Specifically, any item in the list satisfying the test are removed
64 \(nondestructively), and then the new ITEM is added to the front."
65 (cons item (apply #'remove* (funcall key item) list :key key
66 (mdw-remprop-nondestructive :key keys))))
68 (defmacro* mdw-pushnew-replace (item place &rest keys)
69 "Add ITEM to the list PLACE, replacing any existing matching item.
70 Specifically, any item in the list satisfying the test are removed
71 \(nondestructively), and then the new ITEM is added to the front.
73 Evaluation order for the keywords is a bit screwy: don't rely on it."
74 (cond ((fboundp 'cl-callf2)
75 `(cl-callf2 mdw-cons-replace ,item ,place ,@keys))
76 ((fboundp 'cl-setf-do-modify)
77 ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH).
78 (let ((setf-things (cl-setf-do-modify place (cons 'list keys))))
79 `(let (,@(car setf-things))
80 ,(cl-setf-do-store (cadr setf-things)
81 `(mdw-cons-replace ,item ,place
83 (t (error "Don't know how to hack places on this Emacs."))))
85 (defun mdw-define-bot-greeting (server bot greeting)
86 "Define a new bot greeting."
87 (mdw-pushnew-replace (list server bot greeting)
88 mdw-erc-auto-greet-bots-alist
89 :test #'string= :key #'car))
90 (defun mdw-add-ircop-credentials (server acct passwd)
91 "Define a new set of `ircop' credentials."
92 (mdw-pushnew-replace (list server acct passwd)
94 :test #'string= :key #'car))
96 (defun mdw-assoc-regexp (regexp alist)
97 "Return the association in ALIST whose car matches REGEXP."
100 (when (string-match (car l) regexp)
104 (defun mdw-erc-auto-greet-bots (server nick)
105 "Send greeting message to bots."
106 (let ((a (mdw-assoc-regexp server mdw-erc-auto-greet-bots-alist)))
110 (erc-server-send (concat "PRIVMSG " bot " :" message))))))
111 (add-hook 'erc-after-connect 'mdw-erc-auto-greet-bots)
113 (defun erc-cmd-GREET ()
114 "Send greeting messages, according to `mdw-erc-auto-greet-bots-alist'."
115 (mdw-erc-auto-greet-bots erc-session-server (erc-current-nick)))
117 (defun erc-cmd-IRCOP ()
118 "Claim `ircop' privileges."
119 (let ((a (mdw-assoc-regexp erc-session-server mdw-erc-ircop-alist)))
121 (let ((acct (cadr a))
123 (erc-server-send (concat "OPER " acct " " passwd))))))
125 (load "~/.erc-auth.el")
126 (load "~/.erc-local.el")