[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Erc-commit] [commit][emacs22] Fix several autoaway bugs and hack on int
From: |
mwolson |
Subject: |
[Erc-commit] [commit][emacs22] Fix several autoaway bugs and hack on internals. |
Date: |
Sun, 14 Oct 2007 00:48:27 -0400 |
commit aeaad2c2980570d539fc5d1dde45a267b62d962a
Author: Michael Olson <address@hidden>
Date: Sun Aug 20 03:42:00 2006 +0000
Fix several autoaway bugs and hack on internals.
* erc.el (erc-with-server-buffer): New macro that switches to the
current ERC server buffer and runs some code. If no server buffer
is available, return nil. This is a useful way to access
variables in the server buffer.
(erc-get-server-user, erc-add-server-user)
(erc-remove-server-user, erc-change-user-nickname)
(erc-get-server-nickname-list, erc-get-server-nickname-alist)
(erc-ison-p, erc-active-buffer, erc-cmd-IGNORE)
(erc-cmd-UNIGNORE, erc-cmd-IDLE, erc-cmd-NICK, erc-cmd-BANLIST)
(erc-cmd-MASSUNBAN, erc-nickname-in-use, erc-ignored-user-p)
(erc-format-channel-modes): Use it.
(erc-once-with-server-event, erc-once-with-server-event-global)
(erc-with-buffer, erc-with-all-buffers-of-server): Use make-symbol
instead of gensym.
(erc-open-server-buffer-p): New function that returns non-nil if
the given buffer is an ERC server buffer that has an open IRC
process.
(erc-with-buffer): Use buffer-live-p here to set a good example,
though it isn't really needed here.
(erc-away): Mention erc-away-time.
(erc): Don't propagate the erc-away setting, since it makes more
sense to access it from the server buffer.
(erc-cmd-GAWAY): Use erc-open-server-buffer-p instead of
erc-server-buffer-p so that only open connections are set away.
(erc-cmd-GQUIT): Use erc-open-server-buffer-p.
(erc-process-away): Docfix. Don't set erc-away in channel
buffers.
(erc-set-current-nick): Make this uniform with the style used in
erc-current-nick.
(erc-away-time): Rename from erc-away-p, since this is no longer a
boolean-style predicate.
(erc-format-away-status): Use it.
* erc-stamp.el (erc-add-timestamp): Use erc-away-time.
* erc-spelling.el (erc-spelling-init): Use erc-with-server-buffer.
* erc-speedbar.el (erc-speedbar-buttons): Use erc-server-buffer-p.
* erc-pcomplete.el (pcomplete/erc-mode/UNIGNORE)
(pcomplete-erc-all-nicks): Use erc-with-server-buffer.
* erc-notify.el (erc-notify-timer, erc-cmd-NOTIFY): Use
erc-with-server-buffer.
* erc-networks.el (erc-network, erc-current-network)
(erc-network-name): Use erc-with-server-buffer.
* erc-netsplit.el (erc-cmd-WHOLEFT): Use erc-with-server-buffer.
* erc-match.el (erc-log-matches, erc-log-matches-come-back): Use
erc-away-time.
* erc-log.el (log): Use erc-away-time. Remove unnecessary check.
* erc-list.el (erc-chanlist): Use erc-with-server-buffer.
* erc-ibuffer.el (erc-away): Use erc-away-time.
* erc-dcc.el (erc-dcc-get-filter): Temporarily make the buffer
read only instead of permanently doing so.
* erc-compat.el (erc-gensym, *erc-sym-counter*): Remove, since
Emacs Lisp has make-symbol, which is better.
* erc-chess.el (erc-chess-handler, erc-cmd-CHESS): Use
erc-with-server-buffer.
* erc-capab.el (capab-identify): Only deal with server buffers
that have an open IRC process.
(erc-capab-identify-add-prefix): Use erc-with-server-buffer.
* erc-backend.el (erc-server-connected): Docfix. Recommend the
`erc-server-process-alive' function.
(erc-coding-system-for-target): Supply a default target if one is
not given.
(erc-server-send): Simplify slightly.
(erc-call-hooks): Use erc-with-server-buffer.
* erc-autoaway.el (erc-autoaway-reestablish-idletimer): Move
higher to avoid an automatic load snafu.
(erc-autoaway-some-server-buffer): New function that returns an
ERC server buffer with a live connection, or nil otherwise.
(erc-autoaway-insinuate-maybe): New function that adds the
autoaway reset function to post-command-hook if at least one ERC
process is alive.
(erc-autoaway-remove-maybe): New function that removes the
autoaway reset function from post-command-hook if no ERC process
is alive.
(autoaway): Don't touch post-command-hook unless an IRC process is
already open. Remove our addition to post-command-hook as soon as
there are no more IRC processes open. Reset the indicators before
connecting to an IRC server, which fixes a bug when re-connecting.
(erc-autoaway-reset-idle-user): Call erc-autoaway-remove-maybe if
there are no more IRC processes open.
(erc-autoaway-set-back): Pick an open IRC process. Accept an
argument which is a function call if we can't find one.
(erc-autoaway-some-open-server-buffer): New function which returns
an ERC server buffer with an open connection and a user that is
not away.
(erc-autoaway-possibly-set-away, erc-autoaway-set-away): Use it.
(erc-autoaway-set-away): Accept a `notest' argument which is used
to avoid testing the same thing twice.
git-archimport-id: address@hidden/erc--main--0--patch-45
diff --git a/ChangeLog b/ChangeLog
index 820da01..8647850 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,109 @@
+2006-08-20 Michael Olson <address@hidden>
+
+ * erc.el (erc-with-server-buffer): New macro that switches to the
+ current ERC server buffer and runs some code. If no server buffer
+ is available, return nil. This is a useful way to access
+ variables in the server buffer.
+ (erc-get-server-user, erc-add-server-user)
+ (erc-remove-server-user, erc-change-user-nickname)
+ (erc-get-server-nickname-list, erc-get-server-nickname-alist)
+ (erc-ison-p, erc-active-buffer, erc-cmd-IGNORE)
+ (erc-cmd-UNIGNORE, erc-cmd-IDLE, erc-cmd-NICK, erc-cmd-BANLIST)
+ (erc-cmd-MASSUNBAN, erc-nickname-in-use, erc-ignored-user-p)
+ (erc-format-channel-modes): Use it.
+ (erc-once-with-server-event, erc-once-with-server-event-global)
+ (erc-with-buffer, erc-with-all-buffers-of-server): Use make-symbol
+ instead of gensym.
+ (erc-open-server-buffer-p): New function that returns non-nil if
+ the given buffer is an ERC server buffer that has an open IRC
+ process.
+ (erc-with-buffer): Use buffer-live-p here to set a good example,
+ though it isn't really needed here.
+ (erc-away): Mention erc-away-time.
+ (erc): Don't propagate the erc-away setting, since it makes more
+ sense to access it from the server buffer.
+ (erc-cmd-GAWAY): Use erc-open-server-buffer-p instead of
+ erc-server-buffer-p so that only open connections are set away.
+ (erc-cmd-GQUIT): Use erc-open-server-buffer-p.
+ (erc-process-away): Docfix. Don't set erc-away in channel
+ buffers.
+ (erc-set-current-nick): Make this uniform with the style used in
+ erc-current-nick.
+ (erc-away-time): Rename from erc-away-p, since this is no longer a
+ boolean-style predicate.
+ (erc-format-away-status): Use it.
+
+ * erc-stamp.el (erc-add-timestamp): Use erc-away-time.
+
+ * erc-spelling.el (erc-spelling-init): Use erc-with-server-buffer.
+
+ * erc-speedbar.el (erc-speedbar-buttons): Use erc-server-buffer-p.
+
+ * erc-pcomplete.el (pcomplete/erc-mode/UNIGNORE)
+ (pcomplete-erc-all-nicks): Use erc-with-server-buffer.
+
+ * erc-notify.el (erc-notify-timer, erc-cmd-NOTIFY): Use
+ erc-with-server-buffer.
+
+ * erc-networks.el (erc-network, erc-current-network)
+ (erc-network-name): Use erc-with-server-buffer.
+
+ * erc-netsplit.el (erc-cmd-WHOLEFT): Use erc-with-server-buffer.
+
+ * erc-match.el (erc-log-matches, erc-log-matches-come-back): Use
+ erc-away-time.
+
+ * erc-log.el (log): Use erc-away-time. Remove unnecessary check.
+
+ * erc-list.el (erc-chanlist): Use erc-with-server-buffer.
+
+ * erc-ibuffer.el (erc-away): Use erc-away-time.
+
+ * erc-dcc.el (erc-dcc-get-filter): Temporarily make the buffer
+ read only instead of permanently doing so.
+
+ * erc-compat.el (erc-gensym, *erc-sym-counter*): Remove, since
+ Emacs Lisp has make-symbol, which is better.
+
+ * erc-chess.el (erc-chess-handler, erc-cmd-CHESS): Use
+ erc-with-server-buffer.
+
+ * erc-capab.el (capab-identify): Only deal with server buffers
+ that have an open IRC process.
+ (erc-capab-identify-add-prefix): Use erc-with-server-buffer.
+
+ * erc-backend.el (erc-server-connected): Docfix. Recommend the
+ `erc-server-process-alive' function.
+ (erc-coding-system-for-target): Supply a default target if one is
+ not given.
+ (erc-server-send): Simplify slightly.
+ (erc-call-hooks): Use erc-with-server-buffer.
+
+ * erc-autoaway.el (erc-autoaway-reestablish-idletimer): Move
+ higher to avoid an automatic load snafu.
+ (erc-autoaway-some-server-buffer): New function that returns an
+ ERC server buffer with a live connection, or nil otherwise.
+ (erc-autoaway-insinuate-maybe): New function that adds the
+ autoaway reset function to post-command-hook if at least one ERC
+ process is alive.
+ (erc-autoaway-remove-maybe): New function that removes the
+ autoaway reset function from post-command-hook if no ERC process
+ is alive.
+ (autoaway): Don't touch post-command-hook unless an IRC process is
+ already open. Remove our addition to post-command-hook as soon as
+ there are no more IRC processes open. Reset the indicators before
+ connecting to an IRC server, which fixes a bug when re-connecting.
+ (erc-autoaway-reset-idle-user): Call erc-autoaway-remove-maybe if
+ there are no more IRC processes open.
+ (erc-autoaway-set-back): Pick an open IRC process. Accept an
+ argument which is a function call if we can't find one.
+ (erc-autoaway-some-open-server-buffer): New function which returns
+ an ERC server buffer with an open connection and a user that is
+ not away.
+ (erc-autoaway-possibly-set-away, erc-autoaway-set-away): Use it.
+ (erc-autoaway-set-away): Accept a `notest' argument which is used
+ to avoid testing the same thing twice.
+
2006-08-20 Diane Murray <address@hidden>
* erc-backend.el (erc-process-sentinel-1): Doc fix. Let
diff --git a/erc-autoaway.el b/erc-autoaway.el
index 4614bd7..af6f84b 100644
--- a/erc-autoaway.el
+++ b/erc-autoaway.el
@@ -40,6 +40,42 @@ yourself back when you type something."
"The Emacs idletimer.
This is only used when `erc-autoaway-use-emacs-idle' is non-nil.")
+(eval-when-compile (defvar erc-autoaway-idle-seconds))
+
+(defun erc-autoaway-reestablish-idletimer ()
+ "Reestablish the emacs idletimer.
+If `erc-autoaway-idle-method' is 'emacs, you must call this
+function each time you change `erc-autoaway-idle-seconds'."
+ (interactive)
+ (when erc-autoaway-idletimer
+ (erc-cancel-timer erc-autoaway-idletimer))
+ (setq erc-autoaway-idletimer
+ (run-with-idle-timer erc-autoaway-idle-seconds
+ t
+ 'erc-autoaway-set-away
+ erc-autoaway-idle-seconds)))
+
+(defun erc-autoaway-some-server-buffer ()
+ "Return some ERC server buffer if its connection is alive.
+If none is found, return nil."
+ (car (erc-buffer-list #'erc-open-server-buffer-p)))
+
+(defun erc-autoaway-insinuate-maybe (&optional server &rest ignored)
+ "Add autoaway reset function to `post-command-hook' if at least one
+ERC process is alive.
+
+This is used when `erc-autoaway-idle-method' is 'user."
+ (when (or server (erc-autoaway-some-server-buffer))
+ (add-hook 'post-command-hook 'erc-autoaway-reset-idle-user)))
+
+(defun erc-autoaway-remove-maybe (&rest ignored)
+ "Remove the autoaway reset function from `post-command-hook' if
+no ERC process is alive.
+
+This is used when `erc-autoaway-idle-method' is 'user."
+ (unless (erc-autoaway-some-server-buffer)
+ (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user)))
+
;;;###autoload (autoload 'erc-autoaway-mode "erc-autoaway")
(define-erc-module autoaway nil
"In ERC autoaway mode, you can be set away automatically.
@@ -65,24 +101,31 @@ set you no longer away.
Related variables: `erc-public-away-p' and `erc-away-nickname'."
;; Enable:
((when (boundp 'erc-autoaway-idle-method)
+ (add-hook 'erc-connect-pre-hook 'erc-autoaway-reset-indicators)
+ (setq erc-autoaway-last-sent-time (erc-current-time))
(cond
((eq erc-autoaway-idle-method 'irc)
(add-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc)
(add-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc))
((eq erc-autoaway-idle-method 'user)
- (add-hook 'post-command-hook 'erc-autoaway-reset-idle-user))
+ (add-hook 'erc-after-connect 'erc-autoaway-insinuate-maybe)
+ (add-hook 'erc-disconnected-hook 'erc-autoaway-remove-maybe)
+ (erc-autoaway-insinuate-maybe))
((eq erc-autoaway-idle-method 'emacs)
(erc-autoaway-reestablish-idletimer)))
(add-hook 'erc-timer-hook 'erc-autoaway-possibly-set-away)
(add-hook 'erc-server-305-functions 'erc-autoaway-reset-indicators)))
;; Disable:
((when (boundp 'erc-autoaway-idle-method)
+ (remove-hook 'erc-connect-pre-hook 'erc-autoaway-reset-indicators)
(cond
((eq erc-autoaway-idle-method 'irc)
(remove-hook 'erc-send-completed-hook 'erc-autoaway-reset-idle-irc)
(remove-hook 'erc-server-001-functions 'erc-autoaway-reset-idle-irc))
((eq erc-autoaway-idle-method 'user)
- (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user))
+ (remove-hook 'post-command-hook 'erc-autoaway-reset-idle-user)
+ (remove-hook 'erc-after-connect 'erc-autoaway-insinuate-maybe)
+ (remove-hook 'erc-disconnected-hook 'erc-autoaway-remove-maybe))
((eq erc-autoaway-idle-method 'emacs)
(erc-cancel-timer erc-autoaway-idletimer)
(setq erc-autoaway-idletimer nil)))
@@ -133,21 +176,6 @@ See `erc-auto-discard-away'."
:group 'erc-autoaway
:type 'regexp)
-(eval-when-compile (defvar erc-autoaway-idle-seconds))
-
-(defun erc-autoaway-reestablish-idletimer ()
- "Reestablish the emacs idletimer.
-If `erc-autoaway-idle-method' is 'emacs, you must call this
-function each time you change `erc-autoaway-idle-seconds'."
- (interactive)
- (when erc-autoaway-idletimer
- (erc-cancel-timer erc-autoaway-idletimer))
- (setq erc-autoaway-idletimer
- (run-with-idle-timer erc-autoaway-idle-seconds
- t
- 'erc-autoaway-set-away
- erc-autoaway-idle-seconds)))
-
(defcustom erc-autoaway-idle-seconds 1800
"*Number of seconds after which ERC will set you automatically away.
If you are changing this variable using lisp instead of customizing it,
@@ -179,7 +207,7 @@ user's away status.")
This is one global variable since a user talking on one net can
talk on another net too."
(when erc-auto-discard-away
- (erc-autoaway-set-back))
+ (erc-autoaway-set-back #'erc-autoaway-remove-maybe))
(setq erc-autoaway-last-sent-time (erc-current-time)))
(defun erc-autoaway-reset-idle-irc (line &rest stuff)
@@ -192,12 +220,24 @@ talk on another net too."
(erc-autoaway-set-back))
(setq erc-autoaway-last-sent-time (erc-current-time)))
-(defun erc-autoaway-set-back ()
- "Discard the away state globally."
- (let ((server-buffer (car (erc-buffer-list #'erc-server-buffer-p))))
- (when (and erc-autoaway-caused-away
- (with-current-buffer server-buffer (erc-away-p)))
- (erc-cmd-GAWAY ""))))
+(defun erc-autoaway-set-back (&optional none-alive-func)
+ "Discard the away state globally.
+
+NONE-ALIVE-FUNC is the function to call if no ERC processes are alive."
+ (let ((server-buffer (erc-autoaway-some-server-buffer)))
+ (if (and erc-autoaway-caused-away
+ (buffer-live-p server-buffer)
+ (with-current-buffer server-buffer erc-away))
+ (erc-cmd-GAWAY "")
+ (when none-alive-func (funcall none-alive-func)))))
+
+(defun erc-autoaway-some-open-server-buffer ()
+ "Return some ERC server buffer if its connection is alive and the
+user is not away.
+If none is found, return nil."
+ (car (erc-buffer-list (lambda ()
+ (and (erc-open-server-buffer-p)
+ (not erc-away))))))
(defun erc-autoaway-possibly-set-away (current-time)
"Set autoaway when `erc-auto-set-away' is true and the idletime is
@@ -206,7 +246,7 @@ exceeds `erc-autoaway-idle-seconds'."
;; 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-away-p)))
+ (erc-autoaway-some-open-server-buffer))
(let ((idle-time (erc-time-diff erc-autoaway-last-sent-time
current-time)))
(when (>= idle-time erc-autoaway-idle-seconds)
@@ -214,15 +254,17 @@ exceeds `erc-autoaway-idle-seconds'."
nil 'notice nil
(format "Setting automatically away after %i seconds of idle-time"
idle-time))
- (erc-autoaway-set-away idle-time)))))
+ (erc-autoaway-set-away idle-time t)))))
+
+(defun erc-autoaway-set-away (idle-time &optional notest)
+ "Set the away state globally.
-(defun erc-autoaway-set-away (idle-time)
- "Set the away state globally."
+If NOTEST is specified, do not check to see whether there is an
+activer server buffer available."
;; Note that the idle timer runs, even when Emacs is inactive. In
;; order to prevent flooding when we connect, we test for an
;; existing process.
- (when (and (erc-server-process-alive)
- (not (erc-away-p)))
+ (when (or notest (erc-autoaway-some-open-server-buffer))
(setq erc-autoaway-caused-away t)
(erc-cmd-GAWAY (format erc-autoaway-message idle-time))))
diff --git a/erc-backend.el b/erc-backend.el
index 30ab523..bedddea 100644
--- a/erc-backend.el
+++ b/erc-backend.el
@@ -178,8 +178,11 @@ WALLCHOPS - supports sending messages to all operators in
a channel")
"Mapping of server buffers to their specific ping timer.")
(defvar erc-server-connected nil
- "Non-nil if the `current-buffer' is associated with an open IRC connection.
-This variable is buffer-local.")
+ "Non-nil if the current buffer has been used by ERC to establish
+an IRC connection.
+
+If you wish to determine whether an IRC connection is currently
+active, use the `erc-server-process-alive' function instead.")
(make-variable-buffer-local 'erc-server-connected)
(defvar erc-server-quitting nil
@@ -599,6 +602,7 @@ EVENT is the message received from the closed connection
process."
"Return the coding system or cons cell appropriate for TARGET.
This is determined via `erc-encoding-coding-alist' or
`erc-server-coding-system'."
+ (unless target (setq target (erc-default-target)))
(or (when target
(let ((case-fold-search t))
(catch 'match
@@ -644,14 +648,11 @@ See `erc-server-flood-margin' for an explanation of the
flood
protection algorithm."
(erc-log (concat "erc-server-send: " string "(" (buffer-name) ")"))
(setq erc-server-last-sent-time (erc-current-time))
- (let ((buf (erc-server-buffer))
- (encoding (erc-coding-system-for-target
- (or target (erc-default-target)))))
+ (let ((encoding (erc-coding-system-for-target target)))
(when (consp encoding)
(setq encoding (car encoding)))
- (if (and buf
- (erc-server-process-alive))
- (with-current-buffer buf
+ (if (erc-server-process-alive)
+ (erc-with-server-buffer
(let ((str (concat string "\r\n")))
(if forcep
(progn
@@ -891,10 +892,8 @@ Finds hooks by looking in the `erc-server-responses'
hashtable."
(let ((hook (or (erc-get-hook (erc-response.command message))
'erc-default-server-functions)))
(run-hook-with-args-until-success hook process message)
- (let ((server-buffer (erc-server-buffer)))
- (when (buffer-live-p server-buffer)
- (with-current-buffer server-buffer
- (run-hook-with-args 'erc-timer-hook (erc-current-time)))))))
+ (erc-with-server-buffer
+ (run-hook-with-args 'erc-timer-hook (erc-current-time)))))
(add-hook 'erc-default-server-functions 'erc-handle-unknown-server-response)
diff --git a/erc-capab.el b/erc-capab.el
index 7f59cd8..6155172 100644
--- a/erc-capab.el
+++ b/erc-capab.el
@@ -96,7 +96,7 @@
(mapc (lambda (buffer)
(when buffer
(with-current-buffer buffer (erc-capab-identify-setup))))
- (erc-buffer-list 'erc-server-buffer-p)))
+ (erc-buffer-list 'erc-open-server-buffer-p)))
((remove-hook 'erc-server-005-functions 'erc-capab-identify-setup)
(remove-hook 'erc-server-290-functions 'erc-capab-identify-activate)
;; we don't remove the `erc-capab-identify-remove/set-identified-flag' hooks
@@ -173,8 +173,7 @@ PARSED is an `erc-parsed' response struct."
(defun erc-capab-identify-add-prefix ()
"Add `erc-capab-identify-prefix' to nickname if user is unidentified."
(when (and erc-capab-identify-prefix
- (with-current-buffer (erc-server-buffer)
- erc-capab-identify-activated))
+ (erc-with-server-buffer erc-capab-identify-activated))
(goto-char (point-min))
(goto-char (or (erc-capab-find-parsed) (point-min)))
(let ((nickname (erc-capab-get-unidentified-nickname
diff --git a/erc-chess.el b/erc-chess.el
index f79cf7f..fc61bdc 100644
--- a/erc-chess.el
+++ b/erc-chess.el
@@ -91,12 +91,10 @@ This is the main handler for the erc-chess module."
((eq event 'send)
;; Transmit the string given in `(car args)' to the nick
;; saved in `erc-chess-partner'.
- (let ((buf (process-buffer erc-server-process))
- (nick erc-chess-partner)
+ (let ((nick erc-chess-partner)
(msg (substring (car args) 0 (1- (length (car args))))))
- (when (buffer-live-p buf)
- (with-current-buffer buf
- (erc-send-ctcp-message nick (concat "CHESS " msg) t)))))
+ (erc-with-server-buffer
+ (erc-send-ctcp-message nick (concat "CHESS " msg) t))))
(t
(cond
@@ -109,7 +107,7 @@ This is the main handler for the erc-chess module."
(let* ((buf (process-buffer erc-server-process))
(nick (erc-downcase erc-chess-partner))
(engine (current-buffer)))
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(let ((elt (assoc nick erc-chess-alist)))
(when (and elt (eq (nth 1 elt) engine))
(message "Removed from erc-chess-alist in destroy event")
@@ -144,7 +142,7 @@ NICK should be the first and only arg to /chess"
(cond
((string-match (concat "^\\s-*\\(" erc-valid-nick-regexp "\\)\\s-*$") line)
(let ((nick (match-string 1 line)))
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(if (assoc (erc-downcase nick) erc-chess-alist)
;; Maybe check for correctly connected game, and switch here.
(erc-display-message
diff --git a/erc-compat.el b/erc-compat.el
index ee9bf89..2d2e790 100644
--- a/erc-compat.el
+++ b/erc-compat.el
@@ -386,14 +386,6 @@ avoid corrupting the original SEQ."
(setq newseq (cons el newseq))))
(nreverse newseq)))
-;; Provide a simpler replacement for `gensym'.
-(defvar *erc-sym-counter* 0)
-(defun erc-gensym ()
- "Generate a new uninterned symbol."
- (let ((num (prog1 *erc-sym-counter*
- (setq *erc-sym-counter* (1+ *erc-sym-counter*)))))
- (make-symbol (format "*erc-sym-%d*" num))))
-
;; Copied from cl-extra.el
(defun erc-subseq (seq start &optional end)
"Return the subsequence of SEQ from START to END.
diff --git a/erc-dcc.el b/erc-dcc.el
index cf86205..82a8759 100644
--- a/erc-dcc.el
+++ b/erc-dcc.el
@@ -861,29 +861,29 @@ buffer, and sends back the replies after each block of
data per the DCC
protocol spec. Well not really. We write back a reply after each read,
rather than every 1024 byte block, but nobody seems to care."
(with-current-buffer (process-buffer proc)
- (setq buffer-read-only nil) ;; FIXME
- (goto-char (point-max))
- (insert (string-make-unibyte str))
-
- (setq erc-dcc-byte-count (+ (length str) erc-dcc-byte-count))
- (erc-assert (= erc-dcc-byte-count (1- (point-max))))
- (and erc-verbose-dcc
- (erc-display-message
- nil 'notice erc-server-process
- 'dcc-get-bytes-received
- ?f (file-name-nondirectory buffer-file-name)
- ?b (number-to-string erc-dcc-byte-count)))
- (cond
- ((and (> (plist-get erc-dcc-entry-data :size) 0)
- (> erc-dcc-byte-count (plist-get erc-dcc-entry-data :size)))
- (erc-display-message
- nil '(error notice) 'active
- 'dcc-get-file-too-long
- ?f (file-name-nondirectory buffer-file-name))
- (delete-process proc))
- (t
- (process-send-string
- proc (erc-pack-int erc-dcc-byte-count 4))))))
+ (let ((inhibit-read-only t))
+ (goto-char (point-max))
+ (insert (string-make-unibyte str))
+
+ (setq erc-dcc-byte-count (+ (length str) erc-dcc-byte-count))
+ (erc-assert (= erc-dcc-byte-count (1- (point-max))))
+ (and erc-verbose-dcc
+ (erc-display-message
+ nil 'notice erc-server-process
+ 'dcc-get-bytes-received
+ ?f (file-name-nondirectory buffer-file-name)
+ ?b (number-to-string erc-dcc-byte-count)))
+ (cond
+ ((and (> (plist-get erc-dcc-entry-data :size) 0)
+ (> erc-dcc-byte-count (plist-get erc-dcc-entry-data :size)))
+ (erc-display-message
+ nil '(error notice) 'active
+ 'dcc-get-file-too-long
+ ?f (file-name-nondirectory buffer-file-name))
+ (delete-process proc))
+ (t
+ (process-send-string
+ proc (erc-pack-int erc-dcc-byte-count 4)))))))
(defun erc-dcc-get-sentinel (proc event)
diff --git a/erc-ibuffer.el b/erc-ibuffer.el
index a122908..8255b4b 100644
--- a/erc-ibuffer.el
+++ b/erc-ibuffer.el
@@ -127,8 +127,7 @@
(define-ibuffer-column erc-away (:name "A")
(if (and (boundp 'erc-server-process)
(processp erc-server-process)
- (with-current-buffer (process-buffer erc-server-process)
- erc-away))
+ (erc-away-time))
"A"
" "))
diff --git a/erc-list.el b/erc-list.el
index 2243a2f..fe83967 100644
--- a/erc-list.el
+++ b/erc-list.el
@@ -188,7 +188,7 @@ available channel)."
Please note that this function only works with IRC servers which conform
to RFC and send the LIST header (#321) at start of list transmission."
(interactive)
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(erc-once-with-server-event
321
'(progn
diff --git a/erc-log.el b/erc-log.el
index 19e7205..e1b47c8 100644
--- a/erc-log.el
+++ b/erc-log.el
@@ -205,7 +205,7 @@ also be a predicate function. To only log when you are not
set away, use:
\(setq erc-enable-logging
(lambda (buffer)
(with-current-buffer buffer
- (not erc-away))))"
+ (null (erc-away-time)))))"
;; enable
((when erc-log-write-after-insert
(add-hook 'erc-insert-post-hook 'erc-save-buffer-in-logs))
@@ -218,8 +218,7 @@ also be a predicate function. To only log when you are not
set away, use:
;; append, so that 'erc-initialize-log-marker runs first
(add-hook 'erc-connect-pre-hook 'erc-log-setup-logging 'append)
(dolist (buffer (erc-buffer-list))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer (erc-log-setup-logging)))))
+ (with-current-buffer buffer (erc-log-setup-logging))))
;; disable
((remove-hook 'erc-insert-post-hook 'erc-save-buffer-in-logs)
(remove-hook 'erc-send-post-hook 'erc-save-buffer-in-logs)
@@ -229,8 +228,7 @@ also be a predicate function. To only log when you are not
set away, use:
(remove-hook 'erc-part-hook 'erc-conditional-save-buffer)
(remove-hook 'erc-connect-pre-hook 'erc-log-setup-logging)
(dolist (buffer (erc-buffer-list))
- (when (buffer-live-p buffer)
- (with-current-buffer buffer (erc-log-disable-logging))))))
+ (with-current-buffer buffer (erc-log-disable-logging)))))
(define-key erc-mode-map "\C-c\C-l" 'erc-save-buffer-in-logs)
diff --git a/erc-match.el b/erc-match.el
index 8d19099..5cc8eca 100644
--- a/erc-match.el
+++ b/erc-match.el
@@ -540,7 +540,7 @@ deactivate/activate match logging in the latter. See
(when (and
(or (eq erc-log-matches-flag t)
(and (eq erc-log-matches-flag 'away)
- erc-away))
+ (erc-away-time)))
match-buffer-name)
(let ((line (format-spec erc-log-match-format
(format-spec-make
@@ -572,7 +572,7 @@ deactivate/activate match logging in the latter. See
(defun erc-log-matches-come-back (proc parsed)
"Display a notice that messages were logged while away."
- (when (and erc-away
+ (when (and (erc-away-time)
(eq erc-log-matches-flag 'away))
(mapc
(lambda (match-type)
@@ -583,7 +583,7 @@ deactivate/activate match logging in the latter. See
(with-current-buffer buffer
(get-text-property (1- (point-max))
'timestamp))))
- (away-time (erc-emacs-time-to-erc-time erc-away)))
+ (away-time (erc-emacs-time-to-erc-time (erc-away-time))))
(when (and away-time last-msg-time
(erc-time-gt last-msg-time away-time))
(erc-display-message
diff --git a/erc-netsplit.el b/erc-netsplit.el
index 02fbe96..4e30df9 100644
--- a/erc-netsplit.el
+++ b/erc-netsplit.el
@@ -184,7 +184,7 @@ join from that split has been detected or not.")
;;;###autoload
(defun erc-cmd-WHOLEFT ()
"Show who's gone."
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(if (null erc-netsplit-list)
(erc-display-message
nil 'notice 'active
diff --git a/erc-networks.el b/erc-networks.el
index b79a56a..387ddbb 100644
--- a/erc-networks.el
+++ b/erc-networks.el
@@ -733,12 +733,12 @@ search for a match in `erc-networks-alist'."
(defun erc-network ()
"Return the value of `erc-network' for the current server."
- (with-current-buffer (erc-server-buffer) erc-network))
+ (erc-with-server-buffer erc-network))
(defun erc-current-network ()
"Deprecated. Use `erc-network' instead. Return the name of this server's
network as a symbol."
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(intern (downcase (symbol-name erc-network)))))
(erc-make-obsolete 'erc-current-network 'erc-network
@@ -746,7 +746,7 @@ network as a symbol."
(defun erc-network-name ()
"Returns the name of the current network as a string."
- (with-current-buffer (erc-server-buffer) (symbol-name erc-network)))
+ (erc-with-server-buffer (symbol-name erc-network)))
(defun erc-set-network-name (proc parsed)
"Set `erc-network' to the value returned by `erc-determine-network'."
diff --git a/erc-notify.el b/erc-notify.el
index 1d2bdbd..1c9fc99 100644
--- a/erc-notify.el
+++ b/erc-notify.el
@@ -121,8 +121,7 @@ changes."
(ison-list (delete "" (split-string
(erc-response.contents parsed))))
(new-list ison-list)
- (old-list (with-current-buffer (erc-server-buffer)
- erc-last-ison)))
+ (old-list (erc-with-server-buffer erc-last-ison)))
(while new-list
(when (not (erc-member-ignore-case (car new-list) old-list))
(run-hook-with-args 'erc-notify-signon-hook server (car new-list))
@@ -204,7 +203,7 @@ with args, toggle notify status of people."
(cond
((null args)
;; Print current notificated people (online)
- (let ((ison (with-current-buffer (erc-server-buffer) erc-last-ison)))
+ (let ((ison (erc-with-server-buffer erc-last-ison)))
(if (not ison)
(erc-display-message
nil 'notice 'active "No ison-list yet!")
diff --git a/erc-pcomplete.el b/erc-pcomplete.el
index efe2a18..31de8a4 100644
--- a/erc-pcomplete.el
+++ b/erc-pcomplete.el
@@ -180,7 +180,7 @@ the most recent speakers are listed first."
(while (pcomplete-here (pcomplete-erc-nicks))))
(defun pcomplete/erc-mode/UNIGNORE ()
- (pcomplete-here (with-current-buffer (erc-server-buffer) erc-ignore-list)))
+ (pcomplete-here (erc-with-server-buffer erc-ignore-list)))
;;; Functions that provide possible completions.
@@ -233,7 +233,7 @@ If optional argument IGNORE-SELF is non-nil, don't return
the current nick."
(defun pcomplete-erc-all-nicks (&optional postfix)
"Returns a list of all nicks on the current server."
(let (nicks)
- (with-current-buffer (process-buffer erc-server-process)
+ (erc-with-server-buffer
(maphash (lambda (nick user)
(setq nicks (cons (concat nick postfix) nicks)))
erc-server-users))
diff --git a/erc-speedbar.el b/erc-speedbar.el
index 254d7fc..2de2c57 100644
--- a/erc-speedbar.el
+++ b/erc-speedbar.el
@@ -113,7 +113,7 @@ This will add a speedbar major display mode."
(erase-buffer)
(let (serverp chanp queryp)
(with-current-buffer buffer
- (setq serverp (eq buffer (process-buffer erc-server-process)))
+ (setq serverp (erc-server-buffer-p))
(setq chanp (erc-channel-p (erc-default-target)))
(setq queryp (erc-query-buffer-p)))
(cond (serverp
diff --git a/erc-spelling.el b/erc-spelling.el
index ed49758..d2e61e8 100644
--- a/erc-spelling.el
+++ b/erc-spelling.el
@@ -71,11 +71,7 @@ name here."
(setq ispell-local-dictionary
(if dicts
(cadr (car dicts))
- (let ((server (erc-server-buffer)))
- (if server
- (with-current-buffer server
- ispell-local-dictionary)
- nil))))))
+ (erc-with-server-buffer ispell-local-dictionary)))))
(setq flyspell-generic-check-word-p 'erc-spelling-flyspell-verify)
(flyspell-mode 1))
diff --git a/erc-stamp.el b/erc-stamp.el
index 5d43baa..7d8684a 100644
--- a/erc-stamp.el
+++ b/erc-stamp.el
@@ -147,7 +147,7 @@ or `erc-send-modify-hook'."
(error "Timestamp function unbound"))
(when (and (fboundp erc-insert-away-timestamp-function)
erc-away-timestamp-format
- (with-current-buffer (erc-server-buffer) erc-away)
+ (erc-away-time)
(not erc-timestamp-format))
(funcall erc-insert-away-timestamp-function
(erc-format-timestamp ct erc-away-timestamp-format)))
diff --git a/erc.el b/erc.el
index a3a557b..a7952f4 100644
--- a/erc.el
+++ b/erc.el
@@ -357,6 +357,17 @@ nicknames with erc-server-user struct instances.")
(cdr (assq (aref s (match-beginning 0)) c)))))
s))
+(defmacro erc-with-server-buffer (&rest body)
+ "Execute BODY in the current ERC server buffer.
+If no server buffer exists, return nil."
+ (let ((buffer (make-symbol "buffer")))
+ `(let ((,buffer (erc-server-buffer)))
+ (when (buffer-live-p ,buffer)
+ (with-current-buffer ,buffer
+ ,@body)))))
+(put 'erc-with-server-buffer 'lisp-indent-function 0)
+(put 'erc-with-server-buffer 'edebug-form-spec '(body))
+
(defstruct (erc-server-user (:type vector) :named)
;; User data
nickname host login full-name info
@@ -383,14 +394,14 @@ in the current buffer's `erc-channel-users' hash table."
(defsubst erc-get-server-user (nick)
"Finds the USER corresponding to NICK in the current server's
`erc-server-users' hash table."
- (with-current-buffer (process-buffer erc-server-process)
+ (erc-with-server-buffer
(gethash (erc-downcase nick) erc-server-users)))
(defsubst erc-add-server-user (nick user)
"This function is for internal use only.
Adds USER with nickname NICK to the `erc-server-users' hash table."
- (with-current-buffer (process-buffer erc-server-process)
+ (erc-with-server-buffer
(puthash (erc-downcase nick) user erc-server-users)))
(defsubst erc-remove-server-user (nick)
@@ -401,7 +412,7 @@ hash table. This user is not removed from the
`erc-channel-users' lists of other buffers.
See also: `erc-remove-user'."
- (with-current-buffer (process-buffer erc-server-process)
+ (erc-with-server-buffer
(remhash (erc-downcase nick) erc-server-users)))
(defun erc-change-user-nickname (user new-nick)
@@ -412,7 +423,7 @@ Changes the nickname of USER to NEW-NICK in the
other buffers are also changed."
(let ((nick (erc-server-user-nickname user)))
(setf (erc-server-user-nickname user) new-nick)
- (with-current-buffer (process-buffer erc-server-process)
+ (erc-with-server-buffer
(remhash (erc-downcase nick) erc-server-users)
(puthash (erc-downcase new-nick) user erc-server-users))
(dolist (buf (erc-server-user-buffers user))
@@ -505,16 +516,15 @@ See also: `erc-sort-channel-users-by-activity'"
(defun erc-get-server-nickname-list ()
"Returns a list of known nicknames on the current server."
- (if (erc-server-process-alive)
- (with-current-buffer (erc-server-buffer)
- (let (nicks)
- (when (hash-table-p erc-server-users)
- (maphash (lambda (n user)
- (setq nicks
- (cons (erc-server-user-nickname user)
- nicks)))
- erc-server-users)
- nicks)))))
+ (erc-with-server-buffer
+ (let (nicks)
+ (when (hash-table-p erc-server-users)
+ (maphash (lambda (n user)
+ (setq nicks
+ (cons (erc-server-user-nickname user)
+ nicks)))
+ erc-server-users)
+ nicks))))
(defun erc-get-channel-nickname-list ()
"Returns a list of known nicknames on the current channel."
@@ -529,16 +539,15 @@ See also: `erc-sort-channel-users-by-activity'"
(defun erc-get-server-nickname-alist ()
"Returns an alist of known nicknames on the current server."
- (if (erc-server-process-alive)
- (with-current-buffer (erc-server-buffer)
- (let (nicks)
- (when (hash-table-p erc-server-users)
- (maphash (lambda (n user)
- (setq nicks
- (cons (cons (erc-server-user-nickname user) nil)
- nicks)))
- erc-server-users)
- nicks)))))
+ (erc-with-server-buffer
+ (let (nicks)
+ (when (hash-table-p erc-server-users)
+ (maphash (lambda (n user)
+ (setq nicks
+ (cons (cons (erc-server-user-nickname user) nil)
+ nicks)))
+ erc-server-users)
+ nicks))))
(defun erc-get-channel-nickname-alist ()
"Returns an alist of known nicknames on the current channel."
@@ -1271,7 +1280,7 @@ capabilities."
(unless (erc-server-buffer-p)
(error
"You should only run `erc-once-with-server-event' in a server buffer"))
- (let ((fun (erc-gensym))
+ (let ((fun (make-symbol "fun"))
(hook (erc-get-hook event)))
(put fun 'erc-original-buffer (current-buffer))
(fset fun `(lambda (proc parsed)
@@ -1294,7 +1303,7 @@ not be run.
When FORMS execute, the current buffer is the server buffer associated with the
connection over which the data was received that triggered EVENT."
- (let ((fun (erc-gensym))
+ (let ((fun (make-symbol "fun"))
(hook (erc-get-hook event)))
(fset fun `(lambda (proc parsed)
(remove-hook ',hook ',fun)
@@ -1329,6 +1338,14 @@ If BUFFER is nil, the current buffer is used."
(and (eq major-mode 'erc-mode)
(null (erc-default-target)))))
+(defun erc-open-server-buffer-p (&optional buffer)
+ "Return non-nil if argument BUFFER is an ERC server buffer that
+has an open IRC process.
+
+If BUFFER is nil, the current buffer is used."
+ (and (erc-server-buffer-p)
+ (erc-server-process-alive)))
+
(defun erc-query-buffer-p (&optional buffer)
"Return non-nil if BUFFER is an ERC query buffer.
If BUFFER is nil, the current buffer is used."
@@ -1341,7 +1358,7 @@ If BUFFER is nil, the current buffer is used."
(defun erc-ison-p (nick)
"Return non-nil if NICK is online."
(interactive "sNick: ")
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(let ((erc-online-p 'unknown))
(erc-once-with-server-event
303
@@ -1391,7 +1408,7 @@ server buffer")
(defun erc-active-buffer ()
"Return the value of `erc-active-buffer' for the current server.
Defaults to the server buffer."
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(if (buffer-live-p erc-active-buffer)
erc-active-buffer
(setq erc-active-buffer (current-buffer)))))
@@ -1573,10 +1590,10 @@ See `erc-get-buffer' for details.
See also `with-current-buffer'.
\(fn (TARGET [PROCESS]) BODY...)"
- (let ((buf (erc-gensym))
- (proc (erc-gensym))
- (target (erc-gensym))
- (process (erc-gensym)))
+ (let ((buf (make-symbol "buf"))
+ (proc (make-symbol "proc"))
+ (target (make-symbol "target"))
+ (process (make-symbol "process")))
`(let* ((,target ,(car spec))
(,process ,(cadr spec))
(,buf (if (bufferp ,target)
@@ -1586,7 +1603,7 @@ See also `with-current-buffer'.
erc-server-process))))
(if (and ,target ,proc)
(erc-get-buffer ,target ,proc))))))
- (when ,buf
+ (when (buffer-live-p ,buf)
(with-current-buffer ,buf
,@body)))))
(put 'erc-with-buffer 'lisp-indent-function 1)
@@ -1641,8 +1658,8 @@ FORMS will be evaluated in all buffers having the process
PROCESS and
where PRED matches or in all buffers of the server process if PRED is
nil."
;; Make the evaluation have the correct order
- (let ((pre (erc-gensym))
- (pro (erc-gensym)))
+ (let ((pre (make-symbol "pre"))
+ (pro (make-symbol "pro")))
`(let ((,pro ,process)
(,pre ,pred))
(mapcar (lambda (buffer)
@@ -1722,7 +1739,10 @@ all channel buffers on all servers."
(make-variable-buffer-local 'erc-invitation)
(defvar erc-away nil
- "Non-nil indicates that we are away.")
+ "Non-nil indicates that we are away.
+
+Use `erc-away-time' to access this if you might be in a channel
+buffer rather than a server buffer.")
(make-variable-buffer-local 'erc-away)
(defvar erc-channel-list nil
@@ -1934,10 +1954,6 @@ Returns the buffer for the given server or channel."
(erc-set-active-buffer buffer)
;; last invitation channel
(setq erc-invitation nil)
- ;; away flag
- ;; Should only be used in session-buffers
- (setq erc-away (let ((serverbuf (erc-server-buffer)))
- (and serverbuf (with-current-buffer serverbuf erc-away))))
;; Server channel list
(setq erc-channel-list ())
;; login-time 'nick in use' error
@@ -2546,20 +2562,19 @@ If no USER argument is specified, list the contents of
`erc-ignore-list'."
(erc-display-line
(erc-make-notice (format "Now ignoring %s" user))
'active)
- (with-current-buffer (erc-server-buffer)
- (add-to-list 'erc-ignore-list user)))
- (if (null (with-current-buffer (erc-server-buffer) erc-ignore-list))
+ (erc-with-server-buffer (add-to-list 'erc-ignore-list user)))
+ (if (null (erc-with-server-buffer erc-ignore-list))
(erc-display-line (erc-make-notice "Ignore list is empty") 'active)
(erc-display-line (erc-make-notice "Ignore list:") 'active)
(mapc #'(lambda (item)
(erc-display-line (erc-make-notice item)
'active))
- (with-current-buffer (erc-server-buffer) erc-ignore-list))))
+ (erc-with-server-buffer erc-ignore-list))))
t)
(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)
+ (let ((ignored-nick (car (erc-with-server-buffer
(erc-member-ignore-case user erc-ignore-list)))))
(if (null ignored-nick)
(erc-display-line
@@ -2568,7 +2583,7 @@ If no USER argument is specified, list the contents of
`erc-ignore-list'."
(erc-display-line
(erc-make-notice (format "No longer ignoring %s" user))
'active))
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(setq erc-ignore-list (delete ignored-nick erc-ignore-list))))
t)
@@ -2627,8 +2642,8 @@ If no reason is given, unset away status."
"Mark the user as being away everywhere, the reason being indicated by LINE."
;; on all server buffers.
(erc-with-all-buffers-of-server nil
- #'erc-server-buffer-p
- (erc-cmd-AWAY line)))
+ #'erc-open-server-buffer-p
+ (erc-cmd-AWAY line)))
(put 'erc-cmd-GAWAY 'do-not-parse-args t)
(defun erc-cmd-CTCP (nick cmd &rest args)
@@ -2820,10 +2835,9 @@ If SERVER is non-nil, use that, rather than the current
server."
(defun erc-cmd-IDLE (nick)
"Show the length of time NICK has been idle."
- (let ((serverbuf (erc-server-buffer))
- (origbuf (current-buffer))
+ (let ((origbuf (current-buffer))
symlist)
- (with-current-buffer serverbuf
+ (erc-with-server-buffer
(add-to-list 'symlist
(cons (erc-once-with-server-event
311 `(string= ,nick
@@ -2981,8 +2995,8 @@ The rest of LINE is the message to send."
(defun erc-cmd-NICK (nick)
"Change current nickname to NICK."
(erc-log (format "cmd: NICK: %s (erc-bad-nick: %S)" nick erc-bad-nick))
- (let ((nicklen (cdr (assoc "NICKLEN" (with-current-buffer (erc-server-buffer)
- erc-server-parameters)))))
+ (let ((nicklen (cdr (assoc "NICKLEN" (erc-with-server-buffer
+ erc-server-parameters)))))
(and nicklen (> (length nick) (string-to-number nicklen))
(erc-display-message
nil 'notice 'active 'nick-too-long
@@ -3152,9 +3166,7 @@ the message given by REASON."
(defun erc-cmd-GQUIT (reason)
"Disconnect from all servers at once with the same quit REASON."
- (erc-with-all-buffers-of-server nil #'(lambda ()
- (and (erc-server-buffer-p)
- (erc-server-process-alive)))
+ (erc-with-all-buffers-of-server nil #'erc-open-server-buffer-p
(erc-cmd-QUIT reason)))
(defalias 'erc-cmd-GQ 'erc-cmd-GQUIT)
@@ -3330,7 +3342,7 @@ The ban list is fetched from the server if necessary."
(setq erc-server-367-functions 'erc-banlist-store
erc-channel-banlist nil)
;; fetch the ban list then callback
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(erc-once-with-server-event
368
`(with-current-buffer ,chnl-name
@@ -3400,7 +3412,7 @@ Unban all currently banned users in the current channel."
(let ((old-367-hook erc-server-367-functions))
(setq erc-server-367-functions 'erc-banlist-store)
;; fetch the ban list then callback
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
(erc-once-with-server-event
368
`(with-current-buffer ,chnl
@@ -3769,7 +3781,7 @@ See also `erc-display-error-notice'."
(setq erc-nick-change-attempt-count (+ erc-nick-change-attempt-count 1))
(let ((newnick (nth 1 erc-default-nicks))
(nicklen (cdr (assoc "NICKLEN"
- (with-current-buffer (erc-server-buffer)
+ (erc-with-server-buffer
erc-server-parameters)))))
(setq erc-bad-nick t)
;; try to use a different nick
@@ -4291,8 +4303,10 @@ See also `erc-display-message'."
nil)
(defun erc-process-away (proc away-p)
- ;; FIXME: This docstring is AWFUL -- Lawrence 2004-01-08
- "Process the user being away, or returning from an away break."
+ "Toggle the away status of the user depending on the value of AWAY-P.
+
+If nil, set the user as away.
+If non-nil, return from being away."
(let ((sessionbuf (process-buffer proc)))
(when sessionbuf
(with-current-buffer sessionbuf
@@ -4304,14 +4318,12 @@ See also `erc-display-message'."
erc-nick)))
(cond
(away-p
- (erc-with-all-buffers-of-server proc nil
- (setq erc-away (current-time))))
+ (setq erc-away (current-time)))
(t
(let ((away-time erc-away))
;; away must be set to NIL BEFORE sending anything to prevent
;; an infinite recursion
- (erc-with-all-buffers-of-server proc nil
- (setq erc-away nil))
+ (setq erc-away nil)
(save-excursion
(set-buffer (erc-active-buffer))
(when erc-public-away-p
@@ -4993,8 +5005,9 @@ strings over to the next call."
(defun erc-set-current-nick (nick)
"Set the current nickname to NICK."
- (with-current-buffer (or (erc-server-buffer)
- (current-buffer))
+ (with-current-buffer (if (buffer-live-p (erc-server-buffer))
+ (erc-server-buffer)
+ (current-buffer))
(setq erc-server-current-nick nick)))
(defun erc-current-nick ()
@@ -5074,7 +5087,7 @@ The previous default target of QUERY type gets removed"
Takes a full SPEC of a user in the form \"address@hidden", 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))
+ (dolist (ignored (erc-with-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))))
@@ -5629,12 +5642,12 @@ entry of `channel-members'."
""))
user))))
-(defun erc-away-p ()
- "Return t if the current ERC process is set away."
- (save-excursion
- (and (erc-server-buffer-live-p)
- (set-buffer (process-buffer erc-server-process))
- erc-away)))
+(defun erc-away-time ()
+ "Return non-nil if the current ERC process is set away.
+
+In particular, the time that we were set away is returned.
+See `current-time' for details on the time format."
+ (erc-with-server-buffer erc-away))
;; Mode line handling
@@ -5741,18 +5754,14 @@ format-time-message."
(defun erc-format-away-status ()
"Return a formatted `erc-mode-line-away-status-format'
if `erc-away' is non-nil."
- (let ((a (when (erc-server-buffer-live-p)
- (with-current-buffer (process-buffer erc-server-process)
- erc-away))))
+ (let ((a (erc-away-time)))
(if a
(format-time-string erc-mode-line-away-status-format a)
"")))
(defun erc-format-channel-modes ()
"Return the current channel's modes and the estimated lag."
- (let ((lag (when (erc-server-buffer-live-p)
- (with-current-buffer (process-buffer erc-server-process)
- erc-server-lag))))
+ (let ((lag (erc-with-server-buffer erc-server-lag)))
(concat (apply 'concat
"(+" erc-channel-modes)
(cond ((and erc-channel-user-limit erc-channel-key)
@@ -6204,8 +6213,7 @@ Otherwise, connect to HOST:PORT as USER and /join
CHANNEL."
(lambda ()
(and (string-equal erc-session-server host)
(= erc-session-port port)
- erc-server-connected
- (eq (erc-server-buffer) (current-buffer))))))))
+ (erc-open-server-buffer-p)))))))
(with-current-buffer (or server-buffer (current-buffer))
(if (and server-buffer channel)
(erc-cmd-JOIN channel)
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Erc-commit] [commit][emacs22] Fix several autoaway bugs and hack on internals.,
mwolson <=