Subject: bug#6076: closed (Re: bug#6076: 23.1.96; [PATCH] rcirc-complete for nicks and commands)

From: [email-masked] (GNU bug Tracking System)
Date: Sun, 12 Sep 2010 15:38:04 +0000

Your bug report

#6076: 23.1.96; [PATCH] rcirc-complete for nicks and commands

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
6076: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=6076
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#6076: 23.1.96; [PATCH] rcirc-complete for nicks and commands
From: Stefan Monnier <[email-masked]>
To: Leo <[email-masked]>
Cc: Ryan Yeske <[email-masked]>
Date: Sun, 12 Sep 2010 13:11:47 +0200
List-Id: <debbugs-submit.debbugs.gnu.org>

> The ChangeLog entry could looks something like this:

> 	* net/rcirc.el (rcirc-server-commands, rcirc-client-commands)
> 	(rcirc-completion-start): new variables.
> 	(rcirc-nick-completions): rename to rcirc-completions.
> 	(rcirc-nick-completion-start-offset): delete.
> 	(rcirc-completion-at-point): new function for constructing
> 	completion data for both nicks and irc commands. Add to
> 	completion-at-point-functions in rcirc mode.
> 	(rcirc-complete): rename from rcirc-nick-complete; use
> 	rcirc-completion-at-point.
> 	(defun-rcirc-command): update rcirc-client-commands.

Looks fine, except that we capitalize after the ":".
Installed, thank you,

        Stefan

Subject: 23.1.96; [PATCH] rcirc-complete for nicks and commands
From: Leo <[email-masked]>
To: [email-masked]
Date: Sun, 02 May 2010 09:49:09 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

The attached patch replaces rcirc-complete-nick with rcirc-complete that
completes both nicks and user commands. User command completion is only
done after '/'.

I have yet to find a reliable way to obtaining a list of commands
supported by an irc server. So in the end only the standard commands are
copied from RFCs. Let me know if there is a better solution.

>From 25bedc278df5376f24eff69f0dd48c19bc046e6f Mon Sep 17 00:00:00 2001
From: Leo <[email-masked]>
Date: Sun, 2 May 2010 07:00:56 +0100
Subject: [PATCH] New command rcirc-complete that completes both nicks and irc commands

---
 lisp/net/rcirc.el |   90 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 58 insertions(+), 32 deletions(-)

diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 8d70415..0a87200 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -756,42 +756,49 @@ If SILENT is non-nil, do not print the message in any irc buffer."
     (setq rcirc-input-ring-index (1- rcirc-input-ring-index))
     (insert (rcirc-prev-input-string -1))))
 
-(defvar rcirc-nick-completions nil)
-(defvar rcirc-nick-completion-start-offset nil)
+(defvar rcirc-completions nil)
+(defvar rcirc-completion-start-offset nil)
 
-(defun rcirc-complete-nick ()
-  "Cycle through nick completions from list of nicks in channel."
+(defun rcirc-complete ()
+  "Cycle through completions from list of nicks in channel or IRC commands.
+IRC command completion is performed only if '/' is the fisrt input char."
   (interactive)
   (if (eq last-command this-command)
-      (setq rcirc-nick-completions
-            (append (cdr rcirc-nick-completions)
-                    (list (car rcirc-nick-completions))))
-    (setq rcirc-nick-completion-start-offset
+      (setq rcirc-completions
+            (append (cdr rcirc-completions)
+                    (list (car rcirc-completions))))
+    (setq rcirc-completion-start-offset
           (- (save-excursion
                (if (re-search-backward " " rcirc-prompt-end-marker t)
                    (1+ (point))
                  rcirc-prompt-end-marker))
              rcirc-prompt-end-marker))
-    (setq rcirc-nick-completions
-          (let ((completion-ignore-case t))
+    (let ((completion-ignore-case t))
+      (setq rcirc-completions
             (all-completions
-	     (buffer-substring
-	      (+ rcirc-prompt-end-marker
-		 rcirc-nick-completion-start-offset)
-	      (point))
-	     (mapcar (lambda (x) (cons x nil))
-		     (rcirc-channel-nicks (rcirc-buffer-process)
-					  rcirc-target))))))
-  (let ((completion (car rcirc-nick-completions)))
+             (buffer-substring
+              (+ rcirc-prompt-end-marker
+                 rcirc-completion-start-offset)
+              (point))
+             (if (and (zerop rcirc-completion-start-offset)
+                      (char-after rcirc-prompt-end-marker)
+                      (= (char-after rcirc-prompt-end-marker) ?/))
+                 (sort (delete-dups (append rcirc-client-commands
+                                            (copy-sequence rcirc-server-commands)))
+                       'string-lessp)
+               (mapcar (lambda (x) (cons x nil))
+                       (rcirc-channel-nicks (rcirc-buffer-process)
+                                            rcirc-target)))))))
+  (let ((completion (car rcirc-completions)))
     (when completion
       (delete-region (+ rcirc-prompt-end-marker
-			rcirc-nick-completion-start-offset)
+			rcirc-completion-start-offset)
 		     (point))
       (insert (concat completion
-                      (if (= (+ rcirc-prompt-end-marker
-                                rcirc-nick-completion-start-offset)
-                             rcirc-prompt-end-marker)
-                          ": "))))))
+                      (if (or (= (aref completion 0) ?/)
+                              (not (zerop rcirc-completion-start-offset)))
+                          " "
+                        ": "))))))
 
 (defun set-rcirc-decode-coding-system (coding-system)
   "Set the decode coding system used in this channel."
@@ -809,7 +816,7 @@ If SILENT is non-nil, do not print the message in any irc buffer."
 (define-key rcirc-mode-map (kbd "RET") 'rcirc-send-input)
 (define-key rcirc-mode-map (kbd "M-p") 'rcirc-insert-prev-input)
 (define-key rcirc-mode-map (kbd "M-n") 'rcirc-insert-next-input)
-(define-key rcirc-mode-map (kbd "TAB") 'rcirc-complete-nick)
+(define-key rcirc-mode-map (kbd "TAB") 'rcirc-complete)
 (define-key rcirc-mode-map (kbd "C-c C-b") 'rcirc-browse-url)
 (define-key rcirc-mode-map (kbd "C-c C-c") 'rcirc-edit-multiline)
 (define-key rcirc-mode-map (kbd "C-c C-j") 'rcirc-cmd-join)
@@ -1947,17 +1954,36 @@ activity.  Only run if the buffer is not visible and
 ;; the current buffer/channel/user, and ARGS, which is a string
 ;; containing the text following the /cmd.
 
+(defvar rcirc-server-commands
+  '("/admin"   "/away"   "/connect" "/die"      "/error"   "/info"
+    "/invite"  "/ison"   "/join"    "/kick"     "/kill"    "/links"
+    "/list"    "/lusers" "/mode"    "/motd"     "/names"   "/nick"
+    "/notice"  "/oper"   "/part"    "/pass"     "/ping"    "/pong"
+    "/privmsg" "/quit"   "/rehash"  "/restart"  "/service" "/servlist"
+    "/server"  "/squery" "/squit"   "/stats"    "/summon"  "/time"
+    "/topic"   "/trace"  "/user"    "/userhost" "/users"   "/version"
+    "/wallops" "/who"    "/whois"   "/whowas")
+  "A list of user commands by IRC server.
+The value defaults to RFCs 1459 and 2812.")
+
+;; /me and /ctcp are not defined by `defun-rcirc-command'.
+(defvar rcirc-client-commands '("/me" "/ctcp")
+  "A list of user commands defined by IRC client rcirc.
+The list is updated automatically by `defun-rcirc-command'.")
+
 (defmacro defun-rcirc-command (command argument docstring interactive-form
                                        &rest body)
   "Define a command."
-  `(defun ,(intern (concat "rcirc-cmd-" (symbol-name command)))
-     (,@argument &optional process target)
-     ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values given"
-              "\nby `rcirc-buffer-process' and `rcirc-target' will be used.")
-     ,interactive-form
-     (let ((process (or process (rcirc-buffer-process)))
-           (target (or target rcirc-target)))
-       ,@body)))
+  `(progn
+     (add-to-list 'rcirc-client-commands ,(concat "/" (symbol-name command)))
+     (defun ,(intern (concat "rcirc-cmd-" (symbol-name command)))
+       (,@argument &optional process target)
+       ,(concat docstring "\n\nNote: If PROCESS or TARGET are nil, the values given"
+                "\nby `rcirc-buffer-process' and `rcirc-target' will be used.")
+       ,interactive-form
+       (let ((process (or process (rcirc-buffer-process)))
+             (target (or target rcirc-target)))
+         ,@body))))
 
 (defun-rcirc-command msg (message)
   "Send private MESSAGE to TARGET."
-- 
1.7.0.4

With best wishes,
Leo