# HG changeset patch # User Stefan Monnier # Date 1275577669 14400 # Node ID d01ede419552290acf0ef01e8825d10d4125ef65 # Parent 22e354ac21fdd5eef7283db3cd2b783e60bf5314 * lisp/net/rcirc.el (rcirc-sort-nicknames): New custom. (rcirc-nickname<, rcirc-sort-nicknames-join): New funs. (rcirc-handler-366): Use them. diff -r 22e354ac21fd -r d01ede419552 lisp/ChangeLog --- a/lisp/ChangeLog Thu Jun 03 14:04:35 2010 +0200 +++ b/lisp/ChangeLog Thu Jun 03 11:07:49 2010 -0400 @@ -1,3 +1,9 @@ +2010-06-03 Deniz Dogan + + * 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 Split smie-indent-calculate into more manageable chunks. diff -r 22e354ac21fd -r d01ede419552 lisp/net/rcirc.el --- a/lisp/net/rcirc.el Thu Jun 03 14:04:35 2010 +0200 +++ b/lisp/net/rcirc.el Thu Jun 03 11:07:49 2010 -0400 @@ -281,6 +281,11 @@ :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 @@ rcirc-ignore-list (delete nick rcirc-ignore-list)))) +(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))) + ;;; activity tracking (defvar rcirc-track-minor-mode-map (make-sparse-keymap) "Keymap for rcirc track minor mode.") @@ -2554,7 +2591,10 @@ (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)