]> code.delx.au - gnu-emacs/blobdiff - lisp/progmodes/which-func.el
Merge from emacs-24; up to 2014-07-21T01:34:03Z!monnier@iro.umontreal.ca
[gnu-emacs] / lisp / progmodes / which-func.el
index 02340425dfaf0ab703b7f040b8393517a04aa399..e62ad271089812c35c36c46fc5b6731911aefe78 100644 (file)
@@ -1,6 +1,7 @@
 ;;; which-func.el --- print current function in mode line
 
-;; Copyright (C) 1994, 1997-1998, 2001-2012 Free Software Foundation, Inc.
+;; Copyright (C) 1994, 1997-1998, 2001-2014 Free Software Foundation,
+;; Inc.
 
 ;; Author:   Alex Rezinsky <alexr@msil.sps.mot.com>
 ;;           (doesn't seem to be responsive any more)
@@ -182,24 +183,24 @@ and you want to simplify them for the mode line
 (defconst which-func-current
   '(:eval (replace-regexp-in-string
           "%" "%%"
-          (gethash (selected-window) which-func-table which-func-unknown))))
+          (or (gethash (selected-window) which-func-table)
+               which-func-unknown))))
 ;;;###autoload (put 'which-func-current 'risky-local-variable t)
 
-(defvar which-func-mode nil
+(defvar-local which-func-mode nil
   "Non-nil means display current function name in mode line.
 This makes a difference only if `which-function-mode' is non-nil.")
-(make-variable-buffer-local 'which-func-mode)
-;;(put 'which-func-mode 'permanent-local t)
 
 (add-hook 'find-file-hook 'which-func-ff-hook t)
 
 (defun which-func-ff-hook ()
   "File find hook for Which Function mode.
 It creates the Imenu index for the buffer, if necessary."
-  (setq which-func-mode
-       (and which-function-mode
-            (or (eq which-func-modes t)
-                (member major-mode which-func-modes))))
+  (unless (local-variable-p 'which-func-mode)
+    (setq which-func-mode
+          (and which-function-mode
+               (or (eq which-func-modes t)
+                   (member major-mode which-func-modes)))))
 
   (condition-case err
       (if (and which-func-mode
@@ -234,9 +235,7 @@ It creates the Imenu index for the buffer, if necessary."
         (error "Error in which-func-update: %S" info))))))
 
 ;;;###autoload
-(defun which-func-mode (&optional arg)
-  (which-function-mode arg))
-(make-obsolete 'which-func-mode 'which-function-mode "24.1")
+(define-obsolete-function-alias 'which-func-mode 'which-function-mode "24.1")
 
 (defvar which-func-update-timer nil)
 
@@ -259,15 +258,13 @@ in certain major modes."
       ;;Turn it on
       (progn
         (setq which-func-update-timer
-              (run-with-idle-timer idle-update-delay t 'which-func-update))
+              (run-with-idle-timer idle-update-delay t #'which-func-update))
         (dolist (buf (buffer-list))
           (with-current-buffer buf
-            (setq which-func-mode
-                  (or (eq which-func-modes t)
-                      (member major-mode which-func-modes))))))
-    ;; Turn it off
-    (dolist (buf (buffer-list))
-      (with-current-buffer buf (setq which-func-mode nil)))))
+            (unless (local-variable-p 'which-func-mode)
+              (setq which-func-mode
+                    (or (eq which-func-modes t)
+                        (member major-mode which-func-modes)))))))))
 
 (defvar which-function-imenu-failed nil
   "Locally t in a buffer if `imenu--make-index-alist' found nothing there.")
@@ -290,7 +287,7 @@ If no function name is found, return nil."
     (when (and (null name)
               (boundp 'imenu--index-alist) (null imenu--index-alist)
               (null which-function-imenu-failed))
-      (imenu--make-index-alist t)
+      (ignore-errors (imenu--make-index-alist t))
       (unless imenu--index-alist
         (set (make-local-variable 'which-function-imenu-failed) t)))
     ;; If we have an index alist, use it.
@@ -319,7 +316,9 @@ If no function name is found, return nil."
                     namestack (cons (car pair) namestack)
                     alist     (cdr pair)))
 
-             ((number-or-marker-p (setq mark (cdr pair)))
+             ((or (number-or-marker-p (setq mark (cdr pair)))
+                 (and (overlayp mark)
+                      (setq mark (overlay-start mark))))
               (when (and (>= (setq offset (- (point) mark)) 0)
                          (< offset minoffset)) ; Find the closest item.
                 (setq minoffset offset
@@ -341,10 +340,15 @@ If no function name is found, return nil."
 \f
 ;;; Integration with other packages
 
+(defvar ediff-window-A)
+(defvar ediff-window-B)
+(defvar ediff-window-C)
+
+;; FIXME: Why does ediff require special support?
 (defun which-func-update-ediff-windows ()
   "Update Which-Function mode display for Ediff windows.
 This function is meant to be called from `ediff-select-hook'."
-  (when (eq major-mode 'ediff-mode)
+  (when (and (derived-mode-p 'ediff-mode) which-function-mode)
     (when ediff-window-A
       (which-func-update-1 ediff-window-A))
     (when ediff-window-B