From c62bf05a3723508124eda3bc4e208b112520eaad Mon Sep 17 00:00:00 2001 From: Deniz Dogan Date: Thu, 3 Jun 2010 11:07:49 -0400 Subject: [PATCH] * lisp/net/rcirc.el (rcirc-sort-nicknames): New custom. (rcirc-nickname<, rcirc-sort-nicknames-join): New funs. (rcirc-handler-366): Use them. --- lisp/ChangeLog | 6 ++++++ lisp/net/rcirc.el | 42 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index ece74b3ca02..05904bef28e 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -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 --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el index e30249f82c6..ba2d3f130c6 100644 --- a/lisp/net/rcirc.el +++ b/lisp/net/rcirc.el @@ -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)))) +(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 @@ 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) -- 2.39.2