]> git.eshelyaron.com Git - emacs.git/commitdiff
Optionally prompt for more ERC entry-point params
authorF. Jason Park <jp@neverwas.me>
Thu, 29 Dec 2022 14:43:19 +0000 (06:43 -0800)
committerF. Jason Park <jp@neverwas.me>
Sat, 8 Apr 2023 21:23:51 +0000 (14:23 -0700)
* doc/misc/erc.texi: Update statement about availability of `:user'
keyword param when entry points called interactively.
* lisp/erc/erc/compat.el: Don't require `url-parse' when compiling.
Add forward declaration for `url-type'.
* lisp/erc/erc.el: Don't require `url-parse' when compiling.  Add
forward declarations for accessors of `url' struct from `url-parse'
library.
(erc-select-read-args): Allow optionally calling entry points with a
prefix arg to access params `user' and `:full-name'.
(erc-tls): Update doc string.
* test/lisp/erc/erc-tests.el (erc-select-read-args): Add test for
extra args.  (Bug#60428.)

doc/misc/erc.texi
lisp/erc/erc-compat.el
lisp/erc/erc.el
test/lisp/erc/erc-tests.el

index b80affbc954bfad8cc1f08b7ea59c1bc5d938a3b..e92bf576e7520fb7aaa735c3fc3e6f7a6576fe5d 100644 (file)
@@ -952,7 +952,7 @@ Here, ``password'' refers to your account password, which is usually
 your @samp{NickServ} password.  To make this work, customize
 @code{erc-sasl-user} and @code{erc-sasl-password} or specify the
 @code{:user} and @code{:password} keyword arguments when invoking
-@code{erc-tls}.  Note that @code{:user} cannot be given interactively.
+@code{erc-tls}.
 
 @item @code{external} (via Client TLS Certificate)
 This works in conjunction with the @code{:client-certificate} keyword
index 10a495211ccc2b1bf31bcba2f7c65364f6979dc4..29892b78a39db3a53565c923778d1e71cae74b31 100644 (file)
@@ -32,7 +32,7 @@
 ;;; Code:
 
 (require 'compat nil 'noerror)
-(eval-when-compile (require 'cl-lib) (require 'url-parse))
+(eval-when-compile (require 'cl-lib))
 
 ;; Except for the "erc-" namespacing, these two definitions should be
 ;; continuously updated to match the latest upstream ones verbatim.
@@ -412,6 +412,7 @@ If START or END is negative, it counts from the end."
 ;;;; Misc 29.1
 
 (defvar url-irc-function)
+(declare-function url-type "url-parse" (cl-x))
 
 (defun erc-compat--29-browse-url-irc (string &rest _)
   (require 'url-irc)
index 4c856f49c04490553b67811e80b2780e6fe59f5f..85f0416f44b987dd5631870a0d5b92849c00efbe 100644 (file)
@@ -65,7 +65,7 @@
 (require 'cl-lib)
 (require 'format-spec)
 (require 'auth-source)
-(eval-when-compile (require 'subr-x) (require 'url-parse))
+(eval-when-compile (require 'subr-x))
 
 (defconst erc-version "5.6-git"
   "This version of ERC.")
 (declare-function word-at-point "thingatpt" (&optional no-properties))
 (autoload 'word-at-point "thingatpt") ; for hl-nicks
 
+(declare-function url-host "url-parse" (cl-x))
+(declare-function url-password "url-parse" (cl-x))
+(declare-function url-portspec "url-parse" (cl-x))
+(declare-function url-type "url-parse" (cl-x))
+(declare-function url-user "url-parse" (cl-x))
+
 ;; tunable connection and authentication parameters
 
 (defcustom erc-server nil
@@ -2257,8 +2263,8 @@ parameters SERVER and NICK."
 
 ;;;###autoload
 (defun erc-select-read-args ()
-  "Prompt the user for values of nick, server, port, and password."
-  (require 'url-parse)
+  "Prompt the user for values of nick, server, port, and password.
+With prefix arg, also prompt for user and full name."
   (let* ((input (let ((d (erc-compute-server)))
                   (read-string (format "Server or URL (default is %S): " d)
                                nil 'erc-server-history-list d)))
@@ -2278,6 +2284,14 @@ parameters SERVER and NICK."
                    (let ((d (erc-compute-nick)))
                      (read-string (format "Nickname (default is %S): " d)
                                   nil 'erc-nick-history-list d))))
+         (user (and current-prefix-arg
+                    (let ((d (erc-compute-user (url-user url))))
+                      (read-string (format "User (default is %S): " d)
+                                   nil nil d))))
+         (full (and current-prefix-arg
+                    (let ((d (erc-compute-full-name (url-user url))))
+                      (read-string (format "Full name (default is %S): " d)
+                                   nil nil d))))
          (passwd (let* ((p (with-suppressed-warnings ((obsolete erc-password))
                              (or (url-password url) erc-password)))
                         (m (if p
@@ -2298,8 +2312,8 @@ parameters SERVER and NICK."
       (push `(erc-server-connect-function . ,opener) env))
     (when (and passwd (string= "" passwd))
       (setq passwd nil))
-    `( :server ,server :port ,port :nick ,nick
-       ,@(and passwd `(:password ,passwd))
+    `( :server ,server :port ,port :nick ,nick ,@(and user `(:user ,user))
+       ,@(and passwd `(:password ,passwd)) ,@(and full `(:full-name ,full))
        ,@(and env `(&interactive-env ,env)))))
 
 (defmacro erc--with-entrypoint-environment (env &rest body)
@@ -2407,8 +2421,8 @@ Example usage:
 
 When present, ID should be a symbol or a string to use for naming
 the server buffer and identifying the connection unequivocally.
-See Info node `(erc) Network Identifier' for details.  Like USER
-and CLIENT-CERTIFICATE, this parameter cannot be specified
+See Info node `(erc) Network Identifier' for details.  Like
+CLIENT-CERTIFICATE, this parameter cannot be specified
 interactively.
 
 \(fn &key SERVER PORT NICK USER PASSWORD FULL-NAME CLIENT-CERTIFICATE ID)"
index beb4b4cef7659f62df90847f350e8307f43565d9..795864a2cc240f118af2fb9871b9a551c87b19ed 100644 (file)
                      (erc-select-read-args))
                    (list :server "[::1]"
                          :port 6667
-                         :nick "nick")))))
+                         :nick "nick"))))
+
+  (ert-info ("Extra args use URL nick by default")
+    (should (equal (ert-simulate-keys "nick:sesame@localhost:6667\r\r\r\r"
+                     (let ((current-prefix-arg '(4)))
+                       (erc-select-read-args)))
+                   (list :server "localhost"
+                         :port 6667
+                         :nick "nick"
+                         :user "nick"
+                         :password "sesame"
+                         :full-name "nick")))))
 
 (ert-deftest erc-tls ()
   (let (calls env)