Subject: bug#29533: Fwd: [Feature Request] ERC: let erc-join-channel support to select channels from history or a defined list

From: Stefan Kangas <[email-masked]>
Date: Mon, 18 May 2020 17:15:33 -0700

Hi Amin,

stardiviner <[email-masked]> writes:

> At last, I attached my generated commit in attachment.

Could you please help review the below patch?  I don't really use ERC.

Thanks in advance.

Best regards,
Stefan Kangas

> From 26f73fe065196ab8759f6c7f046587e47672ad47 Mon Sep 17 00:00:00 2001
> From: stardiviner <[email-masked]>
> 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