erc-commit
[Top][All Lists]
Advanced

[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)




reply via email to

[Prev in Thread] Current Thread [Next in Thread]