diff lisp/erc/erc-track.el @ 76856:2fae574a2382

Release ERC 5.2. I have updated the version of ERC to 5.2, since it fixes a bug with C-c C-SPC being bound globally by default. For the full list of changes in this version, see etc/ERC-NEWS. Revision: emacs@sv.gnu.org/emacs--devo--0--patch-687 Creator: Michael Olson <mwolson@gnu.org>
author Miles Bader <miles@gnu.org>
date Sun, 01 Apr 2007 13:36:38 +0000
parents 7a3f13e2dd57
children 85d67fae9a94
line wrap: on
line diff
--- a/lisp/erc/erc-track.el	Sun Apr 01 07:44:57 2007 +0000
+++ b/lisp/erc/erc-track.el	Sun Apr 01 13:36:38 2007 +0000
@@ -1,6 +1,7 @@
 ;;; erc-track.el --- Track modified channel buffers
 
-;; Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 2002, 2003, 2004, 2005, 2006,
+;;   2007 Free Software Foundation, Inc.
 
 ;; Author: Mario Lang <mlang@delysid.org>
 ;; Keywords: comm, faces
@@ -46,12 +47,33 @@
   "Track active buffers and show activity in the modeline."
   :group 'erc)
 
+(defcustom erc-track-enable-keybindings 'ask
+  "Whether to enable the ERC track keybindings, namely:
+`C-c C-SPC' and `C-c C-@', which both do the same thing.
+
+The default is to check to see whether these keys are used
+already: if not, then enable the ERC track minor mode, which
+provides these keys.  Otherwise, do not touch the keys.
+
+This can alternatively be set to either t or nil, which indicate
+respectively always to enable ERC track minor mode or never to
+enable ERC track minor mode.
+
+The reason for using this default value is to both (1) adhere to
+the Emacs development guidelines which say not to touch keys of
+the form C-c C-<something> and also (2) to meet the expectations
+of long-time ERC users, many of whom rely on these keybindings."
+  :group 'erc-track
+  :type '(choice (const :tag "Ask, if used already" ask)
+		 (const :tag "Enable" t)
+		 (const :tag "Disable" nil)))
+
 (defcustom erc-track-visibility t
   "Where do we look for buffers to determine their visibility?
 The value of this variable determines, when a buffer is considered
 visible or invisible.  New messages in invisible buffers are tracked,
 while switching to visible buffers when they are tracked removes them
-from the list.  See also `erc-track-when-inactive-mode'.
+from the list.  See also `erc-track-when-inactive'.
 
 Possible values are:
 
@@ -488,45 +510,124 @@
 	 (equal (erc-unique-substrings '("abc" "abcdefg"))
 		'("abc" "abcd"))))))
 
+;;; Minor mode
+
+;; Play nice with other IRC clients (and Emacs development rules) by
+;; making this a minor mode
+
+(defvar erc-track-minor-mode-map (make-sparse-keymap)
+  "Keymap for rcirc track minor mode.")
+
+(define-key erc-track-minor-mode-map (kbd "C-c C-@") 'erc-track-switch-buffer)
+(define-key erc-track-minor-mode-map (kbd "C-c C-SPC")
+  'erc-track-switch-buffer)
+
+;;;###autoload
+(define-minor-mode erc-track-minor-mode
+  "Global minor mode for tracking ERC buffers and showing activity in the
+mode line.
+
+This exists for the sole purpose of providing the C-c C-SPC and
+C-c C-@ keybindings.  Make sure that you have enabled the track
+module, otherwise the keybindings will not do anything useful."
+  :init-value nil
+  :lighter ""
+  :keymap erc-track-minor-mode-map
+  :global t
+  :group 'erc-track)
+
+(defun erc-track-minor-mode-maybe ()
+  "Enable `erc-track-minor-mode', depending on `erc-track-enable-keybindings'."
+  (unless (or erc-track-minor-mode
+	      ;; don't start the minor mode until we have an ERC
+	      ;; process running, because we don't want to prompt the
+	      ;; user while starting Emacs
+	      (null (erc-buffer-list)))
+    (cond ((eq erc-track-enable-keybindings 'ask)
+	   (let ((key (or (and (key-binding (kbd "C-c C-SPC")) "C-SPC")
+			  (and (key-binding (kbd "C-c C-@")) "C-@"))))
+	     (if key
+		 (if (y-or-n-p
+		      (concat "The C-c " key " binding is in use;"
+			      " override it for tracking? "))
+		     (progn
+		       (message (concat "Will change it; set"
+					" `erc-track-enable-keybindings'"
+					" to disable this message"))
+		       (sleep-for 3)
+		       (erc-track-minor-mode 1))
+		   (message (concat "Not changing it; set"
+				    " `erc-track-enable-keybindings'"
+				    " to disable this message"))
+		   (sleep-for 3))
+	       (erc-track-minor-mode 1))))
+	  ((eq erc-track-enable-keybindings t)
+	   (erc-track-minor-mode 1))
+	  (t nil))))
+
 ;;; Module
 
 ;;;###autoload (autoload 'erc-track-mode "erc-track" nil t)
-(define-erc-module track track-modified-channels
+(define-erc-module track nil
   "This mode tracks ERC channel buffers with activity."
-  ((erc-track-add-to-mode-line erc-track-position-in-mode-line)
-   (setq erc-modified-channels-object (erc-modified-channels-object nil))
-   (erc-update-mode-line)
-   (if (featurep 'xemacs)
-       (defadvice switch-to-buffer (after erc-update (&rest args) activate)
-	 (erc-modified-channels-update))
-     (add-hook 'window-configuration-change-hook 'erc-modified-channels-update))
-   (add-hook 'erc-insert-post-hook 'erc-track-modified-channels)
-   (add-hook 'erc-disconnected-hook 'erc-modified-channels-update))
-  ((erc-track-remove-from-mode-line)
-   (if (featurep 'xemacs)
-       (ad-disable-advice 'switch-to-buffer 'after 'erc-update)
-     (remove-hook 'window-configuration-change-hook
-		  'erc-modified-channels-update))
-   (remove-hook 'erc-disconnected-hook 'erc-modified-channels-update)
-   (remove-hook 'erc-insert-post-hook 'erc-track-modified-channels)))
+  ;; Enable:
+  ((when (boundp 'erc-track-when-inactive)
+     (if erc-track-when-inactive
+	 (progn
+	   (if (featurep 'xemacs)
+	       (defadvice switch-to-buffer (after erc-update-when-inactive
+						  (&rest args) activate)
+		 (erc-user-is-active))
+	     (add-hook 'window-configuration-change-hook 'erc-user-is-active))
+	   (add-hook 'erc-send-completed-hook 'erc-user-is-active)
+	   (add-hook 'erc-server-001-functions 'erc-user-is-active))
+       (erc-track-add-to-mode-line erc-track-position-in-mode-line)
+       (setq erc-modified-channels-object (erc-modified-channels-object nil))
+       (erc-update-mode-line)
+       (if (featurep 'xemacs)
+	   (defadvice switch-to-buffer (after erc-update (&rest args) activate)
+	     (erc-modified-channels-update))
+	 (add-hook 'window-configuration-change-hook
+		   'erc-modified-channels-update))
+       (add-hook 'erc-insert-post-hook 'erc-track-modified-channels)
+       (add-hook 'erc-disconnected-hook 'erc-modified-channels-update))
+     ;; enable the tracking keybindings
+     (erc-track-minor-mode-maybe)))
+  ;; Disable:
+  ((when (boundp 'erc-track-when-inactive)
+     (erc-track-remove-from-mode-line)
+     (if erc-track-when-inactive
+	 (progn
+	   (if (featurep 'xemacs)
+	       (ad-disable-advice 'switch-to-buffer 'after
+				  'erc-update-when-inactive)
+	     (remove-hook 'window-configuration-change-hook
+			  'erc-user-is-active))
+	   (remove-hook 'erc-send-completed-hook 'erc-user-is-active)
+	   (remove-hook 'erc-server-001-functions 'erc-user-is-active)
+	   (remove-hook 'erc-timer-hook 'erc-user-is-active))
+       (if (featurep 'xemacs)
+	   (ad-disable-advice 'switch-to-buffer 'after 'erc-update)
+	 (remove-hook 'window-configuration-change-hook
+		      'erc-modified-channels-update))
+       (remove-hook 'erc-disconnected-hook 'erc-modified-channels-update)
+       (remove-hook 'erc-insert-post-hook 'erc-track-modified-channels))
+     ;; disable the tracking keybindings
+     (when erc-track-minor-mode
+       (erc-track-minor-mode -1)))))
 
-;;;###autoload (autoload 'erc-track-when-inactive-mode "erc-track" nil t)
-(define-erc-module track-when-inactive nil
-  "This mode enables channel tracking even for visible buffers,
-if you are inactivity."
-  ((if (featurep 'xemacs)
-       (defadvice switch-to-buffer (after erc-update-when-inactive (&rest args) activate)
-	 (erc-user-is-active))
-     (add-hook 'window-configuration-change-hook 'erc-user-is-active))
-   (add-hook 'erc-send-completed-hook 'erc-user-is-active)
-   (add-hook 'erc-server-001-functions 'erc-user-is-active))
-  ((erc-track-remove-from-mode-line)
-   (if (featurep 'xemacs)
-       (ad-disable-advice 'switch-to-buffer 'after 'erc-update-when-inactive)
-     (remove-hook 'window-configuration-change-hook 'erc-user-is-active))
-   (remove-hook 'erc-send-completed-hook 'erc-user-is-active)
-   (remove-hook 'erc-server-001-functions 'erc-user-is-active)
-   (remove-hook 'erc-timer-hook 'erc-user-is-active)))
+(defcustom erc-track-when-inactive nil
+  "Enable channel tracking even for visible buffers, if you are
+inactive."
+  :group 'erc-track
+  :type 'boolean
+  :set (lambda (sym val)
+	 (if erc-track-mode
+	     (progn
+	       (erc-track-disable)
+	       (set sym val)
+	       (erc-track-enable))
+	   (set sym val))))
 
 ;;; Visibility
 
@@ -545,7 +646,7 @@
 
 (defun erc-buffer-visible (buffer)
   "Return non-nil when the buffer is visible."
-  (if erc-track-when-inactive-mode
+  (if erc-track-when-inactive
       (when erc-buffer-activity; could be nil
 	(and (get-buffer-window buffer erc-track-visibility)
 	     (<= (erc-time-diff erc-buffer-activity (erc-current-time))
@@ -815,7 +916,9 @@
 switch back to the last non-ERC buffer visited.  Next is defined by
 `erc-track-switch-direction', a negative argument will reverse this."
   (interactive "p")
-  (when erc-track-mode
+  (if (not erc-track-mode)
+      (message (concat "Enable the ERC track module if you want to use the"
+		       " tracking minor mode"))
     (cond (erc-modified-channels-alist
 	   ;; if we're not in erc-mode, set this buffer to return to
 	   (unless (eq major-mode 'erc-mode)
@@ -828,12 +931,6 @@
 		(buffer-live-p erc-track-last-non-erc-buffer))
 	   (switch-to-buffer erc-track-last-non-erc-buffer)))))
 
-;; These bindings are global, because they pop us from any other
-;; buffer to an active ERC buffer!
-
-(global-set-key (kbd "C-c C-@") 'erc-track-switch-buffer)
-(global-set-key (kbd "C-c C-SPC") 'erc-track-switch-buffer)
-
 (provide 'erc-track)
 
 ;;; erc-track.el ends here