;; erc.el --- An Emacs Internet Relay Chat client
-;; Copyright (C) 1997-2011 Free Software Foundation, Inc.
+;; Copyright (C) 1997-2012 Free Software Foundation, Inc.
;; Author: Alexander L. Belikoff (alexander@belikoff.net)
;; Contributors: Sergey Berezin (sergey.berezin@cs.cmu.edu),
(repeat :inline t :tag "Others" (string :tag "IRC Message Type"))))
(defcustom erc-hide-list nil
- "*List of IRC type messages to hide.
+ "List of IRC type messages to hide.
A typical value would be '(\"JOIN\" \"PART\" \"QUIT\")."
:group 'erc-ignore
:type 'erc-message-type)
prompt))))
(defcustom erc-notice-prefix "*** "
- "*Prefix for all notices."
+ "Prefix for all notices."
:group 'erc-display
:type 'string)
(defcustom erc-notice-highlight-type 'all
- "*Determines how to highlight notices.
+ "Determines how to highlight notices.
See `erc-notice-prefix'.
The following values are allowed:
(const :tag "don't highlight notices at all" nil)))
(defcustom erc-echo-notice-hook nil
- "*Specifies a list of functions to call to echo a private
+ "Specifies a list of functions to call to echo a private
notice. Each function is called with four arguments, the string
to display, the parsed server message, the target buffer (or
nil), and the sender. The functions are called in order, until a
(defcustom erc-echo-notice-always-hook
'(erc-echo-notice-in-default-buffer)
- "*Specifies a list of functions to call to echo a private
+ "Specifies a list of functions to call to echo a private
notice. Each function is called with four arguments, the string
to display, the parsed server message, the target buffer (or
nil), and the sender. The functions are called in order, and all
;; other tunable parameters
(defcustom erc-whowas-on-nosuchnick nil
- "*If non-nil, do a whowas on a nick if no such nick."
+ "If non-nil, do a whowas on a nick if no such nick."
:group 'erc
:type 'boolean)
(defcustom erc-verbose-server-ping nil
- "*If non-nil, show every time you get a PING or PONG from the server."
+ "If non-nil, show every time you get a PING or PONG from the server."
:group 'erc-paranoia
:type 'boolean)
(defcustom erc-public-away-p nil
- "*Let others know you are back when you are no longer marked away.
+ "Let others know you are back when you are no longer marked away.
This happens in this form:
* <nick> is back (gone for <time>)
:type 'boolean)
(defcustom erc-away-nickname nil
- "*The nickname to take when you are marked as being away."
+ "The nickname to take when you are marked as being away."
:group 'erc
:type '(choice (const nil)
string))
string))
(defcustom erc-ignore-list nil
- "*List of regexps matching user identifiers to ignore.
+ "List of regexps matching user identifiers to ignore.
A user identifier has the form \"nick!login@host\". If an
identifier matches, the message from the person will not be
(make-variable-buffer-local 'erc-ignore-list)
(defcustom erc-ignore-reply-list nil
- "*List of regexps matching user identifiers to ignore completely.
+ "List of regexps matching user identifiers to ignore completely.
This differs from `erc-ignore-list' in that it also ignores any
messages directed at the user.
:type '(repeat regexp))
(defvar erc-flood-protect t
- "*If non-nil, flood protection is enabled.
+ "If non-nil, flood protection is enabled.
Flooding is sending too much information to the server in too
short of an interval, which may cause the server to terminate the
connection.
:type '(repeat directory))
(defcustom erc-script-echo t
- "*If non-nil, echo the IRC script commands locally."
+ "If non-nil, echo the IRC script commands locally."
:group 'erc-scripts
:type 'boolean)
:type '(repeat (list regexp (choice (string) (function)))))
(defcustom erc-quit-reason 'erc-quit-reason-normal
- "*A function which returns the reason for quitting.
+ "A function which returns the reason for quitting.
The function is passed a single argument, the string typed by the
user after \"/quit\"."
(erc-define-minor-mode
,mode
,(format "Toggle ERC %S mode.
-With arg, turn ERC %S mode on if and only if arg is positive.
+With a prefix argument ARG, enable %s if ARG is positive,
+and disable it otherwise. If called from Lisp, enable the mode
+if ARG is omitted or nil.
%s" name name doc)
nil nil nil
:global ,(not local-p) :group (quote ,group)
(const :tag "Use current buffer" t)))
(defcustom erc-frame-alist nil
- "*Alist of frame parameters for creating erc frames.
+ "Alist of frame parameters for creating erc frames.
A value of nil means to use `default-frame-alist'."
:group 'erc-buffers
:type '(repeat (cons :format "%v"
(sexp :tag "Value"))))
(defcustom erc-frame-dedicated-flag nil
- "*Non-nil means the erc frames are dedicated to that buffer.
+ "Non-nil means the erc frames are dedicated to that buffer.
This only has effect when `erc-join-buffer' is set to `frame'."
:group 'erc-buffers
:type 'boolean)
(defcustom erc-reuse-frames t
- "*Determines whether new frames are always created.
+ "Determines whether new frames are always created.
Non-nil means that a new frame is not created to display an ERC
buffer if there is already a window displaying it. This only has
effect when `erc-join-buffer' is set to `frame'."
(t nil)))
(defcustom erc-reuse-buffers t
- "*If nil, create new buffers on joining a channel/query.
+ "If nil, create new buffers on joining a channel/query.
If non-nil, a new buffer will only be created when you join
channels with same names on different servers, or have query buffers
open with nicks of the same name on different servers. Otherwise,
(defun erc-generate-new-buffer-name (server port target &optional proc)
"Create a new buffer name based on the arguments."
(when (numberp port) (setq port (number-to-string port)))
- (let* ((buf-name (or target
- (or (let ((name (concat server ":" port)))
- (when (> (length name) 1)
- name))
- ; This fallback should in fact never happen
- "*erc-server-buffer*"))))
+ (let ((buf-name (or target
+ (or (let ((name (concat server ":" port)))
+ (when (> (length name) 1)
+ name))
+ ;; This fallback should in fact never happen
+ "*erc-server-buffer*")))
+ buffer-name)
;; Reuse existing buffers, but not if the buffer is a connected server
;; buffer and not if its associated with a different server than the
;; current ERC buffer.
- (if (and erc-reuse-buffers
- (get-buffer buf-name)
- (or target
- (with-current-buffer (get-buffer buf-name)
- (and (erc-server-buffer-p)
- (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))))
- buf-name
- (generate-new-buffer-name buf-name))))
+ ;; if buf-name is taken by a different connection (or by something !erc)
+ ;; then see if "buf-name/server" meets the same criteria
+ (dolist (candidate (list buf-name (concat buf-name "/" server)))
+ (if (and (not buffer-name)
+ erc-reuse-buffers
+ (get-buffer candidate)
+ (or target
+ (with-current-buffer (get-buffer candidate)
+ (and (erc-server-buffer-p)
+ (not (erc-server-process-alive)))))
+ (with-current-buffer (get-buffer candidate)
+ (and (string= erc-session-server server)
+ (erc-port-equal erc-session-port port))))
+ (setq buffer-name candidate)))
+ ;; if buffer-name is unset, neither candidate worked out for us,
+ ;; fallback to the old <N> uniquification method:
+ (or buffer-name (generate-new-buffer-name buf-name)) ))
(defun erc-get-buffer-create (server port target &optional proc)
"Create a new buffer based on the arguments."
;;;###autoload
(defalias 'erc-select 'erc)
+(defalias 'erc-ssl 'erc-tls)
-(defun erc-ssl (&rest r)
- "Interactively select SSL connection parameters and run ERC.
-Arguments are the same as for `erc'."
- (interactive (erc-select-read-args))
- (let ((erc-server-connect-function 'erc-open-ssl-stream))
- (apply 'erc r)))
-
-(defalias 'erc-select-ssl 'erc-ssl)
-
-(declare-function open-ssl-stream "ext:ssl" (name buffer host service))
-
-(defun erc-open-ssl-stream (name buffer host port)
- "Open an SSL stream to an IRC server.
-The process will be given the name NAME, its target buffer will be
-BUFFER. HOST and PORT specify the connection target."
- (when (condition-case nil
- (require 'ssl)
- (error (message "You don't have ssl.el. %s"
- "Try using `erc-tls' instead.")
- nil))
- (let ((proc (open-ssl-stream name buffer host port)))
- ;; Ugly hack, but it works for now. Problem is it is
- ;; very hard to detect when ssl is established, because s_client
- ;; doesn't give any CONNECTIONESTABLISHED kind of message, and
- ;; most IRC servers send nothing and wait for you to identify.
- (sit-for 5)
- proc)))
-
+;;;###autoload
(defun erc-tls (&rest r)
"Interactively select TLS connection parameters and run ERC.
Arguments are the same as for `erc'."
(let ((erc-server-connect-function 'erc-open-tls-stream))
(apply 'erc r)))
-(declare-function open-tls-stream "tls" (name buffer host port))
-
(defun erc-open-tls-stream (name buffer host port)
"Open an TLS stream to an IRC server.
The process will be given the name NAME, its target buffer will be
BUFFER. HOST and PORT specify the connection target."
- (when (condition-case nil
- (require 'tls)
- (error (message "You don't have tls.el. %s"
- "Try using `erc-ssl' instead.")
- nil))
- (open-tls-stream name buffer host port)))
+ (open-network-stream name buffer host port
+ :type 'tls))
;;; Displaying error messages
(cond ((integerp elt) ; POSITION
(incf (car list) shift))
((or (atom elt) ; nil, EXTENT
- ;; (eq t (car elt)) ; (t HIGH . LOW)
+ ;; (eq t (car elt)) ; (t . TIME)
(markerp (car elt))) ; (MARKER . DISTANCE)
nil)
((integerp (car elt)) ; (BEGIN . END)
(if (consp val)
(concat "\n" (pp-to-string val))
(format " %S\n" val)))))
- (apropos-internal "^erc-" 'user-variable-p))))
+ (apropos-internal "^erc-" 'custom-variable-p))))
(current-buffer)) t)
(t nil)))
(defalias 'erc-cmd-VAR 'erc-cmd-SET)
(defun erc-cmd-default (line)
"Fallback command.
-Commands for which no erc-cmd-xxx exists, are tunnelled through
+Commands for which no erc-cmd-xxx exists, are tunneled through
this function. LINE is sent to the server verbatim, and
therefore has to contain the command itself as well."
(erc-log (format "cmd: DEFAULT: %s" line))
'start-open t ; XEmacs
'rear-nonsticky t ; Emacs
'erc-prompt t
+ 'field t
'front-sticky t
'read-only t))
(erc-put-text-property 0 (1- (length prompt))
(defcustom erc-default-server-hook '(erc-debug-missing-hooks
erc-default-server-handler)
- "*Default for server messages which aren't covered by `erc-server-hooks'."
+ "Default for server messages which aren't covered by `erc-server-hooks'."
:group 'erc-server-hooks
:type 'hook)
(not (string-match "^\C-a\\ACTION.*\C-a$" message))))
(defun erc-format-privmessage (nick msg privp msgp)
- "Format a PRIVMSG in an insertible fashion."
+ "Format a PRIVMSG in an insertable fashion."
(let* ((mark-s (if msgp (if privp "*" "<") "-"))
(mark-e (if msgp (if privp "*" ">") "-"))
(str (format "%s%s%s %s" mark-s nick mark-e msg))
str))
(defcustom erc-format-nick-function 'erc-format-nick
- "*Function to format a nickname for message display."
+ "Function to format a nickname for message display."
:group 'erc-display
:type 'function)
(run-hooks 'erc-channel-members-changed-hook)))
(defcustom erc-channel-members-changed-hook nil
- "*This hook is called every time the variable `channel-members' changes.
+ "This hook is called every time the variable `channel-members' changes.
The buffer where the change happened is current while this hook is called."
:group 'erc-hooks
:type 'hook)
"Give information about the nickname at `point'.
If called interactively, give a human readable message in the
-minibuffer. If called programatically, return the corresponding
+minibuffer. If called programmatically, return the corresponding
entry of `channel-members'."
(interactive)
(require 'thingatpt)
(add-hook 'kill-buffer-hook 'erc-kill-buffer-function)
(defcustom erc-kill-server-hook '(erc-kill-server)
- "*Invoked whenever a server-buffer is killed via `kill-buffer'."
+ "Invoked whenever a server-buffer is killed via `kill-buffer'."
:group 'erc-hooks
:type 'hook)
(defcustom erc-kill-channel-hook '(erc-kill-channel)
- "*Invoked whenever a channel-buffer is killed via `kill-buffer'."
+ "Invoked whenever a channel-buffer is killed via `kill-buffer'."
:group 'erc-hooks
:type 'hook)
(defcustom erc-kill-buffer-hook nil
- "*Hook run whenever a non-server or channel buffer is killed.
+ "Hook run whenever a non-server or channel buffer is killed.
See also `kill-buffer'."
:group 'erc-hooks
;; indent-tabs-mode: t
;; tab-width: 8
;; End:
-