From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ryan Yeske Newsgroups: gmane.emacs.devel Subject: rcirc updates Date: Mon, 03 Apr 2006 13:10:52 -0700 Message-ID: <87bqvi2zeb.fsf@cut.bc.hsia.telus.net> NNTP-Posting-Host: main.gmane.org X-Trace: sea.gmane.org 1144095156 12018 80.91.229.2 (3 Apr 2006 20:12:36 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Mon, 3 Apr 2006 20:12:36 +0000 (UTC) Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Mon Apr 03 22:12:30 2006 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by ciao.gmane.org with esmtp (Exim 4.43) id 1FQVOW-0002UU-Jb for ged-emacs-devel@m.gmane.org; Mon, 03 Apr 2006 22:12:07 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FQVOU-0000Vx-Av for ged-emacs-devel@m.gmane.org; Mon, 03 Apr 2006 16:11:22 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1FQVOH-0000Vr-PR for emacs-devel@gnu.org; Mon, 03 Apr 2006 16:11:09 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1FQVO8-0000Un-2u for emacs-devel@gnu.org; Mon, 03 Apr 2006 16:11:08 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1FQVO7-0000Uk-Vz for emacs-devel@gnu.org; Mon, 03 Apr 2006 16:11:00 -0400 Original-Received: from [204.209.205.55] (helo=priv-edmwes34.telusplanet.net) by monty-python.gnu.org with esmtp (Exim 4.52) id 1FQVRE-0002YL-JX for emacs-devel@gnu.org; Mon, 03 Apr 2006 16:14:13 -0400 Original-Received: from priv-edmwaa06.telusplanet.net ([207.6.239.189]) by priv-edmwes34.telusplanet.net (InterMail vM.6.01.05.04 201-2131-123-105-20051025) with ESMTP id <20060403201055.JBIA6531.priv-edmwes34.telusplanet.net@priv-edmwaa06.telusplanet.net> for ; Mon, 3 Apr 2006 14:10:55 -0600 Original-Received: from cut.bc.hsia.telus.net (d207-6-239-189.bchsia.telus.net [207.6.239.189]) by priv-edmwaa06.telusplanet.net (BorderWare MXtreme Infinity Mail Firewall) with ESMTP id D9551LUH4C for ; Mon, 3 Apr 2006 14:10:53 -0600 (MDT) Original-To: emacs-devel@gnu.org X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:52378 Archived-At: 2006-04-03 Ryan Yeske * 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)) --- 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)) *************** *** 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) + ;; When using M-x flyspell-mode, only check words after the prompt (put 'rcirc-mode 'flyspell-mode-predicate 'rcirc-looking-at-input)