all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* rcirc updates
@ 2006-02-04 23:48 Ryan Yeske
  0 siblings, 0 replies; 2+ messages in thread
From: Ryan Yeske @ 2006-02-04 23:48 UTC (permalink / raw)
  Cc: bkhl, alex


Here are my latest bugfixes and improvements.

This doesn't include texinfo changes.

? rcirc-20060204.patch
Index: ChangeLog
===================================================================
RCS file: /sources/emacs/emacs/lisp/ChangeLog,v
retrieving revision 1.9068
diff -c -r1.9068 ChangeLog
*** ChangeLog	4 Feb 2006 21:48:50 -0000	1.9068
--- ChangeLog	4 Feb 2006 23:30:57 -0000
***************
*** 1,3 ****
--- 1,41 ----
+ 2006-02-04  Ryan Yeske  <rcyeske@gmail.com>
+ 
+ 	* net/rcirc.el (rcirc-startup-channels-alist): Add
+ 	irc.freenode.net and #emacs as defaults.
+ 	(rcirc-ignore-all-activity-flag): Remove variable.
+ 	(rcirc-authinfo): Add variable.
+ 	(rcirc-authinfo-filename): Remove variable.
+ 	(rcirc-always-use-server-buffer-flag): Add flag.
+ 	(rcirc): M-x rcirc will automatically connect without prompting.
+ 	C-u M-x rcirc will prompt.  Use rcirc-connect to create a
+ 	connection in lisp.
+ 	(rcirc-process-server-response-1): Remove everything but the nick
+ 	portion of the sender so it doesn't need to be done everywhere
+ 	else.  Update related code.
+ 	(global-map): Remove global keybindings.
+ 	(rcirc-get-buffer-create): Make sure rcirc-topic is set.
+ 	(rcirc-send-input): Split into several functions.
+ 	(rcirc-process-input-line): Add function.
+ 	(rcirc-process-message): Add function.
+ 	(rcirc-process-command): Add function.
+ 	(rcirc-target-buffer): Add function to determine where to route
+ 	messages.
+ 	(rcirc-user-nick): Save match data.
+ 	(rcirc-toggle-ignore-buffer-activity)
+ 	(rcirc-update-activity-string): Remove global ignore
+ 	functionality, which can be done now by toggling
+ 	rcirc-track-minor-mode.
+ 	(rcirc-track-minor-mode-map): Add keymap.
+ 	(rcirc-track-minor-mode): Add minor-mode.
+ 	(ignore): Make the ignore output nicer.  Always print it when
+ 	adding or removing nicks.
+ 	(rcirc-url-regexp): Improve.
+ 	(rcirc-mangle-text): Remove properties before using text in the
+ 	modeline.
+ 	(rcirc-authenticate): Authentication data comes from
+ 	rcirc-authinfo, not the file pointed to by rcirc-authinfo-file.
+ 	(rcirc-server-prefix): Inherit from rcirc-server.
+ 
  2006-02-04  Kevin Rodgers  <ihs_4664@yahoo.com>
  
  	* simple.el (display-message-or-buffer): Compare the number of
Index: net/rcirc.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/net/rcirc.el,v
retrieving revision 1.11
diff -c -r1.11 rcirc.el
*** net/rcirc.el	2 Feb 2006 16:48:23 -0000	1.11
--- net/rcirc.el	4 Feb 2006 23:30:59 -0000
***************
*** 79,85 ****
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-startup-channels-alist nil
    "Alist of channels to join at startup.
  Each element looks like (SERVER-REGEXP . CHANNEL-LIST)."
    :type '(alist :key-type string :value-type (repeat string))
--- 79,85 ----
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-startup-channels-alist '(("^irc.freenode.net$" "#emacs"))
    "Alist of channels to join at startup.
  Each element looks like (SERVER-REGEXP . CHANNEL-LIST)."
    :type '(alist :key-type string :value-type (repeat string))
***************
*** 111,121 ****
    "If non-nil, ignore activity in this buffer.")
  (make-variable-buffer-local 'rcirc-ignore-buffer-activity-flag)
  
- (defcustom rcirc-ignore-all-activity-flag nil
-   "*Non-nil means do not indicate any activity in the modeline."
-   :type 'boolean
-   :group 'rcirc)
- 
  (defcustom rcirc-time-format "%H:%M "
    "*Describes how timestamps are printed.
  Used as the first arg to `format-time-string'."
--- 111,116 ----
***************
*** 140,168 ****
  		 (integer :tag "Number of lines"))
    :group 'rcirc)
  
! (defcustom rcirc-authinfo-file-name
!   "~/.rcirc-authinfo"
!   "File containing rcirc authentication passwords.
! The file consists of a single list, with each element itself a
! list with a SERVER-REGEXP string, a NICK-REGEXP string, a METHOD
! and the remaining method specific ARGUMENTS.  The valid METHOD
! symbols are `nickserv', `chanserv' and `bitlbee'.
  
  The required ARGUMENTS for each METHOD symbol are:
!   `nickserv': PASSWORD
!   `chanserv': CHANNEL PASSWORD
!   `bitlbee': PASSWORD
  
  Example:
!  ((\"freenode\" \"bob\" nickserv \"p455w0rd\")
!   (\"freenode\" \"bob\" chanserv \"#bobland\" \"passwd99\")
!   (\"bitlbee\" \"robert\" bitlbee \"sekrit\"))"
!   :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-auto-authenticate-flag (file-readable-p rcirc-authinfo-file-name)
    "*Non-nil means automatically send authentication string to server.
! See also `rcirc-authinfo-file-name'."
    :type 'boolean
    :group 'rcirc)
  
--- 135,176 ----
  		 (integer :tag "Number of lines"))
    :group 'rcirc)
  
! (defcustom rcirc-authinfo nil
!   "List of authentication passwords.
! Each element of the list is a list with a SERVER-REGEXP string
! and a method symbol followed by method specific arguments.
! 
! The valid METHOD symbols are `nickserv', `chanserv' and
! `bitlbee'.
  
  The required ARGUMENTS for each METHOD symbol are:
!   `nickserv': NICK PASSWORD
!   `chanserv': NICK CHANNEL PASSWORD
!   `bitlbee': NICK PASSWORD
  
  Example:
!  ((\"freenode\" nickserv \"bob\" \"p455w0rd\")
!   (\"freenode\" chanserv \"bob\" \"#bobland\" \"passwd99\")
!   (\"bitlbee\" bitlbee \"robert\" \"sekrit\"))"
!   :type '(alist :key-type (string :tag "Server")
! 		:value-type (choice (list :tag "NickServ"
! 					  (const nickserv)
! 					  (string :tag "Nick")
! 					  (string :tag "Password"))
! 				    (list :tag "ChanServ"
! 					  (const chanserv)
! 					  (string :tag "Nick")
! 					  (string :tag "Channel")
! 					  (string :tag "Password"))
! 				    (list :tag "BitlBee"
! 					  (const bitlbee)
! 					  (string :tag "Nick")
! 					  (string :tag "Password"))))
    :group 'rcirc)
  
! (defcustom rcirc-auto-authenticate-flag t
    "*Non-nil means automatically send authentication string to server.
! See also `rcirc-authinfo'."
    :type 'boolean
    :group 'rcirc)
  
***************
*** 199,204 ****
--- 207,217 ----
    :type 'hook
    :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
+   :group 'rcirc)
+ 
  (defvar rcirc-prompt-start-marker nil)
  (defvar rcirc-prompt-end-marker nil)
  
***************
*** 238,274 ****
  \f
  (defvar rcirc-startup-channels nil)
  ;;;###autoload
! (defun rcirc (&optional server port nick channels)
    "Connect to IRC.
! 
! If any of the the optional SERVER, PORT, NICK or CHANNELS are not
! supplied, they are taken from the variables `rcirc-server',
! `rcirc-port', `rcirc-nick', and `rcirc-startup-channels-alist',
! respectively."
!   (interactive (list (read-string "IRC Server: " rcirc-server)
! 		     (read-string "IRC Port: " (number-to-string rcirc-port))
! 		     (read-string "IRC Nick: " rcirc-nick)))
!   (or server (setq server rcirc-server))
!   (or port (setq port rcirc-port))
!   (or nick (setq nick rcirc-nick))
!   (or channels
!       (setq channels
! 	    (if (interactive-p)
! 		(split-string
! 		 (read-string "Channels: "
! 			      (mapconcat 'identity
! 					 (rcirc-startup-channels server)
! 					 " "))
! 			 "[, ]+" t)
! 	      (rcirc-startup-channels server))))
!   (or global-mode-string (setq global-mode-string '("")))
!   (and (not (memq 'rcirc-activity-string global-mode-string))
!        (setq global-mode-string
! 	     (append global-mode-string '(rcirc-activity-string))))
!   (add-hook 'window-configuration-change-hook
! 	    'rcirc-window-configuration-change)
!   (rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
! 		 channels))
  
  ;;;###autoload
  (defalias 'irc 'rcirc)
--- 251,285 ----
  \f
  (defvar rcirc-startup-channels nil)
  ;;;###autoload
! (defun rcirc (arg)
    "Connect to IRC.
! If ARG is non-nil, prompt for a server to connect to."
!   (interactive "P")
!   (if arg
!       (let* ((server (read-string "IRC Server: " rcirc-server))
! 	     (port (read-string "IRC Port: " (number-to-string rcirc-port)))
! 	     (nick (read-string "IRC Nick: " rcirc-nick))
! 	     (channels (split-string
! 			(read-string "IRC Channels: "
! 				     (mapconcat 'identity
! 						(rcirc-startup-channels server)
! 						" "))
! 			"[, ]+" t)))
! 	(rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
! 		       channels))
!     ;; make new connection using defaults unless already connected to
!     ;; the default rcirc-server
!     (let ((default-server (default-value 'rcirc-server))
! 	  connected)
!       (dolist (p (rcirc-process-list))
! 	(when (string= default-server (process-name p))
! 	  (setq connected p)))
!       (if (not connected)
! 	  (rcirc-connect rcirc-server rcirc-port rcirc-nick
! 			 rcirc-user-name rcirc-user-full-name
! 			 (rcirc-startup-channels rcirc-server))
! 	(switch-to-buffer (process-buffer connected))
! 	(message "Connected to %s" rcirc-server)))))
  
  ;;;###autoload
  (defalias 'irc 'rcirc)
***************
*** 279,289 ****
  (defvar rcirc-keepalive-timer nil)
  (defvar rcirc-last-server-message-time nil)
  (defun rcirc-connect (server port nick user-name full-name startup-channels)
!   "Return a connection to SERVER on PORT.
  
- User will identify using the values of NICK, USER-NAME and
- FULL-NAME.  The variable list of channel names in
- STARTUP-CHANNELS will automatically be joined on startup."
    (save-excursion
      (message "Connecting to %s..." server)
      (let* ((inhibit-eol-conversion)
--- 290,298 ----
  (defvar rcirc-keepalive-timer nil)
  (defvar rcirc-last-server-message-time nil)
  (defun rcirc-connect (server port nick user-name full-name startup-channels)
!   (add-hook 'window-configuration-change-hook
! 	    'rcirc-window-configuration-change)
  
    (save-excursion
      (message "Connecting to %s..." server)
      (let* ((inhibit-eol-conversion)
***************
*** 377,389 ****
      (rcirc-debug process (format "SENTINEL: %S %S\n" process sentinel))
      (with-rcirc-process-buffer process
        (dolist (buffer (cons nil (mapcar 'cdr rcirc-buffer-alist)))
-         (rcirc-print process "rcirc.el" "ERROR" buffer
-                      (format "%s: %s (%S)"
-                              (process-name process)
-                              sentinel
-                              (process-status process)) t)
- 	;; remove the prompt from buffers
  	(with-current-buffer (or buffer (current-buffer))
  	  (let ((inhibit-read-only t))
  	    (delete-region rcirc-prompt-start-marker
  			   rcirc-prompt-end-marker)))))
--- 386,398 ----
      (rcirc-debug process (format "SENTINEL: %S %S\n" process sentinel))
      (with-rcirc-process-buffer process
        (dolist (buffer (cons nil (mapcar 'cdr rcirc-buffer-alist)))
  	(with-current-buffer (or buffer (current-buffer))
+ 	  (rcirc-print process "rcirc.el" "ERROR" rcirc-target
+ 		       (format "%s: %s (%S)"
+ 			       (process-name process)
+ 			       sentinel
+ 			       (process-status process)) t)
+ 	  ;; remove the prompt from buffers
  	  (let ((inhibit-read-only t))
  	    (delete-region rcirc-prompt-start-marker
  			   rcirc-prompt-end-marker)))))
***************
*** 428,434 ****
  
  (defun rcirc-process-server-response-1 (process text)
    (if (string-match "^\\(:\\([^ ]+\\) \\)?\\([^ ]+\\) \\(.+\\)$" text)
!       (let* ((sender (match-string 2 text))
               (cmd (match-string 3 text))
               (args (match-string 4 text))
               (handler (intern-soft (concat "rcirc-handler-" cmd))))
--- 437,444 ----
  
  (defun rcirc-process-server-response-1 (process text)
    (if (string-match "^\\(:\\([^ ]+\\) \\)?\\([^ ]+\\) \\(.+\\)$" text)
!       (let* ((user (match-string 2 text))
! 	     (sender (rcirc-user-nick user))
               (cmd (match-string 3 text))
               (args (match-string 4 text))
               (handler (intern-soft (concat "rcirc-handler-" cmd))))
***************
*** 487,498 ****
                   text))
           (more (if oversize
                     (substring message rcirc-max-message-length))))
!     (rcirc-print process (rcirc-nick process) response
! 		 (rcirc-get-buffer-create process target)
! 		 text)
      (rcirc-send-string process (concat response " " target " :" text))
!     (if more
!         (rcirc-send-message process target more noticep))))
  
  (defvar rcirc-input-ring nil)
  (defvar rcirc-input-ring-index 0)
--- 497,506 ----
                   text))
           (more (if oversize
                     (substring message rcirc-max-message-length))))
!     (rcirc-get-buffer-create process target)
!     (rcirc-print process (rcirc-nick process) response target text)
      (rcirc-send-string process (concat response " " target " :" text))
!     (when more (rcirc-send-message process target more noticep))))
  
  (defvar rcirc-input-ring nil)
  (defvar rcirc-input-ring-index 0)
***************
*** 582,591 ****
  (define-key rcirc-mode-map (kbd "C-c C-s") 'rcirc-switch-to-server-buffer)
  (define-key rcirc-mode-map (kbd "C-c C-a") 'rcirc-jump-to-first-unread-line)
  
- (define-key global-map (kbd "C-c `") 'rcirc-next-active-buffer)
- (define-key global-map (kbd "C-c C-@") 'rcirc-next-active-buffer)
- (define-key global-map (kbd "C-c C-SPC") 'rcirc-next-active-buffer)
- 
  (defvar rcirc-browse-url-map (make-sparse-keymap)
    "Keymap used for browsing URLs in `rcirc-mode'.")
  
--- 590,595 ----
***************
*** 730,737 ****
  (defun rcirc-get-buffer (process target &optional server)
    "Return the buffer associated with the PROCESS and TARGET.
  
- If TARGET is nil, return the server buffer.
- 
  If optional argument SERVER is non-nil, return the server buffer
  if there is no existing buffer for TARGET, otherwise return nil."
    (with-rcirc-process-buffer process
--- 734,739 ----
***************
*** 744,750 ****
    "Return the buffer associated with the PROCESS and TARGET.
  Create the buffer if it doesn't exist."
    (let ((buffer (rcirc-get-buffer process target)))
!     (or buffer
  	;; create the buffer
  	(with-rcirc-process-buffer process
  	  (let ((new-buffer (get-buffer-create
--- 746,756 ----
    "Return the buffer associated with the PROCESS and TARGET.
  Create the buffer if it doesn't exist."
    (let ((buffer (rcirc-get-buffer process target)))
!     (if buffer
! 	(progn
! 	  (when (not rcirc-target)
! 	    (setq rcirc-target target))
! 	  buffer)
  	;; create the buffer
  	(with-rcirc-process-buffer process
  	  (let ((new-buffer (get-buffer-create
***************
*** 781,816 ****
  	  (delete-backward-char 1))
  	(let ((input (buffer-substring-no-properties
  		      rcirc-prompt-end-marker (point))))
! 	  ;; process a /cmd
! 	  (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" input)
! 	      (let* ((command (match-string 1 input))
! 		     (fun (intern-soft (concat "rcirc-cmd-" command)))
! 		     (args (match-string 2 input)))
! 		(newline)
! 		(with-current-buffer (current-buffer)
! 		  (delete-region rcirc-prompt-end-marker (point))
! 		  (if (string= command "me")
! 		      (rcirc-print rcirc-process (rcirc-nick rcirc-process)
! 				   "ACTION" (current-buffer) args)
! 		    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
! 				 "COMMAND" (current-buffer) input))
! 		  (set-marker rcirc-prompt-end-marker (point))
! 		  (if (fboundp fun)
! 		      (funcall fun args rcirc-process target)
! 		    (rcirc-send-string rcirc-process
! 				       (concat command " " args)))))
! 	    ;; send message to server
! 	    (if (not rcirc-target)
! 		(message "Not joined")
! 	      (delete-region rcirc-prompt-end-marker (point))
! 	      (mapc (lambda (message)
! 		      (rcirc-send-message rcirc-process target message))
! 		    (split-string input "\n"))))
  	  ;; add to input-ring
  	  (save-excursion
  	    (ring-insert rcirc-input-ring input)
  	    (setq rcirc-input-ring-index 0)))))))
  
  (defvar rcirc-parent-buffer nil)
  (defvar rcirc-window-configuration nil)
  (defun rcirc-edit-multiline ()
--- 787,831 ----
  	  (delete-backward-char 1))
  	(let ((input (buffer-substring-no-properties
  		      rcirc-prompt-end-marker (point))))
! 	  (dolist (line (split-string input "\n"))
! 	    (rcirc-process-input-line rcirc-process target line))
  	  ;; add to input-ring
  	  (save-excursion
  	    (ring-insert rcirc-input-ring input)
  	    (setq rcirc-input-ring-index 0)))))))
  
+ (defun rcirc-process-input-line (process target line)
+   (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
+       (rcirc-process-command (match-string 1 line)
+ 			     (match-string 2 line)
+ 			     line)
+     (rcirc-process-message line)))
+ 
+ (defun rcirc-process-message (line)
+   (if (not rcirc-target)
+       (message "Not joined")
+     (delete-region rcirc-prompt-end-marker (point))
+     (rcirc-send-message rcirc-process rcirc-target line)))
+ 
+ (defun rcirc-process-command (command args line)
+   (if (eq (aref command 0) ?/)
+       ;; "//text" will send "/text" as a message
+       (rcirc-process-message (substring line 1))
+     (let* ((fun (intern-soft (concat "rcirc-cmd-" command))))
+       (newline)
+       (with-current-buffer (current-buffer)
+ 	(delete-region rcirc-prompt-end-marker (point))
+ 	(if (string= command "me")
+ 	    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+ 			 "ACTION" rcirc-target args)
+ 	  (rcirc-print rcirc-process (rcirc-nick rcirc-process)
+ 		       "COMMAND" rcirc-target line))
+ 	(set-marker rcirc-prompt-end-marker (point))
+ 	(if (fboundp fun)
+ 	    (funcall fun args rcirc-process rcirc-target)
+ 	  (rcirc-send-string rcirc-process
+ 			     (concat command " " args)))))))
+ 
  (defvar rcirc-parent-buffer nil)
  (defvar rcirc-window-configuration nil)
  (defun rcirc-edit-multiline ()
***************
*** 828,834 ****
        (setq rcirc-parent-buffer parent)
        (setq rcirc-process process)
        (insert text)
!       (and (> pos 0) (goto-char pos)))))
  
  (define-derived-mode rcirc-multiline-edit-mode
    text-mode "rcirc multi"
--- 843,850 ----
        (setq rcirc-parent-buffer parent)
        (setq rcirc-process process)
        (insert text)
!       (and (> pos 0) (goto-char pos))
!       (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
  
  (define-derived-mode rcirc-multiline-edit-mode
    text-mode "rcirc multi"
***************
*** 894,906 ****
                           (t
                            (setq first "[" middle " " end "]")))
                     (concat first
!                            (rcirc-facify (rcirc-user-nick sender)
                                           (if (string= sender
                                                        (rcirc-nick process))
                                               'rcirc-my-nick
                                             'rcirc-other-nick))
!                            middle
!                            (rcirc-mangle-text process text)
                             end)))
                  ((string= response "COMMAND")
                   text)
--- 910,924 ----
                           (t
                            (setq first "[" middle " " end "]")))
                     (concat first
!                            (rcirc-facify (concat
! 					  sender
! 					  (when target (concat "," target)))
                                           (if (string= sender
                                                        (rcirc-nick process))
                                               'rcirc-my-nick
                                             'rcirc-other-nick))
! 			   middle
! 			   (rcirc-mangle-text process text)
                             end)))
                  ((string= response "COMMAND")
                   text)
***************
*** 914,944 ****
  			  (rcirc-facify
  			   (concat
  			    (when (not (string= sender (rcirc-server process)))
! 			      (concat (rcirc-user-nick sender) " "))
  			    (when (zerop (string-to-number response))
  			      (concat response " "))
  			    text)
  			   'rcirc-server)))))))
  
  (defvar rcirc-activity-type nil)
  (make-variable-buffer-local 'rcirc-activity-type)
  (defun rcirc-print (process sender response target text &optional activity)
    "Print TEXT in the buffer associated with TARGET.
  Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
  record activity."
!   (unless (or (member (rcirc-user-nick sender) rcirc-ignore-list)
  	      (member (with-syntax-table rcirc-nick-syntax-table
  			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
  			  (match-string 1 text))) rcirc-ignore-list))
!     (let* ((buffer (cond ((bufferp target)
! 			  target)
! 			 ((not target)
! 			  (rcirc-get-any-buffer process))
! 			 ((not (rcirc-channel-p target))
! 			  (rcirc-get-buffer-create process
! 						   (rcirc-user-nick sender)))
! 			 ((or (rcirc-get-buffer process target)
! 			      (rcirc-get-any-buffer process)))))
  	   (inhibit-read-only t))
        (with-current-buffer buffer
  	(let ((moving (= (point) rcirc-prompt-end-marker))
--- 932,972 ----
  			  (rcirc-facify
  			   (concat
  			    (when (not (string= sender (rcirc-server process)))
! 			      (concat sender " "))
  			    (when (zerop (string-to-number response))
  			      (concat response " "))
  			    text)
  			   'rcirc-server)))))))
  
+ (defun rcirc-target-buffer (process sender response target text)
+   "Return a buffer to print the server response."
+   (assert (not (bufferp target)))
+   (with-rcirc-process-buffer process
+     (cond ((not target)
+ 	   (if rcirc-always-use-server-buffer-flag
+ 	       (process-buffer process)
+ 	     (rcirc-get-any-buffer process)))
+ 	  ((not (rcirc-channel-p target))
+ 	   ;; message from another user
+ 	   (if (string= response "PRIVMSG")
+ 	       (rcirc-get-buffer-create process (if (string= sender rcirc-nick)
+ 						    target
+ 						  sender))
+ 	     (rcirc-get-buffer process target t)))
+ 	  ((or (rcirc-get-buffer process target)
+ 	       (rcirc-get-any-buffer process))))))
+ 
  (defvar rcirc-activity-type nil)
  (make-variable-buffer-local 'rcirc-activity-type)
  (defun rcirc-print (process sender response target text &optional activity)
    "Print TEXT in the buffer associated with TARGET.
  Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
  record activity."
!   (unless (or (member sender rcirc-ignore-list)
  	      (member (with-syntax-table rcirc-nick-syntax-table
  			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
  			  (match-string 1 text))) rcirc-ignore-list))
!     (let* ((buffer (rcirc-target-buffer process sender response target text))
  	   (inhibit-read-only t))
        (with-current-buffer buffer
  	(let ((moving (= (point) rcirc-prompt-end-marker))
***************
*** 961,967 ****
  	  (set-marker-insertion-type rcirc-prompt-start-marker t)
  	  (set-marker-insertion-type rcirc-prompt-end-marker t)
  	  (insert
! 	   (rcirc-format-response-string process sender response target text)
  	   (propertize "\n" 'hard t))
  	  (set-marker-insertion-type rcirc-prompt-start-marker nil)
  	  (set-marker-insertion-type rcirc-prompt-end-marker nil)
--- 989,995 ----
  	  (set-marker-insertion-type rcirc-prompt-start-marker t)
  	  (set-marker-insertion-type rcirc-prompt-end-marker t)
  	  (insert
! 	   (rcirc-format-response-string process sender response nil text)
  	   (propertize "\n" 'hard t))
  	  (set-marker-insertion-type rcirc-prompt-start-marker nil)
  	  (set-marker-insertion-type rcirc-prompt-end-marker nil)
***************
*** 978,987 ****
  			     0)
  			   (cond ((or (string= response "PRIVMSG")
  				      (string= response "NOTICE"))
! 				  (+ (length (rcirc-user-nick sender))
  				     2)) ; <>
  				 ((string= response "ACTION")
! 				  (+ (length (rcirc-user-nick sender))
  				     1))	; [
  				 (t 3))		; ***
  			   1)
--- 1006,1015 ----
  			     0)
  			   (cond ((or (string= response "PRIVMSG")
  				      (string= response "NOTICE"))
! 				  (+ (length sender)
  				     2)) ; <>
  				 ((string= response "ACTION")
! 				  (+ (length sender)
  				     1))	; [
  				 (t 3))		; ***
  			   1)
***************
*** 1056,1072 ****
  (defun rcirc-join-channels (process channels)
    "Join CHANNELS."
    (save-window-excursion
!     (mapc (lambda (channel)
!             (with-rcirc-process-buffer process
!               (rcirc-cmd-join channel process)))
!           channels)))
  \f
  ;;; nick management
  (defun rcirc-user-nick (user)
    "Return the nick from USER.  Remove any non-nick junk."
!   (if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user ""))
!       (match-string 1 user)
!     user))
  
  (defun rcirc-user-non-nick (user)
    "Return the non-nick portion of USER."
--- 1084,1100 ----
  (defun rcirc-join-channels (process channels)
    "Join CHANNELS."
    (save-window-excursion
!     (dolist (channel channels)
!       (with-rcirc-process-buffer process
! 	(rcirc-cmd-join channel process)))))
  \f
  ;;; nick management
  (defun rcirc-user-nick (user)
    "Return the nick from USER.  Remove any non-nick junk."
!   (save-match-data
!     (if (string-match "^[@%+]?\\([^! ]+\\)!?" (or user ""))
! 	(match-string 1 user)
!       user)))
  
  (defun rcirc-user-non-nick (user)
    "Return the non-nick portion of USER."
***************
*** 1076,1092 ****
  
  (defun rcirc-nick-channels (process nick)
    "Return list of channels for NICK."
!   (let ((nick (rcirc-user-nick nick)))
!     (with-rcirc-process-buffer process
!       (mapcar (lambda (x) (car x))
!               (gethash nick rcirc-nick-table)))))
  
  (defun rcirc-put-nick-channel (process nick channel)
    "Add CHANNEL to list associated with NICK."
    (with-rcirc-process-buffer process
!     (let* ((nick (rcirc-user-nick nick))
!            (chans (gethash nick rcirc-nick-table))
!            (record (assoc-string channel chans t)))
        (if record
            (setcdr record (current-time))
          (puthash nick (cons (cons channel (current-time))
--- 1104,1118 ----
  
  (defun rcirc-nick-channels (process nick)
    "Return list of channels for NICK."
!   (with-rcirc-process-buffer process
!     (mapcar (lambda (x) (car x))
! 	    (gethash nick rcirc-nick-table))))
  
  (defun rcirc-put-nick-channel (process nick channel)
    "Add CHANNEL to list associated with NICK."
    (with-rcirc-process-buffer process
!     (let* ((chans (gethash nick rcirc-nick-table))
! 	   (record (assoc-string channel chans t)))
        (if record
            (setcdr record (current-time))
          (puthash nick (cons (cons channel (current-time))
***************
*** 1101,1108 ****
  (defun rcirc-remove-nick-channel (process nick channel)
    "Remove the CHANNEL from list associated with NICK."
    (with-rcirc-process-buffer process
!     (let* ((nick (rcirc-user-nick nick))
!            (chans (gethash nick rcirc-nick-table))
             (newchans
  	    ;; instead of assoc-string-delete-all:
  	    (let ((record (assoc-string channel chans t)))
--- 1127,1133 ----
  (defun rcirc-remove-nick-channel (process nick channel)
    "Remove the CHANNEL from list associated with NICK."
    (with-rcirc-process-buffer process
!     (let* ((chans (gethash nick rcirc-nick-table))
             (newchans
  	    ;; instead of assoc-string-delete-all:
  	    (let ((record (assoc-string channel chans t)))
***************
*** 1136,1163 ****
  	    (delete nick rcirc-ignore-list))))
  \f
  ;;; activity tracking
  (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
      (setq minor-mode-alist
            (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
  
! (defun rcirc-toggle-ignore-buffer-activity (&optional all)
!   "Toggle the value of `rcirc-ignore-buffer-activity-flag'.
! If ALL is non-nil, instead toggle the value of
! `rcirc-ignore-all-activity-flag'."
!   (interactive "P")
!   (if all
!       (progn
!         (setq rcirc-ignore-all-activity-flag
!               (not rcirc-ignore-all-activity-flag))
!         (message (if rcirc-ignore-all-activity-flag
! 		     "Hide all buffer activity"
! 		   "Display buffer activity"))
!         (rcirc-update-activity-string))
!     (setq rcirc-ignore-buffer-activity-flag
!           (not rcirc-ignore-buffer-activity-flag))
!     (message (if rcirc-ignore-buffer-activity-flag
! 		 "Ignore activity in this buffer"
! 	       "Notice activity in this buffer")))
    (force-mode-line-update))
  
  (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
--- 1161,1204 ----
  	    (delete nick rcirc-ignore-list))))
  \f
  ;;; activity tracking
+ (defvar rcirc-track-minor-mode-map (make-sparse-keymap)
+   "Keymap for rcirc track minor mode.")
+ 
+ (define-key rcirc-track-minor-mode-map (kbd "C-c `") 'rcirc-next-active-buffer)
+ (define-key rcirc-track-minor-mode-map (kbd "C-c C-@") 'rcirc-next-active-buffer)
+ (define-key rcirc-track-minor-mode-map (kbd "C-c C-SPC") 'rcirc-next-active-buffer)
+ 
+ ;;; FIXME: the code to insert `rcirc-activity-string' into
+ ;;; `global-mode-string' isn't called when the mode is activated by
+ ;;; customize.  I don't know how to set that up.
+ (define-minor-mode rcirc-track-minor-mode
+   "Global minor mode for tracking activity in rcirc buffers."
+   :init-value nil
+   :lighter ""
+   :keymap rcirc-track-minor-mode-map
+   :global t
+   :group 'rcirc
+   (or global-mode-string (setq global-mode-string '("")))
+   ;; toggle the mode-line channel indicator
+   (if rcirc-track-minor-mode
+       (and (not (memq 'rcirc-activity-string global-mode-string))
+ 	   (setq global-mode-string
+ 		 (append global-mode-string '(rcirc-activity-string))))
+     (setq global-mode-string 
+ 	  (delete 'rcirc-activity-string global-mode-string))))
+ 
  (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
      (setq minor-mode-alist
            (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
  
! (defun rcirc-toggle-ignore-buffer-activity ()
!   "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
!   (interactive)
!   (setq rcirc-ignore-buffer-activity-flag
! 	(not rcirc-ignore-buffer-activity-flag))
!   (message (if rcirc-ignore-buffer-activity-flag
! 	       "Ignore activity in this buffer"
! 	     "Notice activity in this buffer"))
    (force-mode-line-update))
  
  (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
***************
*** 1229,1249 ****
  (defun rcirc-update-activity-string ()
    "Update mode-line string."
    (setq rcirc-activity-string
! 	(cond (rcirc-ignore-all-activity-flag
! 	       " DND")
! 	      ((not rcirc-activity)
! 	       "")
! 	      (t
! 	       (concat " ["
! 		       (mapconcat
! 			(lambda (b)
! 			  (let ((s (rcirc-short-buffer-name b)))
! 			    (with-current-buffer b
! 			      (if (not (eq rcirc-activity-type 'nick))
! 				  s
! 				(rcirc-facify s 'rcirc-mode-line-nick)))))
! 			rcirc-activity ",")
! 		       "]")))))
  
  (defun rcirc-short-buffer-name (buffer)
    "Return a short name for BUFFER to use in the modeline indicator."
--- 1270,1287 ----
  (defun rcirc-update-activity-string ()
    "Update mode-line string."
    (setq rcirc-activity-string
! 	(if (not rcirc-activity)
! 	       ""
! 	  (concat " ["
! 		  (mapconcat
! 		   (lambda (b)
! 		     (let ((s (rcirc-short-buffer-name b)))
! 		       (with-current-buffer b
! 			 (if (not (eq rcirc-activity-type 'nick))
! 			     s
! 			   (rcirc-facify s 'rcirc-mode-line-nick)))))
! 		   rcirc-activity ",")
! 		  "]"))))
  
  (defun rcirc-short-buffer-name (buffer)
    "Return a short name for BUFFER to use in the modeline indicator."
***************
*** 1488,1510 ****
  nicks when no NICK is given.  When listing ignored nicks, the
  ones added to the list automatically are marked with an asterisk."
    (interactive "sToggle ignoring of nick: ")
!   (if (string= "" nick)
!       (rcirc-print process (rcirc-nick process) "NOTICE" target
! 		   (mapconcat
! 		    (lambda (nick)
! 		      (concat nick
! 			      (if (member nick rcirc-ignore-list-automatic)
! 				  "*" "")))
! 		    rcirc-ignore-list " "))
      (if (member nick rcirc-ignore-list)
  	(setq rcirc-ignore-list (delete nick rcirc-ignore-list))
!       (setq rcirc-ignore-list (cons nick rcirc-ignore-list)))))
! 
  
  \f
  (defun rcirc-message-leader (sender face)
    "Return a string with SENDER propertized with FACE."
!   (rcirc-facify (concat "<" (rcirc-user-nick sender) "> ") face))
  
  (defun rcirc-facify (string face)
    "Return a copy of STRING with FACE property added."
--- 1526,1547 ----
  nicks when no NICK is given.  When listing ignored nicks, the
  ones added to the list automatically are marked with an asterisk."
    (interactive "sToggle ignoring of nick: ")
!   (when (not (string= "" nick))
      (if (member nick rcirc-ignore-list)
  	(setq rcirc-ignore-list (delete nick rcirc-ignore-list))
!       (setq rcirc-ignore-list (cons nick rcirc-ignore-list))))
!   (rcirc-print process (rcirc-nick process) "IGNORE" target 
! 	       (mapconcat
! 		(lambda (nick)
! 		  (concat nick
! 			  (if (member nick rcirc-ignore-list-automatic)
! 			      "*" "")))
! 		rcirc-ignore-list " ")))
  
  \f
  (defun rcirc-message-leader (sender face)
    "Return a string with SENDER propertized with FACE."
!   (rcirc-facify (concat "<" sender "> ") face))
  
  (defun rcirc-facify (string face)
    "Return a copy of STRING with FACE property added."
***************
*** 1518,1525 ****
  	       "://"
  	       (1+ (char "a-zA-Z0-9_."))
  	       (optional ":" (1+ (char "0-9")))))
!       (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,"))
!       (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;"))
    "Regexp matching URLs.  Set to nil to disable URL features in rcirc.")
  
  (defun rcirc-browse-url (&optional arg)
--- 1555,1562 ----
  	       "://"
  	       (1+ (char "a-zA-Z0-9_."))
  	       (optional ":" (1+ (char "0-9")))))
!       (1+ (char "-a-zA-Z0-9_=!?#$\@~`%&*+|\\/:;.,{}[]"))
!       (char "-a-zA-Z0-9_=#$\@~`%&*+|\\/:;{}[]"))
    "Regexp matching URLs.  Set to nil to disable URL features in rcirc.")
  
  (defun rcirc-browse-url (&optional arg)
***************
*** 1603,1609 ****
  					'mouse-face 'highlight
  					'keymap rcirc-browse-url-map)
  				  string))
! 	     (push (substring string start end) rcirc-urls))
  	   rcirc-url-regexp
  	   text))
    text)
--- 1640,1646 ----
  					'mouse-face 'highlight
  					'keymap rcirc-browse-url-map)
  				  string))
! 	     (push (substring-no-properties string start end) rcirc-urls))
  	   rcirc-url-regexp
  	   text))
    text)
***************
*** 1627,1633 ****
  (defun rcirc-handler-PRIVMSG (process sender args text)
    (let ((target (if (rcirc-channel-p (car args))
                      (car args)
!                   (rcirc-user-nick sender)))
          (message (or (cadr args) "")))
      (if (string-match "^\C-a\\(.*\\)\C-a$" message)
          (rcirc-handler-CTCP process target sender (match-string 1 message))
--- 1664,1670 ----
  (defun rcirc-handler-PRIVMSG (process sender args text)
    (let ((target (if (rcirc-channel-p (car args))
                      (car args)
!                   sender))
          (message (or (cadr args) "")))
      (if (string-match "^\C-a\\(.*\\)\C-a$" message)
          (rcirc-handler-CTCP process target sender (match-string 1 message))
***************
*** 1650,1674 ****
  			  (match-string 1 message))
  			 (sender
  			  (if (string= sender (rcirc-server process))
! 			      (process-buffer process)
! 			    (rcirc-user-nick sender))))
                   message t))))
-     ;; do we need this:
-     ;;(and sender (rcirc-put-nick-channel process sender target))))
  
  (defun rcirc-handler-WALLOPS (process sender args text)
!   (let ((target (rcirc-user-nick sender)))
!     (rcirc-print process sender "WALLOPS" target (car args) t)))
  
  (defun rcirc-handler-JOIN (process sender args text)
!   (let ((channel (car args))
!         (nick (rcirc-user-nick sender)))
      (rcirc-get-buffer-create process channel)
      (rcirc-print process sender "JOIN" channel "")
  
      ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer rcirc-process nick)
!       (rcirc-print process sender "JOIN" nick channel))
  
      (rcirc-put-nick-channel process sender channel)))
  
--- 1687,1707 ----
  			  (match-string 1 message))
  			 (sender
  			  (if (string= sender (rcirc-server process))
! 			      nil	; server notice
! 			    sender)))
                   message t))))
  
  (defun rcirc-handler-WALLOPS (process sender args text)
!   (rcirc-print process sender "WALLOPS" sender (car args) t))
  
  (defun rcirc-handler-JOIN (process sender args text)
!   (let ((channel (car args)))
      (rcirc-get-buffer-create process channel)
      (rcirc-print process sender "JOIN" channel "")
  
      ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer rcirc-process sender)
!       (rcirc-print process sender "JOIN" sender channel))
  
      (rcirc-put-nick-channel process sender channel)))
  
***************
*** 1695,1703 ****
  	  (setq rcirc-target nil))))))
  
  (defun rcirc-handler-PART (process sender args text)
!   (rcirc-ignore-update-automatic (rcirc-user-nick sender))
    (rcirc-handler-PART-or-KICK process "PART"
!                               (car args) sender (rcirc-user-nick sender)
                                (cadr args)))
  
  (defun rcirc-handler-KICK (process sender args text)
--- 1728,1736 ----
  	  (setq rcirc-target nil))))))
  
  (defun rcirc-handler-PART (process sender args text)
!   (rcirc-ignore-update-automatic sender)
    (rcirc-handler-PART-or-KICK process "PART"
!                               (car args) sender sender
                                (cadr args)))
  
  (defun rcirc-handler-KICK (process sender args text)
***************
*** 1705,1725 ****
                                (caddr args)))
  
  (defun rcirc-handler-QUIT (process sender args text)
!   (rcirc-ignore-update-automatic (rcirc-user-nick sender))
!   (let ((nick (rcirc-user-nick sender)))
!     (mapc (lambda (channel)
!             (rcirc-print process sender "QUIT" channel (apply 'concat args)))
!           (rcirc-nick-channels process nick))
  
!     ;; print in private chat buffer if it exists
!     (let ((buffer (rcirc-get-buffer rcirc-process nick)))
!       (when buffer
! 	(rcirc-print process sender "QUIT" buffer (apply 'concat args))))
  
!     (rcirc-nick-remove process nick)))
  
  (defun rcirc-handler-NICK (process sender args text)
!   (let* ((old-nick (rcirc-user-nick sender))
           (new-nick (car args))
           (channels (rcirc-nick-channels process old-nick)))
      ;; update list of ignored nicks
--- 1738,1756 ----
                                (caddr args)))
  
  (defun rcirc-handler-QUIT (process sender args text)
!   (rcirc-ignore-update-automatic sender)
!   (mapc (lambda (channel)
! 	  (rcirc-print process sender "QUIT" channel (apply 'concat args)))
! 	(rcirc-nick-channels process sender))
  
!   ;; print in private chat buffer if it exists
!   (when (rcirc-get-buffer rcirc-process sender)
!     (rcirc-print process sender "QUIT" sender (apply 'concat args)))
  
!   (rcirc-nick-remove process sender))
  
  (defun rcirc-handler-NICK (process sender args text)
!   (let* ((old-nick sender)
           (new-nick (car args))
           (channels (rcirc-nick-channels process old-nick)))
      ;; update list of ignored nicks
***************
*** 1796,1804 ****
  
      ;; print in private chat buffers if they exist
      (mapc (lambda (nick)
! 	    (let ((existing-buffer (rcirc-get-buffer process nick)))
! 	      (when existing-buffer
! 		(rcirc-print process sender "MODE" existing-buffer msg))))
  	  (cddr args))))
  
  (defun rcirc-get-temp-buffer-create (process channel)
--- 1827,1834 ----
  
      ;; print in private chat buffers if they exist
      (mapc (lambda (nick)
! 	    (when (rcirc-get-buffer process nick)
! 	      (rcirc-print process sender "MODE" nick msg)))
  	  (cddr args))))
  
  (defun rcirc-get-temp-buffer-create (process channel)
***************
*** 1834,1873 ****
  
  (defun rcirc-authenticate ()
    "Send authentication to process associated with current buffer.
! Passwords are read from `rcirc-authinfo-file-name' (which see)."
    (interactive)
!   (let ((password-alist
!          (with-temp-buffer
!            (insert-file-contents-literally rcirc-authinfo-file-name)
!            (goto-char (point-min))
!            (read (current-buffer)))))
!     (with-rcirc-process-buffer rcirc-process
!       (dolist (i password-alist)
!         (let ((server (car i))
!               (nick (cadr i))
!               (method (caddr i))
!               (args (cdddr i)))
!           (when (and (string-match server rcirc-server)
!                      (string-match nick rcirc-nick))
!             (cond ((equal method 'nickserv)
!                    (rcirc-send-string
!                     rcirc-process
!                     (concat
!                      "PRIVMSG nickserv :identify "
! 		     (car args))))
!                   ((equal method 'chanserv)
!                    (rcirc-send-string
!                     rcirc-process
!                     (concat
!                      "PRIVMSG chanserv :identify "
! 		     (car args) " " (cadr args))))
!                   ((equal method 'bitlbee)
!                    (rcirc-send-string
!                     rcirc-process
!                     (concat "PRIVMSG #bitlbee :identify " (car args))))
!                   (t
!                    (message "No %S authentication method defined"
! 			    method)))))))))
  
  (defun rcirc-handler-INVITE (process sender args text)
    (rcirc-print process sender "INVITE" nil (mapconcat 'identity args " ") t))
--- 1864,1898 ----
  
  (defun rcirc-authenticate ()
    "Send authentication to process associated with current buffer.
! Passwords are stored in `rcirc-authinfo' (which see)."
    (interactive)
!   (with-rcirc-process-buffer rcirc-process
!     (dolist (i rcirc-authinfo)
!       (let ((server (car i))
! 	    (nick (caddr i))
! 	    (method (cadr i))
! 	    (args (cdddr i)))
! 	(when (and (string-match server rcirc-server)
! 		   (string-match nick rcirc-nick))
! 	  (cond ((equal method 'nickserv)
! 		 (rcirc-send-string
! 		  rcirc-process
! 		  (concat
! 		   "PRIVMSG nickserv :identify "
! 		   (car args))))
! 		((equal method 'chanserv)
! 		 (rcirc-send-string
! 		  rcirc-process
! 		  (concat
! 		   "PRIVMSG chanserv :identify "
! 		   (cadr args) " " (car args))))
! 		((equal method 'bitlbee)
! 		 (rcirc-send-string
! 		  rcirc-process
! 		  (concat "PRIVMSG &bitlbee :identify " (car args))))
! 		(t
! 		 (message "No %S authentication method defined"
! 			  method))))))))
  
  (defun rcirc-handler-INVITE (process sender args text)
    (rcirc-print process sender "INVITE" nil (mapconcat 'identity args " ") t))
***************
*** 1879,1900 ****
    (if (string-match "^\\([^ ]+\\) *\\(.*\\)$" text)
        (let* ((request (upcase (match-string 1 text)))
               (args (match-string 2 text))
-              (nick (rcirc-user-nick sender))
               (handler (intern-soft (concat "rcirc-handler-ctcp-" request))))
          (if (not (fboundp handler))
!             (rcirc-print process sender "ERROR"
! 			 (rcirc-get-buffer process target)
!                          (format "%s sent unsupported ctcp: %s" nick text)
  			 t)
            (funcall handler process target sender args)
            (if (not (string= request "ACTION"))
!               (rcirc-print process sender "CTCP"
! 			   (rcirc-get-buffer process target)
  			   (format "%s" text) t))))))
  
  (defun rcirc-handler-ctcp-VERSION (process target sender args)
    (rcirc-send-string process
!                      (concat "NOTICE " (rcirc-user-nick sender)
                               " :\C-aVERSION " rcirc-id-string
                               "\C-a")))
  
--- 1904,1922 ----
    (if (string-match "^\\([^ ]+\\) *\\(.*\\)$" text)
        (let* ((request (upcase (match-string 1 text)))
               (args (match-string 2 text))
               (handler (intern-soft (concat "rcirc-handler-ctcp-" request))))
          (if (not (fboundp handler))
!             (rcirc-print process sender "ERROR" target
!                          (format "%s sent unsupported ctcp: %s" sender text)
  			 t)
            (funcall handler process target sender args)
            (if (not (string= request "ACTION"))
!               (rcirc-print process sender "CTCP" target
  			   (format "%s" text) t))))))
  
  (defun rcirc-handler-ctcp-VERSION (process target sender args)
    (rcirc-send-string process
!                      (concat "NOTICE " sender
                               " :\C-aVERSION " rcirc-id-string
                               "\C-a")))
  
***************
*** 1903,1909 ****
  
  (defun rcirc-handler-ctcp-TIME (process target sender args)
    (rcirc-send-string process
!                      (concat "NOTICE " (rcirc-user-nick sender)
                               " :\C-aTIME " (current-time-string) "\C-a")))
  
  (defun rcirc-handler-CTCP-response (process target sender message)
--- 1925,1931 ----
  
  (defun rcirc-handler-ctcp-TIME (process target sender args)
    (rcirc-send-string process
!                      (concat "NOTICE " sender
                               " :\C-aTIME " (current-time-string) "\C-a")))
  
  (defun rcirc-handler-CTCP-response (process target sender message)
***************
*** 1960,1966 ****
    :group 'rcirc-faces)
  
  (defface rcirc-server-prefix	 ; font-lock-comment-delimiter-face
!   '((default :inherit font-lock-comment-face)
      (((class grayscale)))
      (((class color) (min-colors 16)))
      (((class color) (min-colors 8) (background light))
--- 1982,1988 ----
    :group 'rcirc-faces)
  
  (defface rcirc-server-prefix	 ; font-lock-comment-delimiter-face
!   '((default :inherit rcirc-server)
      (((class grayscale)))
      (((class color) (min-colors 16)))
      (((class color) (min-colors 8) (background light))

^ permalink raw reply	[flat|nested] 2+ messages in thread

* rcirc updates
@ 2006-04-03 20:10 Ryan Yeske
  0 siblings, 0 replies; 2+ messages in thread
From: Ryan Yeske @ 2006-04-03 20:10 UTC (permalink / raw)


2006-04-03  Ryan Yeske  <rcyeske@gmail.com>

	* rcirc.el (rcirc-default-server): Rename from rcirc-server.
	(rcirc-default-port): Rename from rcirc-port.
	(rcirc-default-nick): Rename from rcirc-nick.
	(rcirc-default-user-name): Rename from rcirc-user-name.
	(rcirc-default-user-full-name): Rename from rcirc-user-full-name.
	(rcirc-low-priority-flag): Add variable.
	(rcirc-decode-coding-system): Add custom variable.
	(rcirc-encode-coding-system): Add custom variable.
	(rcirc-coding-system-alist): Add custom variable.
	(rcirc-multiline-major-mode): Add custom variable.
	(rcirc-nick): Add internal variable.
	(rcirc-process): Remove variable.
	(rcirc-server-buffer): Add variable.
	(rcirc): Update to use rcirc-default-* variables above.
	(rcirc-connect): Do not add window-configuration-hook-here.
	(rcirc-server): Add internal variable.
	(rcirc-connect): Do not send keepalive pings if
	rcirc-keepalive-seconds is nil.
	(with-rcirc-server-buffer): Add macro.
	(rcirc-send-string): Encode with rcirc-encode-coding-system.
	(rcirc-server-name): Rename from rcirc-server.
	(rcirc-buffer-process): Add function.
	(rcirc-buffer-nick): Add function.
	(rcirc-buffer-target): Remove function.
	(set-rcirc-decode-coding-system, set-rcirc-encode-coding-system):
	Add commands.
	(rcirc-mode-map): Change binding of C-c C-l to
	rcirc-toggle-low-priority.
	(rcirc-mode): Initialize coding system based on
	rcirc-coding-system-alist.  Add change-major-mode-hook so the
	channel will be parted on a mode change.  Make kill-buffer-hook
	buffer-local.
	(rcirc-change-major-mode-hook): Add function.
	(rcirc-clean-up-buffer): Rename from rcirc-kill-buffer-hook-1.
	(rcirc-last-post-time): Add variable.
	(rcirc-process-message): Store the last time user posted a message
	to this target.
	(rcirc-multiline-minor-mode): New mode.
	(rcirc-multiline-minor-mode-map): New mode map.
	(rcirc-edit-multiline): Put multiline-edit buffer in
	rcirc-multiline-major-mode along with rcirc-multiline-minor-mode.
	(rcirc-print): Any line starting with an ignored nick will be
	ignored.
	(rcirc-print): Decode using rcirc-decode-coding-system.
	(rcirc-track-minor-mode): Update global-mode-string when disabling
	this mode.
	(minor-mode-alist): add LowPri indicator.
	(rcirc-toggle-low-priority): Add function.
	(rcirc-last-non-irc-buffer): Prefix arg now no means switch to
	next lowpriority buffer with activity.
	(rcirc-record-activity): Sort buffers in rcirc-activity by the
	last time the user posted a message in to the target.
	(rcirc-update-activity-string): Add formatting for lowpriority
	buffers.
	(rcirc-split-activity): Add function.
	(rcirc-handler-PART, rcirc-handler-KICK)
	(rcirc-handler-PART-or-KICK): Kick responses are printed properly.
	(rcirc-nick-away-alist): Add variable.
	(rcirc-handler-301): Add handler.  Away messages are printed once
	per change.

Index: rcirc.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/net/rcirc.el,v
retrieving revision 1.20
diff -c -r1.20 rcirc.el
*** rcirc.el	27 Mar 2006 20:23:21 -0000	1.20
--- rcirc.el	3 Apr 2006 19:47:36 -0000
***************
*** 53,79 ****
    :link '(custom-manual "(rcirc)")
    :group 'applications)
  
! (defcustom rcirc-server "irc.freenode.net"
    "The default server to connect to."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-port 6667
    "The default port to connect to."
    :type 'integer
    :group 'rcirc)
  
! (defcustom rcirc-nick (user-login-name)
    "Your nick."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-user-name (user-login-name)
    "Your user name sent to the server when connecting."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-user-full-name (if (string= (user-full-name) "")
  				 rcirc-user-name
  			       (user-full-name))
    "The full name sent to the server when connecting."
--- 53,79 ----
    :link '(custom-manual "(rcirc)")
    :group 'applications)
  
! (defcustom rcirc-default-server "irc.freenode.net"
    "The default server to connect to."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-default-port 6667
    "The default port to connect to."
    :type 'integer
    :group 'rcirc)
  
! (defcustom rcirc-default-nick (user-login-name)
    "Your nick."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-default-user-name (user-login-name)
    "Your user name sent to the server when connecting."
    :type 'string
    :group 'rcirc)
  
! (defcustom rcirc-default-user-full-name (if (string= (user-full-name) "")
  				 rcirc-user-name
  			       (user-full-name))
    "The full name sent to the server when connecting."
***************
*** 112,117 ****
--- 112,121 ----
    "If non-nil, ignore activity in this buffer.")
  (make-variable-buffer-local 'rcirc-ignore-buffer-activity-flag)
  
+ (defvar rcirc-low-priority-flag nil
+   "If non-nil, activity in this buffer is considered low priority.")
+ (make-variable-buffer-local 'rcirc-low-priority-flag)
+ 
  (defcustom rcirc-time-format "%H:%M "
    "*Describes how timestamps are printed.
  Used as the first arg to `format-time-string'."
***************
*** 213,218 ****
--- 217,259 ----
    :type 'boolean
    :group 'rcirc)
  
+ (defcustom rcirc-decode-coding-system 'undecided
+   "Coding system used to decode incoming irc messages."
+   :type 'coding-system
+   :group 'rcirc)
+ 
+ (defcustom rcirc-encode-coding-system 'utf-8
+   "Coding system used to encode outgoing irc messages."
+   :type 'coding-system
+   :group 'rcirc)
+ 
+ (defcustom rcirc-coding-system-alist nil
+   "Alist to decide a coding system to use for a file I/O operation.
+ The format is ((PATTERN . VAL) ...).
+ PATTERN is either a string or a cons of strings.
+ If PATTERN is a string, it is used to match a target.
+ If PATTERN is a cons of strings, the car part is used to match a
+ target, and the cdr part is used to match a server.
+ VAL is either a coding system or a cons of coding systems.
+ If VAL is a coding system, it is used for both decoding and encoding
+ messages.
+ If VAL is a cons of coding systems, the car part is used for decoding,
+ and the cdr part is used for encoding."
+   :type '(alist :key-type (choice (string :tag "Channel Regexp")
+ 					  (cons (string :tag "Channel Regexp")
+ 						(string :tag "Server Regexp")))
+ 		:value-type (choice coding-system
+ 				    (cons (coding-system :tag "Decode")
+ 					  (coding-system :tag "Encode"))))
+   :group 'rcirc)
+ 
+ (defcustom rcirc-multiline-major-mode 'fundamental-mode
+   "Major-mode function to use in multiline edit buffers."
+   :type 'function
+   :group 'rcirc)
+ 
+ (defvar rcirc-nick nil)
+ 
  (defvar rcirc-prompt-start-marker nil)
  (defvar rcirc-prompt-end-marker nil)
  
***************
*** 230,243 ****
  (defvar rcirc-buffer-alist nil)
  
  (defvar rcirc-activity nil
!   "List of channels with unviewed activity.")
  
  (defvar rcirc-activity-string ""
    "String displayed in modeline representing `rcirc-activity'.")
  (put 'rcirc-activity-string 'risky-local-variable t)
  
! (defvar rcirc-process nil
!   "The server process associated with this buffer.")
  
  (defvar rcirc-target nil
    "The channel or user associated with this buffer.")
--- 271,284 ----
  (defvar rcirc-buffer-alist nil)
  
  (defvar rcirc-activity nil
!   "List of buffers with unviewed activity.")
  
  (defvar rcirc-activity-string ""
    "String displayed in modeline representing `rcirc-activity'.")
  (put 'rcirc-activity-string 'risky-local-variable t)
  
! (defvar rcirc-server-buffer nil
!   "The server buffer associated with this channel buffer.")
  
  (defvar rcirc-target nil
    "The channel or user associated with this buffer.")
***************
*** 246,252 ****
    "List of urls seen in the current buffer.")
  
  (defvar rcirc-keepalive-seconds 60
!   "Number of seconds between keepalive pings.")
  
  (defconst rcirc-id-string (concat "rcirc on GNU Emacs " emacs-version))
  \f
--- 287,294 ----
    "List of urls seen in the current buffer.")
  
  (defvar rcirc-keepalive-seconds 60
!   "Number of seconds between keepalive pings.
! If nil, do not send keepalive pings.")
  
  (defconst rcirc-id-string (concat "rcirc on GNU Emacs " emacs-version))
  \f
***************
*** 257,287 ****
  If ARG is non-nil, prompt for a server to connect to."
    (interactive "P")
    (if arg
!       (let* ((server (read-string "IRC Server: " rcirc-server))
! 	     (port (read-string "IRC Port: " (number-to-string rcirc-port)))
! 	     (nick (read-string "IRC Nick: " rcirc-nick))
  	     (channels (split-string
  			(read-string "IRC Channels: "
! 				     (mapconcat 'identity
! 						(rcirc-startup-channels server)
! 						" "))
  			"[, ]+" t)))
! 	(rcirc-connect server port nick rcirc-user-name rcirc-user-full-name
  		       channels))
      ;; make new connection using defaults unless already connected to
      ;; the default rcirc-server
!     (let ((default-server (default-value 'rcirc-server))
! 	  connected)
        (dolist (p (rcirc-process-list))
! 	(when (string= default-server (process-name p))
  	  (setq connected p)))
        (if (not connected)
! 	  (rcirc-connect rcirc-server rcirc-port rcirc-nick
! 			 rcirc-user-name rcirc-user-full-name
! 			 (rcirc-startup-channels rcirc-server))
  	(switch-to-buffer (process-buffer connected))
! 	(message "Connected to %s" rcirc-server)))))
! 
  ;;;###autoload
  (defalias 'irc 'rcirc)
  
--- 299,328 ----
  If ARG is non-nil, prompt for a server to connect to."
    (interactive "P")
    (if arg
!       (let* ((server (read-string "IRC Server: " rcirc-default-server))
! 	     (port (read-string "IRC Port: " (number-to-string rcirc-default-port)))
! 	     (nick (read-string "IRC Nick: " rcirc-default-nick))
  	     (channels (split-string
  			(read-string "IRC Channels: "
! 				     (mapconcat 'identity (rcirc-startup-channels server) " "))
  			"[, ]+" t)))
! 	(rcirc-connect server port nick rcirc-default-user-name rcirc-default-user-full-name
  		       channels))
      ;; make new connection using defaults unless already connected to
      ;; the default rcirc-server
!     (let (connected)
        (dolist (p (rcirc-process-list))
! 	(when (string= rcirc-default-server (process-name p))
  	  (setq connected p)))
        (if (not connected)
! 	  (rcirc-connect rcirc-default-server rcirc-default-port 
! 			 rcirc-default-nick rcirc-default-user-name
! 			 rcirc-default-user-full-name
! 			 (rcirc-startup-channels rcirc-default-server))
  	(switch-to-buffer (process-buffer connected))
! 	(message "Connected to %s" 
! 		 (process-contact (get-buffer-process (current-buffer))
! 				  :host))))))
  ;;;###autoload
  (defalias 'irc 'rcirc)
  
***************
*** 290,301 ****
  (defvar rcirc-topic nil)
  (defvar rcirc-keepalive-timer nil)
  (defvar rcirc-last-server-message-time nil)
  
  ;;;###autoload
  (defun rcirc-connect (&optional server port nick user-name full-name startup-channels)
-   (add-hook 'window-configuration-change-hook
- 	    'rcirc-window-configuration-change)
- 
    (save-excursion
      (message "Connecting to %s..." server)
      (let* ((inhibit-eol-conversion)
--- 331,340 ----
  (defvar rcirc-topic nil)
  (defvar rcirc-keepalive-timer nil)
  (defvar rcirc-last-server-message-time nil)
+ (defvar rcirc-server nil)
  
  ;;;###autoload
  (defun rcirc-connect (&optional server port nick user-name full-name startup-channels)
    (save-excursion
      (message "Connecting to %s..." server)
      (let* ((inhibit-eol-conversion)
***************
*** 303,328 ****
  			    (if (stringp port)
  				(string-to-number port)
  			      port)
! 			  rcirc-port))
! 	   (server (or server rcirc-server))
! 	   (nick (or nick rcirc-nick))
! 	   (user-name (or user-name rcirc-user-name))
! 	   (full-name (or full-name rcirc-user-full-name))
! 	   (startup-channels (or startup-channels (rcirc-startup-channels server)))
             (process (open-network-stream server nil server port-number)))
        ;; set up process
        (set-process-coding-system process 'raw-text 'raw-text)
-       (set-process-filter process 'rcirc-filter)
        (switch-to-buffer (rcirc-generate-new-buffer-name process nil))
        (set-process-buffer process (current-buffer))
-       (set-process-sentinel process 'rcirc-sentinel)
        (rcirc-mode process nil)
        (make-local-variable 'rcirc-buffer-alist)
        (setq rcirc-buffer-alist nil)
        (make-local-variable 'rcirc-nick-table)
        (setq rcirc-nick-table (make-hash-table :test 'equal))
-       (make-local-variable 'rcirc-server)
-       (setq rcirc-server server)
        (make-local-variable 'rcirc-nick)
        (setq rcirc-nick nick)
        (make-local-variable 'rcirc-process-output)
--- 342,367 ----
  			    (if (stringp port)
  				(string-to-number port)
  			      port)
! 			  rcirc-default-port))
! 	   (server (or server rcirc-default-server))
! 	   (nick (or nick rcirc-default-nick))
! 	   (user-name (or user-name rcirc-default-user-name))
! 	   (full-name (or full-name rcirc-default-user-full-name))
! 	   (startup-channels startup-channels)
             (process (open-network-stream server nil server port-number)))
        ;; set up process
        (set-process-coding-system process 'raw-text 'raw-text)
        (switch-to-buffer (rcirc-generate-new-buffer-name process nil))
        (set-process-buffer process (current-buffer))
        (rcirc-mode process nil)
+       (set-process-sentinel process 'rcirc-sentinel)
+       (set-process-filter process 'rcirc-filter)
+       (make-local-variable 'rcirc-server)
+       (setq rcirc-server server)
        (make-local-variable 'rcirc-buffer-alist)
        (setq rcirc-buffer-alist nil)
        (make-local-variable 'rcirc-nick-table)
        (setq rcirc-nick-table (make-hash-table :test 'equal))
        (make-local-variable 'rcirc-nick)
        (setq rcirc-nick nick)
        (make-local-variable 'rcirc-process-output)
***************
*** 339,347 ****
                                        full-name))
  
        ;; setup ping timer if necessary
!       (unless rcirc-keepalive-timer
!         (setq rcirc-keepalive-timer
!               (run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive)))
  
        (message "Connecting to %s...done" server)
  
--- 378,387 ----
                                        full-name))
  
        ;; setup ping timer if necessary
!       (when rcirc-keepalive-seconds
! 	(unless rcirc-keepalive-timer
! 	  (setq rcirc-keepalive-timer
! 		(run-at-time 0 rcirc-keepalive-seconds 'rcirc-keepalive))))
  
        (message "Connecting to %s...done" server)
  
***************
*** 353,358 ****
--- 393,403 ----
    `(with-current-buffer (process-buffer ,process)
       ,@body))
  
+ (defmacro with-rcirc-server-buffer (&rest body)
+   (declare (indent 0) (debug t))
+   `(with-current-buffer rcirc-server-buffer
+      ,@body))
+ 
  (defun rcirc-keepalive ()
    "Send keep alive pings to active rcirc processes.
  Kill processes that have not received a server message since the
***************
*** 471,494 ****
  
  (defun rcirc-send-string (process string)
    "Send PROCESS a STRING plus a newline."
!   (let ((string (concat (encode-coding-string string
!                                               buffer-file-coding-system)
                          "\n")))
!     (unless (eq (process-status rcirc-process) 'open)
        (error "Network connection to %s is not open"
!              (process-name rcirc-process)))
      (rcirc-debug process string)
      (process-send-string process string)))
  
! (defun rcirc-server (process)
!   "Return PROCESS server, given by the 001 response."
    (with-rcirc-process-buffer process
!     rcirc-server))
  
  (defun rcirc-nick (process)
    "Return PROCESS nick."
!   (with-rcirc-process-buffer process
!     rcirc-nick))
  
  (defvar rcirc-max-message-length 450
    "Messages longer than this value will be split.")
--- 516,550 ----
  
  (defun rcirc-send-string (process string)
    "Send PROCESS a STRING plus a newline."
!   (let ((string (concat (encode-coding-string string rcirc-encode-coding-system)
                          "\n")))
!     (unless (eq (process-status process) 'open)
        (error "Network connection to %s is not open"
!              (process-name process)))
      (rcirc-debug process string)
      (process-send-string process string)))
  
! (defun rcirc-buffer-process (&optional buffer)
!   "Return the process associated with channel BUFFER.
! With no argument or nil as argument, use the current buffer."
!   (get-buffer-process (or buffer rcirc-server-buffer)))
! 
! (defun rcirc-server-name (process)
!   "Return PROCESS server name, given by the 001 response."
    (with-rcirc-process-buffer process
!     (or rcirc-server rcirc-default-server)))
  
  (defun rcirc-nick (process)
    "Return PROCESS nick."
!   (with-rcirc-process-buffer process 
!     (or rcirc-nick rcirc-default-nick)))
! 
! (defun rcirc-buffer-nick (&optional buffer)
!   "Return the nick associated with BUFFER.
! With no argument or nil as argument, use the current buffer."
!   (with-current-buffer (or buffer (current-buffer))
!     (with-current-buffer rcirc-server-buffer
!       (or rcirc-nick rcirc-default-nick))))
  
  (defvar rcirc-max-message-length 450
    "Messages longer than this value will be split.")
***************
*** 554,561 ****
  		 rcirc-nick-completion-start-offset)
  	      (point))
  	     (mapcar (lambda (x) (cons x nil))
! 		     (rcirc-channel-nicks rcirc-process
! 					  (rcirc-buffer-target)))))))
    (let ((completion (car rcirc-nick-completions)))
      (when completion
        (delete-region (+ rcirc-prompt-end-marker
--- 610,617 ----
  		 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)))
      (when completion
        (delete-region (+ rcirc-prompt-end-marker
***************
*** 567,577 ****
                               rcirc-prompt-end-marker)
                            ": "))))))
  
! (defun rcirc-buffer-target (&optional buffer)
!   "Return the name of target for BUFFER.
! If buffer is nil, return the target of the current buffer."
!   (with-current-buffer (or buffer (current-buffer))
!     rcirc-target))
  
  (defvar rcirc-mode-map (make-sparse-keymap)
    "Keymap for rcirc mode.")
--- 623,637 ----
                               rcirc-prompt-end-marker)
                            ": "))))))
  
! (defun set-rcirc-decode-coding-system (coding-system)
!   "Set the decode coding system used in this channel."
!   (interactive "zCoding system for incoming messages: ")
!   (setq rcirc-decode-coding-system coding-system))
! 
! (defun set-rcirc-encode-coding-system (coding-system)
!   "Set the encode coding system used in this channel."
!   (interactive "zCoding system for outgoing messages: ")
!   (setq rcirc-encode-coding-system coding-system))
  
  (defvar rcirc-mode-map (make-sparse-keymap)
    "Keymap for rcirc mode.")
***************
*** 584,590 ****
  (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)
  (define-key rcirc-mode-map (kbd "C-c C-k") 'rcirc-cmd-kick)
! (define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-cmd-list)
  (define-key rcirc-mode-map (kbd "C-c C-d") 'rcirc-cmd-mode)
  (define-key rcirc-mode-map (kbd "C-c C-m") 'rcirc-cmd-msg)
  (define-key rcirc-mode-map (kbd "C-c C-r") 'rcirc-cmd-nick) ; rename
--- 644,650 ----
  (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)
  (define-key rcirc-mode-map (kbd "C-c C-k") 'rcirc-cmd-kick)
! (define-key rcirc-mode-map (kbd "C-c C-l") 'rcirc-toggle-low-priority)
  (define-key rcirc-mode-map (kbd "C-c C-d") 'rcirc-cmd-mode)
  (define-key rcirc-mode-map (kbd "C-c C-m") 'rcirc-cmd-msg)
  (define-key rcirc-mode-map (kbd "C-c C-r") 'rcirc-cmd-nick) ; rename
***************
*** 623,634 ****
  
    (make-local-variable 'rcirc-input-ring)
    (setq rcirc-input-ring (make-ring rcirc-input-ring-size))
!   (make-local-variable 'rcirc-process)
!   (setq rcirc-process process)
    (make-local-variable 'rcirc-target)
    (setq rcirc-target target)
    (make-local-variable 'rcirc-topic)
    (setq rcirc-topic nil)
  
    (make-local-variable 'rcirc-short-buffer-name)
    (setq rcirc-short-buffer-name nil)
--- 683,696 ----
  
    (make-local-variable 'rcirc-input-ring)
    (setq rcirc-input-ring (make-ring rcirc-input-ring-size))
!   (make-local-variable 'rcirc-server-buffer)
!   (setq rcirc-server-buffer (process-buffer process))
    (make-local-variable 'rcirc-target)
    (setq rcirc-target target)
    (make-local-variable 'rcirc-topic)
    (setq rcirc-topic nil)
+   (make-local-variable 'rcirc-last-post-time)
+   (setq rcirc-last-post-time (current-time))
  
    (make-local-variable 'rcirc-short-buffer-name)
    (setq rcirc-short-buffer-name nil)
***************
*** 636,641 ****
--- 698,713 ----
    (setq rcirc-urls nil)
    (setq use-hard-newlines t)
  
+   (make-local-variable 'rcirc-decode-coding-system)
+   (make-local-variable 'rcirc-encode-coding-system)
+   (dolist (i rcirc-coding-system-alist)
+     (let ((chan (if (consp (car i)) (caar i) (car i)))
+ 	  (serv (if (consp (car i)) (cdar i) "")))
+       (when (and (string-match chan (or target ""))
+ 		 (string-match serv (rcirc-server-name process)))
+ 	(setq rcirc-decode-coding-system (if (consp (cdr i)) (cadr i) i)
+ 	      rcirc-encode-coding-system (if (consp (cdr i)) (cddr i) i)))))
+ 
    ;; setup the prompt and markers
    (make-local-variable 'rcirc-prompt-start-marker)
    (setq rcirc-prompt-start-marker (make-marker))
***************
*** 649,654 ****
--- 721,733 ----
    (setq overlay-arrow-position (make-marker))
    (set-marker overlay-arrow-position nil)
  
+   ;; if the user changes the major mode or kills the buffer, there is
+   ;; cleanup work to do
+   (make-local-variable 'change-major-mode-hook)
+   (add-hook 'change-major-mode-hook 'rcirc-change-major-mode-hook)
+   (make-local-variable 'kill-buffer-hook)
+   (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
+ 
    ;; add to buffer list, and update buffer abbrevs
    (when target				; skip server buffer
      (let ((buffer (current-buffer)))
***************
*** 675,685 ****
  	  (prompt (or rcirc-prompt "")))
        (mapc (lambda (rep)
  	      (setq prompt
! 		    (replace-regexp-in-string (car rep) (regexp-quote (cdr rep)) prompt)))
! 	    (list (cons "%n" (with-rcirc-process-buffer rcirc-process
! 			       rcirc-nick))
! 		  (cons "%s" (with-rcirc-process-buffer rcirc-process
! 			       rcirc-server))
  		  (cons "%t" (or rcirc-target ""))))
        (save-excursion
  	(delete-region rcirc-prompt-start-marker rcirc-prompt-end-marker)
--- 754,762 ----
  	  (prompt (or rcirc-prompt "")))
        (mapc (lambda (rep)
  	      (setq prompt
! 		    (replace-regexp-in-string (car rep) (cdr rep) prompt)))
! 	    (list (cons "%n" (rcirc-buffer-nick))
! 		  (cons "%s" (with-rcirc-server-buffer (or rcirc-server "")))
  		  (cons "%t" (or rcirc-target ""))))
        (save-excursion
  	(delete-region rcirc-prompt-start-marker rcirc-prompt-end-marker)
***************
*** 713,739 ****
  (defun rcirc-kill-buffer-hook ()
    "Part the channel when killing an rcirc buffer."
    (when (eq major-mode 'rcirc-mode)
!     (rcirc-kill-buffer-hook-1)))
! (defun rcirc-kill-buffer-hook-1 ()
    (let ((buffer (current-buffer)))
      (rcirc-clear-activity buffer)
!     (when (and rcirc-process
! 	       (eq (process-status rcirc-process) 'open))
!       (with-rcirc-process-buffer rcirc-process
! 	(setq rcirc-buffer-alist
! 	      (rassq-delete-all buffer rcirc-buffer-alist)))
        (rcirc-update-short-buffer-names)
        (if (rcirc-channel-p rcirc-target)
! 	  (rcirc-send-string rcirc-process
! 			     (concat "PART " rcirc-target
! 				     " :Killed buffer"))
  	(when rcirc-target
! 	  (rcirc-remove-nick-channel rcirc-process
! 				     (rcirc-nick rcirc-process)
  				     rcirc-target))))))
  
- (add-hook 'kill-buffer-hook 'rcirc-kill-buffer-hook)
- 
  (defun rcirc-generate-new-buffer-name (process target)
    "Return a buffer name based on PROCESS and TARGET.
  This is used for the initial name given to IRC buffers."
--- 790,818 ----
  (defun rcirc-kill-buffer-hook ()
    "Part the channel when killing an rcirc buffer."
    (when (eq major-mode 'rcirc-mode)
!     (rcirc-clean-up-buffer "Killed buffer")))
! 
! (defun rcirc-change-major-mode-hook ()
!   "Part the channel when changing the major-mode."
!   (rcirc-clean-up-buffer "Changed major mode"))
! 
! (defun rcirc-clean-up-buffer (reason)
    (let ((buffer (current-buffer)))
      (rcirc-clear-activity buffer)
!     (when (and (rcirc-buffer-process)
! 	       (eq (process-status (rcirc-buffer-process)) 'open))
!       (with-rcirc-server-buffer
!        (setq rcirc-buffer-alist
! 	     (rassq-delete-all buffer rcirc-buffer-alist)))
        (rcirc-update-short-buffer-names)
        (if (rcirc-channel-p rcirc-target)
! 	  (rcirc-send-string (rcirc-buffer-process)
! 			     (concat "PART " rcirc-target " :" reason))
  	(when rcirc-target
! 	  (rcirc-remove-nick-channel (rcirc-buffer-process)
! 				     (rcirc-buffer-nick)
  				     rcirc-target))))))
  
  (defun rcirc-generate-new-buffer-name (process target)
    "Return a buffer name based on PROCESS and TARGET.
  This is used for the initial name given to IRC buffers."
***************
*** 756,762 ****
    "Return the buffer associated with the PROCESS and TARGET.
  Create the buffer if it doesn't exist."
    (let ((buffer (rcirc-get-buffer process target)))
!     (if buffer
  	(with-current-buffer buffer
  	  (when (not rcirc-target)
   	    (setq rcirc-target target))
--- 835,841 ----
    "Return the buffer associated with the PROCESS and TARGET.
  Create the buffer if it doesn't exist."
    (let ((buffer (rcirc-get-buffer process target)))
!     (if (and buffer (buffer-live-p buffer))
  	(with-current-buffer buffer
  	  (when (not rcirc-target)
   	    (setq rcirc-target target))
***************
*** 789,839 ****
  		   (buffer-substring-no-properties start end)))))
      ;; process input
      (goto-char (point-max))
!     (let ((target (rcirc-buffer-target))
! 	  (start rcirc-prompt-end-marker))
!       (when (not (equal 0 (- (point) start)))
! 	;; delete a trailing newline
! 	(when (eq (point) (point-at-bol))
! 	  (delete-backward-char 1))
! 	(let ((input (buffer-substring-no-properties
! 		      rcirc-prompt-end-marker (point))))
! 	  (dolist (line (split-string input "\n"))
! 	    (rcirc-process-input-line rcirc-process target line))
! 	  ;; add to input-ring
! 	  (save-excursion
! 	    (ring-insert rcirc-input-ring input)
! 	    (setq rcirc-input-ring-index 0)))))))
  
! (defun rcirc-process-input-line (process target line)
    (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
        (rcirc-process-command (match-string 1 line)
  			     (match-string 2 line)
  			     line)
      (rcirc-process-message line)))
  
  (defun rcirc-process-message (line)
    (if (not rcirc-target)
!       (message "Not joined")
      (delete-region rcirc-prompt-end-marker (point))
!     (rcirc-send-message rcirc-process rcirc-target line)))
  
  (defun rcirc-process-command (command args line)
    (if (eq (aref command 0) ?/)
        ;; "//text" will send "/text" as a message
        (rcirc-process-message (substring line 1))
!     (let* ((fun (intern-soft (concat "rcirc-cmd-" command))))
        (newline)
        (with-current-buffer (current-buffer)
  	(delete-region rcirc-prompt-end-marker (point))
  	(if (string= command "me")
! 	    (rcirc-print rcirc-process (rcirc-nick rcirc-process)
  			 "ACTION" rcirc-target args)
! 	  (rcirc-print rcirc-process (rcirc-nick rcirc-process)
  		       "COMMAND" rcirc-target line))
  	(set-marker rcirc-prompt-end-marker (point))
  	(if (fboundp fun)
! 	    (funcall fun args rcirc-process rcirc-target)
! 	  (rcirc-send-string rcirc-process
  			     (concat command " " args)))))))
  
  (defvar rcirc-parent-buffer nil)
--- 868,919 ----
  		   (buffer-substring-no-properties start end)))))
      ;; process input
      (goto-char (point-max))
!     (when (not (equal 0 (- (point) rcirc-prompt-end-marker)))
!       ;; delete a trailing newline
!       (when (eq (point) (point-at-bol))
! 	(delete-backward-char 1))
!       (let ((input (buffer-substring-no-properties
! 		    rcirc-prompt-end-marker (point))))
! 	(dolist (line (split-string input "\n"))
! 	  (rcirc-process-input-line line))
! 	;; add to input-ring
! 	(save-excursion
! 	  (ring-insert rcirc-input-ring input)
! 	  (setq rcirc-input-ring-index 0))))))
  
! (defun rcirc-process-input-line (line)
    (if (string-match "^/\\([^ ]+\\) ?\\(.*\\)$" line)
        (rcirc-process-command (match-string 1 line)
  			     (match-string 2 line)
  			     line)
      (rcirc-process-message line)))
  
+ (defvar rcirc-last-post-time nil)
  (defun rcirc-process-message (line)
    (if (not rcirc-target)
!       (message "Not joined (no target)")
      (delete-region rcirc-prompt-end-marker (point))
!     (rcirc-send-message (rcirc-buffer-process) rcirc-target line)
!     (setq rcirc-last-post-time (current-time))))
  
  (defun rcirc-process-command (command args line)
    (if (eq (aref command 0) ?/)
        ;; "//text" will send "/text" as a message
        (rcirc-process-message (substring line 1))
!     (let ((fun (intern-soft (concat "rcirc-cmd-" command)))
! 	  (process (rcirc-buffer-process)))
        (newline)
        (with-current-buffer (current-buffer)
  	(delete-region rcirc-prompt-end-marker (point))
  	(if (string= command "me")
! 	    (rcirc-print process (rcirc-buffer-nick)
  			 "ACTION" rcirc-target args)
! 	  (rcirc-print process (rcirc-buffer-nick)
  		       "COMMAND" rcirc-target line))
  	(set-marker rcirc-prompt-end-marker (point))
  	(if (fboundp fun)
! 	    (funcall fun args process rcirc-target)
! 	  (rcirc-send-string process
  			     (concat command " " args)))))))
  
  (defvar rcirc-parent-buffer nil)
***************
*** 844,881 ****
    (let ((pos (1+ (- (point) rcirc-prompt-end-marker))))
      (goto-char (point-max))
      (let ((text (buffer-substring rcirc-prompt-end-marker (point)))
!           (parent (buffer-name))
!           (process rcirc-process))
        (delete-region rcirc-prompt-end-marker (point))
        (setq rcirc-window-configuration (current-window-configuration))
        (pop-to-buffer (concat "*multiline " parent "*"))
!       (rcirc-multiline-edit-mode)
        (setq rcirc-parent-buffer parent)
-       (setq rcirc-process process)
        (insert text)
        (and (> pos 0) (goto-char pos))
        (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
  
! (define-derived-mode rcirc-multiline-edit-mode
!   text-mode "rcirc multi"
!   "Major mode for multiline edits
! \\{rcirc-multiline-edit-mode-map}"
!   (make-local-variable 'rcirc-parent-buffer)
!   (make-local-variable 'rcirc-process))
  
! (define-key rcirc-multiline-edit-mode-map
!   (kbd "C-c C-c") 'rcirc-multiline-edit-submit)
! (define-key rcirc-multiline-edit-mode-map
!   (kbd "C-x C-s") 'rcirc-multiline-edit-submit)
! (define-key rcirc-multiline-edit-mode-map
!   (kbd "C-c C-k") 'rcirc-multiline-edit-cancel)
! (define-key rcirc-multiline-edit-mode-map
!   (kbd "ESC ESC ESC") 'rcirc-multiline-edit-cancel)
  
! (defun rcirc-multiline-edit-submit ()
    "Send the text in buffer back to parent buffer."
    (interactive)
-   (assert (eq major-mode 'rcirc-multiline-edit-mode))
    (assert rcirc-parent-buffer)
    (untabify (point-min) (point-max))
    (let ((text (buffer-substring (point-min) (point-max)))
--- 924,964 ----
    (let ((pos (1+ (- (point) rcirc-prompt-end-marker))))
      (goto-char (point-max))
      (let ((text (buffer-substring rcirc-prompt-end-marker (point)))
!           (parent (buffer-name)))
        (delete-region rcirc-prompt-end-marker (point))
        (setq rcirc-window-configuration (current-window-configuration))
        (pop-to-buffer (concat "*multiline " parent "*"))
!       (funcall rcirc-multiline-major-mode)
!       (rcirc-multiline-minor-mode 1)
        (setq rcirc-parent-buffer parent)
        (insert text)
        (and (> pos 0) (goto-char pos))
        (message "Type C-c C-c to return text to %s, or C-c C-k to cancel" parent))))
  
! (defvar rcirc-multiline-minor-mode-map (make-sparse-keymap)
!   "Keymap for multiline mode in rcirc.")
! (define-key rcirc-multiline-minor-mode-map 
!   (kbd "C-c C-c") 'rcirc-multiline-minor-submit)
! (define-key rcirc-multiline-minor-mode-map
!   (kbd "C-x C-s") 'rcirc-multiline-minor-submit)
! (define-key rcirc-multiline-minor-mode-map
!   (kbd "C-c C-k") 'rcirc-multiline-minor-cancel)
! (define-key rcirc-multiline-minor-mode-map
!   (kbd "ESC ESC ESC") 'rcirc-multiline-minor-cancel)
  
! (define-minor-mode rcirc-multiline-minor-mode
!   "Minor mode for editing multiple lines in rcirc."
!   :init-value nil
!   :lighter " rcirc-mline"
!   :keymap rcirc-multiline-minor-mode-map
!   :global nil
!   :group 'rcirc
!   (make-local-variable 'rcirc-parent-buffer)
!   (put 'rcirc-parent-buffer 'permanent-local t))
  
! (defun rcirc-multiline-minor-submit ()
    "Send the text in buffer back to parent buffer."
    (interactive)
    (assert rcirc-parent-buffer)
    (untabify (point-min) (point-max))
    (let ((text (buffer-substring (point-min) (point-max)))
***************
*** 888,897 ****
      (set-window-configuration rcirc-window-configuration)
      (goto-char (+ rcirc-prompt-end-marker (1- pos)))))
  
! (defun rcirc-multiline-edit-cancel ()
    "Cancel the multiline edit."
    (interactive)
-   (assert (eq major-mode 'rcirc-multiline-edit-mode))
    (kill-buffer (current-buffer))
    (set-window-configuration rcirc-window-configuration))
  
--- 971,979 ----
      (set-window-configuration rcirc-window-configuration)
      (goto-char (+ rcirc-prompt-end-marker (1- pos)))))
  
! (defun rcirc-multiline-minor-cancel ()
    "Cancel the multiline edit."
    (interactive)
    (kill-buffer (current-buffer))
    (set-window-configuration rcirc-window-configuration))
  
***************
*** 903,909 ****
        (if (and buffer
  	       (with-current-buffer buffer
  		 (and (eq major-mode 'rcirc-mode)
! 		      (eq rcirc-process process))))
  	  buffer
  	(process-buffer process)))))
  
--- 985,991 ----
        (if (and buffer
  	       (with-current-buffer buffer
  		 (and (eq major-mode 'rcirc-mode)
! 		      (eq (rcirc-buffer-process) process))))
  	  buffer
  	(process-buffer process)))))
  
***************
*** 932,939 ****
    %fs       Following text uses the face `rcirc-server'
    %f[FACE]  Following text uses the face FACE
    %f-       Following text uses the default face
!   %%        A literal `%' character
! "
    :type '(alist :key-type (choice (string :tag "Type")
  				  (const :tag "Default" t))
  		:value-type string)
--- 1014,1020 ----
    %fs       Following text uses the face `rcirc-server'
    %f[FACE]  Following text uses the face FACE
    %f-       Following text uses the default face
!   %%        A literal `%' character"
    :type '(alist :key-type (choice (string :tag "Type")
  				  (const :tag "Default" t))
  		:value-type string)
***************
*** 963,970 ****
  		   "%")
  		  ((or (eq key ?n) (eq key ?N))
  		   ;; %n/%N -- nick
! 		   (let ((nick (concat (if (string= (with-rcirc-process-buffer
! 							process rcirc-server)
  						    sender)
  					   ""
  					 sender)
--- 1044,1051 ----
  		   "%")
  		  ((or (eq key ?n) (eq key ?N))
  		   ;; %n/%N -- nick
! 		   (let ((nick (concat (if (string= (with-rcirc-process-buffer process
! 						      rcirc-server)
  						    sender)
  					   ""
  					 sender)
***************
*** 1037,1049 ****
  
  (defvar rcirc-activity-type nil)
  (make-variable-buffer-local 'rcirc-activity-type)
  (defun rcirc-print (process sender response target text &optional activity)
    "Print TEXT in the buffer associated with TARGET.
  Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
  record activity."
    (unless (or (member sender rcirc-ignore-list)
  	      (member (with-syntax-table rcirc-nick-syntax-table
! 			(when (string-match "^\\([^/]\\w*\\)[:,]" text)
  			  (match-string 1 text))) rcirc-ignore-list))
      (let* ((buffer (rcirc-target-buffer process sender response target text))
  	   (inhibit-read-only t))
--- 1118,1135 ----
  
  (defvar rcirc-activity-type nil)
  (make-variable-buffer-local 'rcirc-activity-type)
+ (defvar rcirc-last-sender nil)
+ (make-variable-buffer-local 'rcirc-last-sender)
+ (defvar rcirc-gray-toggle nil)
+ (make-variable-buffer-local 'rcirc-gray-toggle)
  (defun rcirc-print (process sender response target text &optional activity)
    "Print TEXT in the buffer associated with TARGET.
  Format based on SENDER and RESPONSE.  If ACTIVITY is non-nil,
  record activity."
+   (or text (setq text ""))
    (unless (or (member sender rcirc-ignore-list)
  	      (member (with-syntax-table rcirc-nick-syntax-table
! 			(when (string-match "^\\([^/]\\w*\\)\\b" text)
  			  (match-string 1 text))) rcirc-ignore-list))
      (let* ((buffer (rcirc-target-buffer process sender response target text))
  	   (inhibit-read-only t))
***************
*** 1054,1061 ****
  
  	  (unless (string= sender (rcirc-nick process))
  	    ;; only decode text from other senders, not ours
! 	    (setq text (decode-coding-string (or text "")
! 					     buffer-file-coding-system))
  	    ;; mark the line with overlay arrow
  	    (unless (or (marker-position overlay-arrow-position)
  			(get-buffer-window (current-buffer)))
--- 1140,1146 ----
  
  	  (unless (string= sender (rcirc-nick process))
  	    ;; only decode text from other senders, not ours
! 	    (setq text (decode-coding-string text rcirc-decode-coding-system))
  	    ;; mark the line with overlay arrow
  	    (unless (or (marker-position overlay-arrow-position)
  			(get-buffer-window (current-buffer)))
***************
*** 1142,1148 ****
  		      nick-match)
  	      (rcirc-record-activity
  	       (current-buffer)
! 	       (when (or nick-match (not (rcirc-channel-p rcirc-target)))
  		 'nick)))))
  
  	(sit-for 0)			; displayed text before hook
--- 1227,1234 ----
  		      nick-match)
  	      (rcirc-record-activity
  	       (current-buffer)
! 	       (when (or nick-match (and (not (rcirc-channel-p rcirc-target))
! 					 (not rcirc-low-priority-flag)))
  		 'nick)))))
  
  	(sit-for 0)			; displayed text before hook
***************
*** 1215,1232 ****
            (puthash nick newchans rcirc-nick-table)
          (remhash nick rcirc-nick-table)))))
  
! (defun rcirc-channel-nicks (process channel)
!   "Return the list of nicks in CHANNEL sorted by last activity."
!   (with-rcirc-process-buffer process
!     (let (nicks)
!       (maphash
!        (lambda (k v)
!          (let ((record (assoc-string channel v t)))
!            (if record
!                (setq nicks (cons (cons k (cdr record)) nicks)))))
!        rcirc-nick-table)
!       (mapcar (lambda (x) (car x))
!               (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x))))))))
  
  (defun rcirc-ignore-update-automatic (nick)
    "Remove NICK from `rcirc-ignore-list'
--- 1301,1321 ----
            (puthash nick newchans rcirc-nick-table)
          (remhash nick rcirc-nick-table)))))
  
! (defun rcirc-channel-nicks (process target)
!   "Return the list of nicks associated with TARGET sorted by last activity."
!   (when target
!     (if (rcirc-channel-p target)
! 	(with-rcirc-process-buffer process
! 	  (let (nicks)
! 	    (maphash
! 	     (lambda (k v)
! 	       (let ((record (assoc-string target v t)))
! 		 (if record
! 		     (setq nicks (cons (cons k (cdr record)) nicks)))))
! 	     rcirc-nick-table)
! 	    (mapcar (lambda (x) (car x))
! 		    (sort nicks (lambda (x y) (time-less-p (cdr y) (cdr x)))))))
!       (list target))))
  
  (defun rcirc-ignore-update-automatic (nick)
    "Remove NICK from `rcirc-ignore-list'
***************
*** 1256,1270 ****
    (or global-mode-string (setq global-mode-string '("")))
    ;; toggle the mode-line channel indicator
    (if rcirc-track-minor-mode
!       (and (not (memq 'rcirc-activity-string global-mode-string))
! 	   (setq global-mode-string
! 		 (append global-mode-string '(rcirc-activity-string))))
      (setq global-mode-string 
! 	  (delete 'rcirc-activity-string global-mode-string))))
  
  (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
      (setq minor-mode-alist
            (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
  
  (defun rcirc-toggle-ignore-buffer-activity ()
    "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
--- 1345,1367 ----
    (or global-mode-string (setq global-mode-string '("")))
    ;; toggle the mode-line channel indicator
    (if rcirc-track-minor-mode
!       (progn
! 	(and (not (memq 'rcirc-activity-string global-mode-string))
! 	     (setq global-mode-string
! 		   (append global-mode-string '(rcirc-activity-string))))
! 	(add-hook 'window-configuration-change-hook
! 		  'rcirc-window-configuration-change))
      (setq global-mode-string 
! 	  (delete 'rcirc-activity-string global-mode-string))
!     (remove-hook 'window-configuration-change-hook
! 		 'rcirc-window-configuration-change)))
  
  (or (assq 'rcirc-ignore-buffer-activity-flag minor-mode-alist)
      (setq minor-mode-alist
            (cons '(rcirc-ignore-buffer-activity-flag " Ignore") minor-mode-alist)))
+ (or (assq 'rcirc-low-priority-flag minor-mode-alist)
+     (setq minor-mode-alist
+           (cons '(rcirc-low-priority-flag " LowPri") minor-mode-alist)))
  
  (defun rcirc-toggle-ignore-buffer-activity ()
    "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
***************
*** 1276,1281 ****
--- 1373,1388 ----
  	     "Notice activity in this buffer"))
    (force-mode-line-update))
  
+ (defun rcirc-toggle-low-priority ()
+   "Toggle the value of `rcirc-ignore-buffer-activity-flag'."
+   (interactive)
+   (setq rcirc-low-priority-flag
+ 	(not rcirc-low-priority-flag))
+   (message (if rcirc-low-priority-flag
+ 	       "Activity in this buffer is low priority"
+ 	     "Activity in this buffer is normal priority"))
+   (force-mode-line-update))
+ 
  (defvar rcirc-switch-to-buffer-function 'switch-to-buffer
    "Function to use when switching buffers.
  Possible values are `switch-to-buffer', `pop-to-buffer', and
***************
*** 1284,1290 ****
  (defun rcirc-switch-to-server-buffer ()
    "Switch to the server buffer associated with current channel buffer."
    (interactive)
!   (funcall rcirc-switch-to-buffer-function (process-buffer rcirc-process)))
  
  (defun rcirc-jump-to-first-unread-line ()
    "Move the point to the first unread line in this buffer."
--- 1391,1397 ----
  (defun rcirc-switch-to-server-buffer ()
    "Switch to the server buffer associated with current channel buffer."
    (interactive)
!   (funcall rcirc-switch-to-buffer-function rcirc-server-buffer))
  
  (defun rcirc-jump-to-first-unread-line ()
    "Move the point to the first unread line in this buffer."
***************
*** 1296,1322 ****
    "The buffer to switch to when there is no more activity.")
  
  (defun rcirc-next-active-buffer (arg)
!   "Go to the ARGth rcirc buffer with activity.
  The function given by `rcirc-switch-to-buffer-function' is used to
  show the buffer."
!   (interactive "p")
!   (if rcirc-activity
!       (progn
!         (unless (eq major-mode 'rcirc-mode)
!           (setq rcirc-last-non-irc-buffer (current-buffer)))
!         (if (and (> arg 0)
!                  (<= arg (length rcirc-activity)))
!             (funcall rcirc-switch-to-buffer-function
! 		     (nth (1- arg) rcirc-activity))
!           (message "Invalid arg: %d" arg)))
!     (if (eq major-mode 'rcirc-mode)
!         (if (not (and rcirc-last-non-irc-buffer
!                       (buffer-live-p rcirc-last-non-irc-buffer)))
!             (message "No IRC activity.  Start something.")
! 	  (message "No more IRC activity.  Go back to work.")
!           (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
!           (setq rcirc-last-non-irc-buffer nil))
!       (message "No IRC activity."))))
  
  (defvar rcirc-activity-hooks nil
    "Hook to be run when there is channel activity.
--- 1403,1437 ----
    "The buffer to switch to when there is no more activity.")
  
  (defun rcirc-next-active-buffer (arg)
!   "Go to the next rcirc buffer with activity.
! With prefix ARG, go to the next low priority buffer with activity.
  The function given by `rcirc-switch-to-buffer-function' is used to
  show the buffer."
!   (interactive "P")
!   (let* ((pair (rcirc-split-activity rcirc-activity))
! 	 (lopri (car pair))
! 	 (hipri (cdr pair)))		
!     (if (or (and (not arg) hipri)
! 	    (and arg lopri))
! 	(progn
! 	  (unless (eq major-mode 'rcirc-mode)
! 	    (setq rcirc-last-non-irc-buffer (current-buffer)))
! 	  (funcall rcirc-switch-to-buffer-function
! 		   (car (if arg lopri hipri))))
!       (if (eq major-mode 'rcirc-mode)
! 	  (if (not (and rcirc-last-non-irc-buffer
! 			(buffer-live-p rcirc-last-non-irc-buffer)))
! 	      (message "No IRC activity.  Start something.")
! 	    (message "No more IRC activity.  Go back to work.")
! 	    (funcall rcirc-switch-to-buffer-function rcirc-last-non-irc-buffer)
! 	    (setq rcirc-last-non-irc-buffer nil))
! 	(message (concat 
! 		  "No IRC activity."
! 		  (when lopri
! 		    (concat 
! 		     "  Type C-u "
! 		     (key-description (this-command-keys))
! 		     " for low priority activity."))))))))
  
  (defvar rcirc-activity-hooks nil
    "Hook to be run when there is channel activity.
***************
*** 1325,1337 ****
  activity.  Only run if the buffer is not visible and
  `rcirc-ignore-buffer-activity-flag' is non-nil.")
  
! (defun rcirc-record-activity (buffer type)
    "Record BUFFER activity with TYPE."
    (with-current-buffer buffer
      (when (not (get-buffer-window (current-buffer) t))
!       (add-to-list 'rcirc-activity (current-buffer))
        (if (not rcirc-activity-type)
!           (setq rcirc-activity-type type))
        (rcirc-update-activity-string)))
    (run-hook-with-args 'rcirc-activity-hooks buffer))
  
--- 1440,1457 ----
  activity.  Only run if the buffer is not visible and
  `rcirc-ignore-buffer-activity-flag' is non-nil.")
  
! (defun rcirc-record-activity (buffer &optional type)
    "Record BUFFER activity with TYPE."
    (with-current-buffer buffer
      (when (not (get-buffer-window (current-buffer) t))
!       (setq rcirc-activity
! 	    (sort (add-to-list 'rcirc-activity (current-buffer))
! 		  (lambda (b1 b2)
! 		    (let ((t1 (with-current-buffer b1 rcirc-last-post-time))
! 			  (t2 (with-current-buffer b2 rcirc-last-post-time)))
! 		      (time-less-p t2 t1)))))
        (if (not rcirc-activity-type)
! 	  (setq rcirc-activity-type type))
        (rcirc-update-activity-string)))
    (run-hook-with-args 'rcirc-activity-hooks buffer))
  
***************
*** 1341,1362 ****
    (with-current-buffer buffer
      (setq rcirc-activity-type nil)))
  
  ;; TODO: add mouse properties
  (defun rcirc-update-activity-string ()
    "Update mode-line string."
!   (setq rcirc-activity-string
! 	(if (not rcirc-activity)
! 	       ""
! 	  (concat "-["
! 		  (mapconcat
! 		   (lambda (b)
! 		     (let ((s (rcirc-short-buffer-name b)))
! 		       (with-current-buffer b
! 			 (if (not (eq rcirc-activity-type 'nick))
! 			     s
! 			   (rcirc-facify s 'rcirc-mode-line-nick)))))
! 		   rcirc-activity ",")
! 		  "]-"))))
  
  (defun rcirc-short-buffer-name (buffer)
    "Return a short name for BUFFER to use in the modeline indicator."
--- 1461,1505 ----
    (with-current-buffer buffer
      (setq rcirc-activity-type nil)))
  
+ (defun rcirc-split-activity (activity)
+   "Return a cons cell with ACTIVITY split into (lopri . hipri)."
+   (let (lopri hipri)
+     (dolist (buf rcirc-activity)
+       (with-current-buffer buf
+ 	(if (and rcirc-low-priority-flag
+ 		 (not (eq rcirc-activity-type 'nick)))
+ 	    (add-to-list 'lopri buf t)
+ 	  (add-to-list 'hipri buf t))))
+     (cons lopri hipri)))
+ 
  ;; TODO: add mouse properties
  (defun rcirc-update-activity-string ()
    "Update mode-line string."
!   (let* ((pair (rcirc-split-activity rcirc-activity))
! 	 (lopri (car pair))
! 	 (hipri (cdr pair)))
!     (setq rcirc-activity-string
! 	  (if (or hipri lopri)
! 	      (concat "-"
! 		      (and hipri "[")
! 		      (rcirc-activity-string hipri)
! 		      (and hipri lopri ",")
! 		      (and lopri
! 			   (concat "("
! 				   (rcirc-activity-string lopri)
! 				   ")"))
! 		      (and hipri "]")
! 		      "-")
! 	    "-[]-"))))
! 
! (defun rcirc-activity-string (buffers)
!   (mapconcat (lambda (b)
! 	       (let ((s (rcirc-short-buffer-name b)))
! 		 (with-current-buffer b
! 		   (if (not (eq rcirc-activity-type 'nick))
! 		       s
! 		     (rcirc-facify s 'rcirc-mode-line-nick)))))
! 	     buffers ","))
  
  (defun rcirc-short-buffer-name (buffer)
    "Return a short name for BUFFER to use in the modeline indicator."
***************
*** 1370,1378 ****
    (let ((current-now-hidden t))
      (walk-windows (lambda (w)
  		    (let ((buf (window-buffer w)))
! 		      (rcirc-clear-activity buf)
! 		      (when (eq buf rcirc-current-buffer)
! 			(setq current-now-hidden nil)))))
      (when (and rcirc-current-buffer current-now-hidden)
        (with-current-buffer rcirc-current-buffer
  	(when (eq major-mode 'rcirc-mode)
--- 1513,1523 ----
    (let ((current-now-hidden t))
      (walk-windows (lambda (w)
  		    (let ((buf (window-buffer w)))
! 		      (when (eq major-mode 'rcirc-mode)
! 			(rcirc-clear-activity buf)
! 			(when (eq buf rcirc-current-buffer)
! 			  (setq current-now-hidden nil))))))
!     ;; add overlay arrow if the buffer isn't displayed
      (when (and rcirc-current-buffer current-now-hidden)
        (with-current-buffer rcirc-current-buffer
  	(when (eq major-mode 'rcirc-mode)
***************
*** 1395,1402 ****
  				    rcirc-buffer-alist))
  				(rcirc-process-list)))))
      (dolist (i (rcirc-abbreviate bufalist))
!       (with-current-buffer (cdr i)
! 	(setq rcirc-short-buffer-name (car i))))))
  
  (defun rcirc-abbreviate (pairs)
    (apply 'append (mapcar 'rcirc-rebuild-tree (rcirc-make-trees pairs))))
--- 1540,1548 ----
  				    rcirc-buffer-alist))
  				(rcirc-process-list)))))
      (dolist (i (rcirc-abbreviate bufalist))
!       (when (buffer-live-p (cdr i))
! 	(with-current-buffer (cdr i)
! 	  (setq rcirc-short-buffer-name (car i)))))))
  
  (defun rcirc-abbreviate (pairs)
    (apply 'append (mapcar 'rcirc-rebuild-tree (rcirc-make-trees pairs))))
***************
*** 1451,1461 ****
    "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 of"
!               "\nbuffer local variables `rcirc-process' and `rcirc-target',"
!               "\nwill be used.")
       ,interactive-form
!      (let ((process (or process rcirc-process))
             (target (or target rcirc-target)))
         ,@body)))
  
--- 1597,1606 ----
    "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)))
  
***************
*** 1465,1472 ****
    (if (null message)
        (progn
          (setq target (completing-read "Message nick: "
!                                       (with-rcirc-process-buffer rcirc-process
!                                         rcirc-nick-table)))
          (when (> (length target) 0)
            (setq message (read-string (format "Message %s: " target)))
            (when (> (length message) 0)
--- 1610,1617 ----
    (if (null message)
        (progn
          (setq target (completing-read "Message nick: "
!                                       (with-rcirc-server-buffer 
! 					rcirc-nick-table)))
          (when (> (length target) 0)
            (setq message (read-string (format "Message %s: " target)))
            (when (> (length message) 0)
***************
*** 1480,1487 ****
  (defun-rcirc-command query (nick)
    "Open a private chat buffer to NICK."
    (interactive (list (completing-read "Query nick: "
!                                       (with-rcirc-process-buffer rcirc-process
!                                         rcirc-nick-table))))
    (let ((existing-buffer (rcirc-get-buffer process nick)))
      (switch-to-buffer (or existing-buffer
  			  (rcirc-get-buffer-create process nick)))
--- 1625,1631 ----
  (defun-rcirc-command query (nick)
    "Open a private chat buffer to NICK."
    (interactive (list (completing-read "Query nick: "
!                                       (with-rcirc-server-buffer rcirc-nick-table))))
    (let ((existing-buffer (rcirc-get-buffer process nick)))
      (switch-to-buffer (or existing-buffer
  			  (rcirc-get-buffer-create process nick)))
***************
*** 1493,1501 ****
    (interactive "sJoin channel: ")
    (let ((buffer (rcirc-get-buffer-create process
                                           (car (split-string channel)))))
      (when (not (eq (selected-window) (minibuffer-window)))
!       (funcall rcirc-switch-to-buffer-function buffer))
!     (rcirc-send-string process (concat "JOIN " channel))))
  
  (defun-rcirc-command part (channel)
    "Part CHANNEL."
--- 1637,1645 ----
    (interactive "sJoin channel: ")
    (let ((buffer (rcirc-get-buffer-create process
                                           (car (split-string channel)))))
+     (rcirc-send-string process (concat "JOIN " channel))
      (when (not (eq (selected-window) (minibuffer-window)))
!       (funcall rcirc-switch-to-buffer-function buffer))))
  
  (defun-rcirc-command part (channel)
    "Part CHANNEL."
***************
*** 1544,1551 ****
    "Request information from server about NICK."
    (interactive (list
                  (completing-read "Whois: "
!                                  (with-rcirc-process-buffer rcirc-process
!                                    rcirc-nick-table))))
    (rcirc-send-string process (concat "WHOIS " nick)))
  
  (defun-rcirc-command mode (args)
--- 1688,1694 ----
    "Request information from server about NICK."
    (interactive (list
                  (completing-read "Whois: "
!                                  (with-rcirc-server-buffer rcirc-nick-table))))
    (rcirc-send-string process (concat "WHOIS " nick)))
  
  (defun-rcirc-command mode (args)
***************
*** 1573,1580 ****
    "Kick NICK from current channel."
    (interactive (list
                  (concat (completing-read "Kick nick: "
!                                          (rcirc-channel-nicks rcirc-process
!                                                               rcirc-target))
                          (read-from-minibuffer "Kick reason: "))))
    (let* ((arglist (split-string arg))
           (argstring (concat (car arglist) " :"
--- 1716,1724 ----
    "Kick NICK from current channel."
    (interactive (list
                  (concat (completing-read "Kick nick: "
!                                          (rcirc-channel-nicks 
! 					  (rcirc-buffer-process)
! 					  rcirc-target))
                          (read-from-minibuffer "Kick reason: "))))
    (let* ((arglist (split-string arg))
           (argstring (concat (car arglist) " :"
***************
*** 1768,1774 ****
  			 ((string-match "^\\[\\(#[^ ]+\\)\\]" message)
  			  (match-string 1 message))
  			 (sender
! 			  (if (string= sender (rcirc-server process))
  			      nil	; server notice
  			    sender)))
                   message t))))
--- 1912,1918 ----
  			 ((string-match "^\\[\\(#[^ ]+\\)\\]" message)
  			  (match-string 1 message))
  			 (sender
! 			  (if (string= sender (rcirc-server-name process))
  			      nil	; server notice
  			    sender)))
                   message t))))
***************
*** 1782,1800 ****
      (rcirc-print process sender "JOIN" channel "")
  
      ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer rcirc-process sender)
        (rcirc-print process sender "JOIN" sender channel))
  
      (rcirc-put-nick-channel process sender channel)))
  
  ;; PART and KICK are handled the same way
  (defun rcirc-handler-PART-or-KICK (process response channel sender nick args)
!   (rcirc-print process sender response channel (concat channel " " args))
! 
!   ;; print in private chat buffer if it exists
!   (when (rcirc-get-buffer rcirc-process nick)
!     (rcirc-print process sender response nick (concat channel " " args)))
! 
    (if (not (string= nick (rcirc-nick process)))
        ;; this is someone else leaving
        (rcirc-remove-nick-channel process nick channel)
--- 1926,1939 ----
      (rcirc-print process sender "JOIN" channel "")
  
      ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer (rcirc-buffer-process) sender)
        (rcirc-print process sender "JOIN" sender channel))
  
      (rcirc-put-nick-channel process sender channel)))
  
  ;; PART and KICK are handled the same way
  (defun rcirc-handler-PART-or-KICK (process response channel sender nick args)
!   (rcirc-ignore-update-automatic nick)
    (if (not (string= nick (rcirc-nick process)))
        ;; this is someone else leaving
        (rcirc-remove-nick-channel process nick channel)
***************
*** 1810,1823 ****
  	  (setq rcirc-target nil))))))
  
  (defun rcirc-handler-PART (process sender args text)
!   (rcirc-ignore-update-automatic sender)
!   (rcirc-handler-PART-or-KICK process "PART"
!                               (car args) sender sender
!                               (cadr args)))
  
  (defun rcirc-handler-KICK (process sender args text)
!   (rcirc-handler-PART-or-KICK process "KICK" (car args) sender (cadr args)
!                               (caddr args)))
  
  (defun rcirc-handler-QUIT (process sender args text)
    (rcirc-ignore-update-automatic sender)
--- 1949,1975 ----
  	  (setq rcirc-target nil))))))
  
  (defun rcirc-handler-PART (process sender args text)
!   (let* ((channel (car args))
! 	 (reason (cadr args))
! 	 (message (concat channel " " reason)))
!     (rcirc-print process sender "PART" channel message)
!     ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer (rcirc-buffer-process) sender)
!       (rcirc-print process sender "PART" sender message))
! 
!     (rcirc-handler-PART-or-KICK process "PART" channel sender sender reason)))
  
  (defun rcirc-handler-KICK (process sender args text)
!   (let* ((channel (car args))
! 	 (nick (cadr args))
! 	 (reason (caddr args))
! 	 (message (concat nick " " channel " " reason)))
!     (rcirc-print process sender "KICK" channel message t)
!     ;; print in private chat buffer if it exists
!     (when (rcirc-get-buffer (rcirc-buffer-process) nick)
!       (rcirc-print process sender "KICK" nick message))
! 
!     (rcirc-handler-PART-or-KICK process "KICK" channel sender nick reason)))
  
  (defun rcirc-handler-QUIT (process sender args text)
    (rcirc-ignore-update-automatic sender)
***************
*** 1826,1832 ****
  	(rcirc-nick-channels process sender))
  
    ;; print in private chat buffer if it exists
!   (when (rcirc-get-buffer rcirc-process sender)
      (rcirc-print process sender "QUIT" sender (apply 'concat args)))
  
    (rcirc-nick-remove process sender))
--- 1978,1984 ----
  	(rcirc-nick-channels process sender))
  
    ;; print in private chat buffer if it exists
!   (when (rcirc-get-buffer (rcirc-buffer-process) sender)
      (rcirc-print process sender "QUIT" sender (apply 'concat args)))
  
    (rcirc-nick-remove process sender))
***************
*** 1875,1880 ****
--- 2027,2047 ----
      (with-current-buffer (rcirc-get-buffer process (car args))
        (setq rcirc-topic topic))))
  
+ (defvar rcirc-nick-away-alist nil)
+ (defun rcirc-handler-301 (process sender args text)
+   "RPL_AWAY"
+   (let* ((nick (cadr args))
+ 	 (rec (assoc-string nick rcirc-nick-away-alist))
+ 	 (away-message (caddr args)))
+     (when (or (not rec)
+ 	      (not (string= (cdr rec) away-message)))
+       ;; away message has changed
+       (rcirc-handler-generic process "AWAY" nick (cdr args) text)
+       (if rec
+ 	  (setcdr rec away-message)
+ 	(setq rcirc-nick-away-alist (cons (cons nick away-message)
+ 					  rcirc-nick-away-alist))))))
+ 
  (defun rcirc-handler-332 (process sender args text)
    "RPL_TOPIC"
    (let ((buffer (or (rcirc-get-buffer process (cadr args))
***************
*** 1948,1956 ****
    "Send authentication to process associated with current buffer.
  Passwords are stored in `rcirc-authinfo' (which see)."
    (interactive)
!   (with-rcirc-process-buffer rcirc-process
      (dolist (i rcirc-authinfo)
!       (let ((server (car i))
  	    (nick (caddr i))
  	    (method (cadr i))
  	    (args (cdddr i)))
--- 2115,2124 ----
    "Send authentication to process associated with current buffer.
  Passwords are stored in `rcirc-authinfo' (which see)."
    (interactive)
!   (with-rcirc-server-buffer
      (dolist (i rcirc-authinfo)
!       (let ((process (rcirc-buffer-process))
! 	    (server (car i))
  	    (nick (caddr i))
  	    (method (cadr i))
  	    (args (cdddr i)))
***************
*** 1958,1976 ****
  		   (string-match nick rcirc-nick))
  	  (cond ((equal method 'nickserv)
  		 (rcirc-send-string
! 		  rcirc-process
  		  (concat
  		   "PRIVMSG nickserv :identify "
  		   (car args))))
  		((equal method 'chanserv)
  		 (rcirc-send-string
! 		  rcirc-process
  		  (concat
  		   "PRIVMSG chanserv :identify "
  		   (cadr args) " " (car args))))
  		((equal method 'bitlbee)
  		 (rcirc-send-string
! 		  rcirc-process
  		  (concat "PRIVMSG &bitlbee :identify " (car args))))
  		(t
  		 (message "No %S authentication method defined"
--- 2126,2144 ----
  		   (string-match nick rcirc-nick))
  	  (cond ((equal method 'nickserv)
  		 (rcirc-send-string
! 		  process
  		  (concat
  		   "PRIVMSG nickserv :identify "
  		   (car args))))
  		((equal method 'chanserv)
  		 (rcirc-send-string
! 		  process
  		  (concat
  		   "PRIVMSG chanserv :identify "
  		   (cadr args) " " (car args))))
  		((equal method 'bitlbee)
  		 (rcirc-send-string
! 		  process
  		  (concat "PRIVMSG &bitlbee :identify " (car args))))
  		(t
  		 (message "No %S authentication method defined"
***************
*** 2102,2107 ****
--- 2270,2276 ----
    '((t (:bold t)))
    "The face used indicate activity directed at you."
    :group 'rcirc-faces)
+ 
  \f
  ;; When using M-x flyspell-mode, only check words after the prompt
  (put 'rcirc-mode 'flyspell-mode-predicate 'rcirc-looking-at-input)

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2006-04-03 20:10 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-04-03 20:10 rcirc updates Ryan Yeske
  -- strict thread matches above, loose matches on Subject: below --
2006-02-04 23:48 Ryan Yeske

Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.