chiark / gitweb /
el/dot-emacs.el: Better fontification for Ediff.
[profile] / dot / ercrc.el
1 ;;; -*-emacs-lisp-*-
2 ;;;
3 ;;; ERC configuration
4
5 (setq erc-nick "mdw"
6       erc-user-full-name "Mark Wooding")
7
8 (if (not (memq 'truncate erc-modules))
9     (setq erc-modules (cons 'truncate erc-modules)))
10
11 (setq erc-fill-column 76
12       erc-timestamp-right-column 68
13       erc-fill-prefix "   "
14       erc-max-buffer-size (* 60 3000))
15
16 (load "~/.erc-local.el")
17
18 (setq erc-track-exclude-types '("NICK" "JOIN" "PART"))
19
20 (setq erc-auto-query 'buffer)
21
22 (defun mdw-erc-turn-off-truncate-lines ()
23   (setq truncate-lines nil
24         truncate-partial-with-windows nil
25         word-wrap t
26         wrap-prefix (concat (propertize "    " 'face 'erc-prompt-face)
27                             " ")))
28 (add-hook 'erc-mode-hook 'mdw-erc-turn-off-truncate-lines)
29
30 (setq erc-autojoin t
31       erc-autojoin-domain-only nil
32       erc-autojoin-channels-alist
33       '(("irc.ssdis.loc" "#devel" "#jukebox" "#nextgen")
34         ("cam.irc.devel.ncipher.com"
35          "#devel" "#jukebox" "#nextgen" "#sec-team")
36         ("chiark.greenend.org.uk" "#chiark")
37         ("irc.distorted.org.uk" "#distorted" "#jukebox")
38         ("irc.hstg.corp.good.com" "#hstg")))
39
40 (defvar mdw-erc-auto-greet-bots-alist nil
41   "*Alist of (SERVER-REGEXP BOT-NICK MESSAGE-FORM).
42 Evaluate MESSAGE-FORM and sent to BOT-NICK when connected to a server which
43 matches SERVER-REGEXP.")
44
45 (defvar mdw-erc-ircop-alist nil
46   "*Alist of (SERVER-REGEXP ACCT PASSWD).
47 Login details for claiming server admin rights.")
48
49 (defun mdw-remprop-nondestructive (indic plist)
50   "Return a plist like PLIST, only without the first entry for INDIC.
51 The PLIST is not itself modified."
52   (if (getf plist indic)
53       (let* ((head (cons nil nil))
54              (tail head))
55         (while (and plist (not (eq (car plist) indic)))
56           (let* ((i (pop plist)) (v (pop plist))
57                  (vv (cons v nil)) (ii (cons i vv)))
58             (rplacd tail ii)
59             (setq tail vv)))
60         (rplacd tail (cddr plist))
61         (cdr head))
62     plist))
63
64 (defmacro* mdw-pushnew-replace
65     (item place &rest keys &key (key '#'identity) &allow-other-keys)
66   "Add ITEM to the list PLACE, replacing any existing matching item.
67 Specifically, any item in the list satisfying the test are removed
68 \(nondestructively), and then the new ITEM is added to the front.
69
70 Evaluation order for the keywords is a bit screwy: don't rely on it."
71   ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH).
72   (let ((setf-things (cl-setf-do-modify place (cons 'list keys)))
73         (keyfn (gensym "key"))
74         (itemvar (gensym "item")))
75     `(let ((,keyfn ,key)
76            (,itemvar ,item)
77            ,@(car setf-things))
78        ,(cl-setf-do-store (cadr setf-things)
79                           `(cons ,itemvar
80                                  (remove* (funcall ,keyfn ,itemvar)
81                                           ,(caddr setf-things)
82                                           :key ,keyfn
83                                           ,@(mdw-remprop-nondestructive
84                                              :key keys)))))))
85
86 (defun mdw-define-bot-greeting (server bot greeting)
87   "Define a new bot greeting."
88   (mdw-pushnew-replace (list server bot greeting)
89                        mdw-erc-auto-greet-bots-alist
90                        :test #'string= :key #'car))
91 (defun mdw-add-ircop-credentials (server acct passwd)
92   "Define a new set of `ircop' credentials."
93   (mdw-pushnew-replace (list server acct passwd)
94                        mdw-erc-ircop-alist
95                        :test #'string= :key #'car))
96 (load "~/.erc-auth.el")
97
98 (defun mdw-assoc-regexp (regexp alist)
99   "Return the association in ALIST whose car matches REGEXP."
100   (let ((answer nil))
101     (dolist (l alist)
102       (when (string-match (car l) regexp)
103         (setq answer l)))
104     answer))
105
106 (defun mdw-erc-auto-greet-bots (server nick)
107   "Send greeting message to bots."
108   (let ((a (mdw-assoc-regexp server mdw-erc-auto-greet-bots-alist)))
109     (when a
110       (let ((bot (cadr a))
111             (message (caddr a)))
112         (erc-server-send (concat "PRIVMSG " bot " :" message))))))
113 (add-hook 'erc-after-connect 'mdw-erc-auto-greet-bots)
114
115 (defun erc-cmd-GREET ()
116   "Send greeting messages, according to `mdw-erc-auto-greet-bots-alist'."
117   (mdw-erc-auto-greet-bots erc-session-server (erc-current-nick)))
118
119 (defun erc-cmd-IRCOP ()
120   "Claim `ircop' privileges."
121   (let ((a (mdw-assoc-regexp erc-session-server mdw-erc-ircop-alist)))
122     (when a
123       (let ((acct (cadr a))
124             (passwd (caddr a)))
125         (erc-server-send (concat "OPER " acct " " passwd))))))