2012-05-08 14:19:08 +00:00
|
|
|
;;; imenu.el --- framework for mode-specific buffer indexes -*- lexical-binding: t -*-
|
1994-03-07 03:00:30 +00:00
|
|
|
|
2013-01-01 09:11:05 +00:00
|
|
|
;; Copyright (C) 1994-1998, 2001-2013 Free Software Foundation, Inc.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
|
|
|
;; Author: Ake Stenhoff <etxaksf@aom.ericsson.se>
|
|
|
|
;; Lars Lindberg <lli@sypro.cap.se>
|
1997-05-27 15:32:03 +00:00
|
|
|
;; Maintainer: FSF
|
1994-03-07 03:00:30 +00:00
|
|
|
;; Created: 8 Feb 1994
|
1998-05-26 09:23:23 +00:00
|
|
|
;; Keywords: tools convenience
|
1996-01-14 07:34:30 +00:00
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 08:06:51 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1994-03-07 03:00:30 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 08:06:51 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
1996-01-14 07:34:30 +00:00
|
|
|
|
|
|
|
;; GNU Emacs is distributed in the hope that it will be useful,
|
1994-03-07 03:00:30 +00:00
|
|
|
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
;; GNU General Public License for more details.
|
1996-01-14 07:34:30 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
;; You should have received a copy of the GNU General Public License
|
2008-05-06 08:06:51 +00:00
|
|
|
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
|
|
|
;;; Commentary:
|
1996-01-14 07:34:30 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
;; Purpose of this package:
|
|
|
|
;; To present a framework for mode-specific buffer indexes.
|
|
|
|
;; A buffer index is an alist of names and buffer positions.
|
|
|
|
;; For instance all functions in a C-file and their positions.
|
|
|
|
;;
|
1998-04-30 00:05:06 +00:00
|
|
|
;; It is documented in the Emacs Lisp manual.
|
|
|
|
;;
|
1994-03-07 03:00:30 +00:00
|
|
|
;; How it works:
|
|
|
|
|
|
|
|
;; A mode-specific function is called to generate the index. It is
|
|
|
|
;; then presented to the user, who can choose from this index.
|
|
|
|
;;
|
|
|
|
;; The package comes with a set of example functions for how to
|
|
|
|
;; utilize this package.
|
|
|
|
|
1995-06-27 06:23:43 +00:00
|
|
|
;; There are *examples* for index gathering functions/regular
|
|
|
|
;; expressions for C/C++ and Lisp/Emacs Lisp but it is easy to
|
|
|
|
;; customize for other modes. A function for jumping to the chosen
|
|
|
|
;; index position is also supplied.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1998-04-30 00:05:06 +00:00
|
|
|
;;; History:
|
|
|
|
;; Thanks go to
|
1994-03-07 23:24:02 +00:00
|
|
|
;; [simon] - Simon Leinen simon@lia.di.epfl.ch
|
|
|
|
;; [dean] - Dean Andrews ada@unison.com
|
1998-04-30 00:05:06 +00:00
|
|
|
;; [alon] - Alon Albert al@mercury.co.il
|
1994-09-29 06:32:06 +00:00
|
|
|
;; [greg] - Greg Thompson gregt@porsche.visix.COM
|
1994-11-30 20:50:33 +00:00
|
|
|
;; [wolfgang] - Wolfgang Bangerth zcg51122@rpool1.rus.uni-stuttgart.de
|
1994-11-24 11:26:41 +00:00
|
|
|
;; [kai] - Kai Grossjohann grossjoh@linus.informatik.uni-dortmund.de
|
1994-12-23 05:05:22 +00:00
|
|
|
;; [david] - David M. Smith dsmith@stats.adelaide.edu.au
|
1995-06-27 06:23:43 +00:00
|
|
|
;; [christian] - Christian Egli Christian.Egli@hcsd.hac.com
|
|
|
|
;; [karl] - Karl Fogel kfogel@floss.life.uiuc.edu
|
|
|
|
|
2001-07-15 16:15:35 +00:00
|
|
|
;;; Code:
|
1996-01-14 07:34:30 +00:00
|
|
|
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 11:51:54 +00:00
|
|
|
(eval-when-compile (require 'cl-lib))
|
1994-03-07 03:00:30 +00:00
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;;
|
|
|
|
;;; Customizable variables
|
|
|
|
;;;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
1995-06-27 06:23:43 +00:00
|
|
|
|
1997-05-03 19:53:57 +00:00
|
|
|
(defgroup imenu nil
|
|
|
|
"Mode-specific buffer indexes."
|
|
|
|
:group 'matching
|
1998-04-30 00:05:06 +00:00
|
|
|
:group 'frames
|
1998-05-26 09:23:23 +00:00
|
|
|
:group 'convenience
|
1998-04-30 00:05:06 +00:00
|
|
|
:link '(custom-manual "(elisp)Imenu"))
|
1997-05-03 19:53:57 +00:00
|
|
|
|
|
|
|
(defcustom imenu-use-markers t
|
2008-12-03 05:48:14 +00:00
|
|
|
"Non-nil means use markers instead of integers for Imenu buffer positions.
|
1998-04-30 00:05:06 +00:00
|
|
|
|
|
|
|
Setting this to nil makes Imenu work a little faster but editing the
|
|
|
|
buffer will make the generated index positions wrong.
|
1997-04-05 21:41:59 +00:00
|
|
|
|
1997-05-03 19:53:57 +00:00
|
|
|
This might not yet be honored by all index-building functions."
|
|
|
|
:type 'boolean
|
|
|
|
:group 'imenu)
|
|
|
|
|
1997-04-05 21:41:59 +00:00
|
|
|
|
1997-05-03 19:53:57 +00:00
|
|
|
(defcustom imenu-max-item-length 60
|
2008-12-03 05:48:14 +00:00
|
|
|
"If a number, truncate Imenu entries to that length."
|
1998-04-30 00:05:06 +00:00
|
|
|
:type '(choice integer
|
|
|
|
(const :tag "Unlimited"))
|
1997-05-03 19:53:57 +00:00
|
|
|
:group 'imenu)
|
1997-04-05 21:41:59 +00:00
|
|
|
|
1997-05-05 23:41:56 +00:00
|
|
|
(defcustom imenu-auto-rescan nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"Non-nil means Imenu should always rescan the buffers."
|
1997-05-03 19:53:57 +00:00
|
|
|
:type 'boolean
|
|
|
|
:group 'imenu)
|
1995-06-27 06:23:43 +00:00
|
|
|
|
1998-04-30 00:05:06 +00:00
|
|
|
(defcustom imenu-auto-rescan-maxout 60000
|
2008-12-03 05:48:14 +00:00
|
|
|
"Imenu auto-rescan is disabled in buffers larger than this size (in bytes).
|
1997-05-03 19:53:57 +00:00
|
|
|
This variable is buffer-local."
|
|
|
|
:type 'integer
|
|
|
|
:group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
2002-08-15 00:12:30 +00:00
|
|
|
(defvar imenu-always-use-completion-buffer-p nil)
|
|
|
|
(make-obsolete-variable 'imenu-always-use-completion-buffer-p
|
2005-02-09 15:50:47 +00:00
|
|
|
'imenu-use-popup-menu "22.1")
|
2002-08-15 00:12:30 +00:00
|
|
|
|
|
|
|
(defcustom imenu-use-popup-menu
|
|
|
|
(if imenu-always-use-completion-buffer-p
|
|
|
|
(not (eq imenu-always-use-completion-buffer-p 'never))
|
|
|
|
'on-mouse)
|
|
|
|
"Use a popup menu rather than a minibuffer prompt.
|
|
|
|
If nil, always use a minibuffer prompt.
|
|
|
|
If t, always use a popup menu,
|
|
|
|
If `on-mouse' use a popup menu when `imenu' was invoked with the mouse."
|
|
|
|
:type '(choice (const :tag "On Mouse" on-mouse)
|
|
|
|
(const :tag "Never" nil)
|
2005-05-19 19:06:19 +00:00
|
|
|
(other :tag "Always" t))
|
|
|
|
:group 'imenu)
|
2002-08-15 00:12:30 +00:00
|
|
|
|
|
|
|
(defcustom imenu-eager-completion-buffer
|
|
|
|
(not (eq imenu-always-use-completion-buffer-p 'never))
|
|
|
|
"If non-nil, eagerly popup the completion buffer."
|
2004-11-04 10:00:53 +00:00
|
|
|
:type 'boolean
|
|
|
|
:group 'imenu
|
2005-02-09 15:50:47 +00:00
|
|
|
:version "22.1")
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1999-09-24 13:55:29 +00:00
|
|
|
(defcustom imenu-after-jump-hook nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"Hooks called after jumping to a place in the buffer.
|
1999-09-24 13:55:29 +00:00
|
|
|
|
|
|
|
Useful things to use here include `reposition-window', `recenter', and
|
|
|
|
\(lambda () (recenter 0)) to show at top of screen."
|
|
|
|
:type 'hook
|
|
|
|
:group 'imenu)
|
|
|
|
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1997-05-03 19:53:57 +00:00
|
|
|
(defcustom imenu-sort-function nil
|
2008-12-03 05:48:14 +00:00
|
|
|
"The function to use for sorting the index mouse-menu.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
|
|
|
Affects only the mouse index menu.
|
|
|
|
|
|
|
|
Set this to nil if you don't want any sorting (faster).
|
|
|
|
The items in the menu are then presented in the order they were found
|
|
|
|
in the buffer.
|
|
|
|
|
1994-04-16 02:38:40 +00:00
|
|
|
Set it to `imenu--sort-by-name' if you want alphabetic sorting.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1998-09-30 19:21:01 +00:00
|
|
|
The function should take two arguments and return t if the first
|
1994-03-07 03:00:30 +00:00
|
|
|
element should come before the second. The arguments are cons cells;
|
1997-05-03 19:53:57 +00:00
|
|
|
\(NAME . POSITION). Look at `imenu--sort-by-name' for an example."
|
1998-04-30 00:05:06 +00:00
|
|
|
:type '(choice (const :tag "No sorting" nil)
|
1999-01-31 07:20:12 +00:00
|
|
|
(const :tag "Sort by name" imenu--sort-by-name)
|
1998-04-30 00:05:06 +00:00
|
|
|
(function :tag "Another function"))
|
1997-05-03 19:53:57 +00:00
|
|
|
:group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1997-05-03 19:53:57 +00:00
|
|
|
(defcustom imenu-max-items 25
|
2008-12-03 05:48:14 +00:00
|
|
|
"Maximum number of elements in a mouse menu for Imenu."
|
1997-05-03 19:53:57 +00:00
|
|
|
:type 'integer
|
|
|
|
:group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
2004-10-28 14:11:32 +00:00
|
|
|
;; No longer used. KFS 2004-10-27
|
|
|
|
;; (defcustom imenu-scanning-message "Scanning buffer for index (%3d%%)"
|
2010-09-24 02:59:16 +00:00
|
|
|
;; "Progress message during the index scanning of the buffer.
|
2004-10-28 14:11:32 +00:00
|
|
|
;; If non-nil, user gets a message during the scanning of the buffer.
|
|
|
|
;;
|
|
|
|
;; Relevant only if the mode-specific function that creates the buffer
|
|
|
|
;; index use `imenu-progress-message', and not useful if that is fast, in
|
|
|
|
;; which case you might as well set this to nil."
|
|
|
|
;; :type '(choice string
|
|
|
|
;; (const :tag "None" nil))
|
|
|
|
;; :group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1998-06-27 19:45:22 +00:00
|
|
|
(defcustom imenu-space-replacement "."
|
2008-12-03 05:48:14 +00:00
|
|
|
"The replacement string for spaces in index names.
|
1998-06-27 19:45:22 +00:00
|
|
|
Used when presenting the index in a completion buffer to make the
|
1997-05-03 19:53:57 +00:00
|
|
|
names work as tokens."
|
2002-08-15 00:12:30 +00:00
|
|
|
:type '(choice string (const nil))
|
1997-05-03 19:53:57 +00:00
|
|
|
:group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1997-05-03 19:53:57 +00:00
|
|
|
(defcustom imenu-level-separator ":"
|
2008-12-03 05:48:14 +00:00
|
|
|
"The separator between index names of different levels.
|
1994-03-07 03:00:30 +00:00
|
|
|
Used for making mouse-menu titles and for flattening nested indexes
|
1997-05-03 19:53:57 +00:00
|
|
|
with name concatenation."
|
|
|
|
:type 'string
|
|
|
|
:group 'imenu)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1995-06-27 06:23:43 +00:00
|
|
|
;;;###autoload
|
1994-11-30 20:50:33 +00:00
|
|
|
(defvar imenu-generic-expression nil
|
2012-08-05 14:14:54 +00:00
|
|
|
"List of definition matchers for creating an Imenu index.
|
|
|
|
Each element of this list should have the form
|
|
|
|
|
|
|
|
(MENU-TITLE REGEXP INDEX [FUNCTION] [ARGUMENTS...])
|
|
|
|
|
|
|
|
MENU-TITLE should be nil (in which case the matches for this
|
|
|
|
element are put in the top level of the buffer index) or a
|
|
|
|
string (which specifies the title of a submenu into which the
|
|
|
|
matches are put).
|
|
|
|
REGEXP is a regular expression matching a definition construct
|
|
|
|
which is to be displayed in the menu. REGEXP may also be a
|
|
|
|
function, called without arguments. It is expected to search
|
|
|
|
backwards. It must return true and set `match-data' if it finds
|
|
|
|
another element.
|
|
|
|
INDEX is an integer specifying which subexpression of REGEXP
|
|
|
|
matches the definition's name; this subexpression is displayed as
|
|
|
|
the menu item.
|
|
|
|
FUNCTION, if present, specifies a function to call when the index
|
|
|
|
item is selected by the user. This function is called with
|
|
|
|
arguments consisting of the item name, the buffer position, and
|
|
|
|
the ARGUMENTS.
|
|
|
|
|
|
|
|
The variable `imenu-case-fold-search' determines whether or not
|
|
|
|
the regexp matches are case sensitive, and `imenu-syntax-alist'
|
|
|
|
can be used to alter the syntax table for the search.
|
1995-06-27 06:23:43 +00:00
|
|
|
|
2005-05-21 02:44:29 +00:00
|
|
|
If non-nil this pattern is passed to `imenu--generic-function' to
|
2012-08-05 14:14:54 +00:00
|
|
|
create a buffer index.
|
1998-04-30 00:05:06 +00:00
|
|
|
|
2012-08-05 14:14:54 +00:00
|
|
|
For example, see the value of `fortran-imenu-generic-expression'
|
|
|
|
used by `fortran-mode' with `imenu-syntax-alist' set locally to
|
|
|
|
give the characters which normally have \"symbol\" syntax
|
|
|
|
\"word\" syntax during matching.")
|
2009-08-26 03:07:25 +00:00
|
|
|
;;;###autoload(put 'imenu-generic-expression 'risky-local-variable t)
|
1995-06-27 06:23:43 +00:00
|
|
|
|
1996-03-17 15:37:36 +00:00
|
|
|
;;;###autoload
|
1995-07-25 21:13:10 +00:00
|
|
|
(make-variable-buffer-local 'imenu-generic-expression)
|
1994-11-30 20:50:33 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
;;;; Hooks
|
|
|
|
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-03-07 03:00:30 +00:00
|
|
|
(defvar imenu-create-index-function 'imenu-default-create-index-function
|
2006-04-18 21:22:33 +00:00
|
|
|
"The function to use for creating an index alist of the current buffer.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
2006-04-18 21:22:33 +00:00
|
|
|
It should be a function that takes no arguments and returns
|
|
|
|
an index alist of the current buffer. The function is
|
|
|
|
called within a `save-excursion'.
|
1996-09-21 22:32:10 +00:00
|
|
|
|
2006-04-18 21:22:33 +00:00
|
|
|
See `imenu--index-alist' for the format of the buffer index alist.")
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-03-07 03:00:30 +00:00
|
|
|
(make-variable-buffer-local 'imenu-create-index-function)
|
|
|
|
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-05-04 21:34:13 +00:00
|
|
|
(defvar imenu-prev-index-position-function 'beginning-of-defun
|
1994-03-07 03:00:30 +00:00
|
|
|
"Function for finding the next index position.
|
|
|
|
|
1994-04-16 02:38:40 +00:00
|
|
|
If `imenu-create-index-function' is set to
|
|
|
|
`imenu-default-create-index-function', then you must set this variable
|
1994-03-07 03:00:30 +00:00
|
|
|
to a function that will find the next index, looking backwards in the
|
|
|
|
file.
|
|
|
|
|
|
|
|
The function should leave point at the place to be connected to the
|
2004-07-26 21:16:08 +00:00
|
|
|
index and it should return nil when it doesn't find another index.")
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-05-04 21:34:13 +00:00
|
|
|
(make-variable-buffer-local 'imenu-prev-index-position-function)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-05-04 21:34:13 +00:00
|
|
|
(defvar imenu-extract-index-name-function nil
|
1998-04-30 00:05:06 +00:00
|
|
|
"Function for extracting the index item name, given a position.
|
1998-02-06 21:55:42 +00:00
|
|
|
|
|
|
|
This function is called after `imenu-prev-index-position-function'
|
|
|
|
finds a position for an index item, with point at that position.
|
2004-07-26 21:16:08 +00:00
|
|
|
It should return the name for that index item.")
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1994-05-04 21:34:13 +00:00
|
|
|
(make-variable-buffer-local 'imenu-extract-index-name-function)
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1999-09-24 13:55:29 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defvar imenu-name-lookup-function nil
|
|
|
|
"Function to compare string with index item.
|
|
|
|
|
|
|
|
This function will be called with two strings, and should return
|
|
|
|
non-nil if they match.
|
|
|
|
|
|
|
|
If nil, comparison is done with `string='.
|
|
|
|
Set this to some other function for more advanced comparisons,
|
|
|
|
such as \"begins with\" or \"name matches and number of
|
2004-07-26 21:16:08 +00:00
|
|
|
arguments match\".")
|
1999-09-24 13:55:29 +00:00
|
|
|
;;;###autoload
|
|
|
|
(make-variable-buffer-local 'imenu-name-lookup-function)
|
|
|
|
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1997-03-22 23:42:48 +00:00
|
|
|
(defvar imenu-default-goto-function 'imenu-default-goto-function
|
|
|
|
"The default function called when selecting an Imenu item.
|
|
|
|
The function in this variable is called when selecting a normal index-item.")
|
1998-07-22 02:29:27 +00:00
|
|
|
;;;###autoload
|
1997-03-22 23:42:48 +00:00
|
|
|
(make-variable-buffer-local 'imenu-default-goto-function)
|
|
|
|
|
|
|
|
|
1996-09-21 22:32:10 +00:00
|
|
|
(defun imenu--subalist-p (item)
|
|
|
|
(and (consp (cdr item)) (listp (cadr item))
|
1998-04-30 00:05:06 +00:00
|
|
|
(not (eq (car (cadr item)) 'lambda))))
|
1996-09-21 22:32:10 +00:00
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(defmacro imenu-progress-message (_prevpos &optional _relpos _reverse)
|
|
|
|
"Macro to display a progress message.
|
|
|
|
RELPOS is the relative position to display.
|
|
|
|
If RELPOS is nil, then the relative position in the buffer
|
|
|
|
is calculated.
|
|
|
|
PREVPOS is the variable in which we store the last position displayed."
|
2012-04-19 21:34:49 +00:00
|
|
|
|
|
|
|
;; Made obsolete/empty, as computers are now faster than the eye, and
|
|
|
|
;; it had problems updating the messages correctly, and could shadow
|
|
|
|
;; more important messages/prompts in the minibuffer. KFS 2004-10-27.
|
|
|
|
|
|
|
|
;; `(and
|
|
|
|
;; imenu-scanning-message
|
|
|
|
;; (let ((pos ,(if relpos
|
|
|
|
;; relpos
|
|
|
|
;; `(imenu--relative-position ,reverse))))
|
|
|
|
;; (if ,(if relpos t
|
|
|
|
;; `(> pos (+ 5 ,prevpos)))
|
|
|
|
;; (progn
|
|
|
|
;; (message imenu-scanning-message pos)
|
|
|
|
;; (setq ,prevpos pos)))))
|
|
|
|
)
|
|
|
|
|
1994-11-30 20:50:33 +00:00
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;;;
|
|
|
|
;;;; Some examples of functions utilizing the framework of this
|
|
|
|
;;;; package.
|
|
|
|
;;;;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
2009-08-22 19:41:49 +00:00
|
|
|
;; FIXME: This was the only imenu-example-* definition actually used,
|
|
|
|
;; by cperl-mode.el. Now cperl-mode has its own copy, so these can
|
|
|
|
;; all be removed.
|
1994-11-30 20:50:33 +00:00
|
|
|
(defun imenu-example--name-and-position ()
|
2004-10-10 03:17:52 +00:00
|
|
|
"Return the current/previous sexp and its (beginning) location.
|
|
|
|
Don't move point."
|
Use declare forms, where possible, to mark obsolete functions.
* lisp/allout.el (allout-passphrase-hint-string): Likewise.
(allout-init): Use a declare form to mark obsolete.
* lisp/calendar/calendar.el (calendar-version):
* lisp/calendar/icalendar.el (icalendar-extract-ical-from-buffer)
(icalendar-convert-diary-to-ical):
* lisp/cus-edit.el (custom-mode):
* lisp/ansi-color.el (ansi-color-unfontify-region):
* lisp/international/latin1-disp.el (latin1-char-displayable-p):
* lisp/progmodes/cwarn.el (turn-on-cwarn-mode):
* lisp/progmodes/which-func.el (which-func-update-1): Use
define-obsolete-function-alias.
* lisp/bookmark.el (bookmark-jump-noselect): Use a declare form to mark
this function obsolete.
* lisp/calendar/cal-x.el (calendar-two-frame-setup)
(calendar-only-one-frame-setup, calendar-one-frame-setup):
* lisp/calendar/calendar.el (american-calendar, european-calendar)
(calendar-for-loop):
* lisp/comint.el (comint-dynamic-simple-complete)
(comint-dynamic-complete-as-filename, comint-unquote-filename):
* lisp/desktop.el (desktop-load-default):
* lisp/dired-x.el (dired-omit-here-always)
(dired-hack-local-variables, dired-default-directory):
* lisp/emacs-lisp/derived.el (derived-mode-class):
* lisp/emacs-lisp/timer.el (timer-set-time-with-usecs):
* lisp/emacs-lock.el (toggle-emacs-lock):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-sign-keys, epg-start-sign-keys)
(epg-passphrase-callback-function):
* lisp/eshell/esh-util.el (eshell-for):
* lisp/eshell/eshell.el (eshell-remove-from-window-buffer-names)
(eshell-add-to-window-buffer-names):
* lisp/files.el (locate-file-completion):
* lisp/imenu.el (imenu-example--create-c-index)
(imenu-example--create-lisp-index)
(imenu-example--lisp-extract-index-name)
(imenu-example--name-and-position):
* lisp/international/mule-cmds.el (princ-list):
* lisp/international/mule-diag.el (decode-codepage-char):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/iswitchb.el (iswitchb-read-buffer):
* lisp/mail/mailalias.el (mail-complete):
* lisp/mail/sendmail.el (mail-sent-via):
* lisp/mouse.el (mouse-popup-menubar-stuff, mouse-popup-menubar)
(mouse-major-mode-menu):
* lisp/password-cache.el (password-read-and-add):
* lisp/pcomplete.el (pcomplete-parse-comint-arguments):
* lisp/progmodes/sh-script.el (sh-maybe-here-document):
* lisp/replace.el (query-replace-regexp-eval):
* lisp/savehist.el (savehist-load):
* lisp/simple.el (choose-completion-delete-max-match):
* lisp/term.el (term-dynamic-simple-complete):
* lisp/vc/ediff-init.el (ediff-check-version):
* lisp/vc/ediff-wind.el (ediff-choose-window-setup-function-automatically):
* lisp/vc/vc.el (vc-diff-switches-list):
* lisp/view.el (view-return-to-alist-update): Likewise.
* lisp/iswitchb.el (iswitchb-read-buffer): Move code of
iswitchb-define-mode-map here, and delete that obsolete function.
* lisp/subr.el (eval-next-after-load, makehash, insert-string)
(assoc-ignore-representation, assoc-ignore-case): Use declare to
mark obsolete.
(mode-line-inverse-video): Variable deleted.
* lisp/emacs-lisp/byte-run.el (make-obsolete): Doc fix; emphasize that
this applies to functions.
* lisp/erc/erc.el (erc-send-command): Use define-obsolete-function-alias.
* lisp/international/mule-util.el (string-to-sequence): Remove.
* lisp/net/newst-backend.el (newsticker-cache-filename):
* lisp/net/newst-treeview.el (newsticker-groups-filename): Fix
incorrect obsolescence declaration.
* lisp/net/snmp-mode.el (snmp-font-lock-keywords-3): Don't use obsolete
font-lock-reference-face.
* lisp/url/url-parse.el (url-recreate-url-attributes):
* lisp/url/url-util.el (url-generate-unique-filename): Use declare to mark
obsolete.
* src/xdisp.c (mode_line_inverse_video): Delete obsolete variable.
2012-09-25 04:13:02 +00:00
|
|
|
(declare (obsolete "use your own function instead." "23.2"))
|
1994-11-30 20:50:33 +00:00
|
|
|
(save-excursion
|
|
|
|
(forward-sexp -1)
|
1997-04-05 21:41:59 +00:00
|
|
|
;; [ydi] modified for imenu-use-markers
|
|
|
|
(let ((beg (if imenu-use-markers (point-marker) (point)))
|
|
|
|
(end (progn (forward-sexp) (point))))
|
1994-11-30 20:50:33 +00:00
|
|
|
(cons (buffer-substring beg end)
|
1997-04-05 21:41:59 +00:00
|
|
|
beg))))
|
1994-11-30 20:50:33 +00:00
|
|
|
|
|
|
|
;;;
|
|
|
|
;;; Lisp
|
1998-04-30 00:05:06 +00:00
|
|
|
;;;
|
1994-11-30 20:50:33 +00:00
|
|
|
|
|
|
|
(defun imenu-example--lisp-extract-index-name ()
|
|
|
|
;; Example of a candidate for `imenu-extract-index-name-function'.
|
|
|
|
;; This will generate a flat index of definitions in a lisp file.
|
Use declare forms, where possible, to mark obsolete functions.
* lisp/allout.el (allout-passphrase-hint-string): Likewise.
(allout-init): Use a declare form to mark obsolete.
* lisp/calendar/calendar.el (calendar-version):
* lisp/calendar/icalendar.el (icalendar-extract-ical-from-buffer)
(icalendar-convert-diary-to-ical):
* lisp/cus-edit.el (custom-mode):
* lisp/ansi-color.el (ansi-color-unfontify-region):
* lisp/international/latin1-disp.el (latin1-char-displayable-p):
* lisp/progmodes/cwarn.el (turn-on-cwarn-mode):
* lisp/progmodes/which-func.el (which-func-update-1): Use
define-obsolete-function-alias.
* lisp/bookmark.el (bookmark-jump-noselect): Use a declare form to mark
this function obsolete.
* lisp/calendar/cal-x.el (calendar-two-frame-setup)
(calendar-only-one-frame-setup, calendar-one-frame-setup):
* lisp/calendar/calendar.el (american-calendar, european-calendar)
(calendar-for-loop):
* lisp/comint.el (comint-dynamic-simple-complete)
(comint-dynamic-complete-as-filename, comint-unquote-filename):
* lisp/desktop.el (desktop-load-default):
* lisp/dired-x.el (dired-omit-here-always)
(dired-hack-local-variables, dired-default-directory):
* lisp/emacs-lisp/derived.el (derived-mode-class):
* lisp/emacs-lisp/timer.el (timer-set-time-with-usecs):
* lisp/emacs-lock.el (toggle-emacs-lock):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-sign-keys, epg-start-sign-keys)
(epg-passphrase-callback-function):
* lisp/eshell/esh-util.el (eshell-for):
* lisp/eshell/eshell.el (eshell-remove-from-window-buffer-names)
(eshell-add-to-window-buffer-names):
* lisp/files.el (locate-file-completion):
* lisp/imenu.el (imenu-example--create-c-index)
(imenu-example--create-lisp-index)
(imenu-example--lisp-extract-index-name)
(imenu-example--name-and-position):
* lisp/international/mule-cmds.el (princ-list):
* lisp/international/mule-diag.el (decode-codepage-char):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/iswitchb.el (iswitchb-read-buffer):
* lisp/mail/mailalias.el (mail-complete):
* lisp/mail/sendmail.el (mail-sent-via):
* lisp/mouse.el (mouse-popup-menubar-stuff, mouse-popup-menubar)
(mouse-major-mode-menu):
* lisp/password-cache.el (password-read-and-add):
* lisp/pcomplete.el (pcomplete-parse-comint-arguments):
* lisp/progmodes/sh-script.el (sh-maybe-here-document):
* lisp/replace.el (query-replace-regexp-eval):
* lisp/savehist.el (savehist-load):
* lisp/simple.el (choose-completion-delete-max-match):
* lisp/term.el (term-dynamic-simple-complete):
* lisp/vc/ediff-init.el (ediff-check-version):
* lisp/vc/ediff-wind.el (ediff-choose-window-setup-function-automatically):
* lisp/vc/vc.el (vc-diff-switches-list):
* lisp/view.el (view-return-to-alist-update): Likewise.
* lisp/iswitchb.el (iswitchb-read-buffer): Move code of
iswitchb-define-mode-map here, and delete that obsolete function.
* lisp/subr.el (eval-next-after-load, makehash, insert-string)
(assoc-ignore-representation, assoc-ignore-case): Use declare to
mark obsolete.
(mode-line-inverse-video): Variable deleted.
* lisp/emacs-lisp/byte-run.el (make-obsolete): Doc fix; emphasize that
this applies to functions.
* lisp/erc/erc.el (erc-send-command): Use define-obsolete-function-alias.
* lisp/international/mule-util.el (string-to-sequence): Remove.
* lisp/net/newst-backend.el (newsticker-cache-filename):
* lisp/net/newst-treeview.el (newsticker-groups-filename): Fix
incorrect obsolescence declaration.
* lisp/net/snmp-mode.el (snmp-font-lock-keywords-3): Don't use obsolete
font-lock-reference-face.
* lisp/url/url-parse.el (url-recreate-url-attributes):
* lisp/url/url-util.el (url-generate-unique-filename): Use declare to mark
obsolete.
* src/xdisp.c (mode_line_inverse_video): Delete obsolete variable.
2012-09-25 04:13:02 +00:00
|
|
|
(declare (obsolete nil "23.2"))
|
1994-11-30 20:50:33 +00:00
|
|
|
(save-match-data
|
|
|
|
(and (looking-at "(def")
|
|
|
|
(condition-case nil
|
|
|
|
(progn
|
|
|
|
(down-list 1)
|
|
|
|
(forward-sexp 2)
|
|
|
|
(let ((beg (point))
|
|
|
|
(end (progn (forward-sexp -1) (point))))
|
|
|
|
(buffer-substring beg end)))
|
|
|
|
(error nil)))))
|
|
|
|
|
|
|
|
(defun imenu-example--create-lisp-index ()
|
|
|
|
;; Example of a candidate for `imenu-create-index-function'.
|
|
|
|
;; It will generate a nested index of definitions.
|
Use declare forms, where possible, to mark obsolete functions.
* lisp/allout.el (allout-passphrase-hint-string): Likewise.
(allout-init): Use a declare form to mark obsolete.
* lisp/calendar/calendar.el (calendar-version):
* lisp/calendar/icalendar.el (icalendar-extract-ical-from-buffer)
(icalendar-convert-diary-to-ical):
* lisp/cus-edit.el (custom-mode):
* lisp/ansi-color.el (ansi-color-unfontify-region):
* lisp/international/latin1-disp.el (latin1-char-displayable-p):
* lisp/progmodes/cwarn.el (turn-on-cwarn-mode):
* lisp/progmodes/which-func.el (which-func-update-1): Use
define-obsolete-function-alias.
* lisp/bookmark.el (bookmark-jump-noselect): Use a declare form to mark
this function obsolete.
* lisp/calendar/cal-x.el (calendar-two-frame-setup)
(calendar-only-one-frame-setup, calendar-one-frame-setup):
* lisp/calendar/calendar.el (american-calendar, european-calendar)
(calendar-for-loop):
* lisp/comint.el (comint-dynamic-simple-complete)
(comint-dynamic-complete-as-filename, comint-unquote-filename):
* lisp/desktop.el (desktop-load-default):
* lisp/dired-x.el (dired-omit-here-always)
(dired-hack-local-variables, dired-default-directory):
* lisp/emacs-lisp/derived.el (derived-mode-class):
* lisp/emacs-lisp/timer.el (timer-set-time-with-usecs):
* lisp/emacs-lock.el (toggle-emacs-lock):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-sign-keys, epg-start-sign-keys)
(epg-passphrase-callback-function):
* lisp/eshell/esh-util.el (eshell-for):
* lisp/eshell/eshell.el (eshell-remove-from-window-buffer-names)
(eshell-add-to-window-buffer-names):
* lisp/files.el (locate-file-completion):
* lisp/imenu.el (imenu-example--create-c-index)
(imenu-example--create-lisp-index)
(imenu-example--lisp-extract-index-name)
(imenu-example--name-and-position):
* lisp/international/mule-cmds.el (princ-list):
* lisp/international/mule-diag.el (decode-codepage-char):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/iswitchb.el (iswitchb-read-buffer):
* lisp/mail/mailalias.el (mail-complete):
* lisp/mail/sendmail.el (mail-sent-via):
* lisp/mouse.el (mouse-popup-menubar-stuff, mouse-popup-menubar)
(mouse-major-mode-menu):
* lisp/password-cache.el (password-read-and-add):
* lisp/pcomplete.el (pcomplete-parse-comint-arguments):
* lisp/progmodes/sh-script.el (sh-maybe-here-document):
* lisp/replace.el (query-replace-regexp-eval):
* lisp/savehist.el (savehist-load):
* lisp/simple.el (choose-completion-delete-max-match):
* lisp/term.el (term-dynamic-simple-complete):
* lisp/vc/ediff-init.el (ediff-check-version):
* lisp/vc/ediff-wind.el (ediff-choose-window-setup-function-automatically):
* lisp/vc/vc.el (vc-diff-switches-list):
* lisp/view.el (view-return-to-alist-update): Likewise.
* lisp/iswitchb.el (iswitchb-read-buffer): Move code of
iswitchb-define-mode-map here, and delete that obsolete function.
* lisp/subr.el (eval-next-after-load, makehash, insert-string)
(assoc-ignore-representation, assoc-ignore-case): Use declare to
mark obsolete.
(mode-line-inverse-video): Variable deleted.
* lisp/emacs-lisp/byte-run.el (make-obsolete): Doc fix; emphasize that
this applies to functions.
* lisp/erc/erc.el (erc-send-command): Use define-obsolete-function-alias.
* lisp/international/mule-util.el (string-to-sequence): Remove.
* lisp/net/newst-backend.el (newsticker-cache-filename):
* lisp/net/newst-treeview.el (newsticker-groups-filename): Fix
incorrect obsolescence declaration.
* lisp/net/snmp-mode.el (snmp-font-lock-keywords-3): Don't use obsolete
font-lock-reference-face.
* lisp/url/url-parse.el (url-recreate-url-attributes):
* lisp/url/url-util.el (url-generate-unique-filename): Use declare to mark
obsolete.
* src/xdisp.c (mode_line_inverse_video): Delete obsolete variable.
2012-09-25 04:13:02 +00:00
|
|
|
(declare (obsolete nil "23.2"))
|
1994-11-30 20:50:33 +00:00
|
|
|
(let ((index-alist '())
|
|
|
|
(index-var-alist '())
|
|
|
|
(index-type-alist '())
|
lisp/*: Add declarations, remove unused bindings, mark unused args.
* lisp/avoid.el (mouse-avoidance-mode): Mark unused arg.
(mouse-avoidance-nudge-mouse): Remove unused binding.
* lisp/imenu.el (imenu-default-goto-function): Mark unused args.
(imenu-progress-message): Remove obsolete macro; all callers changed.
* lisp/mouse.el (mouse-menu-major-mode-map):
* lisp/emacs-lisp/authors.el (authors-scan-change-log)
(authors-add-to-author-list):
* lisp/emacs-lisp/avl-tree.el (avl-tree--enter-balance):
* lisp/emacs-lisp/smie.el (smie-auto-fill):
* lisp/mail/sendmail.el (mail-bury):
* lisp/mail/unrmail.el (unrmail):
* lisp/net/tls.el (open-tls-stream):
* lisp/textmodes/picture.el (picture-mouse-set-point):
Remove unused bindings.
* lisp/subr.el (keymap-canonicalize): Remove unused binding.
(read-passwd): Mark unused arg.
* lisp/tutorial.el (tutorial--display-changes): Remove unused binding.
(tutorial--save-tutorial-to): Remove unused variable.
* lisp/emacs-lisp/package.el (define-package, package-menu-mark-delete)
(package-menu-mark-install, package-menu-mark-unmark): Mark unused args.
(package-generate-autoloads, package-menu--generate)
(package-menu--find-upgrades): Remove unused bindings.
* lisp/emulation/cua-rect.el (cua-restrict-regexp-rectangle)
(cua-restrict-prefix-rectangle): Doc fixes. Remove unused bindings.
(cua--mouse-ignore, cua--delete-rectangle, cua--extract-rectangle)
(cua--indent-rectangle, cua-open-rectangle, cua-close-rectangle)
(cua-blank-rectangle, cua-string-rectangle, cua-replace-in-rectangle)
(cua-incr-rectangle, cua-sequence-rectangle, cua--convert-rectangle-as)
(cua--rectangle-aux-replace, cua--left-fill-rectangle)
(cua-scroll-rectangle-up, cua-scroll-rectangle-down)
(cua-delete-char-rectangle): Mark unused args.
(cua-align-rectangle): Remove unused binding.
* lisp/mail/rmail.el (compilation--message->loc)
(epa--find-coding-system-for-mime-charset): Declare.
* lisp/net/dbus.el (dbus-register-service): Declare.
(dbus-name-owner-changed-handler): Remove unused binding.
* lisp/nxml/nxml-mode.el (nxml-electric-slash, nxml-in-mixed-content-p)
(nxml-compute-indent-from-matching-start-tag): Remove unused variables.
(nxml-scan-backward-within): Mark unused arg.
(nxml-dynamic-markup-word): Remove unused binding.
2012-04-19 17:20:26 +00:00
|
|
|
(index-unknown-alist '()))
|
1994-11-30 20:50:33 +00:00
|
|
|
(goto-char (point-max))
|
|
|
|
;; Search for the function
|
|
|
|
(while (beginning-of-defun)
|
1998-04-30 00:05:06 +00:00
|
|
|
(save-match-data
|
|
|
|
(and (looking-at "(def")
|
|
|
|
(save-excursion
|
1994-11-30 20:50:33 +00:00
|
|
|
(down-list 1)
|
1998-04-30 00:05:06 +00:00
|
|
|
(cond
|
1994-11-30 20:50:33 +00:00
|
|
|
((looking-at "def\\(var\\|const\\)")
|
1998-04-30 00:05:06 +00:00
|
|
|
(forward-sexp 2)
|
|
|
|
(push (imenu-example--name-and-position)
|
|
|
|
index-var-alist))
|
1994-11-30 20:50:33 +00:00
|
|
|
((looking-at "def\\(un\\|subst\\|macro\\|advice\\)")
|
1998-04-30 00:05:06 +00:00
|
|
|
(forward-sexp 2)
|
|
|
|
(push (imenu-example--name-and-position)
|
|
|
|
index-alist))
|
1994-11-30 20:50:33 +00:00
|
|
|
((looking-at "def\\(type\\|struct\\|class\\|ine-condition\\)")
|
1998-04-30 00:05:06 +00:00
|
|
|
(forward-sexp 2)
|
1994-11-30 20:50:33 +00:00
|
|
|
(if (= (char-after (1- (point))) ?\))
|
1998-04-30 00:05:06 +00:00
|
|
|
(progn
|
1994-11-30 20:50:33 +00:00
|
|
|
(forward-sexp -1)
|
1998-04-30 00:05:06 +00:00
|
|
|
(down-list 1)
|
1994-11-30 20:50:33 +00:00
|
|
|
(forward-sexp 1)))
|
1998-04-30 00:05:06 +00:00
|
|
|
(push (imenu-example--name-and-position)
|
|
|
|
index-type-alist))
|
|
|
|
(t
|
|
|
|
(forward-sexp 2)
|
|
|
|
(push (imenu-example--name-and-position)
|
1994-11-30 20:50:33 +00:00
|
|
|
index-unknown-alist)))))))
|
|
|
|
(and index-var-alist
|
1996-03-01 18:09:57 +00:00
|
|
|
(push (cons "Variables" index-var-alist)
|
1994-11-30 20:50:33 +00:00
|
|
|
index-alist))
|
|
|
|
(and index-type-alist
|
1996-03-01 18:09:57 +00:00
|
|
|
(push (cons "Types" index-type-alist)
|
1994-11-30 20:50:33 +00:00
|
|
|
index-alist))
|
|
|
|
(and index-unknown-alist
|
1996-03-01 18:09:57 +00:00
|
|
|
(push (cons "Syntax-unknown" index-unknown-alist)
|
1994-11-30 20:50:33 +00:00
|
|
|
index-alist))
|
|
|
|
index-alist))
|
|
|
|
|
|
|
|
;; Regular expression to find C functions
|
|
|
|
(defvar imenu-example--function-name-regexp-c
|
1998-04-30 00:05:06 +00:00
|
|
|
(concat
|
1994-11-30 20:50:33 +00:00
|
|
|
"^[a-zA-Z0-9]+[ \t]?" ; type specs; there can be no
|
|
|
|
"\\([a-zA-Z0-9_*]+[ \t]+\\)?" ; more than 3 tokens, right?
|
|
|
|
"\\([a-zA-Z0-9_*]+[ \t]+\\)?"
|
|
|
|
"\\([*&]+[ \t]*\\)?" ; pointer
|
|
|
|
"\\([a-zA-Z0-9_*]+\\)[ \t]*(" ; name
|
|
|
|
))
|
|
|
|
|
|
|
|
(defun imenu-example--create-c-index (&optional regexp)
|
Use declare forms, where possible, to mark obsolete functions.
* lisp/allout.el (allout-passphrase-hint-string): Likewise.
(allout-init): Use a declare form to mark obsolete.
* lisp/calendar/calendar.el (calendar-version):
* lisp/calendar/icalendar.el (icalendar-extract-ical-from-buffer)
(icalendar-convert-diary-to-ical):
* lisp/cus-edit.el (custom-mode):
* lisp/ansi-color.el (ansi-color-unfontify-region):
* lisp/international/latin1-disp.el (latin1-char-displayable-p):
* lisp/progmodes/cwarn.el (turn-on-cwarn-mode):
* lisp/progmodes/which-func.el (which-func-update-1): Use
define-obsolete-function-alias.
* lisp/bookmark.el (bookmark-jump-noselect): Use a declare form to mark
this function obsolete.
* lisp/calendar/cal-x.el (calendar-two-frame-setup)
(calendar-only-one-frame-setup, calendar-one-frame-setup):
* lisp/calendar/calendar.el (american-calendar, european-calendar)
(calendar-for-loop):
* lisp/comint.el (comint-dynamic-simple-complete)
(comint-dynamic-complete-as-filename, comint-unquote-filename):
* lisp/desktop.el (desktop-load-default):
* lisp/dired-x.el (dired-omit-here-always)
(dired-hack-local-variables, dired-default-directory):
* lisp/emacs-lisp/derived.el (derived-mode-class):
* lisp/emacs-lisp/timer.el (timer-set-time-with-usecs):
* lisp/emacs-lock.el (toggle-emacs-lock):
* lisp/epa.el (epa-display-verify-result):
* lisp/epg.el (epg-sign-keys, epg-start-sign-keys)
(epg-passphrase-callback-function):
* lisp/eshell/esh-util.el (eshell-for):
* lisp/eshell/eshell.el (eshell-remove-from-window-buffer-names)
(eshell-add-to-window-buffer-names):
* lisp/files.el (locate-file-completion):
* lisp/imenu.el (imenu-example--create-c-index)
(imenu-example--create-lisp-index)
(imenu-example--lisp-extract-index-name)
(imenu-example--name-and-position):
* lisp/international/mule-cmds.el (princ-list):
* lisp/international/mule-diag.el (decode-codepage-char):
* lisp/international/mule-util.el (detect-coding-with-priority):
* lisp/iswitchb.el (iswitchb-read-buffer):
* lisp/mail/mailalias.el (mail-complete):
* lisp/mail/sendmail.el (mail-sent-via):
* lisp/mouse.el (mouse-popup-menubar-stuff, mouse-popup-menubar)
(mouse-major-mode-menu):
* lisp/password-cache.el (password-read-and-add):
* lisp/pcomplete.el (pcomplete-parse-comint-arguments):
* lisp/progmodes/sh-script.el (sh-maybe-here-document):
* lisp/replace.el (query-replace-regexp-eval):
* lisp/savehist.el (savehist-load):
* lisp/simple.el (choose-completion-delete-max-match):
* lisp/term.el (term-dynamic-simple-complete):
* lisp/vc/ediff-init.el (ediff-check-version):
* lisp/vc/ediff-wind.el (ediff-choose-window-setup-function-automatically):
* lisp/vc/vc.el (vc-diff-switches-list):
* lisp/view.el (view-return-to-alist-update): Likewise.
* lisp/iswitchb.el (iswitchb-read-buffer): Move code of
iswitchb-define-mode-map here, and delete that obsolete function.
* lisp/subr.el (eval-next-after-load, makehash, insert-string)
(assoc-ignore-representation, assoc-ignore-case): Use declare to
mark obsolete.
(mode-line-inverse-video): Variable deleted.
* lisp/emacs-lisp/byte-run.el (make-obsolete): Doc fix; emphasize that
this applies to functions.
* lisp/erc/erc.el (erc-send-command): Use define-obsolete-function-alias.
* lisp/international/mule-util.el (string-to-sequence): Remove.
* lisp/net/newst-backend.el (newsticker-cache-filename):
* lisp/net/newst-treeview.el (newsticker-groups-filename): Fix
incorrect obsolescence declaration.
* lisp/net/snmp-mode.el (snmp-font-lock-keywords-3): Don't use obsolete
font-lock-reference-face.
* lisp/url/url-parse.el (url-recreate-url-attributes):
* lisp/url/url-util.el (url-generate-unique-filename): Use declare to mark
obsolete.
* src/xdisp.c (mode_line_inverse_video): Delete obsolete variable.
2012-09-25 04:13:02 +00:00
|
|
|
(declare (obsolete nil "23.2"))
|
1994-11-30 20:50:33 +00:00
|
|
|
(let ((index-alist '())
|
lisp/*: Add declarations, remove unused bindings, mark unused args.
* lisp/avoid.el (mouse-avoidance-mode): Mark unused arg.
(mouse-avoidance-nudge-mouse): Remove unused binding.
* lisp/imenu.el (imenu-default-goto-function): Mark unused args.
(imenu-progress-message): Remove obsolete macro; all callers changed.
* lisp/mouse.el (mouse-menu-major-mode-map):
* lisp/emacs-lisp/authors.el (authors-scan-change-log)
(authors-add-to-author-list):
* lisp/emacs-lisp/avl-tree.el (avl-tree--enter-balance):
* lisp/emacs-lisp/smie.el (smie-auto-fill):
* lisp/mail/sendmail.el (mail-bury):
* lisp/mail/unrmail.el (unrmail):
* lisp/net/tls.el (open-tls-stream):
* lisp/textmodes/picture.el (picture-mouse-set-point):
Remove unused bindings.
* lisp/subr.el (keymap-canonicalize): Remove unused binding.
(read-passwd): Mark unused arg.
* lisp/tutorial.el (tutorial--display-changes): Remove unused binding.
(tutorial--save-tutorial-to): Remove unused variable.
* lisp/emacs-lisp/package.el (define-package, package-menu-mark-delete)
(package-menu-mark-install, package-menu-mark-unmark): Mark unused args.
(package-generate-autoloads, package-menu--generate)
(package-menu--find-upgrades): Remove unused bindings.
* lisp/emulation/cua-rect.el (cua-restrict-regexp-rectangle)
(cua-restrict-prefix-rectangle): Doc fixes. Remove unused bindings.
(cua--mouse-ignore, cua--delete-rectangle, cua--extract-rectangle)
(cua--indent-rectangle, cua-open-rectangle, cua-close-rectangle)
(cua-blank-rectangle, cua-string-rectangle, cua-replace-in-rectangle)
(cua-incr-rectangle, cua-sequence-rectangle, cua--convert-rectangle-as)
(cua--rectangle-aux-replace, cua--left-fill-rectangle)
(cua-scroll-rectangle-up, cua-scroll-rectangle-down)
(cua-delete-char-rectangle): Mark unused args.
(cua-align-rectangle): Remove unused binding.
* lisp/mail/rmail.el (compilation--message->loc)
(epa--find-coding-system-for-mime-charset): Declare.
* lisp/net/dbus.el (dbus-register-service): Declare.
(dbus-name-owner-changed-handler): Remove unused binding.
* lisp/nxml/nxml-mode.el (nxml-electric-slash, nxml-in-mixed-content-p)
(nxml-compute-indent-from-matching-start-tag): Remove unused variables.
(nxml-scan-backward-within): Mark unused arg.
(nxml-dynamic-markup-word): Remove unused binding.
2012-04-19 17:20:26 +00:00
|
|
|
char)
|
1994-11-30 20:50:33 +00:00
|
|
|
(goto-char (point-min))
|
|
|
|
;; Search for the function
|
|
|
|
(save-match-data
|
|
|
|
(while (re-search-forward
|
|
|
|
(or regexp imenu-example--function-name-regexp-c)
|
|
|
|
nil t)
|
|
|
|
(backward-up-list 1)
|
|
|
|
(save-excursion
|
|
|
|
(goto-char (scan-sexps (point) 1))
|
|
|
|
(setq char (following-char)))
|
|
|
|
;; Skip this function name if it is a prototype declaration.
|
|
|
|
(if (not (eq char ?\;))
|
|
|
|
(push (imenu-example--name-and-position) index-alist))))
|
|
|
|
(nreverse index-alist)))
|
1995-06-27 06:23:43 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;;
|
|
|
|
;;; Internal variables
|
|
|
|
;;;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
;; The item to use in the index for rescanning the buffer.
|
|
|
|
(defconst imenu--rescan-item '("*Rescan*" . -99))
|
|
|
|
|
|
|
|
;; The latest buffer index.
|
2012-05-08 14:19:08 +00:00
|
|
|
(defvar-local imenu--index-alist nil
|
2006-04-18 21:22:33 +00:00
|
|
|
"The buffer index alist computed for this buffer in Imenu.
|
|
|
|
|
|
|
|
Simple elements in the alist look like (INDEX-NAME . POSITION).
|
|
|
|
POSITION is the buffer position of the item; to go to the item
|
|
|
|
is simply to move point to that position.
|
|
|
|
|
|
|
|
Special elements look like (INDEX-NAME POSITION FUNCTION ARGUMENTS...).
|
|
|
|
To \"go to\" a special element means applying FUNCTION
|
|
|
|
to INDEX-NAME, POSITION, and the ARGUMENTS.
|
|
|
|
|
|
|
|
A nested sub-alist element looks like (INDEX-NAME SUB-ALIST).
|
|
|
|
The function `imenu--subalist-p' tests an element and returns t
|
|
|
|
if it is a sub-alist.
|
|
|
|
|
|
|
|
There is one simple element with negative POSITION; selecting that
|
2006-04-18 22:49:21 +00:00
|
|
|
element recalculates the buffer's index alist.")
|
2009-08-26 03:07:25 +00:00
|
|
|
;;;###autoload(put 'imenu--index-alist 'risky-local-variable t)
|
1998-02-06 21:55:42 +00:00
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(defvar-local imenu--last-menubar-index-alist nil
|
2006-04-18 21:22:33 +00:00
|
|
|
"The latest buffer index alist used to update the menu bar menu.")
|
1999-02-06 21:50:53 +00:00
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(defvar imenu--history-list nil
|
|
|
|
;; Making this buffer local caused it not to work!
|
|
|
|
"History list for 'jump-to-function-in-buffer'.")
|
1994-03-07 03:00:30 +00:00
|
|
|
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;;
|
|
|
|
;;; Internal support functions
|
|
|
|
;;;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
|
|
|
(defun imenu--sort-by-name (item1 item2)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Comparison function to sort items depending on their index name.
|
|
|
|
An item looks like (NAME . POSITION)."
|
1994-03-07 03:00:30 +00:00
|
|
|
(string-lessp (car item1) (car item2)))
|
|
|
|
|
1998-09-30 19:21:01 +00:00
|
|
|
(defun imenu--sort-by-position (item1 item2)
|
|
|
|
(< (cdr item1) (cdr item2)))
|
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
(defun imenu--relative-position (&optional reverse)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Support function to calculate relative position in buffer.
|
|
|
|
Beginning of buffer is 0 and end of buffer is 100
|
|
|
|
If REVERSE is non-nil then the beginning is 100 and the end is 0."
|
1994-03-07 03:00:30 +00:00
|
|
|
(let ((pos (point))
|
|
|
|
(total (buffer-size)))
|
|
|
|
(and reverse (setq pos (- total pos)))
|
|
|
|
(if (> total 50000)
|
|
|
|
;; Avoid overflow from multiplying by 100!
|
|
|
|
(/ (1- pos) (max (/ total 100) 1))
|
|
|
|
(/ (* 100 (1- pos)) (max total 1)))))
|
|
|
|
|
|
|
|
(defun imenu--split (list n)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Split LIST into sublists of max length N.
|
|
|
|
Example (imenu--split '(1 2 3 4 5 6 7 8) 3)-> '((1 2 3) (4 5 6) (7 8))
|
|
|
|
The returned list DOES NOT share structure with LIST."
|
1994-03-07 03:00:30 +00:00
|
|
|
(let ((remain list)
|
|
|
|
(result '())
|
|
|
|
(sublist '())
|
|
|
|
(i 0))
|
|
|
|
(while remain
|
|
|
|
(push (pop remain) sublist)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 11:51:54 +00:00
|
|
|
(cl-incf i)
|
1994-03-07 03:00:30 +00:00
|
|
|
(and (= i n)
|
|
|
|
;; We have finished a sublist
|
|
|
|
(progn (push (nreverse sublist) result)
|
|
|
|
(setq i 0)
|
|
|
|
(setq sublist '()))))
|
|
|
|
;; There might be a sublist (if the length of LIST mod n is != 0)
|
|
|
|
;; that has to be added to the result list.
|
|
|
|
(and sublist
|
|
|
|
(push (nreverse sublist) result))
|
|
|
|
(nreverse result)))
|
|
|
|
|
|
|
|
(defun imenu--split-menu (menulist title)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Split the alist MENULIST into a nested alist, if it is long enough.
|
|
|
|
In any case, add TITLE to the front of the alist.
|
|
|
|
If IMENU--RESCAN-ITEM is present in MENULIST, it is moved to the
|
|
|
|
beginning of the returned alist.
|
|
|
|
The returned alist DOES NOT share structure with MENULIST."
|
2008-09-30 03:38:42 +00:00
|
|
|
(let ((menulist (copy-sequence menulist))
|
2012-05-08 14:19:08 +00:00
|
|
|
keep-at-top)
|
1996-09-21 23:00:40 +00:00
|
|
|
(if (memq imenu--rescan-item menulist)
|
2008-09-30 03:38:42 +00:00
|
|
|
(setq keep-at-top (list imenu--rescan-item)
|
1996-09-21 23:00:40 +00:00
|
|
|
menulist (delq imenu--rescan-item menulist)))
|
2012-05-08 14:19:08 +00:00
|
|
|
(dolist (item menulist)
|
2003-05-16 21:12:25 +00:00
|
|
|
(when (imenu--subalist-p item)
|
|
|
|
(push item keep-at-top)
|
|
|
|
(setq menulist (delq item menulist))))
|
1996-09-21 23:00:40 +00:00
|
|
|
(if imenu-sort-function
|
2008-09-30 03:38:42 +00:00
|
|
|
(setq menulist (sort menulist imenu-sort-function)))
|
1996-09-21 23:00:40 +00:00
|
|
|
(if (> (length menulist) imenu-max-items)
|
2003-05-16 21:12:25 +00:00
|
|
|
(setq menulist
|
|
|
|
(mapcar
|
|
|
|
(lambda (menu)
|
|
|
|
(cons (format "From: %s" (caar menu)) menu))
|
|
|
|
(imenu--split menulist imenu-max-items))))
|
1996-09-21 23:00:40 +00:00
|
|
|
(cons title
|
|
|
|
(nconc (nreverse keep-at-top) menulist))))
|
1996-03-01 18:09:57 +00:00
|
|
|
|
|
|
|
(defun imenu--split-submenus (alist)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Split up each long alist that are nested within ALIST into nested alists.
|
|
|
|
Return a split and sorted copy of ALIST. The returned alist DOES
|
|
|
|
NOT share structure with ALIST."
|
|
|
|
(mapcar (lambda (elt)
|
|
|
|
(if (and (consp elt)
|
|
|
|
(stringp (car elt))
|
|
|
|
(listp (cdr elt)))
|
|
|
|
(imenu--split-menu (cdr elt) (car elt))
|
|
|
|
elt))
|
1996-03-01 18:09:57 +00:00
|
|
|
alist))
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1997-04-05 21:41:59 +00:00
|
|
|
(defun imenu--truncate-items (menulist)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Truncate all strings in MENULIST to `imenu-max-item-length'."
|
|
|
|
(mapcar (lambda (item)
|
|
|
|
(cond
|
|
|
|
((consp (cdr item))
|
|
|
|
(imenu--truncate-items (cdr item)))
|
|
|
|
;; truncate if necessary
|
|
|
|
((and (numberp imenu-max-item-length)
|
|
|
|
(> (length (car item)) imenu-max-item-length))
|
|
|
|
(setcar item (substring (car item) 0 imenu-max-item-length)))))
|
2001-01-11 19:04:29 +00:00
|
|
|
menulist))
|
1997-04-05 21:41:59 +00:00
|
|
|
|
|
|
|
|
1995-12-21 17:47:08 +00:00
|
|
|
(defun imenu--make-index-alist (&optional noerror)
|
2006-04-18 21:22:33 +00:00
|
|
|
"Create an index alist for the definitions in the current buffer.
|
|
|
|
This works by using the hook function `imenu-create-index-function'.
|
1998-04-30 00:05:06 +00:00
|
|
|
Report an error if the list is empty unless NOERROR is supplied and
|
|
|
|
non-nil.
|
|
|
|
|
2006-04-18 21:22:33 +00:00
|
|
|
See `imenu--index-alist' for the format of the index alist."
|
1995-06-27 06:23:43 +00:00
|
|
|
(or (and imenu--index-alist
|
|
|
|
(or (not imenu-auto-rescan)
|
|
|
|
(and imenu-auto-rescan
|
|
|
|
(> (buffer-size) imenu-auto-rescan-maxout))))
|
1997-04-05 21:41:59 +00:00
|
|
|
;; Get the index; truncate if necessary
|
|
|
|
(progn
|
|
|
|
(setq imenu--index-alist
|
|
|
|
(save-excursion
|
|
|
|
(save-restriction
|
|
|
|
(widen)
|
|
|
|
(funcall imenu-create-index-function))))
|
|
|
|
(imenu--truncate-items imenu--index-alist)))
|
1995-12-21 17:47:08 +00:00
|
|
|
(or imenu--index-alist noerror
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "No items suitable for an index found in this buffer"))
|
1995-12-21 17:47:08 +00:00
|
|
|
(or imenu--index-alist
|
|
|
|
(setq imenu--index-alist (list nil)))
|
1994-03-07 03:00:30 +00:00
|
|
|
;; Add a rescan option to the index.
|
|
|
|
(cons imenu--rescan-item imenu--index-alist))
|
1996-09-24 22:50:24 +00:00
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(defvar imenu--cleanup-seen nil)
|
1996-09-24 22:50:24 +00:00
|
|
|
|
1994-08-01 07:11:43 +00:00
|
|
|
(defun imenu--cleanup (&optional alist)
|
2012-05-08 14:19:08 +00:00
|
|
|
"Find all markers in ALIST and make them point nowhere.
|
|
|
|
If ALIST is nil (the normal case), use `imenu--index-alist'.
|
|
|
|
Non-nil arguments are in recursive calls."
|
1998-04-30 00:05:06 +00:00
|
|
|
;; If alist is provided use that list.
|
1996-09-24 22:50:24 +00:00
|
|
|
;; If not, empty the table of lists already seen
|
|
|
|
;; and use imenu--index-alist.
|
|
|
|
(if alist
|
|
|
|
(setq imenu--cleanup-seen (cons alist imenu--cleanup-seen))
|
|
|
|
(setq alist imenu--index-alist imenu--cleanup-seen (list alist)))
|
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(when alist
|
|
|
|
(dolist (item alist)
|
|
|
|
(cond
|
|
|
|
((markerp (cdr item)) (set-marker (cdr item) nil))
|
|
|
|
;; Don't process one alist twice.
|
|
|
|
((memq (cdr item) imenu--cleanup-seen))
|
|
|
|
((imenu--subalist-p item) (imenu--cleanup (cdr item)))))
|
|
|
|
t))
|
1994-11-30 20:50:33 +00:00
|
|
|
|
2003-05-16 21:12:25 +00:00
|
|
|
(defun imenu--create-keymap (title alist &optional cmd)
|
Reduce use of (require 'cl).
* admin/bzrmerge.el: Use cl-lib.
* leim/quail/hangul.el: Don't require CL.
* leim/quail/ipa.el: Use cl-lib.
* vc/smerge-mode.el, vc/pcvs.el, vc/pcvs-util.el, vc/pcvs-info.el:
* vc/diff-mode.el, vc/cvs-status.el, uniquify.el, scroll-bar.el:
* register.el, progmodes/sh-script.el, net/gnutls.el, net/dbus.el:
* msb.el, mpc.el, minibuffer.el, international/ucs-normalize.el:
* international/quail.el, info-xref.el, imenu.el, image-mode.el:
* font-lock.el, filesets.el, edmacro.el, doc-view.el, bookmark.el:
* battery.el, avoid.el, abbrev.el: Use cl-lib.
* vc/pcvs-parse.el, vc/pcvs-defs.el, vc/log-view.el, vc/log-edit.el:
* vc/diff.el, simple.el, pcomplete.el, lpr.el, comint.el, loadhist.el:
* jit-lock.el, international/iso-ascii.el, info.el, frame.el, bs.el:
* emulation/crisp.el, electric.el, dired.el, cus-dep.el, composite.el:
* calculator.el, autorevert.el, apropos.el: Don't require CL.
* emacs-bytecomp.el (byte-recompile-directory, display-call-tree)
(byte-compile-unfold-bcf, byte-compile-check-variable):
* emacs-byte-opt.el (byte-compile-trueconstp)
(byte-compile-nilconstp):
* emacs-autoload.el (make-autoload): Use pcase.
* face-remap.el (text-scale-adjust): Simplify pcase patterns.
2012-07-10 11:51:54 +00:00
|
|
|
`(keymap ,title
|
|
|
|
,@(mapcar
|
|
|
|
(lambda (item)
|
|
|
|
`(,(car item) ,(car item)
|
|
|
|
,@(cond
|
|
|
|
((imenu--subalist-p item)
|
|
|
|
(imenu--create-keymap (car item) (cdr item) cmd))
|
|
|
|
(t
|
|
|
|
`(lambda () (interactive)
|
|
|
|
,(if cmd `(,cmd ',item) (list 'quote item)))))))
|
|
|
|
alist)))
|
1995-06-27 06:23:43 +00:00
|
|
|
|
|
|
|
(defun imenu--in-alist (str alist)
|
|
|
|
"Check whether the string STR is contained in multi-level ALIST."
|
|
|
|
(let (elt head tail res)
|
|
|
|
(setq res nil)
|
|
|
|
(while alist
|
1998-04-30 00:05:06 +00:00
|
|
|
(setq elt (car alist)
|
1995-06-27 06:23:43 +00:00
|
|
|
tail (cdr elt)
|
1998-04-30 00:05:06 +00:00
|
|
|
alist (cdr alist)
|
|
|
|
head (car elt))
|
1996-08-26 00:08:21 +00:00
|
|
|
;; A nested ALIST element looks like
|
|
|
|
;; (INDEX-NAME (INDEX-NAME . INDEX-POSITION) ...)
|
|
|
|
;; while a bottom-level element looks like
|
|
|
|
;; (INDEX-NAME . INDEX-POSITION)
|
|
|
|
;; We are only interested in the bottom-level elements, so we need to
|
|
|
|
;; recurse if TAIL is a list.
|
|
|
|
(cond ((listp tail)
|
|
|
|
(if (setq res (imenu--in-alist str tail))
|
|
|
|
(setq alist nil)))
|
1999-09-24 13:55:29 +00:00
|
|
|
((if imenu-name-lookup-function
|
|
|
|
(funcall imenu-name-lookup-function str head)
|
|
|
|
(string= str head))
|
1996-08-26 00:08:21 +00:00
|
|
|
(setq alist nil res elt))))
|
1995-06-27 06:23:43 +00:00
|
|
|
res))
|
|
|
|
|
1998-01-25 23:06:37 +00:00
|
|
|
(defvar imenu-syntax-alist nil
|
2001-11-20 00:17:25 +00:00
|
|
|
"Alist of syntax table modifiers to use while in `imenu--generic-function'.
|
1998-01-25 23:06:37 +00:00
|
|
|
|
|
|
|
The car of the assocs may be either a character or a string and the
|
2002-08-20 20:35:56 +00:00
|
|
|
cdr is a syntax description appropriate for `modify-syntax-entry'. For
|
1998-01-25 23:06:37 +00:00
|
|
|
a string, all the characters in the string get the specified syntax.
|
|
|
|
|
|
|
|
This is typically used to give word syntax to characters which
|
1998-05-27 13:37:11 +00:00
|
|
|
normally have symbol syntax to simplify `imenu-expression'
|
1998-01-25 23:06:37 +00:00
|
|
|
and speed-up matching.")
|
2001-01-29 15:50:53 +00:00
|
|
|
;;;###autoload
|
1998-01-25 23:06:37 +00:00
|
|
|
(make-variable-buffer-local 'imenu-syntax-alist)
|
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
(defun imenu-default-create-index-function ()
|
2008-12-03 05:48:14 +00:00
|
|
|
"Default function to create an index alist of the current buffer.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
2006-04-18 21:22:33 +00:00
|
|
|
The most general method is to move point to end of buffer, then repeatedly call
|
1994-05-04 21:34:13 +00:00
|
|
|
`imenu-prev-index-position-function' and `imenu-extract-index-name-function'.
|
2006-04-18 21:22:33 +00:00
|
|
|
All the results returned by the latter are gathered into an index alist.
|
|
|
|
This method is used if those two variables are non-nil.
|
|
|
|
|
|
|
|
The alternate method, which is the one most often used, is to call
|
|
|
|
`imenu--generic-function' with `imenu-generic-expression' as argument."
|
1994-05-06 06:06:08 +00:00
|
|
|
;; These should really be done by setting imenu-create-index-function
|
|
|
|
;; in these major modes. But save that change for later.
|
1997-11-11 03:54:00 +00:00
|
|
|
(cond ((and imenu-prev-index-position-function
|
|
|
|
imenu-extract-index-name-function)
|
2013-01-30 07:46:28 +00:00
|
|
|
(let ((index-alist '()) (pos -1)
|
lisp/*: Add declarations, remove unused bindings, mark unused args.
* lisp/avoid.el (mouse-avoidance-mode): Mark unused arg.
(mouse-avoidance-nudge-mouse): Remove unused binding.
* lisp/imenu.el (imenu-default-goto-function): Mark unused args.
(imenu-progress-message): Remove obsolete macro; all callers changed.
* lisp/mouse.el (mouse-menu-major-mode-map):
* lisp/emacs-lisp/authors.el (authors-scan-change-log)
(authors-add-to-author-list):
* lisp/emacs-lisp/avl-tree.el (avl-tree--enter-balance):
* lisp/emacs-lisp/smie.el (smie-auto-fill):
* lisp/mail/sendmail.el (mail-bury):
* lisp/mail/unrmail.el (unrmail):
* lisp/net/tls.el (open-tls-stream):
* lisp/textmodes/picture.el (picture-mouse-set-point):
Remove unused bindings.
* lisp/subr.el (keymap-canonicalize): Remove unused binding.
(read-passwd): Mark unused arg.
* lisp/tutorial.el (tutorial--display-changes): Remove unused binding.
(tutorial--save-tutorial-to): Remove unused variable.
* lisp/emacs-lisp/package.el (define-package, package-menu-mark-delete)
(package-menu-mark-install, package-menu-mark-unmark): Mark unused args.
(package-generate-autoloads, package-menu--generate)
(package-menu--find-upgrades): Remove unused bindings.
* lisp/emulation/cua-rect.el (cua-restrict-regexp-rectangle)
(cua-restrict-prefix-rectangle): Doc fixes. Remove unused bindings.
(cua--mouse-ignore, cua--delete-rectangle, cua--extract-rectangle)
(cua--indent-rectangle, cua-open-rectangle, cua-close-rectangle)
(cua-blank-rectangle, cua-string-rectangle, cua-replace-in-rectangle)
(cua-incr-rectangle, cua-sequence-rectangle, cua--convert-rectangle-as)
(cua--rectangle-aux-replace, cua--left-fill-rectangle)
(cua-scroll-rectangle-up, cua-scroll-rectangle-down)
(cua-delete-char-rectangle): Mark unused args.
(cua-align-rectangle): Remove unused binding.
* lisp/mail/rmail.el (compilation--message->loc)
(epa--find-coding-system-for-mime-charset): Declare.
* lisp/net/dbus.el (dbus-register-service): Declare.
(dbus-name-owner-changed-handler): Remove unused binding.
* lisp/nxml/nxml-mode.el (nxml-electric-slash, nxml-in-mixed-content-p)
(nxml-compute-indent-from-matching-start-tag): Remove unused variables.
(nxml-scan-backward-within): Mark unused arg.
(nxml-dynamic-markup-word): Remove unused binding.
2012-04-19 17:20:26 +00:00
|
|
|
name)
|
1994-05-06 06:06:08 +00:00
|
|
|
(goto-char (point-max))
|
|
|
|
;; Search for the function
|
1998-04-30 00:05:06 +00:00
|
|
|
(while (funcall imenu-prev-index-position-function)
|
2013-01-30 07:46:28 +00:00
|
|
|
(when (= pos (point))
|
|
|
|
(error "Infinite loop at %s:%d: imenu-prev-index-position-function does not move point" (buffer-name) pos))
|
2010-01-11 20:53:23 +00:00
|
|
|
(setq pos (point))
|
1994-05-06 06:06:08 +00:00
|
|
|
(save-excursion
|
|
|
|
(setq name (funcall imenu-extract-index-name-function)))
|
|
|
|
(and (stringp name)
|
1997-04-05 21:41:59 +00:00
|
|
|
;; [ydi] updated for imenu-use-markers
|
|
|
|
(push (cons name (if imenu-use-markers (point-marker) (point)))
|
|
|
|
index-alist)))
|
1994-11-30 20:50:33 +00:00
|
|
|
index-alist))
|
|
|
|
;; Use generic expression if possible.
|
|
|
|
((and imenu-generic-expression)
|
1998-04-30 00:05:06 +00:00
|
|
|
(imenu--generic-function imenu-generic-expression))
|
1994-11-30 20:50:33 +00:00
|
|
|
(t
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "This buffer cannot use `imenu-default-create-index-function'"))))
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1994-11-30 20:50:33 +00:00
|
|
|
;;;
|
|
|
|
;;; Generic index gathering function.
|
|
|
|
;;;
|
1995-06-27 06:23:43 +00:00
|
|
|
|
1998-01-25 22:55:08 +00:00
|
|
|
(defvar imenu-case-fold-search t
|
|
|
|
"Defines whether `imenu--generic-function' should fold case when matching.
|
|
|
|
|
2001-11-20 00:17:25 +00:00
|
|
|
This variable should be set (only) by initialization code
|
2003-05-06 15:16:27 +00:00
|
|
|
for modes which use `imenu--generic-function'. If it is not set, but
|
|
|
|
`font-lock-defaults' is set, then font-lock's setting is used.")
|
1998-04-30 00:05:06 +00:00
|
|
|
;;;###autoload
|
1998-01-25 22:55:08 +00:00
|
|
|
(make-variable-buffer-local 'imenu-case-fold-search)
|
|
|
|
|
2004-11-25 02:57:47 +00:00
|
|
|
;; This function can be called with quitting disabled,
|
|
|
|
;; so it needs to be careful never to loop!
|
1995-06-27 06:23:43 +00:00
|
|
|
(defun imenu--generic-function (patterns)
|
2006-04-18 21:22:33 +00:00
|
|
|
"Return an index alist of the current buffer based on PATTERNS.
|
2012-08-05 14:14:54 +00:00
|
|
|
PATTERNS should be an alist which has the same form as
|
|
|
|
`imenu-generic-expression'.
|
1995-06-27 06:23:43 +00:00
|
|
|
|
2012-08-05 14:14:54 +00:00
|
|
|
The return value is an alist of the form
|
2003-10-02 09:45:16 +00:00
|
|
|
(INDEX-NAME . INDEX-POSITION)
|
2012-08-05 14:14:54 +00:00
|
|
|
or
|
2003-10-02 09:45:16 +00:00
|
|
|
(INDEX-NAME INDEX-POSITION FUNCTION ARGUMENTS...)
|
2012-08-05 14:14:54 +00:00
|
|
|
The return value may also consist of nested index alists like:
|
2003-10-02 09:45:16 +00:00
|
|
|
(INDEX-NAME . INDEX-ALIST)
|
|
|
|
depending on PATTERNS."
|
1995-06-27 06:23:43 +00:00
|
|
|
(let ((index-alist (list 'dummy))
|
2003-05-06 15:16:27 +00:00
|
|
|
(case-fold-search (if (or (local-variable-p 'imenu-case-fold-search)
|
|
|
|
(not (local-variable-p 'font-lock-defaults)))
|
|
|
|
imenu-case-fold-search
|
|
|
|
(nth 2 font-lock-defaults)))
|
1998-01-25 23:06:37 +00:00
|
|
|
(old-table (syntax-table))
|
|
|
|
(table (copy-syntax-table (syntax-table)))
|
|
|
|
(slist imenu-syntax-alist))
|
|
|
|
;; Modify the syntax table used while matching regexps.
|
2001-11-20 00:17:25 +00:00
|
|
|
(dolist (syn slist)
|
1998-04-30 00:05:06 +00:00
|
|
|
;; The character(s) to modify may be a single char or a string.
|
2001-11-20 00:17:25 +00:00
|
|
|
(if (numberp (car syn))
|
|
|
|
(modify-syntax-entry (car syn) (cdr syn) table)
|
2002-08-20 20:23:25 +00:00
|
|
|
(mapc (lambda (c)
|
|
|
|
(modify-syntax-entry c (cdr syn) table))
|
|
|
|
(car syn))))
|
1994-11-30 20:50:33 +00:00
|
|
|
(goto-char (point-max))
|
1998-04-30 00:05:06 +00:00
|
|
|
(unwind-protect ; for syntax table
|
|
|
|
(save-match-data
|
|
|
|
(set-syntax-table table)
|
2004-11-25 02:57:47 +00:00
|
|
|
|
1998-04-30 00:05:06 +00:00
|
|
|
;; map over the elements of imenu-generic-expression
|
|
|
|
;; (typically functions, variables ...)
|
2001-11-20 00:17:25 +00:00
|
|
|
(dolist (pat patterns)
|
|
|
|
(let ((menu-title (car pat))
|
|
|
|
(regexp (nth 1 pat))
|
|
|
|
(index (nth 2 pat))
|
|
|
|
(function (nth 3 pat))
|
2004-10-26 21:38:09 +00:00
|
|
|
(rest (nthcdr 4 pat))
|
2005-04-23 16:43:30 +00:00
|
|
|
start beg)
|
2001-11-20 00:17:25 +00:00
|
|
|
;; Go backwards for convenience of adding items in order.
|
|
|
|
(goto-char (point-max))
|
2005-05-21 02:44:29 +00:00
|
|
|
(while (and (if (functionp regexp)
|
|
|
|
(funcall regexp)
|
2012-04-12 20:00:24 +00:00
|
|
|
(and
|
|
|
|
(re-search-backward regexp nil t)
|
|
|
|
;; Do not count invisible definitions.
|
|
|
|
(let ((invis (invisible-p (point))))
|
|
|
|
(or (not invis)
|
|
|
|
(progn
|
|
|
|
(while (and invis
|
|
|
|
(not (bobp)))
|
|
|
|
(setq invis (not (re-search-backward
|
|
|
|
regexp nil 'move))))
|
|
|
|
(not invis))))))
|
2004-11-25 02:57:47 +00:00
|
|
|
;; Exit the loop if we get an empty match,
|
|
|
|
;; because it means a bad regexp was specified.
|
|
|
|
(not (= (match-beginning 0) (match-end 0))))
|
2004-11-20 23:31:55 +00:00
|
|
|
(setq start (point))
|
2005-04-23 16:43:30 +00:00
|
|
|
;; Record the start of the line in which the match starts.
|
2005-01-15 18:09:16 +00:00
|
|
|
;; That's the official position of this definition.
|
2005-04-23 16:43:30 +00:00
|
|
|
(goto-char (match-beginning index))
|
|
|
|
(beginning-of-line)
|
|
|
|
(setq beg (point))
|
2004-12-03 00:21:37 +00:00
|
|
|
;; Add this sort of submenu only when we've found an
|
|
|
|
;; item for it, avoiding empty, duff menus.
|
|
|
|
(unless (assoc menu-title index-alist)
|
|
|
|
(push (list menu-title) index-alist))
|
|
|
|
(if imenu-use-markers
|
2005-04-23 16:43:30 +00:00
|
|
|
(setq beg (copy-marker beg)))
|
2004-12-03 00:21:37 +00:00
|
|
|
(let ((item
|
|
|
|
(if function
|
|
|
|
(nconc (list (match-string-no-properties index)
|
2005-04-23 16:43:30 +00:00
|
|
|
beg function)
|
2004-12-03 00:21:37 +00:00
|
|
|
rest)
|
|
|
|
(cons (match-string-no-properties index)
|
2005-04-23 16:43:30 +00:00
|
|
|
beg)))
|
2004-12-03 00:21:37 +00:00
|
|
|
;; This is the desired submenu,
|
|
|
|
;; starting with its title (or nil).
|
|
|
|
(menu (assoc menu-title index-alist)))
|
|
|
|
;; Insert the item unless it is already present.
|
|
|
|
(unless (member item (cdr menu))
|
|
|
|
(setcdr menu
|
2005-04-23 16:43:30 +00:00
|
|
|
(cons item (cdr menu)))))
|
|
|
|
;; Go to the start of the match, to make sure we
|
|
|
|
;; keep making progress backwards.
|
|
|
|
(goto-char start))))
|
1998-04-30 00:05:06 +00:00
|
|
|
(set-syntax-table old-table)))
|
1998-09-30 19:21:01 +00:00
|
|
|
;; Sort each submenu by position.
|
|
|
|
;; This is in case one submenu gets items from two different regexps.
|
2001-11-20 00:17:25 +00:00
|
|
|
(dolist (item index-alist)
|
|
|
|
(when (listp item)
|
|
|
|
(setcdr item (sort (cdr item) 'imenu--sort-by-position))))
|
1996-03-01 18:09:57 +00:00
|
|
|
(let ((main-element (assq nil index-alist)))
|
1996-09-21 23:00:40 +00:00
|
|
|
(nconc (delq main-element (delq 'dummy index-alist))
|
|
|
|
(cdr main-element)))))
|
1994-11-30 20:50:33 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
;;;
|
|
|
|
;;; The main functions for this package!
|
|
|
|
;;;
|
|
|
|
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
|
|
|
2001-11-20 00:17:25 +00:00
|
|
|
;; See also info-lookup-find-item
|
|
|
|
(defun imenu-find-default (guess completions)
|
|
|
|
"Fuzzily find an item based on GUESS inside the alist COMPLETIONS."
|
|
|
|
(catch 'found
|
|
|
|
(let ((case-fold-search t))
|
|
|
|
(if (assoc guess completions) guess
|
|
|
|
(dolist (re (list (concat "\\`" (regexp-quote guess) "\\'")
|
|
|
|
(concat "\\`" (regexp-quote guess))
|
|
|
|
(concat (regexp-quote guess) "\\'")
|
|
|
|
(regexp-quote guess)))
|
|
|
|
(dolist (x completions)
|
|
|
|
(if (string-match re (car x)) (throw 'found (car x)))))))))
|
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
(defun imenu--completion-buffer (index-alist &optional prompt)
|
|
|
|
"Let the user select from INDEX-ALIST in a completion buffer with PROMPT.
|
|
|
|
|
2004-10-10 03:17:52 +00:00
|
|
|
Return one of the entries in index-alist or nil."
|
1994-03-07 03:00:30 +00:00
|
|
|
;; Create a list for this buffer only when needed.
|
1998-04-30 00:05:06 +00:00
|
|
|
(let ((name (thing-at-point 'symbol))
|
|
|
|
choice
|
|
|
|
(prepared-index-alist
|
2002-08-15 00:12:30 +00:00
|
|
|
(if (not imenu-space-replacement) index-alist
|
|
|
|
(mapcar
|
|
|
|
(lambda (item)
|
2005-06-29 13:49:08 +00:00
|
|
|
(cons (subst-char-in-string ?\s (aref imenu-space-replacement 0)
|
2002-08-15 00:12:30 +00:00
|
|
|
(car item))
|
|
|
|
(cdr item)))
|
|
|
|
index-alist))))
|
2001-11-20 00:17:25 +00:00
|
|
|
(when (stringp name)
|
|
|
|
(setq name (or (imenu-find-default name prepared-index-alist) name)))
|
1998-04-30 00:05:06 +00:00
|
|
|
(cond (prompt)
|
|
|
|
((and name (imenu--in-alist name prepared-index-alist))
|
|
|
|
(setq prompt (format "Index item (default %s): " name)))
|
|
|
|
(t (setq prompt "Index item: ")))
|
2002-08-15 00:12:30 +00:00
|
|
|
(let ((minibuffer-setup-hook minibuffer-setup-hook))
|
|
|
|
;; Display the completion buffer.
|
|
|
|
(if (not imenu-eager-completion-buffer)
|
|
|
|
(add-hook 'minibuffer-setup-hook 'minibuffer-completion-help))
|
|
|
|
(setq name (completing-read prompt
|
|
|
|
prepared-index-alist
|
|
|
|
nil t nil 'imenu--history-list name)))
|
2004-05-29 14:35:20 +00:00
|
|
|
|
2004-10-10 03:17:52 +00:00
|
|
|
(when (stringp name)
|
|
|
|
(setq choice (assoc name prepared-index-alist))
|
|
|
|
(if (imenu--subalist-p choice)
|
|
|
|
(imenu--completion-buffer (cdr choice) prompt)
|
|
|
|
choice))))
|
1994-05-04 21:34:13 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
(defun imenu--mouse-menu (index-alist event &optional title)
|
|
|
|
"Let the user select from a buffer index from a mouse menu.
|
|
|
|
|
|
|
|
INDEX-ALIST is the buffer index and EVENT is a mouse event.
|
|
|
|
|
1996-09-10 17:57:05 +00:00
|
|
|
Returns t for rescan and otherwise an element or subelement of INDEX-ALIST."
|
1996-03-01 18:09:57 +00:00
|
|
|
(setq index-alist (imenu--split-submenus index-alist))
|
2001-11-20 00:17:25 +00:00
|
|
|
(let* ((menu (imenu--split-menu index-alist (or title (buffer-name))))
|
2003-05-16 21:12:25 +00:00
|
|
|
(map (imenu--create-keymap (car menu)
|
|
|
|
(cdr (if (< 1 (length (cdr menu)))
|
|
|
|
menu
|
|
|
|
(car (cdr menu)))))))
|
2001-11-20 00:17:25 +00:00
|
|
|
(popup-menu map event)))
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1994-03-07 23:24:02 +00:00
|
|
|
(defun imenu-choose-buffer-index (&optional prompt alist)
|
1994-03-07 03:00:30 +00:00
|
|
|
"Let the user select from a buffer index and return the chosen index.
|
|
|
|
|
|
|
|
If the user originally activated this function with the mouse, a mouse
|
|
|
|
menu is used. Otherwise a completion buffer is used and the user is
|
|
|
|
prompted with PROMPT.
|
|
|
|
|
1994-03-07 23:24:02 +00:00
|
|
|
If you call this function with index alist ALIST, then it lets the user
|
|
|
|
select from ALIST.
|
|
|
|
|
1994-04-16 02:38:40 +00:00
|
|
|
With no index alist ALIST, it calls `imenu--make-index-alist' to
|
1994-03-07 23:24:02 +00:00
|
|
|
create the index alist.
|
|
|
|
|
2006-07-09 01:59:34 +00:00
|
|
|
If `imenu-use-popup-menu' is nil, then the completion buffer
|
|
|
|
is always used, no matter if the mouse was used or not.
|
1994-03-07 03:00:30 +00:00
|
|
|
|
1996-09-30 23:38:43 +00:00
|
|
|
The returned value is of the form (INDEX-NAME . INDEX-POSITION)."
|
1994-03-07 03:00:30 +00:00
|
|
|
(let (index-alist
|
1994-07-20 07:41:16 +00:00
|
|
|
(mouse-triggered (listp last-nonmenu-event))
|
2001-11-20 00:17:25 +00:00
|
|
|
(result t))
|
1994-03-07 03:00:30 +00:00
|
|
|
;; If selected by mouse, see to that the window where the mouse is
|
|
|
|
;; really is selected.
|
|
|
|
(and mouse-triggered
|
1995-06-27 10:05:22 +00:00
|
|
|
(not (equal last-nonmenu-event '(menu-bar)))
|
1994-07-20 07:41:16 +00:00
|
|
|
(let ((window (posn-window (event-start last-nonmenu-event))))
|
1995-07-21 12:40:55 +00:00
|
|
|
(or (framep window) (null window) (select-window window))))
|
1994-03-07 03:00:30 +00:00
|
|
|
;; Create a list for this buffer only when needed.
|
|
|
|
(while (eq result t)
|
1994-03-07 23:24:02 +00:00
|
|
|
(setq index-alist (if alist alist (imenu--make-index-alist)))
|
1994-03-07 03:00:30 +00:00
|
|
|
(setq result
|
2002-08-15 00:12:30 +00:00
|
|
|
(if (and imenu-use-popup-menu
|
|
|
|
(or (eq imenu-use-popup-menu t) mouse-triggered))
|
1994-07-20 07:41:16 +00:00
|
|
|
(imenu--mouse-menu index-alist last-nonmenu-event)
|
1994-03-07 03:00:30 +00:00
|
|
|
(imenu--completion-buffer index-alist prompt)))
|
2004-10-10 03:17:52 +00:00
|
|
|
(and (equal result imenu--rescan-item)
|
1994-08-01 07:11:43 +00:00
|
|
|
(imenu--cleanup)
|
2004-10-10 03:17:52 +00:00
|
|
|
(setq result t imenu--index-alist nil)))
|
1994-03-07 03:00:30 +00:00
|
|
|
result))
|
|
|
|
|
1995-06-27 06:23:43 +00:00
|
|
|
;;;###autoload
|
1994-08-01 07:11:43 +00:00
|
|
|
(defun imenu-add-to-menubar (name)
|
1998-04-30 00:05:06 +00:00
|
|
|
"Add an `imenu' entry to the menu bar for the current buffer.
|
1995-12-21 17:47:08 +00:00
|
|
|
NAME is a string used to name the menu bar item.
|
1996-02-24 01:42:31 +00:00
|
|
|
See the command `imenu' for more information."
|
1995-12-21 17:47:08 +00:00
|
|
|
(interactive "sImenu menu item name: ")
|
1997-11-11 03:54:00 +00:00
|
|
|
(if (or (and imenu-prev-index-position-function
|
|
|
|
imenu-extract-index-name-function)
|
|
|
|
imenu-generic-expression
|
|
|
|
(not (eq imenu-create-index-function
|
|
|
|
'imenu-default-create-index-function)))
|
2012-04-11 21:37:13 +00:00
|
|
|
(unless (and (current-local-map)
|
|
|
|
(keymapp (lookup-key (current-local-map) [menu-bar index])))
|
2012-03-15 01:38:40 +00:00
|
|
|
(let ((newmap (make-sparse-keymap)))
|
|
|
|
(set-keymap-parent newmap (current-local-map))
|
|
|
|
(setq imenu--last-menubar-index-alist nil)
|
|
|
|
(define-key newmap [menu-bar index]
|
|
|
|
`(menu-item ,name ,(make-sparse-keymap "Imenu")))
|
|
|
|
(use-local-map newmap)
|
|
|
|
(add-hook 'menu-bar-update-hook 'imenu-update-menubar)))
|
Add new error and function `user-error'.
* lisp/subr.el (user-error): New function.
* lisp/window.el (switch-to-buffer):
* lisp/vc/smerge-mode.el (smerge-resolve-function, smerge-resolve)
(smerge-match-conflict):
* lisp/simple.el (previous-matching-history-element)
(next-matching-history-element, goto-history-element, undo-more)
(undo-start):
* lisp/progmodes/etags.el (visit-tags-table-buffer, find-tag-tag)
(find-tag-noselect, find-tag-in-order, etags-goto-tag-location)
(next-file, tags-loop-scan, list-tags, complete-tag):
* lisp/progmodes/compile.el (compilation-loop):
* lisp/mouse.el (mouse-minibuffer-check):
* lisp/man.el (Man-bgproc-sentinel, Man-goto-page):
* lisp/info.el (Info-find-node-2, Info-extract-pointer, Info-history-back)
(Info-history-forward, Info-follow-reference, Info-menu)
(Info-extract-menu-item, Info-extract-menu-counting)
(Info-forward-node, Info-backward-node, Info-next-menu-item)
(Info-last-menu-item, Info-next-preorder, Info-last-preorder)
(Info-next-reference, Info-prev-reference, Info-index)
(Info-index-next, Info-follow-nearest-node)
(Info-copy-current-node-name):
* lisp/imenu.el (imenu--make-index-alist)
(imenu-default-create-index-function, imenu-add-to-menubar):
* lisp/files.el (basic-save-buffer, recover-file):
* lisp/emacs-lisp/easy-mmode.el (easy-mmode-define-navigation):
* lisp/emacs-lisp/checkdoc.el (checkdoc-continue, checkdoc-comments)
(checkdoc-message-text, checkdoc-defun):
* lisp/dabbrev.el (dabbrev-completion, dabbrev--abbrev-at-point):
* lisp/cus-edit.el (customize-changed-options, customize-rogue)
(customize-saved, custom-variable-set, custom-variable-mark-to-save)
(custom-variable-mark-to-reset-standard)
(custom-variable-reset-backup, custom-face-mark-to-reset-standard)
(custom-file):
* lisp/completion.el (check-completion-length):
* lisp/comint.el (comint-search-arg)
(comint-previous-matching-input-string-position)
(comint-previous-matching-input)
(comint-replace-by-expanded-history-before-point, comint-send-input)
(comint-copy-old-input, comint-backward-matching-input)
(comint-goto-process-mark, comint-set-process-mark):
* lisp/calendar/calendar.el (calendar-cursor-to-date): Use it.
* lisp/bindings.el (debug-ignored-errors): Remove regexps, add `user-error'.
* src/data.c (PUT_ERROR): New macro.
(syms_of_data): Use it. Add new error type `user-error'.
* src/undo.c (user_error): New function.
(Fprimitive_undo): Use it.
* src/print.c (print_error_message): Adjust print style for `user-error'.
* src/keyboard.c (user_error): New function.
(Fexit_recursive_edit, Fabort_recursive_edit): Use it.
2012-05-04 23:16:47 +00:00
|
|
|
(user-error "The mode `%s' does not support Imenu"
|
|
|
|
(format-mode-line mode-name))))
|
1995-12-21 17:47:08 +00:00
|
|
|
|
1998-04-30 00:05:06 +00:00
|
|
|
;;;###autoload
|
|
|
|
(defun imenu-add-menubar-index ()
|
|
|
|
"Add an Imenu \"Index\" entry on the menu bar for the current buffer.
|
|
|
|
|
|
|
|
A trivial interface to `imenu-add-to-menubar' suitable for use in a hook."
|
|
|
|
(interactive)
|
|
|
|
(imenu-add-to-menubar "Index"))
|
|
|
|
|
1996-02-21 21:44:28 +00:00
|
|
|
(defvar imenu-buffer-menubar nil)
|
|
|
|
|
2012-05-08 14:19:08 +00:00
|
|
|
(defvar-local imenu-menubar-modified-tick 0
|
2006-09-01 13:30:55 +00:00
|
|
|
"The value of (buffer-chars-modified-tick) as of the last call
|
|
|
|
to `imenu-update-menubar'.")
|
2002-03-11 09:16:37 +00:00
|
|
|
|
1995-12-21 17:47:08 +00:00
|
|
|
(defun imenu-update-menubar ()
|
2002-03-18 04:27:30 +00:00
|
|
|
(when (and (current-local-map)
|
|
|
|
(keymapp (lookup-key (current-local-map) [menu-bar index]))
|
2006-09-01 13:30:55 +00:00
|
|
|
(/= (buffer-chars-modified-tick) imenu-menubar-modified-tick))
|
|
|
|
(setq imenu-menubar-modified-tick (buffer-chars-modified-tick))
|
2002-03-18 04:27:30 +00:00
|
|
|
(let ((index-alist (imenu--make-index-alist t)))
|
|
|
|
;; Don't bother updating if the index-alist has not changed
|
|
|
|
;; since the last time we did it.
|
|
|
|
(unless (equal index-alist imenu--last-menubar-index-alist)
|
|
|
|
(let (menu menu1 old)
|
|
|
|
(setq imenu--last-menubar-index-alist index-alist)
|
|
|
|
(setq index-alist (imenu--split-submenus index-alist))
|
|
|
|
(setq menu (imenu--split-menu index-alist
|
|
|
|
(buffer-name)))
|
2003-05-16 21:12:25 +00:00
|
|
|
(setq menu1 (imenu--create-keymap (car menu)
|
|
|
|
(cdr (if (< 1 (length (cdr menu)))
|
|
|
|
menu
|
|
|
|
(car (cdr menu))))
|
|
|
|
'imenu--menubar-select))
|
2002-03-18 04:27:30 +00:00
|
|
|
(setq old (lookup-key (current-local-map) [menu-bar index]))
|
2012-03-15 01:38:40 +00:00
|
|
|
;; This should never happen, but in some odd cases, potentially,
|
|
|
|
;; lookup-key may return a dynamically composed keymap.
|
|
|
|
(if (keymapp (cadr old)) (setq old (cadr old)))
|
2002-03-18 04:27:30 +00:00
|
|
|
(setcdr old (cdr menu1)))))))
|
1995-12-21 17:47:08 +00:00
|
|
|
|
|
|
|
(defun imenu--menubar-select (item)
|
2001-11-20 00:17:25 +00:00
|
|
|
"Use Imenu to select the function or variable named in this menu ITEM."
|
1997-03-22 23:42:48 +00:00
|
|
|
(if (equal item imenu--rescan-item)
|
1996-03-08 21:51:22 +00:00
|
|
|
(progn
|
|
|
|
(imenu--cleanup)
|
2004-05-29 14:35:20 +00:00
|
|
|
;; Make sure imenu-update-menubar redoes everything.
|
|
|
|
(setq imenu-menubar-modified-tick -1)
|
1996-03-08 21:51:22 +00:00
|
|
|
(setq imenu--index-alist nil)
|
2004-05-29 14:35:20 +00:00
|
|
|
(setq imenu--last-menubar-index-alist nil)
|
2001-11-20 00:17:25 +00:00
|
|
|
(imenu-update-menubar)
|
|
|
|
t)
|
|
|
|
(imenu item)
|
|
|
|
nil))
|
1994-08-01 07:11:43 +00:00
|
|
|
|
lisp/*: Add declarations, remove unused bindings, mark unused args.
* lisp/avoid.el (mouse-avoidance-mode): Mark unused arg.
(mouse-avoidance-nudge-mouse): Remove unused binding.
* lisp/imenu.el (imenu-default-goto-function): Mark unused args.
(imenu-progress-message): Remove obsolete macro; all callers changed.
* lisp/mouse.el (mouse-menu-major-mode-map):
* lisp/emacs-lisp/authors.el (authors-scan-change-log)
(authors-add-to-author-list):
* lisp/emacs-lisp/avl-tree.el (avl-tree--enter-balance):
* lisp/emacs-lisp/smie.el (smie-auto-fill):
* lisp/mail/sendmail.el (mail-bury):
* lisp/mail/unrmail.el (unrmail):
* lisp/net/tls.el (open-tls-stream):
* lisp/textmodes/picture.el (picture-mouse-set-point):
Remove unused bindings.
* lisp/subr.el (keymap-canonicalize): Remove unused binding.
(read-passwd): Mark unused arg.
* lisp/tutorial.el (tutorial--display-changes): Remove unused binding.
(tutorial--save-tutorial-to): Remove unused variable.
* lisp/emacs-lisp/package.el (define-package, package-menu-mark-delete)
(package-menu-mark-install, package-menu-mark-unmark): Mark unused args.
(package-generate-autoloads, package-menu--generate)
(package-menu--find-upgrades): Remove unused bindings.
* lisp/emulation/cua-rect.el (cua-restrict-regexp-rectangle)
(cua-restrict-prefix-rectangle): Doc fixes. Remove unused bindings.
(cua--mouse-ignore, cua--delete-rectangle, cua--extract-rectangle)
(cua--indent-rectangle, cua-open-rectangle, cua-close-rectangle)
(cua-blank-rectangle, cua-string-rectangle, cua-replace-in-rectangle)
(cua-incr-rectangle, cua-sequence-rectangle, cua--convert-rectangle-as)
(cua--rectangle-aux-replace, cua--left-fill-rectangle)
(cua-scroll-rectangle-up, cua-scroll-rectangle-down)
(cua-delete-char-rectangle): Mark unused args.
(cua-align-rectangle): Remove unused binding.
* lisp/mail/rmail.el (compilation--message->loc)
(epa--find-coding-system-for-mime-charset): Declare.
* lisp/net/dbus.el (dbus-register-service): Declare.
(dbus-name-owner-changed-handler): Remove unused binding.
* lisp/nxml/nxml-mode.el (nxml-electric-slash, nxml-in-mixed-content-p)
(nxml-compute-indent-from-matching-start-tag): Remove unused variables.
(nxml-scan-backward-within): Mark unused arg.
(nxml-dynamic-markup-word): Remove unused binding.
2012-04-19 17:20:26 +00:00
|
|
|
(defun imenu-default-goto-function (_name position &optional _rest)
|
2004-10-10 03:17:52 +00:00
|
|
|
"Move to the given position.
|
1998-04-30 00:05:06 +00:00
|
|
|
|
|
|
|
NAME is ignored. POSITION is where to move. REST is also ignored.
|
|
|
|
The ignored args just make this function have the same interface as a
|
|
|
|
function placed in a special index-item."
|
1997-04-05 21:41:59 +00:00
|
|
|
(if (or (< position (point-min))
|
|
|
|
(> position (point-max)))
|
1997-03-22 23:42:48 +00:00
|
|
|
;; widen if outside narrowing
|
|
|
|
(widen))
|
1997-04-05 21:41:59 +00:00
|
|
|
(goto-char position))
|
1997-03-22 23:42:48 +00:00
|
|
|
|
1994-05-04 21:34:13 +00:00
|
|
|
;;;###autoload
|
1995-07-25 21:13:10 +00:00
|
|
|
(defun imenu (index-item)
|
1994-05-04 21:34:13 +00:00
|
|
|
"Jump to a place in the buffer chosen using a buffer menu or mouse menu.
|
1998-04-30 00:05:06 +00:00
|
|
|
INDEX-ITEM specifies the position. See `imenu-choose-buffer-index'
|
|
|
|
for more information."
|
1996-12-16 07:39:34 +00:00
|
|
|
(interactive (list (imenu-choose-buffer-index)))
|
1995-12-21 17:47:08 +00:00
|
|
|
;; Convert a string to an alist element.
|
|
|
|
(if (stringp index-item)
|
|
|
|
(setq index-item (assoc index-item (imenu--make-index-alist))))
|
2001-11-20 00:17:25 +00:00
|
|
|
(when index-item
|
2012-10-29 09:58:49 +00:00
|
|
|
(push-mark nil t)
|
2001-11-20 00:17:25 +00:00
|
|
|
(let* ((is-special-item (listp (cdr index-item)))
|
|
|
|
(function
|
|
|
|
(if is-special-item
|
|
|
|
(nth 2 index-item) imenu-default-goto-function))
|
|
|
|
(position (if is-special-item
|
|
|
|
(cadr index-item) (cdr index-item)))
|
|
|
|
(rest (if is-special-item (cddr index-item))))
|
|
|
|
(apply function (car index-item) position rest))
|
|
|
|
(run-hooks 'imenu-after-jump-hook)))
|
1994-08-01 07:11:43 +00:00
|
|
|
|
1994-03-07 03:00:30 +00:00
|
|
|
(provide 'imenu)
|
|
|
|
|
|
|
|
;;; imenu.el ends here
|