X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/70c2e72ae5368e39277de78a414c9d42292886c5..315f675857250c2204d024748e9eafa57c68410f:/lisp/net/rcirc.el?ds=sidebyside diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el index 9e04abb8cd..85a13a8cf6 100644 --- a/lisp/net/rcirc.el +++ b/lisp/net/rcirc.el @@ -1,6 +1,6 @@ ;;; rcirc.el --- default, simple IRC client. -;; Copyright (C) 2005-2011 Free Software Foundation, Inc. +;; Copyright (C) 2005-2012 Free Software Foundation, Inc. ;; Author: Ryan Yeske ;; Maintainers: Ryan Yeske , @@ -30,7 +30,7 @@ ;; one-to-one communication. ;; Rcirc has simple defaults and clear and consistent behavior. -;; Message arrival timestamps, activity notification on the modeline, +;; Message arrival timestamps, activity notification on the mode line, ;; message filling, nick completion, and keepalive pings are all ;; enabled by default, but can easily be adjusted or turned off. Each ;; discussion takes place in its own buffer and there is a single @@ -139,12 +139,12 @@ for connections using SSL/TLS." :group 'rcirc) (defcustom rcirc-fill-flag t - "*Non-nil means line-wrap messages printed in channel buffers." + "Non-nil means line-wrap messages printed in channel buffers." :type 'boolean :group 'rcirc) (defcustom rcirc-fill-column nil - "*Column beyond which automatic line-wrapping should happen. + "Column beyond which automatic line-wrapping should happen. If nil, use value of `fill-column'. If 'frame-width, use the maximum frame width." :type '(choice (const :tag "Value of `fill-column'") @@ -153,7 +153,7 @@ maximum frame width." :group 'rcirc) (defcustom rcirc-fill-prefix nil - "*Text to insert before filled lines. + "Text to insert before filled lines. If nil, calculate the prefix dynamically to line up text underneath each nick." :type '(choice (const :tag "Dynamic" nil) @@ -174,23 +174,23 @@ Use the command `rcirc-omit-mode' to change this variable.") (make-variable-buffer-local 'rcirc-omit-mode) (defcustom rcirc-time-format "%H:%M " - "*Describes how timestamps are printed. + "Describes how timestamps are printed. Used as the first arg to `format-time-string'." :type 'string :group 'rcirc) (defcustom rcirc-input-ring-size 1024 - "*Size of input history ring." + "Size of input history ring." :type 'integer :group 'rcirc) (defcustom rcirc-read-only-flag t - "*Non-nil means make text in IRC buffers read-only." + "Non-nil means make text in IRC buffers read-only." :type 'boolean :group 'rcirc) (defcustom rcirc-buffer-maximum-lines nil - "*The maximum size in lines for rcirc buffers. + "The maximum size in lines for rcirc buffers. Channel buffers are truncated from the top to be no greater than this number. If zero or nil, no truncating is done." :type '(choice (const :tag "No truncation" nil) @@ -198,7 +198,7 @@ number. If zero or nil, no truncating is done." :group 'rcirc) (defcustom rcirc-scroll-show-maximum-output t - "*If non-nil, scroll buffer to keep the point at the bottom of + "If non-nil, scroll buffer to keep the point at the bottom of the window." :type 'boolean :group 'rcirc) @@ -244,13 +244,13 @@ Examples: :group 'rcirc) (defcustom rcirc-auto-authenticate-flag t - "*Non-nil means automatically send authentication string to server. + "Non-nil means automatically send authentication string to server. See also `rcirc-authinfo'." :type 'boolean :group 'rcirc) (defcustom rcirc-authenticate-before-join t - "*Non-nil means authenticate to services before joining channels. + "Non-nil means authenticate to services before joining channels. Currently only works with NickServ on some networks." :version "24.1" :type 'boolean @@ -361,6 +361,14 @@ of a line. The string is passed as the first argument to :type 'string :group 'rcirc) +(defcustom rcirc-kill-channel-buffers nil + "When non-nil, kill channel buffers when the server buffer is killed. +Only the channel buffers associated with the server in question +will be killed." + :version "24.2" + :type 'boolean + :group 'rcirc) + (defvar rcirc-nick nil) (defvar rcirc-prompt-start-marker nil) @@ -386,7 +394,7 @@ of a line. The string is passed as the first argument to "List of buffers with unviewed activity.") (defvar rcirc-activity-string "" - "String displayed in modeline representing `rcirc-activity'.") + "String displayed in mode line representing `rcirc-activity'.") (put 'rcirc-activity-string 'risky-local-variable t) (defvar rcirc-server-buffer nil @@ -471,7 +479,8 @@ If ARG is non-nil, instead prompt for connection parameters." rcirc-default-full-name)) (channels (plist-get (cdr c) :channels)) (password (plist-get (cdr c) :password)) - (encryption (plist-get (cdr c) :encryption))) + (encryption (plist-get (cdr c) :encryption)) + contact) (when server (let (connected) (dolist (p (rcirc-process-list)) @@ -483,10 +492,11 @@ If ARG is non-nil, instead prompt for connection parameters." full-name channels password encryption) (quit (message "Quit connecting to %s" server))) (with-current-buffer (process-buffer connected) - (setq connected-servers - (cons (process-contact (get-buffer-process - (current-buffer)) :host) - connected-servers)))))))) + (setq contact (process-contact + (get-buffer-process (current-buffer)) :host)) + (setq connected-servers + (cons (if (stringp contact) contact server) + connected-servers)))))))) (when connected-servers (message "Already connected to %s" (if (cdr connected-servers) @@ -659,7 +669,7 @@ Functions are called with PROCESS and SENTINEL arguments.") (defun rcirc-disconnect-buffer (&optional buffer) (with-current-buffer (or buffer (current-buffer)) ;; set rcirc-target to nil for each channel so cleanup - ;; doesnt happen when we reconnect + ;; doesn't happen when we reconnect (setq rcirc-target nil) (setq mode-line-process ":disconnected"))) @@ -815,18 +825,19 @@ If SILENT is non-nil, do not print the message in any irc buffer." (defvar rcirc-input-ring nil) (defvar rcirc-input-ring-index 0) + (defun rcirc-prev-input-string (arg) (ring-ref rcirc-input-ring (+ rcirc-input-ring-index arg))) -(defun rcirc-insert-prev-input (arg) - (interactive "p") +(defun rcirc-insert-prev-input () + (interactive) (when (<= rcirc-prompt-end-marker (point)) (delete-region rcirc-prompt-end-marker (point-max)) (insert (rcirc-prev-input-string 0)) (setq rcirc-input-ring-index (1+ rcirc-input-ring-index)))) -(defun rcirc-insert-next-input (arg) - (interactive "p") +(defun rcirc-insert-next-input () + (interactive) (when (<= rcirc-prompt-end-marker (point)) (delete-region rcirc-prompt-end-marker (point-max)) (setq rcirc-input-ring-index (1- rcirc-input-ring-index)) @@ -963,7 +974,13 @@ This number is independent of the number of lines in the buffer.") (setq mode-line-process nil) (set (make-local-variable 'rcirc-input-ring) - (make-ring rcirc-input-ring-size)) + ;; If rcirc-input-ring is already a ring with desired size do + ;; not re-initialize. + (if (and (ring-p rcirc-input-ring) + (= (ring-size rcirc-input-ring) + rcirc-input-ring-size)) + rcirc-input-ring + (make-ring rcirc-input-ring-size))) (set (make-local-variable 'rcirc-server-buffer) (process-buffer process)) (set (make-local-variable 'rcirc-target) target) (set (make-local-variable 'rcirc-topic) nil) @@ -972,6 +989,7 @@ This number is independent of the number of lines in the buffer.") (set (make-local-variable 'rcirc-recent-quit-alist) nil) (set (make-local-variable 'rcirc-current-line) 0) + (use-hard-newlines t) (set (make-local-variable 'rcirc-short-buffer-name) nil) (set (make-local-variable 'rcirc-urls) nil) @@ -1080,12 +1098,20 @@ Logfiles are kept in `rcirc-log-directory'." :group 'rcirc) (defun rcirc-kill-buffer-hook () - "Part the channel when killing an rcirc buffer." + "Part the channel when killing an rcirc buffer. + +If `rcirc-kill-channel-buffers' is non-nil and the killed buffer +is a server buffer, kills all of the channel buffers associated +with it." (when (eq major-mode 'rcirc-mode) (when (and rcirc-log-flag rcirc-log-directory) (rcirc-log-write)) - (rcirc-clean-up-buffer "Killed buffer"))) + (rcirc-clean-up-buffer "Killed buffer") + (when (and rcirc-buffer-alist ;; it's a server buffer + rcirc-kill-channel-buffers) + (dolist (channel rcirc-buffer-alist) + (kill-buffer (cdr channel)))))) (defun rcirc-change-major-mode-hook () "Part the channel when changing the major-mode." @@ -1253,7 +1279,10 @@ Create the buffer if it doesn't exist." "Keymap for multiline mode in rcirc.") (define-minor-mode rcirc-multiline-minor-mode - "Minor mode for editing multiple lines in rcirc." + "Minor mode for editing multiple lines in rcirc. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil." :init-value nil :lighter " rcirc-mline" :keymap rcirc-multiline-minor-mode-map @@ -1555,24 +1584,22 @@ record activity." ;; keep window on bottom line if it was already there (when rcirc-scroll-show-maximum-output - (walk-windows (lambda (w) - (when (eq (window-buffer w) (current-buffer)) - (with-current-buffer (window-buffer w) - (when (eq major-mode 'rcirc-mode) - (with-selected-window w - (when (<= (- (window-height) - (count-screen-lines (window-point) - (window-start)) - 1) - 0) - (recenter -1))))))) - nil t)) + (let ((window (get-buffer-window))) + (when window + (with-selected-window window + (when (eq major-mode 'rcirc-mode) + (when (<= (- (window-height) + (count-screen-lines (window-point) + (window-start)) + 1) + 0) + (recenter -1))))))) ;; flush undo (can we do something smarter here?) (buffer-disable-undo) (buffer-enable-undo)) - ;; record modeline activity + ;; record mode line activity (when (and activity (not rcirc-ignore-buffer-activity-flag) (not (and rcirc-dim-nicks sender @@ -1773,7 +1800,10 @@ This function does not alter the INPUT string." ;;;###autoload (define-minor-mode rcirc-track-minor-mode - "Global minor mode for tracking activity in rcirc buffers." + "Global minor mode for tracking activity in rcirc buffers. +With a prefix argument ARG, enable the mode if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil." :init-value nil :lighter "" :keymap rcirc-track-minor-mode-map @@ -1973,7 +2003,7 @@ activity. Only run if the buffer is not visible and buffers ",")) (defun rcirc-short-buffer-name (buffer) - "Return a short name for BUFFER to use in the modeline indicator." + "Return a short name for BUFFER to use in the mode line indicator." (with-current-buffer buffer (or rcirc-short-buffer-name (buffer-name)))) @@ -2136,6 +2166,16 @@ CHANNELS is a comma- or space-separated string of channel names." (dolist (b buffers) ;; order the new channel buffers in the buffer list (switch-to-buffer b))))) +(defun-rcirc-command invite (nick-channel) + "Invite NICK to CHANNEL." + (interactive (list + (concat + (completing-read "Invite nick: " + (with-rcirc-server-buffer rcirc-nick-table)) + " " + (read-string "Channel: ")))) + (rcirc-send-string process (concat "INVITE " nick-channel))) + ;; TODO: /part #channel reason, or consider removing #channel altogether (defun-rcirc-command part (channel) "Part CHANNEL." @@ -2362,6 +2402,7 @@ keywords when no KEYWORD is given." (delete-region (match-beginning 1) (match-end 1)) (goto-char (match-beginning 1))) ;; remove the ^O characters now + (goto-char (point-min)) (while (re-search-forward "\C-o+" nil t) (delete-region (match-beginning 0) (match-end 0)))) @@ -2514,6 +2555,7 @@ the only argument." (member message (list (format "You are now identified for \C-b%s\C-b." rcirc-nick) + (format "You are successfully identified as \C-b%s\C-b." rcirc-nick) "Password accepted - you are now recognized." ))) (and ;; quakenet @@ -2695,7 +2737,8 @@ the only argument." (setq rcirc-topic (caddr args))))) (defun rcirc-handler-333 (process sender args text) - "Not in rfc1459.txt" + "333 says who set the topic and when. +Not in rfc1459.txt" (let ((buffer (or (rcirc-get-buffer process (cadr args)) (rcirc-get-temp-buffer-create process (cadr args))))) (with-current-buffer buffer @@ -2843,67 +2886,65 @@ Passwords are stored in `rcirc-authinfo' (which see)." :group 'faces) (defface rcirc-my-nick ; font-lock-function-name-face - '((((class color) (min-colors 88) (background light)) (:foreground "Blue1")) - (((class color) (min-colors 88) (background dark)) (:foreground "LightSkyBlue")) - (((class color) (min-colors 16) (background light)) (:foreground "Blue")) - (((class color) (min-colors 16) (background dark)) (:foreground "LightSkyBlue")) - (((class color) (min-colors 8)) (:foreground "blue" :weight bold)) - (t (:inverse-video t :weight bold))) - "The face used to highlight my messages." + '((((class color) (min-colors 88) (background light)) :foreground "Blue1") + (((class color) (min-colors 88) (background dark)) :foreground "LightSkyBlue") + (((class color) (min-colors 16) (background light)) :foreground "Blue") + (((class color) (min-colors 16) (background dark)) :foreground "LightSkyBlue") + (((class color) (min-colors 8)) :foreground "blue" :weight bold) + (t :inverse-video t :weight bold)) + "Rcirc face for my messages." :group 'rcirc-faces) (defface rcirc-other-nick ; font-lock-variable-name-face '((((class grayscale) (background light)) - (:foreground "Gray90" :weight bold :slant italic)) + :foreground "Gray90" :weight bold :slant italic) (((class grayscale) (background dark)) - (:foreground "DimGray" :weight bold :slant italic)) - (((class color) (min-colors 88) (background light)) (:foreground "DarkGoldenrod")) - (((class color) (min-colors 88) (background dark)) (:foreground "LightGoldenrod")) - (((class color) (min-colors 16) (background light)) (:foreground "DarkGoldenrod")) - (((class color) (min-colors 16) (background dark)) (:foreground "LightGoldenrod")) - (((class color) (min-colors 8)) (:foreground "yellow" :weight light)) - (t (:weight bold :slant italic))) - "The face used to highlight other messages." + :foreground "DimGray" :weight bold :slant italic) + (((class color) (min-colors 88) (background light)) :foreground "DarkGoldenrod") + (((class color) (min-colors 88) (background dark)) :foreground "LightGoldenrod") + (((class color) (min-colors 16) (background light)) :foreground "DarkGoldenrod") + (((class color) (min-colors 16) (background dark)) :foreground "LightGoldenrod") + (((class color) (min-colors 8)) :foreground "yellow" :weight light) + (t :weight bold :slant italic)) + "Rcirc face for other users' messages." :group 'rcirc-faces) (defface rcirc-bright-nick '((((class grayscale) (background light)) - (:foreground "LightGray" :weight bold :underline t)) + :foreground "LightGray" :weight bold :underline t) (((class grayscale) (background dark)) - (:foreground "Gray50" :weight bold :underline t)) - (((class color) (min-colors 88) (background light)) (:foreground "CadetBlue")) - (((class color) (min-colors 88) (background dark)) (:foreground "Aquamarine")) - (((class color) (min-colors 16) (background light)) (:foreground "CadetBlue")) - (((class color) (min-colors 16) (background dark)) (:foreground "Aquamarine")) - (((class color) (min-colors 8)) (:foreground "magenta")) - (t (:weight bold :underline t))) - "Face used for nicks matched by `rcirc-bright-nicks'." + :foreground "Gray50" :weight bold :underline t) + (((class color) (min-colors 88) (background light)) :foreground "CadetBlue") + (((class color) (min-colors 88) (background dark)) :foreground "Aquamarine") + (((class color) (min-colors 16) (background light)) :foreground "CadetBlue") + (((class color) (min-colors 16) (background dark)) :foreground "Aquamarine") + (((class color) (min-colors 8)) :foreground "magenta") + (t :weight bold :underline t)) + "Rcirc face for nicks matched by `rcirc-bright-nicks'." :group 'rcirc-faces) (defface rcirc-dim-nick '((t :inherit default)) - "Face used for nicks in `rcirc-dim-nicks'." + "Rcirc face for nicks in `rcirc-dim-nicks'." :group 'rcirc-faces) (defface rcirc-server ; font-lock-comment-face '((((class grayscale) (background light)) - (:foreground "DimGray" :weight bold :slant italic)) + :foreground "DimGray" :weight bold :slant italic) (((class grayscale) (background dark)) - (:foreground "LightGray" :weight bold :slant italic)) + :foreground "LightGray" :weight bold :slant italic) (((class color) (min-colors 88) (background light)) - (:foreground "Firebrick")) + :foreground "Firebrick") (((class color) (min-colors 88) (background dark)) - (:foreground "chocolate1")) + :foreground "chocolate1") (((class color) (min-colors 16) (background light)) - (:foreground "red")) + :foreground "red") (((class color) (min-colors 16) (background dark)) - (:foreground "red1")) - (((class color) (min-colors 8) (background light)) - ) - (((class color) (min-colors 8) (background dark)) - ) - (t (:weight bold :slant italic))) - "The face used to highlight server messages." + :foreground "red1") + (((class color) (min-colors 8) (background light))) + (((class color) (min-colors 8) (background dark))) + (t :weight bold :slant italic)) + "Rcirc face for server messages." :group 'rcirc-faces) (defface rcirc-server-prefix ; font-lock-comment-delimiter-face @@ -2914,57 +2955,53 @@ Passwords are stored in `rcirc-authinfo' (which see)." :foreground "red") (((class color) (min-colors 8) (background dark)) :foreground "red1")) - "The face used to highlight server prefixes." + "Rcirc face for server prefixes." :group 'rcirc-faces) (defface rcirc-timestamp - '((t (:inherit default))) - "The face used to highlight timestamps." + '((t :inherit default)) + "Rcirc face for timestamps." :group 'rcirc-faces) (defface rcirc-nick-in-message ; font-lock-keyword-face - '((((class grayscale) (background light)) (:foreground "LightGray" :weight bold)) - (((class grayscale) (background dark)) (:foreground "DimGray" :weight bold)) - (((class color) (min-colors 88) (background light)) (:foreground "Purple")) - (((class color) (min-colors 88) (background dark)) (:foreground "Cyan1")) - (((class color) (min-colors 16) (background light)) (:foreground "Purple")) - (((class color) (min-colors 16) (background dark)) (:foreground "Cyan")) - (((class color) (min-colors 8)) (:foreground "cyan" :weight bold)) - (t (:weight bold))) - "The face used to highlight instances of your nick within messages." + '((((class grayscale) (background light)) :foreground "LightGray" :weight bold) + (((class grayscale) (background dark)) :foreground "DimGray" :weight bold) + (((class color) (min-colors 88) (background light)) :foreground "Purple") + (((class color) (min-colors 88) (background dark)) :foreground "Cyan1") + (((class color) (min-colors 16) (background light)) :foreground "Purple") + (((class color) (min-colors 16) (background dark)) :foreground "Cyan") + (((class color) (min-colors 8)) :foreground "cyan" :weight bold) + (t :weight bold)) + "Rcirc face for instances of your nick within messages." :group 'rcirc-faces) -(defface rcirc-nick-in-message-full-line - '((t (:bold t))) - "The face used emphasize the entire message when your nick is mentioned." +(defface rcirc-nick-in-message-full-line '((t :weight bold)) + "Rcirc face for emphasizing the entire message when your nick is mentioned." :group 'rcirc-faces) (defface rcirc-prompt ; comint-highlight-prompt - '((((min-colors 88) (background dark)) (:foreground "cyan1")) - (((background dark)) (:foreground "cyan")) - (t (:foreground "dark blue"))) - "The face used to highlight prompts." + '((((min-colors 88) (background dark)) :foreground "cyan1") + (((background dark)) :foreground "cyan") + (t :foreground "dark blue")) + "Rcirc face for prompts." :group 'rcirc-faces) (defface rcirc-track-nick - '((((type tty)) (:inherit default)) - (t (:inverse-video t))) - "The face used in the mode-line when your nick is mentioned." + '((((type tty)) :inherit default) + (t :inverse-video t)) + "Rcirc face used in the mode-line when your nick is mentioned." :group 'rcirc-faces) -(defface rcirc-track-keyword - '((t (:bold t ))) - "The face used in the mode-line when keywords are mentioned." +(defface rcirc-track-keyword '((t :weight bold)) + "Rcirc face used in the mode-line when keywords are mentioned." :group 'rcirc-faces) -(defface rcirc-url - '((t (:bold t))) - "The face used to highlight urls." +(defface rcirc-url '((t :weight bold)) + "Rcirc face used to highlight urls." :group 'rcirc-faces) -(defface rcirc-keyword - '((t (:inherit highlight))) - "The face used to highlight keywords." +(defface rcirc-keyword '((t :inherit highlight)) + "Rcirc face used to highlight keywords." :group 'rcirc-faces)