+2006-11-20 Michael Olson <mwolson@gnu.org>
+
+ * NEWS: Change M-x erc-select to M-x erc.
+
2006-11-20 Sun Yijiang <sunyijiang@gmail.com>
* TUTORIAL.cn: Updated.
* PROBLEMS (are): Emacs compiled with Gtk+ crashes when closing a
display (x-close-connection).
+2006-09-03 Diane Murray <disumu@x3y2z1.net>
+
+ * erc.texi (Getting Started, Connecting): Changed erc-select to
+ erc.
+
2006-09-02 Juri Linkov <juri@jurta.org>
* HELLO: Regroup Europe Non-ASCII examples by similar scripts.
ERC NEWS -*- outline -*-
+* Changes in ERC 5.2 (stable pre-release for Emacs 22)
+
+** M-x erc RET now starts ERC.
+`erc-select' has been changed to `erc'. `erc-select' still remains as
+an alias of `erc'. Likewise, `erc-select-ssl' has been renamed to
+`erc-ssl' with `erc-select-ssl' as its alias. The function that was
+known as `erc' is now `erc-open'.
+
+** Changes and additions to modules
+
+*** Channel tracking (erc-track.el)
+
+**** Use mouse-face and help-echo for channel names in the mode-line.
+This helps people using a mouse know that they are buttons and can be
+clicked on.
+
* Changes in ERC 5.1.4
** Make find-function and find-variable work in Emacs 22 for
To see what modules are available, type
M-x customize-option erc-modules RET.
-To start an IRC session, type M-x erc-select, and follow the prompts
-for server, port, and nick.
+To start an IRC session, type M-x erc, and follow the prompts for
+server, port, and nick.
---
** Rcirc is now part of the Emacs distribution.
+2006-11-20 Michael Olson <mwolson@gnu.org>
+
+ * erc.el (erc-version-string): Call this Version 5.2 stable
+ pre-release, since it diverges slightly from our 5.2 branch, in
+ that unstable features are not included.
+ (erc-update-modules): Display better error message when module not
+ found.
+
+2006-11-12 Michael Olson <mwolson@gnu.org>
+
+ * erc-log.el: Save all log buffers when Emacs exits, in case
+ someone ignores the warning about open processes. Remove the
+ advice code in the commentary.
+ (erc-save-query-buffers): Docfix.
+ (erc-log-save-all-buffers): New function that saves all ERC
+ buffers to logs.
+ (erc-current-logfile): Fix bug in filename selection, where the
+ current buffer was erroneously being preferred over the given
+ buffer.
+
+2006-11-08 Michael Olson <mwolson@gnu.org>
+
+ * erc.el (erc-string-to-port): Avoid error when a numerical port
+ is passed. Thanks to Zekeriya KOÇ for the report.
+
2006-11-08 Łukasz Demianiuk <ldemianiuk@gmail.com> (tiny change)
* erc.el (erc-header-line): Fix typo.
* erc-autoaway.el (erc-autoaway-reestablish-idletimer):
* erc-truncate.el (truncate): Fix typo in docstring.
+2006-10-21 Michael Olson <mwolson@gnu.org>
+
+ * erc.el (erc-iswitchb): Fix bug when hitting C-c C-b without
+ first loading iswitchb. Thanks to Leo for the report.
+
+2006-10-10 Michael Olson <mwolson@gnu.org>
+
+ * erc.el (erc-default-port): Make the default be 6667 instead of
+ ircd. since Mac OS X apparently has problems with looking up that
+ port name.
+
+ * erc-backend.el (353): Receive names after displaying the initial
+ message, instead of before.
+
+2006-10-05 Diane Murray <disumu@x3y2z1.net>
+
+ * erc.el (erc-my-nick-face): New face.
+ (erc): Use FULL-NAME argument, not `erc-user-full-name'. This
+ fixes a bug where the :full-name argument passed to the function
+ was not respected.
+ (erc-format-my-nick): Use `erc-my-nick-face'. This should help
+ make it easier to find messages you sent in conversations when
+ `erc-show-my-nick' is non-nil.
+ (erc-compute-server): Doc fix.
+
+2006-09-11 Michael Olson <mwolson@gnu.org>
+
+ * erc-nicklist.el (erc-nicklist-insert-contents): Add missing
+ parenthesis. Thanks to Stephan Stahl for the report.
+
+2006-09-10 Eric Hanchrow <offby1@blarg.net>
+
+ * erc.el (erc-cmd-IGNORE): Prompt user if this might be a regexp
+ instead of a single user.
+
+2006-09-10 Michael Olson <mwolson@gnu.org>
+
+ * erc.el (erc-generate-new-buffer-name): If this is a server
+ buffer and a process exists already, create a new buffer.
+ (erc-open): If the IRC session was continued, restore the old
+ point. Thanks to Stephan Stahl for the report.
+ (erc-member-ignore-case): Coding style tweak.
+ (erc-cmd-UNIGNORE): Quote the user before comparison. If we don't
+ find the user listed verbatim, try to match them against the list
+ using string-match. In this case, prompt as to whether the regexp
+ should be removed.
+ (erc-ignored-user-p): Remove CL-ism.
+
+ * erc-autoaway.el (erc-autoaway-possibly-set-away): Check to see
+ whether we are already away.
+
+ * erc-menu.el: Fix potential compiler warning.
+
+2006-09-07 Diane Murray <disumu@x3y2z1.net>
+
+ * erc.el: Updated Commentary and URL.
+ (erc-iswitchb, erc-display-line, erc-set-modes, erc-update-modes)
+ (erc-arrange-session-in-multiple-windows): No need to check if
+ `erc-server-process' is bound.
+ (erc-server-buffer-live-p): Doc fix.
+ (erc-part-from-channel): Don't use any initial contents at prompt.
+ (erc-format-nick, erc-format-@nick): Doc fix. Use `when'.
+ (s367): Fixed to support only banmask and channel which is the
+ standard. Also, there's no reason to add a message to each banned
+ user entry trying to persuade the user to use /banlist instead of
+ /mode #channel +b. That part of the message was a little
+ confusing, anyways.
+ (s367-set-by): New catalog entry. The user who set the ban and
+ the time of ban seem to be specific to only certain servers such
+ as freenode.
+
+ * erc-autoaway.el (erc-autoaway-idletimer): Doc fix.
+
+ * erc-backend.el (erc-server-process-alive): No need to check if
+ `erc-server-process' is bound.
+ (367): Use s367 or s367-set-by where appropriate.
+
+ * erc-compat.el: Fixed URL.
+
+ * erc-dcc.el: Updated copyright years. Added Usage section.
+ Changed supported Emacs version number from 21.3.50 to 22 in
+ Commentary.
+
+ * erc-ibuffer.el (erc-server-name, erc-target, erc-away): No need
+ to check if `erc-server-process' is bound.
+
+ * erc-nicklist.el: Added to the Commentary section an explanation
+ that `erc-nicklist-quit' should be called from within the nicklist
+ buffer. Set file coding to utf-8 so a contributor's name is
+ displayed correctly.
+ (erc-nicklist-icons-directory): Use customize type directory
+ instead of string.
+ (erc-nicklist-insert-contents): Set bbdb-nick to an empty string
+ if it wasn't found. This fixes a bug where an error would occur
+ when using `string=' on bbdb-nick if it was nil.
+
+ * erc-replace.el: Removed URL from file information since it
+ doesn't exist.
+
+ * erc-sound.el: Updated copyright years. Fixed Commentary and
+ added Usage section.
+ (define-erc-module): Add and remove `erc-ctcp-query-SOUND' to
+ `erc-ctcp-query-SOUND-hook' here. Removed the keybinding
+ definitions.
+ (erc-play-sound, erc-default-sound, erc-cmd-SOUND)
+ (erc-ctcp-query-SOUND): Doc fix.
+ (erc-play-command): Removed, not necessary anymore.
+ (erc-ctcp-query-SOUND-hook): Set to nil as default. Moved up
+ higher in code, added docstring.
+ (erc-play-sound): Use `play-sound-file'. It exists in GNU Emacs
+ as well since version 21 or earlier. Removed commented-out older
+ version of function.
+
+ * NEWS: Fixed formatting, added channel tracking change.
+
+2006-09-03 Diane Murray <disumu@x3y2z1.net>
+
+ * erc.el: M-x erc RET can now be used to start ERC.
+ (erc-open): Renamed from `erc'.
+ (erc-before-connect): Change erc-select to erc.
+ (erc): Renamed from `erc-select'. Use `erc-open'.
+ (erc-select): Defined as alias of `erc'.
+ (erc-ssl): Renamed from `erc-select-ssl'. Use `erc'.
+ (erc-select-ssl): Defined as alias of `erc-ssl'.
+ (erc-cmd-SERVER): Use `erc'.
+ (erc-query, erc-handle-irc-url): Use `erc-open'.
+
+ * erc-backend.el (erc-process-sentinel-1, JOIN): Use `erc-open'.
+
+ * erc-menu.el (erc-menu-definition): Use `erc'.
+
+ * erc-networks.el: Updated copyright years.
+ (erc-server-select): Use keyword arguments when calling `erc'.
+
+ * erc.texi (Getting Started, Connecting): Changed erc-select to
+ erc.
+
+ * NEWS: Added note about these changes.
+
+2006-08-21 Diane Murray <disumu@x3y2z1.net>
+
+ * erc-track.el (erc-track-mode-line-mouse-face): New variable.
+ (erc-make-mode-line-buffer-name): Add help-echo and mouse-face
+ properties to channel name.
+
+2006-08-14 Diane Murray <disumu@x3y2z1.net>
+
+ * erc-menu.el: Updated copyright years. Removed EmacsWiki URL.
+ (erc-menu-definition): Name the menu "ERC" instead of "IRC" to
+ avoid confusion with rcirc and other clients.
+
2006-08-13 Romain Francoise <romain@orebokech.com>
* erc-match.el (erc-log-matches-make-buffer): End `y-or-n-p'
prompt with a space.
+2006-08-11 Michael Olson <mwolson@gnu.org>
+
+ * erc-fill.el (erc-fill): Skip any initial empty lines so that we
+ avoid errors when inserting disconnect messages and other messages
+ that begin with newlines.
+
2006-08-07 Michael Olson <mwolson@gnu.org>
* erc-backend.el (erc-process-sentinel-1): Use erc-display-message
2006-08-06 Michael Olson <mwolson@gnu.org>
+ * erc-backend.el (erc-server-send-queue): Update from Circe
+ version of this function.
+
* erc.el (erc-arrange-session-in-multiple-windows): Fix bug with
multi-tty Emacs.
(erc-select-startup-file): Fix bug introduced by recent change.
(defvar erc-autoaway-idletimer nil
"The Emacs idletimer.
-This is only used when `erc-autoaway-use-emacs-idle' is non-nil.")
+This is only used when `erc-autoaway-idle-method' is set to 'emacs.")
;;;###autoload (autoload 'erc-autoaway-mode "erc-autoaway")
(define-erc-module autoaway nil
;; this function is called from `erc-timer-hook', which is called
;; whenever the server sends something to the client.
(when (and erc-auto-set-away
+ (not erc-autoaway-caused-away)
(not (erc-away-p)))
(let ((idle-time (erc-time-diff erc-autoaway-last-sent-time
current-time)))
(defun erc-server-process-alive ()
"Return non-nil when `erc-server-process' is open or running."
- (and (boundp 'erc-server-process)
+ (and erc-server-process
(processp erc-server-process)
(memq (process-status erc-server-process) '(run open))))
(not (string-match "^failed with code 111" event)))
;; Yuck, this should perhaps funcall
;; erc-server-reconnect-function with no args
- (erc erc-session-server erc-session-port erc-server-current-nick
- erc-session-user-full-name t erc-session-password)
+ (erc-open erc-session-server erc-session-port erc-server-current-nick
+ erc-session-user-full-name t erc-session-password)
;; terminate, do not reconnect
(erc-display-message nil 'error (current-buffer)
'terminated ?e event))))
(error nil)))))
(when erc-server-flood-queue
(setq erc-server-flood-timer
- (run-at-time 2 nil #'erc-server-send-queue buffer))))))
+ (run-at-time (+ 0.2 erc-server-flood-penalty)
+ nil #'erc-server-send-queue buffer))))))
(defun erc-message (message-command line &optional force)
"Send LINE to the server as a privmsg or a notice.
(let* ((str (cond
;; If I have joined a channel
((erc-current-nick-p nick)
- (setq buffer (erc erc-session-server erc-session-port
- nick erc-session-user-full-name
- nil nil
- erc-default-recipients chnl
- erc-server-process))
+ (setq buffer (erc-open erc-session-server erc-session-port
+ nick erc-session-user-full-name
+ nil nil
+ erc-default-recipients chnl
+ erc-server-process))
(when buffer
(set-buffer buffer)
(erc-add-default-channel chnl)
"NAMES notice." nil
(let ((channel (third (erc-response.command-args parsed)))
(users (erc-response.contents parsed)))
- (erc-with-buffer (channel proc)
- (erc-channel-receive-names users))
(erc-display-message parsed 'notice (or (erc-get-buffer channel proc)
'active)
- 's353 ?c channel ?u users)))
+ 's353 ?c channel ?u users)
+ (erc-with-buffer (channel proc)
+ (erc-channel-receive-names users))))
(define-erc-response-handler (366)
"End of NAMES." nil
"Channel ban list entries" nil
(multiple-value-bind (channel banmask setter time)
(cdr (erc-response.command-args parsed))
- (erc-display-message parsed 'notice 'active 's367
- ?c channel
- ?b banmask
- ?s setter
- ?t time)))
+ ;; setter and time are not standard
+ (if setter
+ (erc-display-message parsed 'notice 'active 's367-set-by
+ ?c channel
+ ?b banmask
+ ?s setter
+ ?t (or time ""))
+ (erc-display-message parsed 'notice 'active 's367
+ ?c channel
+ ?b banmask))))
(define-erc-response-handler (368)
"End of channel ban list" nil
;; Copyright (C) 2002, 2003, 2005, 2006 Free Software Foundation, Inc.
;; Author: Alex Schroeder <alex@gnu.org>
-;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?EmacsIRCClient
+;; URL: http://www.emacswiki.org/cgi-bin/wiki/ERC
;; This file is part of GNU Emacs.
;; rewritten to support the way how ERC operates. Server socket support
;; was added for DCC CHAT and SEND afterwards. Thanks
;; to the original authors for their work.
-;;
+
+;;; Usage:
+
;; To use this file, put
;; (require 'erc-dcc)
;; in your .emacs.
;; /dcc send nick file - Offer DCC SEND to nick
;;
;; Please note that offering DCC connections (offering chats and sending
-;; files) is only supported with Emacs 21.3.50 (CVS).
+;; files) is only supported with Emacs 22.
;;; Code:
You can put this on `erc-insert-modify-hook' and/or `erc-send-modify-hook'."
(unless (erc-string-invisible-p (buffer-substring (point-min) (point-max)))
(when erc-fill-function
- (funcall erc-fill-function))))
+ ;; skip initial empty lines
+ (goto-char (point-min))
+ (save-match-data
+ (while (and (looking-at "[ \t\n]*$")
+ (= (forward-line 1) 0))))
+ (unless (eobp)
+ (save-restriction
+ (narrow-to-region (point) (point-max))
+ (funcall erc-fill-function))))))
(defun erc-fill-static ()
"Fills a text such that messages start at column `erc-fill-static-center'."
" "))
(define-ibuffer-column erc-server-name (:name "Server")
- (if (and (boundp 'erc-server-process) (processp erc-server-process))
+ (if (and erc-server-process (processp erc-server-process))
(with-current-buffer (process-buffer erc-server-process)
(or erc-server-announced-name erc-session-server))
""))
(define-ibuffer-column erc-target (:name "Target")
(if (eq major-mode 'erc-mode)
- (cond ((and (boundp 'erc-server-process) (processp erc-server-process)
+ (cond ((and erc-server-process (processp erc-server-process)
(eq (current-buffer) (process-buffer erc-server-process)))
(concat "Server " erc-session-server ":"
(erc-port-to-string erc-session-port)))
""))
(define-ibuffer-column erc-away (:name "A")
- (if (and (boundp 'erc-server-process)
+ (if (and erc-server-process
(processp erc-server-process)
(with-current-buffer (process-buffer erc-server-process)
erc-away))
;;
;; (require 'erc-log)
;;
-;; You may optionally want the following code, to save all ERC buffers
-;; without confirmation when exiting emacs:
-;;
-;; (defadvice save-buffers-kill-emacs (before save-logs (&rest args) activate)
-;; (save-some-buffers t (lambda ()
-;; (when (and (eq major-mode 'erc-mode)
-;; (not (null buffer-file-name))) t))))
-;;
;; If you only want to save logs for some buffers, customise the
;; variable `erc-enable-logging'.
(add-hook 'erc-send-post-hook 'erc-save-buffer-in-logs))
(add-hook 'erc-kill-buffer-hook 'erc-save-buffer-in-logs)
(add-hook 'erc-kill-channel-hook 'erc-save-buffer-in-logs)
+ (add-hook 'kill-emacs-hook 'erc-log-save-all-buffers)
(add-hook 'erc-quit-hook 'erc-conditional-save-queries)
(add-hook 'erc-part-hook 'erc-conditional-save-buffer)
;; append, so that 'erc-initialize-log-marker runs first
(remove-hook 'erc-send-post-hook 'erc-save-buffer-in-logs)
(remove-hook 'erc-kill-buffer-hook 'erc-save-buffer-in-logs)
(remove-hook 'erc-kill-channel-hook 'erc-save-buffer-in-logs)
+ (remove-hook 'kill-emacs-hook 'erc-log-save-all-buffers)
(remove-hook 'erc-quit-hook 'erc-conditional-save-queries)
(remove-hook 'erc-part-hook 'erc-conditional-save-buffer)
(remove-hook 'erc-connect-pre-hook 'erc-log-setup-logging)
(not (erc-server-buffer-p)))))
(defun erc-save-query-buffers (process)
- "Save all buffers process."
+ "Save all buffers of the given PROCESS."
(erc-with-all-buffers-of-server process
nil
(erc-save-buffer-in-logs)))
(when erc-save-queries-on-quit
(erc-save-query-buffers process)))
+;; Make sure that logs get saved, even if someone overrides the active
+;; process prompt for a quick exit from Emacs
+(defun erc-log-save-all-buffers ()
+ (dolist (buffer (erc-buffer-list))
+ (erc-save-buffer-in-logs buffer)))
+
;;;###autoload
(defun erc-logging-enabled (&optional buffer)
"Return non-nil if logging is enabled for BUFFER.
(erc-log-standardize-name
(funcall erc-generate-log-file-name-function
(or buffer (current-buffer))
- (or (erc-default-target) (buffer-name buffer))
+ (or (buffer-name buffer) (erc-default-target))
(erc-current-nick)
erc-session-server erc-session-port))
erc-log-channels-directory))
;; Author: Mario Lang <mlang@delysid.org>
;; Keywords: comm, processes, menu
-;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcMenu
;; This file is part of GNU Emacs.
;;; Code:
+;(require 'erc)
(require 'easymenu)
(defvar erc-menu-definition
- (list "IRC"
- ["Connect to server..." erc-select t]
+ (list "ERC"
+ ["Connect to server..." erc t]
["Disconnect from server..." erc-quit-server erc-server-connected]
"-"
["List channels..." erc-list-channels
(erc-ports-list (nth 3 srv))
(list (nth 3 srv))))
(port (nth (random (length ports)) ports)))
- (erc host port erc-nick erc-user-full-name t)))
+ (erc :server host :port port)))
;;; The following experimental
;; It does not work yet, help me with it if you
;; This provides a minimal mIRC style nicklist buffer for ERC. To
;; activate, do M-x erc-nicklist RET in the channel buffer you want
;; the nicklist to appear for. To close and quit the nicklist
-;; buffer, do M-x erc-nicklist-quit RET.
+;; buffer, do M-x erc-nicklist-quit RET from within the nicklist buffer.
;;
;; TODO:
;; o Somehow associate nicklist windows with channel windows so they
"*Directory of the PNG files for chat icons.
Icons are displayed if `erc-nicklist-use-icons' is non-nil."
:group 'erc-nicklist
- :type 'string)
+ :type 'directory)
(defcustom erc-nicklist-voiced-position 'bottom
"*Position of voiced nicks in the nicklist.
(channels (erc-server-user-buffers server-user))
(op (erc-channel-user-op channel-user))
(voice (erc-channel-user-voice channel-user))
- (bbdb-nick (erc-nicklist-search-for-nick (concat login "@" host)))
+ (bbdb-nick (or (erc-nicklist-search-for-nick
+ (concat login "@" host))
+ ""))
(away-status (if voice "" "\n(Away)"))
(balloon-text (concat bbdb-nick (if (string= "" bbdb-nick)
"" "\n")
;; Local Variables:
;; indent-tabs-mode: t
;; tab-width: 8
+;; coding: utf-8
;; End:
;; arch-tag: db37a256-87a7-4544-bd90-e5f16c9f5ca5
;; Author: Andreas Fuchs <asf@void.at>
;; Maintainer: Mario Lang (mlang@delysid.org)
;; Keywords: IRC, client, Internet
-;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcReplace
;; This file is part of GNU Emacs.
;;; Commentary:
-;; This used to be in erc.el, I (Jorgen) just extracted it from there
-;; and put it in this file. Bugs and features are those of the
-;; original author.
+;; Play sounds when users send you CTCP SOUND messages.
+
+;; This file also defines the command /sound so that you can send
+;; sound requests to other users.
+
+;;; Usage:
+
+;; Add the following to your .emacs if you want to play sounds.
+;;
+;; (require 'erc-soud)
+;; (erc-sound-enable)
+;;
+;; To send requests to other users from within query buffers, type the
+;; following:
+;;
+;; /sound filename optional-message-text
+;;
+;; You can also type the following:
+;;
+;; /ctcp nickname sound filename optional-message
;;; Code:
"In ERC sound mode, the client will respond to CTCP SOUND requests
and play sound files as requested."
;; Enable:
- ((define-key erc-mode-map "\C-c\C-s" 'erc-toggle-sound))
+ ((add-hook 'erc-ctcp-query-SOUND-hook 'erc-ctcp-query-SOUND)
+ (define-key erc-mode-map "\C-c\C-s" 'erc-toggle-sound))
;; Disable:
- ((define-key erc-mode-map "\C-c\C-s" 'undefined)))
+ ((remove-hook 'erc-ctcp-query-SOUND-hook 'erc-ctcp-query-SOUND)
+ (define-key erc-mode-map "\C-c\C-s" 'undefined)))
(erc-define-catalog-entry 'english 'CTCP-SOUND "%n (%u@%h) plays %s:%m")
:group 'erc)
(defcustom erc-play-sound t
- "*Play sound on SOUND ctcp requests (used in ICQ chat)."
+ "*Play sounds when you receive CTCP SOUND requests."
:group 'erc-sound
:type 'boolean)
:type '(repeat directory))
(defcustom erc-default-sound nil
- "Play this sound if the requested file was not found."
+ "Play this sound if the requested file was not found.
+If this is set to nil or the file doesn't exist a beep will sound."
:group 'erc-sound
:type '(choice (const nil)
file))
-(defcustom erc-play-command "play"
- "Command for playing sound samples."
- :group 'erc-sound
- :type 'string)
+(defvar erc-ctcp-query-SOUND-hook nil
+ "Hook to run after receiving a CTCP SOUND request.")
(defun erc-cmd-SOUND (line &optional force)
- "Play the sound given in LINE."
+ "Send a CTCP SOUND message to the default target.
+If `erc-play-sound' is non-nil, play the sound as well.
+
+/sound filename optional-message-text
+
+LINE is the text entered, including the command."
(cond
((string-match "^\\s-*\\(\\S-+\\)\\(\\s-.*\\)?$" line)
(let ((file (match-string 1 line))
t))
(t nil)))
-(defvar erc-ctcp-query-SOUND-hook '(erc-ctcp-query-SOUND))
(defun erc-ctcp-query-SOUND (proc nick login host to msg)
+ "Display a CTCP SOUND message and play sound if `erc-play-sound' is non-nil."
(when (string-match "^SOUND\\s-+\\(\\S-+\\)\\(\\(\\s-+.*\\)\\|\\(\\s-*\\)\\)$" msg)
(let ((sound (match-string 1 msg))
(comment (match-string 2 msg)))
nil)
(defun erc-play-sound (file)
- "Plays a sound file located in one of the directories in `erc-sound-path'
-with a command `erc-play-command'."
+ "Play a sound file located in one of the directories in `erc-sound-path'.
+See also `play-sound-file'."
(let ((filepath (erc-find-file file erc-sound-path)))
(if (and (not filepath) erc-default-sound)
(setq filepath erc-default-sound))
(cond ((and filepath (file-exists-p filepath))
- (if (and (fboundp 'device-sound-enabled-p)
- (device-sound-enabled-p))
- ; For XEmacs
- (play-sound-file filepath)
-; (start-process "erc-sound" nil erc-play-command filepath)
- (start-process "erc-sound" nil "/bin/tcsh" "-c"
- (concat erc-play-command " " filepath))))
+ (play-sound-file filepath))
(t (beep)))
(erc-log (format "Playing sound file %S" filepath))))
-;(defun erc-play-sound (file)
-; "Plays a sound file located in one of the directories in `erc-sound-path'
-; with a command `erc-play-command'."
-; (let ((filepath nil)
-; (paths erc-sound-path))
-; (while (and paths
-; (progn (setq filepath (expand-file-name file (car paths)))
-; (not (file-exists-p filepath))))
-; (setq paths (cdr paths)))
-; (if (and (not (and filepath (file-exists-p filepath)))
-; erc-default-sound)
-; (setq filepath erc-default-sound))
-; (cond ((and filepath (file-exists-p filepath))
-;; (start-process "erc-sound" nil erc-play-command filepath)
-; (start-process "erc-sound" nil "/bin/tcsh" "-c"
-; (concat erc-play-command " " filepath))
-; )
-; (t (beep)))
-; (erc-log (format "Playing sound file %S" filepath))))
-
(defun erc-toggle-sound (&optional arg)
"Toggles playing sounds on and off. With positive argument,
turns them on. With any other argument turns sounds off."
(erc-modified-channels-display)
(force-mode-line-update t))))
+(defvar erc-track-mouse-face (if (featurep 'xemacs)
+ 'modeline-mousable
+ 'mode-line-highlight)
+ "The face to use when mouse is over channel names in the mode line.")
+
(defun erc-make-mode-line-buffer-name (string buffer &optional faces count)
"Return STRING as a button that switches to BUFFER when clicked.
If FACES are provided, color STRING with them."
(posn-window (event-start e)))
(switch-to-buffer-other-window ,buffer))))
(put-text-property 0 (length name) 'local-map map name)
+ (put-text-property
+ 0 (length name)
+ 'help-echo (concat "mouse-2: switch to buffer, "
+ "mouse-3: switch to buffer in other window")
+ name)
+ (put-text-property 0 (length name) 'mouse-face erc-track-mouse-face name)
(when (and faces erc-track-use-faces)
(put-text-property 0 (length name) 'face faces name))
name))
;;; Commentary:
-;; ERC is an IRC client for Emacs.
+;; ERC is a powerful, modular, and extensible IRC client for Emacs.
;; For more information, see the following URLs:
;; * http://sv.gnu.org/projects/erc/
-;; * http://www.emacswiki.org/cgi-bin/wiki.pl?EmacsIRCClient
+;; * http://www.emacswiki.org/cgi-bin/wiki/ERC
;; As of 2006-06-13, ERC development is now hosted on Savannah
;; (http://sv.gnu.org/projects/erc). I invite everyone who wants to
;; To connect to an IRC server, do
;;
-;; M-x erc-select RET
+;; M-x erc RET
;;
;; After you are connected to a server, you can use C-h m or have a look at
-;; the IRC menu.
+;; the ERC menu.
;;; History:
;;
;;; Code:
-(defconst erc-version-string "Version 5.1.4"
+(defconst erc-version-string "Version 5.2 stable pre-release"
"ERC version. This is used by function `erc-version'.")
(eval-when-compile (require 'cl))
"ERC face for errors."
:group 'erc-faces)
+;; same default color as `erc-input-face'
+(defface erc-my-nick-face '((t (:bold t :foreground "brown")))
+ "ERC face for your current nickname in messages sent by you.
+See also `erc-show-my-nick'."
+ :group 'erc-faces)
+
(defface erc-nick-default-face '((t (:bold t)))
"ERC nickname default face."
:group 'erc-faces)
(process-buffer erc-server-process)))
(defun erc-server-buffer-live-p ()
- "Return t if the buffer associated with `erc-server-process'
-has not been killed."
+ "Return t if the server buffer has not been killed."
(and (processp erc-server-process)
(buffer-live-p (process-buffer erc-server-process))))
(defconst erc-default-server "irc.freenode.net"
"IRC server to use if it cannot be detected otherwise.")
-(defconst erc-default-port "ircd"
+(defconst erc-default-port "6667"
"IRC port to use if it cannot be detected otherwise.")
(defcustom erc-join-buffer 'buffer
(or target
(with-current-buffer (get-buffer buf-name)
(and (erc-server-buffer-p)
- (not erc-server-connected))))
+ (not (erc-server-process-alive)))))
(with-current-buffer (get-buffer buf-name)
(and (string= erc-session-server server)
(erc-port-equal erc-session-port port))))
(catch 'result
(while list
(if (string= string (erc-downcase (car list)))
- (throw 'result list) (setq list (cdr list))))))
+ (throw 'result list)
+ (setq list (cdr list))))))
(defmacro erc-with-buffer (spec &rest body)
"Execute BODY in the buffer associated with SPEC.
Due to some yet unresolved reason, global function `iswitchb-mode'
needs to be active for this function to work."
(interactive "P")
- (eval-when-compile
+ (eval-and-compile
(require 'iswitchb))
(let ((iswitchb-make-buflist-hook
(lambda ()
(mapcar 'buffer-name
(erc-buffer-list
nil
- (when (and arg (boundp 'erc-server-process))
- erc-server-process)))))))
+ (when arg erc-server-process)))))))
(switch-to-buffer
(iswitchb-read-buffer
"Switch-to: "
(condition-case nil
(require (intern req))
(error nil))
- (funcall (or (intern-soft (concat "erc-" (symbol-name mod) "-mode"))
- (error "`%s' is not a known ERC module" mod))
- 1))))
+ (let ((sym (intern-soft (concat "erc-" (symbol-name mod) "-mode"))))
+ (if (fboundp sym)
+ (funcall sym 1)
+ (error "`%s' is not a known ERC module" mod))))))
(defun erc-setup-buffer (buffer)
"Consults `erc-join-buffer' to find out how to display `BUFFER'."
(display-buffer buffer)
(switch-to-buffer buffer)))))
-(defun erc (&optional server port nick full-name
- connect passwd tgt-list channel process)
+(defun erc-open (&optional server port nick full-name
+ connect passwd tgt-list channel process)
"ERC is a powerful, modular, and extensible IRC client.
Connect to SERVER on PORT as NICK with FULL-NAME.
(connected-p (unless connect erc-server-connected))
(buffer (erc-get-buffer-create server port channel))
(old-buffer (current-buffer))
+ (old-point (point))
continued-session)
(erc-update-modules)
(set-buffer buffer)
(insert "\n"))
(set-marker (process-mark erc-server-process) (point))
(if continued-session
- (goto-char (point-max))
+ (goto-char old-point)
(set-marker erc-insert-marker (point))
(erc-display-prompt)
(goto-char (point-max)))
(defcustom erc-before-connect nil
"Hook called before connecting to a server.
-This hook gets executed before `erc-select' actually invokes `erc-mode'
+This hook gets executed before `erc' actually invokes `erc-mode'
with your input data. The functions in here get called with three
parameters, SERVER, PORT and NICK."
:group 'erc-hooks
(list :server server :port port :nick nick :password passwd)))
;;;###autoload
-(defun* erc-select (&key (server (erc-compute-server))
- (port (erc-compute-port))
- (nick (erc-compute-nick))
- password
- (full-name (erc-compute-full-name)))
+(defun* erc (&key (server (erc-compute-server))
+ (port (erc-compute-port))
+ (nick (erc-compute-nick))
+ password
+ (full-name (erc-compute-full-name)))
"Select connection parameters and run ERC.
Non-interactively, it takes keyword arguments
(server (erc-compute-server))
That is, if called with
- (erc-select :server \"irc.freenode.net\" :full-name \"Harry S Truman\")
+ (erc :server \"irc.freenode.net\" :full-name \"Harry S Truman\")
server and full-name will be set to those values, whereas
`erc-compute-port', `erc-compute-nick' and `erc-compute-full-name' will
(interactive (erc-select-read-args))
(run-hook-with-args 'erc-before-connect server port nick)
- (erc server port nick erc-user-full-name t password))
+ (erc-open server port nick full-name t password))
+(defalias 'erc-select 'erc)
-(defun erc-select-ssl (&rest r)
+(defun erc-ssl (&rest r)
"Interactively select SSL connection parameters and run ERC.
-Arguments are as to erc-select."
+Arguments are the same as for `erc'."
(interactive (erc-select-read-args))
(let ((erc-server-connect-function 'erc-open-ssl-stream))
- (apply 'erc-select r)))
+ (apply 'erc r)))
+
+(defalias 'erc-select-ssl 'erc-ssl)
(defun erc-open-ssl-stream (name buffer host port)
"Open an SSL stream to an IRC server.
((listp buffer) buffer)
((processp buffer) (list (process-buffer buffer)))
((eq 'all buffer)
- (and (boundp 'erc-server-process)
- ;; Hmm, or all of the same session server?
- (erc-buffer-list nil erc-server-process)))
+ ;; Hmm, or all of the same session server?
+ (erc-buffer-list nil erc-server-process))
((and (eq 'active buffer) (erc-active-buffer))
(list (erc-active-buffer)))
((erc-server-buffer-live-p)
"Ignore USER. This should be a regexp matching nick!user@host.
If no USER argument is specified, list the contents of `erc-ignore-list'."
(if user
- (progn
+ (let ((quoted (regexp-quote user)))
+ (when (and (not (string= user quoted))
+ (y-or-n-p (format "Use regexp-quoted form (%s) instead? "
+ quoted)))
+ (setq user quoted))
(erc-display-line
(erc-make-notice (format "Now ignoring %s" user))
'active)
(defun erc-cmd-UNIGNORE (user)
"Remove the user specified in USER from the ignore list."
(let ((ignored-nick (car (with-current-buffer (erc-server-buffer)
- (erc-member-ignore-case user erc-ignore-list)))))
- (if (null ignored-nick)
+ (erc-member-ignore-case (regexp-quote user)
+ erc-ignore-list)))))
+ (unless ignored-nick
+ (if (setq ignored-nick (erc-ignored-user-p user))
+ (unless (y-or-n-p (format "Remove this regexp (%s)? "
+ ignored-nick))
+ (setq ignored-nick nil))
(erc-display-line
(erc-make-notice (format "%s is not currently ignored!" user))
- 'active)
+ 'active)))
+ (when ignored-nick
(erc-display-line
(erc-make-notice (format "No longer ignoring %s" user))
- 'active))
- (with-current-buffer (erc-server-buffer)
- (setq erc-ignore-list (delete ignored-nick erc-ignore-list))))
+ 'active)
+ (with-current-buffer (erc-server-buffer)
+ (setq erc-ignore-list (delete ignored-nick erc-ignore-list)))))
t)
(defun erc-cmd-CLEAR ()
"Connect to SERVER, leaving existing connection intact."
(erc-log (format "cmd: SERVER: %s" server))
(condition-case nil
- (erc-select :server server :nick (erc-current-nick))
+ (erc :server server :nick (erc-current-nick))
(error
(message "Cannot find host %s." server)
(beep)))
(list
(if (and (boundp 'reason) (stringp reason) (not (string= reason "")))
reason
- (read-from-minibuffer (concat "Leave " (erc-default-target)
- ", Reason? ")
- (cons "No reason" 0)))))
+ (read-from-minibuffer (concat "Reason for leaving " (erc-default-target)
+ ": ")))))
(erc-cmd-PART (concat (erc-default-target)" " reason)))
(defun erc-set-topic (topic)
(buffer-live-p server)
(set-buffer server))
(error "Couldn't switch to server buffer"))
- (let ((buf (erc erc-session-server
- erc-session-port
- (erc-current-nick)
- erc-session-user-full-name
- nil
- nil
- (list target)
- target
- erc-server-process)))
+ (let ((buf (erc-open erc-session-server
+ erc-session-port
+ (erc-current-nick)
+ erc-session-user-full-name
+ nil
+ nil
+ (list target)
+ target
+ erc-server-process)))
(unless buf
(error "Couldn't open query window"))
(erc-update-mode-line)
:type 'function)
(defun erc-format-nick (&optional user channel-data)
- "Standard nickname formatting function. Only returns the value
-of NICK."
- (if user
- (erc-server-user-nickname user)))
+ "Return the nickname of USER.
+See also `erc-format-nick-function'."
+ (when user (erc-server-user-nickname user)))
(defun erc-format-@nick (&optional user channel-data)
- "Format a nickname such that @ or + are prefix for the NICK
-if OP or VOICE are t respectively."
- (if user
- (let (op voice)
- (if channel-data
- (setq op (erc-channel-user-op channel-data)
- voice (erc-channel-user-voice channel-data)))
- (concat (if voice "+" "")
- (if op "@" "")
- (erc-server-user-nickname user)))))
+ "Format the nickname of USER showing if USER is an operator or has voice.
+Operators have \"@\" and users with voice have \"+\" as a prefix.
+Use CHANNEL-DATA to determine op and voice status.
+See also `erc-format-nick-function'."
+ (when user
+ (let ((op (and channel-data (erc-channel-user-op channel-data) "@"))
+ (voice (and channel-data (erc-channel-user-voice channel-data) "+")))
+ (concat voice op (erc-server-user-nickname user)))))
(defun erc-format-my-nick ()
"Return the beginning of this user's message, correctly propertized"
(nick (erc-current-nick)))
(concat
(erc-propertize open 'face 'erc-default-face)
- (erc-propertize nick 'face 'erc-nick-default-face)
+ (erc-propertize nick 'face 'erc-my-nick-face)
(erc-propertize close 'face 'erc-default-face)))
(let ((prefix "> "))
(erc-propertize prefix 'face 'erc-default-face))))
;; list of triples: (mode-char 'on/'off argument)
(arg-modes (nth 2 modes)))
(cond ((erc-channel-p tgt); channel modes
- (let ((buf (and (boundp 'erc-server-process) erc-server-process
+ (let ((buf (and erc-server-process
(erc-get-buffer tgt erc-server-process))))
(when buf
(with-current-buffer buf
(arg-modes (nth 2 modes)))
;; now parse the modes changes and do the updates
(cond ((erc-channel-p tgt); channel modes
- (let ((buf (and (boundp 'erc-server-process) erc-server-process
+ (let ((buf (and erc-server-process
(erc-get-buffer tgt erc-server-process))))
(when buf
;; FIXME! This used to have an original buffer
Takes a full SPEC of a user in the form \"nick!login@host\", and
matches against all the regexp's in `erc-ignore-list'. If any
match, returns that regexp."
- (dolist (ignored (with-current-buffer (erc-server-buffer) erc-ignore-list))
- (if (string-match ignored spec)
- ;; We have `require'd cl, so we can return from the block named nil
- (return ignored))))
+ (catch 'found
+ (dolist (ignored (with-current-buffer (erc-server-buffer) erc-ignore-list))
+ (if (string-match ignored spec)
+ (throw 'found ignored)))))
(defun erc-ignored-reply-p (msg tgt proc)
;; FIXME: this docstring needs fixing -- Lawrence 2004-01-08
This tries a number of increasingly more default methods until a
non-nil value is found.
-- SERVER (the argument passwd to this function)
+- SERVER (the argument passed to this function)
- The `erc-server' option
- The value of the IRCSERVER environment variable
- The `erc-default-server' variable"
(defun erc-string-to-port (s)
"Convert string S to either an integer port number or a service name."
- (let ((n (string-to-number s)))
- (if (= n 0)
- s
- n)))
+ (if (numberp s)
+ s
+ (let ((n (string-to-number s)))
+ (if (= n 0)
+ s
+ n))))
(defun erc-version (&optional here)
"Show the version number of ERC in the minibuffer.
All windows are opened in the current frame."
(interactive)
- (unless (boundp 'erc-server-process)
- (error "No erc-process found in current buffer"))
+ (unless erc-server-process
+ (error "No erc-server-process found in current buffer"))
(let ((bufs (erc-buffer-list nil erc-server-process)))
(when bufs
(delete-other-windows)
(s341 . "Inviting %n to channel %c")
(s352 . "%-11c %-10n %-4a %u@%h (%f)")
(s353 . "Users on %c: %u")
- (s367 . "Ban on %b on %c set by %s on %t (Use /banlist!)")
+ (s367 . "Ban for %b on %c")
+ (s367-set-by . "Ban for %b on %c set by %s on %t")
(s368 . "Banlist of %c ends.")
(s379 . "%c: Forwarded to %f")
(s391 . "The time at %s is %t")
(with-current-buffer (or server-buffer (current-buffer))
(if (and server-buffer channel)
(erc-cmd-JOIN channel)
- (erc host port (or user (erc-compute-nick)) (erc-compute-full-name)
- (not server-buffer) password nil channel
- (when server-buffer
- (get-buffer-process server-buffer)))))))
+ (erc-open host port (or user (erc-compute-nick)) (erc-compute-full-name)
+ (not server-buffer) password nil channel
+ (when server-buffer
+ (get-buffer-process server-buffer)))))))
(provide 'erc)
+2006-11-20 Michael Olson <mwolson@gnu.org>
+
+ * erc.texi: Call this the 5.2 stable pre-release of ERC.
+
2006-11-18 Chong Yidong <cyd@stupidchicken.com>
* misc.texi (Interactive Shell): INSIDE_EMACS is set to t,
@syncodeindex fn cp
@copying
-This manual is for ERC version 5.1.4.
+This manual is for ERC version 5.2 stable pre-release.
Copyright @copyright{} 2005, 2006 Free Software Foundation, Inc.
(require 'erc)
@end lisp
-Once ERC is loaded, the command @kbd{M-x erc-select} will start ERC and
+Once ERC is loaded, the command @kbd{M-x erc} will start ERC and
prompt for the server to connect to.
@c PRE5_2: Sample session, including:
@section Connecting to an IRC Server
@cindex connecting
-The easiest way to connect to an IRC server is to call
-@kbd{M-x erc-select}. If you want to assign this function to a
-keystroke, the following will help you figure out its parameters.
+The easiest way to connect to an IRC server is to call @kbd{M-x erc}.
+If you want to assign this function to a keystroke, the following will
+help you figure out its parameters.
-@defun erc-select
+@defun erc
Select connection parameters and run ERC.
Non-interactively, it takes the following keyword arguments.
parameters.
@example
-(erc-select :server "irc.freenode.net" :full-name "Harry S Truman")
+(erc :server "irc.freenode.net" :full-name "Harry S Truman")
@end example
@end defun