From 26f73fe065196ab8759f6c7f046587e47672ad47 Mon Sep 17 00:00:00 2001 From: stardiviner Date: Mon, 18 May 2020 20:16:21 +0800 Subject: [PATCH] Join channel smartly from alist of stored channels * lisp/erc/erc.el (erc-mode-map): Add an option to store your frequently joined channels. And replace original `erc-join-channel' with `erc-join-channel-select'. --- lisp/erc/erc.el | 41 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index cfde84e19a..be59b4203f 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -1161,7 +1161,7 @@ erc-mode-map (define-key map "\C-c\C-e" 'erc-toggle-ctcp-autoresponse) (define-key map "\C-c\C-f" 'erc-toggle-flood-control) (define-key map "\C-c\C-i" 'erc-invite-only-mode) - (define-key map "\C-c\C-j" 'erc-join-channel) + (define-key map "\C-c\C-j" 'erc-join-channel-select) (define-key map "\C-c\C-n" 'erc-channel-names) (define-key map "\C-c\C-o" 'erc-get-channel-mode-from-keypress) (define-key map "\C-c\C-p" 'erc-part-from-channel) @@ -3993,6 +3993,34 @@ erc-input-action (if (not (string-match "^\\s-*$" action)) (erc-send-action (erc-default-target) action)))) +(defcustom erc-join-channels-alist nil + "Alist of channels to select when you join channels. + +Every element in the alist has the form (SERVER . CHANNELS). +SERVER is a regexp matching the server, and channels is the +list of channels to join. + +If the channel(s) require channel keys for joining, the passwords +are found via auth-source. For instance, if you use ~/.authinfo +as your auth-source backend, then put something like the +following in that file: + +machine irc.example.net login \"#fsf\" password sEcReT + +Customize this variable to set the value for your first connect. +Once you are connected and join and part channels, this alist +keeps track of what channels you are on, and will join them +again when you get disconnected. When you restart Emacs, however, +those changes are lost, and the customization you saved the last +time is used again." + :group 'erc-join + :type '(repeat (cons :tag "Server" + (regexp :tag "Name") + (repeat :tag "Channels" + (string :tag "Name"))))) + +(setq erc-join-channels-alist '(("*.freenode.net" "#emacs" "#org-mode"))) + (defun erc-join-channel (channel &optional key) "Join CHANNEL. @@ -4008,6 +4036,17 @@ erc-join-channel (read-from-minibuffer "Channel key (RET for none): " nil)))) (erc-cmd-JOIN channel (when (>= (length key) 1) key))) +(defun erc-join-channel-select () + "Select a channel to join from alist of channels to." + (interactive) + (erc-join-channel + (completing-read + "Select a channel: " + (cdr (assoc + (completing-read "Select a server: " + (mapcar 'car erc-join-channels-alist)) + erc-join-channels-alist))))) + (defun erc-part-from-channel (reason) "Part from the current channel and prompt for a REASON." (interactive -- 2.26.2