chiark / gitweb /
dot/gitconfig.in: Remove output filename; force full indices.
[profile] / dot / ercrc.el
index a84d63ffe086d0b476aeb65da3ca91181465794d..3881cc12c46eac9abda3720758ada109d61ae149 100644 (file)
@@ -13,8 +13,6 @@ (setq erc-fill-column 76
       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 @@ (add-hook 'erc-mode-hook 'mdw-erc-turn-off-truncate-lines)
 (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 @@ (defvar mdw-erc-ircop-alist nil
   "*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 @@ (defun erc-cmd-IRCOP ()
       (let ((acct (cadr a))
            (passwd (caddr a)))
        (erc-server-send (concat "OPER " acct " " passwd))))))
+
+(load "~/.erc-auth.el")
+(load "~/.erc-local.el")