]> code.delx.au - gnu-emacs/commitdiff
* lisp/net/rcirc.el (rcirc-sort-nicknames): New custom.
authorDeniz Dogan <deniz.a.m.dogan@gmail.com>
Thu, 3 Jun 2010 15:07:49 +0000 (11:07 -0400)
committerStefan Monnier <monnier@iro.umontreal.ca>
Thu, 3 Jun 2010 15:07:49 +0000 (11:07 -0400)
(rcirc-nickname<, rcirc-sort-nicknames-join): New funs.
(rcirc-handler-366): Use them.

lisp/ChangeLog
lisp/net/rcirc.el

index ece74b3ca0243ca9be3bb6f4735788a14e87169b..05904bef28e7efc6940cf67d76a42dfeefb84c29 100644 (file)
@@ -1,3 +1,9 @@
+2010-06-03  Deniz Dogan  <deniz.a.m.dogan@gmail.com>
+
+       * net/rcirc.el (rcirc-sort-nicknames): New custom.
+       (rcirc-nickname<, rcirc-sort-nicknames-join): New funs.
+       (rcirc-handler-366): Use them.
+
 2010-06-03  Stefan Monnier  <monnier@iro.umontreal.ca>
 
        Split smie-indent-calculate into more manageable chunks.
index e30249f82c6f46165e362c4cac1eb7df9669e14f..ba2d3f130c676c54ff7d8a96406c9c6e41091d45 100644 (file)
@@ -281,6 +281,11 @@ Called with 5 arguments, PROCESS, SENDER, RESPONSE, TARGET and TEXT."
   :type 'hook
   :group 'rcirc)
 
+(defcustom rcirc-sort-nicknames nil
+  "If non-nil, sorts nickname listings."
+  :type 'boolean
+  :group 'rcirc)
+
 (defcustom rcirc-always-use-server-buffer-flag nil
   "Non-nil means messages without a channel target will go to the server buffer."
   :type 'boolean
@@ -1650,6 +1655,38 @@ if NICK is also on `rcirc-ignore-list-automatic'."
            rcirc-ignore-list
            (delete nick rcirc-ignore-list))))
 \f
+(defun rcirc-nickname< (s1 s2)
+  "Compares two IRC nicknames.  Operator nicknames (@) are
+considered less than voiced nicknames (+).  Any other nicknames
+are greater than voiced nicknames.
+
+Returns t if S1 is less than S2, otherwise nil.
+
+The comparison is case-insensitive."
+  (setq s1 (downcase s1)
+        s2 (downcase s2))
+  (let* ((s1-op (eq ?@ (string-to-char s1)))
+         (s2-op (eq ?@ (string-to-char s2))))
+    (if s1-op
+        (if s2-op
+            (string< (substring s1 1) (substring s2 1))
+          t)
+      (if s2-op
+          nil
+        (string< s1 s2)))))
+
+(defun rcirc-sort-nicknames-join (input sep)
+  "Takes a string of nicknames and returns the string with the
+nicknames sorted.
+
+INPUT is a string containing nicknames separated by SEP.
+
+This function is non-destructive, sorting a copy of the input."
+  (let ((parts (split-string input sep t))
+        copy)
+    (setq copy (sort parts 'rcirc-nickname<))
+    (mapconcat 'identity copy sep)))
+\f
 ;;; activity tracking
 (defvar rcirc-track-minor-mode-map (make-sparse-keymap)
   "Keymap for rcirc track minor mode.")
@@ -2554,7 +2591,10 @@ keywords when no KEYWORD is given."
          (buffer (rcirc-get-temp-buffer-create process channel)))
     (with-current-buffer buffer
       (rcirc-print process sender "NAMES" channel
-                   (buffer-substring (point-min) (point-max))))
+                   (let ((content (buffer-substring (point-min) (point-max))))
+                     (if rcirc-sort-nicknames
+                         (rcirc-sort-nicknames-join content " ")
+                       content))))
     (kill-buffer buffer)))
 
 (defun rcirc-handler-433 (process sender args text)