X-Git-Url: https://git.distorted.org.uk/~mdw/profile/blobdiff_plain/61181450bc063b30e5d0208661d0b9f541119f4b..2cbc27f5c7514c1043f9ea52292178a884c6616d:/dot/ercrc.el diff --git a/dot/ercrc.el b/dot/ercrc.el index a84d63f..3881cc1 100644 --- a/dot/ercrc.el +++ b/dot/ercrc.el @@ -13,8 +13,6 @@ erc-fill-prefix " " erc-max-buffer-size (* 60 3000)) -(load "~/.erc-local.el") - (setq erc-track-exclude-types '("NICK" "JOIN" "PART")) (setq erc-auto-query 'buffer) @@ -30,12 +28,10 @@ (setq erc-autojoin t erc-autojoin-domain-only nil erc-autojoin-channels-alist - '(("irc.ssdis.loc" "#devel" "#jukebox" "#nextgen") - ("cam.irc.devel.ncipher.com" - "#devel" "#jukebox" "#nextgen" "#sec-team") - ("chiark.greenend.org.uk" "#chiark") + '(("chiark.greenend.org.uk" "#chiark") ("irc.distorted.org.uk" "#distorted" "#jukebox") ("irc.hstg.corp.good.com" "#hstg"))) +(erc-autojoin-mode 1) (defvar mdw-erc-auto-greet-bots-alist nil "*Alist of (SERVER-REGEXP BOT-NICK MESSAGE-FORM). @@ -46,19 +42,56 @@ matches SERVER-REGEXP.") "*Alist of (SERVER-REGEXP ACCT PASSWD). Login details for claiming server admin rights.") +(defun mdw-remprop-nondestructive (indic plist) + "Return a plist like PLIST, only without the first entry for INDIC. +The PLIST is not itself modified." + (if (getf plist indic) + (let* ((head (cons nil nil)) + (tail head)) + (while (and plist (not (eq (car plist) indic))) + (let* ((i (pop plist)) (v (pop plist)) + (vv (cons v nil)) (ii (cons i vv))) + (rplacd tail ii) + (setq tail vv))) + (rplacd tail (cddr plist)) + (cdr head)) + plist)) + +(defun* mdw-cons-replace + (item list &rest keys &key (key '#'identity) &allow-other-keys) + "Return LIST, with ITEM at the start, replacing any existing matching item. +Specifically, any item in the list satisfying the test are removed +\(nondestructively), and then the new ITEM is added to the front." + (cons item (apply #'remove* (funcall key item) list :key key + (mdw-remprop-nondestructive :key keys)))) + +(defmacro* mdw-pushnew-replace (item place &rest keys) + "Add ITEM to the list PLACE, replacing any existing matching item. +Specifically, any item in the list satisfying the test are removed +\(nondestructively), and then the new ITEM is added to the front. + +Evaluation order for the keywords is a bit screwy: don't rely on it." + (cond ((fboundp 'cl-callf2) + `(cl-callf2 mdw-cons-replace ,item ,place ,@keys)) + ((fboundp 'cl-setf-do-modify) + ;; `cl-setf-do-modify' returns a list (LETS STORE FETCH). + (let ((setf-things (cl-setf-do-modify place (cons 'list keys)))) + `(let (,@(car setf-things)) + ,(cl-setf-do-store (cadr setf-things) + `(mdw-cons-replace ,item ,place + ,@keys))))) + (t (error "Don't know how to hack places on this Emacs.")))) + (defun mdw-define-bot-greeting (server bot greeting) "Define a new bot greeting." - (setq mdw-erc-auto-greet-bots-alist - (cons (list server bot greeting) - (remove* server mdw-erc-auto-greet-bots-alist - :test #'string= :key #'car)))) + (mdw-pushnew-replace (list server bot greeting) + mdw-erc-auto-greet-bots-alist + :test #'string= :key #'car)) (defun mdw-add-ircop-credentials (server acct passwd) "Define a new set of `ircop' credentials." - (setq mdw-erc-ircop-alist - (cons (list server acct passwd) - (remove* server mdw-erc-ircop-alist - :test #'string= :key #'car))))) -(load "~/.erc-auth.el") + (mdw-pushnew-replace (list server acct passwd) + mdw-erc-ircop-alist + :test #'string= :key #'car)) (defun mdw-assoc-regexp (regexp alist) "Return the association in ALIST whose car matches REGEXP." @@ -88,3 +121,6 @@ Login details for claiming server admin rights.") (let ((acct (cadr a)) (passwd (caddr a))) (erc-server-send (concat "OPER " acct " " passwd)))))) + +(load "~/.erc-auth.el") +(load "~/.erc-local.el")