Mercurial > emacs
annotate lisp/imenu.el @ 16189:b41f7cd8f5b3 libc-960918 libc-960919 libc-960920 libc-960921 libc-960922 libc-960923
RMS:
Use pc instead of unknown, for pc clones.
Use -linux-gnu for Linux-based GNU systems.
author | Richard Kenner <kenner@gnu.org> |
---|---|
date | Sun, 15 Sep 1996 00:49:22 +0000 |
parents | 8ca583c0b988 |
children | 52620db97569 |
rev | line source |
---|---|
6230 | 1 ;;; imenu.el --- Framework for mode-specific buffer indexes. |
2 | |
14733 | 3 ;; Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. |
6230 | 4 |
5 ;; Author: Ake Stenhoff <etxaksf@aom.ericsson.se> | |
6 ;; Lars Lindberg <lli@sypro.cap.se> | |
7 ;; Created: 8 Feb 1994 | |
8 ;; Keywords: tools | |
14169 | 9 |
10 ;; This file is part of GNU Emacs. | |
11 | |
12 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
6230 | 13 ;; it under the terms of the GNU General Public License as published by |
14 ;; the Free Software Foundation; either version 2, or (at your option) | |
15 ;; any later version. | |
14169 | 16 |
17 ;; GNU Emacs is distributed in the hope that it will be useful, | |
6230 | 18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 ;; GNU General Public License for more details. | |
14169 | 21 |
6230 | 22 ;; You should have received a copy of the GNU General Public License |
14169 | 23 ;; along with GNU Emacs; see the file COPYING. If not, write to the |
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
25 ;; Boston, MA 02111-1307, USA. | |
6230 | 26 |
27 ;;; Commentary: | |
14169 | 28 |
6230 | 29 ;; Purpose of this package: |
30 ;; To present a framework for mode-specific buffer indexes. | |
31 ;; A buffer index is an alist of names and buffer positions. | |
32 ;; For instance all functions in a C-file and their positions. | |
33 ;; | |
34 ;; How it works: | |
35 | |
36 ;; A mode-specific function is called to generate the index. It is | |
37 ;; then presented to the user, who can choose from this index. | |
38 ;; | |
39 ;; The package comes with a set of example functions for how to | |
40 ;; utilize this package. | |
41 | |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
42 ;; There are *examples* for index gathering functions/regular |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
43 ;; expressions for C/C++ and Lisp/Emacs Lisp but it is easy to |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
44 ;; customize for other modes. A function for jumping to the chosen |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
45 ;; index position is also supplied. |
6230 | 46 |
6241 | 47 ;;; Thanks goes to |
48 ;; [simon] - Simon Leinen simon@lia.di.epfl.ch | |
49 ;; [dean] - Dean Andrews ada@unison.com | |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
50 ;; [alon] - Alon Albert al@mercury.co.il |
9176
5646f9ac8ec3
(imenu--cleanup): Changed 'mapc' to 'mapcar'.
Richard M. Stallman <rms@gnu.org>
parents:
8408
diff
changeset
|
51 ;; [greg] - Greg Thompson gregt@porsche.visix.COM |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
52 ;; [wolfgang] - Wolfgang Bangerth zcg51122@rpool1.rus.uni-stuttgart.de |
10072
a7b70665c937
(imenu): Widen temporary before scan the file.
Richard M. Stallman <rms@gnu.org>
parents:
9176
diff
changeset
|
53 ;; [kai] - Kai Grossjohann grossjoh@linus.informatik.uni-dortmund.de |
10221
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
54 ;; [david] - David M. Smith dsmith@stats.adelaide.edu.au |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
55 ;; [christian] - Christian Egli Christian.Egli@hcsd.hac.com |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
56 ;; [karl] - Karl Fogel kfogel@floss.life.uiuc.edu |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
57 |
6230 | 58 ;;; Code |
14169 | 59 |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
60 (eval-when-compile (require 'cl)) |
6230 | 61 |
62 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
63 ;;; | |
64 ;;; Customizable variables | |
65 ;;; | |
66 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
67 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
68 (defvar imenu-auto-rescan nil |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
69 "*Non-nil means Imenu should always rescan the buffers.") |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
70 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
71 (defvar imenu-auto-rescan-maxout 60000 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
72 "* auto-rescan is disabled in buffers larger than this. |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
73 This variable is buffer-local.") |
6230 | 74 |
75 (defvar imenu-always-use-completion-buffer-p nil | |
76 "*Set this to non-nil for displaying the index in a completion buffer. | |
77 | |
78 Non-nil means always display the index in a completion buffer. | |
79 Nil means display the index as a mouse menu when the mouse was | |
10221
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
80 used to invoke `imenu'. |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
81 `never' means never automatically display a listing of any kind.") |
6230 | 82 |
83 (defvar imenu-sort-function nil | |
84 "*The function to use for sorting the index mouse-menu. | |
85 | |
86 Affects only the mouse index menu. | |
87 | |
88 Set this to nil if you don't want any sorting (faster). | |
89 The items in the menu are then presented in the order they were found | |
90 in the buffer. | |
91 | |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
92 Set it to `imenu--sort-by-name' if you want alphabetic sorting. |
6230 | 93 |
94 The function should take two arguments and return T if the first | |
95 element should come before the second. The arguments are cons cells; | |
7639 | 96 \(NAME . POSITION). Look at `imenu--sort-by-name' for an example.") |
6230 | 97 |
98 (defvar imenu-max-items 25 | |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
99 "*Maximum number of elements in an mouse menu for Imenu.") |
6230 | 100 |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
101 (defvar imenu-scanning-message "Scanning buffer for index (%3d%%)" |
6230 | 102 "*Progress message during the index scanning of the buffer. |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
103 If non-nil, user gets a message during the scanning of the buffer |
6230 | 104 |
105 Relevant only if the mode-specific function that creates the buffer | |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
106 index use `imenu-progress-message'.") |
6230 | 107 |
108 (defvar imenu-space-replacement "^" | |
109 "*The replacement string for spaces in index names. | |
110 Used when presenting the index in a completion-buffer to make the | |
111 names work as tokens.") | |
112 | |
113 (defvar imenu-level-separator ":" | |
114 "*The separator between index names of different levels. | |
115 Used for making mouse-menu titles and for flattening nested indexes | |
116 with name concatenation.") | |
117 | |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
118 ;;;###autoload |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
119 (defvar imenu-generic-expression nil |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
120 "The regex pattern to use for creating a buffer index. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
121 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
122 If non-nil this pattern is passed to `imenu-create-index-with-pattern' |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
123 to create a buffer index. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
124 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
125 It is an alist with elements that look like this: (MENU-TITLE |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
126 REGEXP INDEX). |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
127 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
128 MENU-TITLE is a string used as the title for the submenu or nil if the |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
129 entries are not nested. |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
130 |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
131 REGEXP is a regexp that should match a construct in the buffer that is |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
132 to be displayed in the menu; i.e., function or variable definitions, |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
133 etc. It contains a substring which is the name to appear in the |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
134 menu. See the info section on Regexps for more information. |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
135 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
136 INDEX points to the substring in REGEXP that contains the name (of the |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
137 function, variable or type) that is to appear in the menu. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
138 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
139 For emacs-lisp-mode for example PATTERN would look like: |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
140 |
13645
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
141 '((nil \"^\\\\s-*(def\\\\(un\\\\|subst\\\\|macro\\\\|advice\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2) |
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
142 (\"*Vars*\" \"^\\\\s-*(def\\\\(var\\\\|const\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2) |
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
143 (\"*Types*\" \"^\\\\s-*(def\\\\(type\\\\|struct\\\\|class\\\\|ine-condition\\\\)\\\\s-+\\\\([-A-Za-z0-9+]+\\\\)\" 2)) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
144 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
145 The variable is buffer-local.") |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
146 |
14816
485422b900d3
(imenu-generic-expression): Autoload the make-variable-buffer-local call.
Richard M. Stallman <rms@gnu.org>
parents:
14798
diff
changeset
|
147 ;;;###autoload |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
148 (make-variable-buffer-local 'imenu-generic-expression) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
149 |
6230 | 150 ;;;; Hooks |
151 | |
152 (defvar imenu-create-index-function 'imenu-default-create-index-function | |
153 "The function to use for creating a buffer index. | |
154 | |
155 It should be a function that takes no arguments and returns an index | |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
156 of the current buffer as an alist. The elements in the alist look |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
157 like: (INDEX-NAME . INDEX-POSITION). You may also nest index list like |
7639 | 158 \(INDEX-NAME . INDEX-ALIST). |
6230 | 159 |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
160 This function is called within a `save-excursion'. |
6230 | 161 |
162 The variable is buffer-local.") | |
163 (make-variable-buffer-local 'imenu-create-index-function) | |
164 | |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
165 (defvar imenu-prev-index-position-function 'beginning-of-defun |
6230 | 166 "Function for finding the next index position. |
167 | |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
168 If `imenu-create-index-function' is set to |
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
169 `imenu-default-create-index-function', then you must set this variable |
6230 | 170 to a function that will find the next index, looking backwards in the |
171 file. | |
172 | |
173 The function should leave point at the place to be connected to the | |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
174 index and it should return nil when it doesn't find another index.") |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
175 (make-variable-buffer-local 'imenu-prev-index-position-function) |
6230 | 176 |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
177 (defvar imenu-extract-index-name-function nil |
6230 | 178 "Function for extracting the index name. |
179 | |
180 This function is called after the function pointed out by | |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
181 `imenu-prev-index-position-function'.") |
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
182 (make-variable-buffer-local 'imenu-extract-index-name-function) |
6230 | 183 |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
184 ;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
185 ;;; Macro to display a progress message. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
186 ;;; RELPOS is the relative position to display. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
187 ;;; If RELPOS is nil, then the relative position in the buffer |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
188 ;;; is calculated. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
189 ;;; PREVPOS is the variable in which we store the last position displayed. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
190 (defmacro imenu-progress-message (prevpos &optional relpos reverse) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
191 (` (and |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
192 imenu-scanning-message |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
193 (let ((pos (, (if relpos |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
194 relpos |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
195 (` (imenu--relative-position (, reverse))))))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
196 (if (, (if relpos t |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
197 (` (> pos (+ 5 (, prevpos)))))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
198 (progn |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
199 (message imenu-scanning-message pos) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
200 (setq (, prevpos) pos))))))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
201 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
202 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
203 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
204 ;;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
205 ;;;; Some examples of functions utilizing the framework of this |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
206 ;;;; package. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
207 ;;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
208 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
209 |
12707
06608e9272b5
(imenu-generic-lisp-expression)
Karl Heuer <kwzh@gnu.org>
parents:
12664
diff
changeset
|
210 ;; Return the current/previous sexp and the location of the sexp (its |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
211 ;; beginning) without moving the point. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
212 (defun imenu-example--name-and-position () |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
213 (save-excursion |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
214 (forward-sexp -1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
215 (let ((beg (point)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
216 (end (progn (forward-sexp) (point))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
217 (marker (make-marker))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
218 (set-marker marker beg) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
219 (cons (buffer-substring beg end) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
220 marker)))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
221 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
222 ;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
223 ;;; Lisp |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
224 ;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
225 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
226 (defun imenu-example--lisp-extract-index-name () |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
227 ;; Example of a candidate for `imenu-extract-index-name-function'. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
228 ;; This will generate a flat index of definitions in a lisp file. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
229 (save-match-data |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
230 (and (looking-at "(def") |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
231 (condition-case nil |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
232 (progn |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
233 (down-list 1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
234 (forward-sexp 2) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
235 (let ((beg (point)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
236 (end (progn (forward-sexp -1) (point)))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
237 (buffer-substring beg end))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
238 (error nil))))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
239 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
240 (defun imenu-example--create-lisp-index () |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
241 ;; Example of a candidate for `imenu-create-index-function'. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
242 ;; It will generate a nested index of definitions. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
243 (let ((index-alist '()) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
244 (index-var-alist '()) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
245 (index-type-alist '()) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
246 (index-unknown-alist '()) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
247 prev-pos) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
248 (goto-char (point-max)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
249 (imenu-progress-message prev-pos 0) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
250 ;; Search for the function |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
251 (while (beginning-of-defun) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
252 (imenu-progress-message prev-pos nil t) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
253 (save-match-data |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
254 (and (looking-at "(def") |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
255 (save-excursion |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
256 (down-list 1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
257 (cond |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
258 ((looking-at "def\\(var\\|const\\)") |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
259 (forward-sexp 2) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
260 (push (imenu-example--name-and-position) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
261 index-var-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
262 ((looking-at "def\\(un\\|subst\\|macro\\|advice\\)") |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
263 (forward-sexp 2) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
264 (push (imenu-example--name-and-position) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
265 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
266 ((looking-at "def\\(type\\|struct\\|class\\|ine-condition\\)") |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
267 (forward-sexp 2) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
268 (if (= (char-after (1- (point))) ?\)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
269 (progn |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
270 (forward-sexp -1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
271 (down-list 1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
272 (forward-sexp 1))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
273 (push (imenu-example--name-and-position) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
274 index-type-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
275 (t |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
276 (forward-sexp 2) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
277 (push (imenu-example--name-and-position) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
278 index-unknown-alist))))))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
279 (imenu-progress-message prev-pos 100) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
280 (and index-var-alist |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
281 (push (cons "Variables" index-var-alist) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
282 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
283 (and index-type-alist |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
284 (push (cons "Types" index-type-alist) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
285 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
286 (and index-unknown-alist |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
287 (push (cons "Syntax-unknown" index-unknown-alist) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
288 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
289 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
290 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
291 ;; Regular expression to find C functions |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
292 (defvar imenu-example--function-name-regexp-c |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
293 (concat |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
294 "^[a-zA-Z0-9]+[ \t]?" ; type specs; there can be no |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
295 "\\([a-zA-Z0-9_*]+[ \t]+\\)?" ; more than 3 tokens, right? |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
296 "\\([a-zA-Z0-9_*]+[ \t]+\\)?" |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
297 "\\([*&]+[ \t]*\\)?" ; pointer |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
298 "\\([a-zA-Z0-9_*]+\\)[ \t]*(" ; name |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
299 )) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
300 |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
301 (defun imenu-example--create-c-index (&optional regexp) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
302 (let ((index-alist '()) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
303 prev-pos char) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
304 (goto-char (point-min)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
305 (imenu-progress-message prev-pos 0) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
306 ;; Search for the function |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
307 (save-match-data |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
308 (while (re-search-forward |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
309 (or regexp imenu-example--function-name-regexp-c) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
310 nil t) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
311 (imenu-progress-message prev-pos) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
312 (backward-up-list 1) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
313 (save-excursion |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
314 (goto-char (scan-sexps (point) 1)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
315 (setq char (following-char))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
316 ;; Skip this function name if it is a prototype declaration. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
317 (if (not (eq char ?\;)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
318 (push (imenu-example--name-and-position) index-alist)))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
319 (imenu-progress-message prev-pos 100) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
320 (nreverse index-alist))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
321 |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
322 |
6230 | 323 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
324 ;;; | |
325 ;;; Internal variables | |
326 ;;; | |
327 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
328 | |
329 ;; The item to use in the index for rescanning the buffer. | |
330 (defconst imenu--rescan-item '("*Rescan*" . -99)) | |
331 | |
332 ;; The latest buffer index. | |
333 ;; Buffer local. | |
334 (defvar imenu--index-alist nil) | |
335 (make-variable-buffer-local 'imenu--index-alist) | |
336 | |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
337 ;; The latest buffer index used to update the menu bar menu. |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
338 (defvar imenu--last-menubar-index-alist nil) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
339 (make-variable-buffer-local 'imenu--last-menubar-index-alist) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
340 |
6230 | 341 ;; History list for 'jump-to-function-in-buffer'. |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
342 ;; Making this buffer local caused it not to work! |
6230 | 343 (defvar imenu--history-list nil) |
344 | |
345 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
346 ;;; | |
347 ;;; Internal support functions | |
348 ;;; | |
349 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
350 | |
351 ;;; | |
352 ;;; Sort function | |
353 ;;; Sorts the items depending on their index name. | |
354 ;;; An item look like (NAME . POSITION). | |
355 ;;; | |
356 (defun imenu--sort-by-name (item1 item2) | |
357 (string-lessp (car item1) (car item2))) | |
358 | |
359 (defun imenu--relative-position (&optional reverse) | |
360 ;; Support function to calculate relative position in buffer | |
361 ;; Beginning of buffer is 0 and end of buffer is 100 | |
362 ;; If REVERSE is non-nil then the beginning is 100 and the end is 0. | |
363 (let ((pos (point)) | |
364 (total (buffer-size))) | |
365 (and reverse (setq pos (- total pos))) | |
366 (if (> total 50000) | |
367 ;; Avoid overflow from multiplying by 100! | |
368 (/ (1- pos) (max (/ total 100) 1)) | |
369 (/ (* 100 (1- pos)) (max total 1))))) | |
370 | |
371 ;; Split LIST into sublists of max length N. | |
372 ;; Example (imenu--split '(1 2 3 4 5 6 7 8) 3)-> '((1 2 3) (4 5 6) (7 8)) | |
373 (defun imenu--split (list n) | |
374 (let ((remain list) | |
375 (result '()) | |
376 (sublist '()) | |
377 (i 0)) | |
378 (while remain | |
379 (push (pop remain) sublist) | |
380 (incf i) | |
381 (and (= i n) | |
382 ;; We have finished a sublist | |
383 (progn (push (nreverse sublist) result) | |
384 (setq i 0) | |
385 (setq sublist '())))) | |
386 ;; There might be a sublist (if the length of LIST mod n is != 0) | |
387 ;; that has to be added to the result list. | |
388 (and sublist | |
389 (push (nreverse sublist) result)) | |
390 (nreverse result))) | |
391 | |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
392 ;;; Split the alist MENULIST into a nested alist, if it is long enough. |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
393 ;;; In any case, add TITLE to the front of the alist. |
6230 | 394 (defun imenu--split-menu (menulist title) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
395 (if imenu-sort-function |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
396 (setq menulist |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
397 (sort |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
398 (let ((res nil) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
399 (oldlist menulist)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
400 ;; Copy list method from the cl package `copy-list' |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
401 (while (consp oldlist) (push (pop oldlist) res)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
402 (prog1 (nreverse res) (setcdr res oldlist))) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
403 imenu-sort-function))) |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
404 (if (> (length menulist) imenu-max-items) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
405 (let ((count 0)) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
406 (cons title |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
407 (mapcar |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
408 (function |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
409 (lambda (menu) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
410 (cons (format "(%s-%d)" title (setq count (1+ count))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
411 menu))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
412 (imenu--split menulist imenu-max-items)))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
413 (cons title menulist))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
414 |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
415 ;;; Split up each long alist that are nested within ALIST |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
416 ;;; into nested alists. |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
417 (defun imenu--split-submenus (alist) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
418 (mapcar (function (lambda (elt) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
419 (if (and (consp elt) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
420 (stringp (car elt)) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
421 (listp (cdr elt))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
422 (imenu--split-menu (cdr elt) (car elt)) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
423 elt))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
424 alist)) |
6230 | 425 |
426 ;;; | |
427 ;;; Find all items in this buffer that should be in the index. | |
428 ;;; Returns an alist on the form | |
429 ;;; ((NAME . POSITION) (NAME . POSITION) ...) | |
430 ;;; | |
431 | |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
432 (defun imenu--make-index-alist (&optional noerror) |
6230 | 433 ;; Create a list for this buffer only when needed. |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
434 (or (and imenu--index-alist |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
435 (or (not imenu-auto-rescan) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
436 (and imenu-auto-rescan |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
437 (> (buffer-size) imenu-auto-rescan-maxout)))) |
6230 | 438 ;; Get the index |
439 (setq imenu--index-alist | |
440 (save-excursion | |
441 (funcall imenu-create-index-function)))) | |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
442 (or imenu--index-alist noerror |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
443 (error "No items suitable for an index found in this buffer")) |
6230 | 444 (or imenu--index-alist |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
445 (setq imenu--index-alist (list nil))) |
6230 | 446 ;; Add a rescan option to the index. |
447 (cons imenu--rescan-item imenu--index-alist)) | |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
448 ;;; |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
449 ;;; Find all markers in alist and makes |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
450 ;;; them point nowhere. |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
451 ;;; |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
452 (defun imenu--cleanup (&optional alist) |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
453 ;; Sets the markers in imenu--index-alist |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
454 ;; point nowhere. |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
455 ;; if alist is provided use that list. |
10795
8cbc8846b19b
(imenu--cleanup): Set alist to its default just once, at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
10221
diff
changeset
|
456 (or alist |
8cbc8846b19b
(imenu--cleanup): Set alist to its default just once, at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
10221
diff
changeset
|
457 (setq alist imenu--index-alist)) |
8cbc8846b19b
(imenu--cleanup): Set alist to its default just once, at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
10221
diff
changeset
|
458 (and alist |
9176
5646f9ac8ec3
(imenu--cleanup): Changed 'mapc' to 'mapcar'.
Richard M. Stallman <rms@gnu.org>
parents:
8408
diff
changeset
|
459 (mapcar |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
460 (function |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
461 (lambda (item) |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
462 (cond |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
463 ((markerp (cdr item)) |
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
464 (set-marker (cdr item) nil)) |
10795
8cbc8846b19b
(imenu--cleanup): Set alist to its default just once, at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
10221
diff
changeset
|
465 ((consp (cdr item)) |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
466 (imenu--cleanup (cdr item)))))) |
10795
8cbc8846b19b
(imenu--cleanup): Set alist to its default just once, at the beginning.
Richard M. Stallman <rms@gnu.org>
parents:
10221
diff
changeset
|
467 alist) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
468 t)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
469 |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
470 (defun imenu--create-keymap-2 (alist counter &optional commands) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
471 (let ((map nil)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
472 (mapcar |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
473 (function |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
474 (lambda (item) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
475 (cond |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
476 ((listp (cdr item)) |
14114
b8c7c891ed63
(imenu--create-keymap-2): Fix bug in constructing
Karl Heuer <kwzh@gnu.org>
parents:
14040
diff
changeset
|
477 (append (list (setq counter (1+ counter)) |
b8c7c891ed63
(imenu--create-keymap-2): Fix bug in constructing
Karl Heuer <kwzh@gnu.org>
parents:
14040
diff
changeset
|
478 (car item) 'keymap (car item)) |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
479 (imenu--create-keymap-2 (cdr item) (+ counter 10) commands))) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
480 (t |
14114
b8c7c891ed63
(imenu--create-keymap-2): Fix bug in constructing
Karl Heuer <kwzh@gnu.org>
parents:
14040
diff
changeset
|
481 (let ((end (if commands `(lambda () (interactive) |
b8c7c891ed63
(imenu--create-keymap-2): Fix bug in constructing
Karl Heuer <kwzh@gnu.org>
parents:
14040
diff
changeset
|
482 (imenu--menubar-select ',item)) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
483 (cons '(nil) item)))) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
484 (cons (car item) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
485 (cons (car item) end)))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
486 ))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
487 alist))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
488 |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
489 ;; If COMMANDS is non-nil, make a real keymap |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
490 ;; with a real command used as the definition. |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
491 ;; If it is nil, make something suitable for x-popup-menu. |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
492 (defun imenu--create-keymap-1 (title alist &optional commands) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
493 (append (list 'keymap title) (imenu--create-keymap-2 alist 0 commands))) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
494 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
495 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
496 (defun imenu--in-alist (str alist) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
497 "Check whether the string STR is contained in multi-level ALIST." |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
498 (let (elt head tail res) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
499 (setq res nil) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
500 (while alist |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
501 (setq elt (car alist) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
502 tail (cdr elt) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
503 alist (cdr alist) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
504 head (car elt)) |
15929
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
505 ;; A nested ALIST element looks like |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
506 ;; (INDEX-NAME (INDEX-NAME . INDEX-POSITION) ...) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
507 ;; while a bottom-level element looks like |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
508 ;; (INDEX-NAME . INDEX-POSITION) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
509 ;; We are only interested in the bottom-level elements, so we need to |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
510 ;; recurse if TAIL is a list. |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
511 (cond ((listp tail) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
512 (if (setq res (imenu--in-alist str tail)) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
513 (setq alist nil))) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
514 ((string= str head) |
955269257adf
(imenu--in-alist): Accept only bottom-level matches.
Richard M. Stallman <rms@gnu.org>
parents:
15831
diff
changeset
|
515 (setq alist nil res elt)))) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
516 res)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
517 |
6230 | 518 (defun imenu-default-create-index-function () |
519 "*Wrapper for index searching functions. | |
520 | |
521 Moves point to end of buffer and then repeatedly calls | |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
522 `imenu-prev-index-position-function' and `imenu-extract-index-name-function'. |
6230 | 523 Their results are gathered into an index alist." |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
524 ;; These should really be done by setting imenu-create-index-function |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
525 ;; in these major modes. But save that change for later. |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
526 (cond ((and (fboundp imenu-prev-index-position-function) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
527 (fboundp imenu-extract-index-name-function)) |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
528 (let ((index-alist '()) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
529 prev-pos name) |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
530 (goto-char (point-max)) |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
531 (imenu-progress-message prev-pos 0 t) |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
532 ;; Search for the function |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
533 (while (funcall imenu-prev-index-position-function) |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
534 (imenu-progress-message prev-pos nil t) |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
535 (save-excursion |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
536 (setq name (funcall imenu-extract-index-name-function))) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
537 (and (stringp name) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
538 (push (cons name (point)) index-alist))) |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
539 (imenu-progress-message prev-pos 100 t) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
540 index-alist)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
541 ;; Use generic expression if possible. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
542 ((and imenu-generic-expression) |
12707
06608e9272b5
(imenu-generic-lisp-expression)
Karl Heuer <kwzh@gnu.org>
parents:
12664
diff
changeset
|
543 (imenu--generic-function imenu-generic-expression)) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
544 (t |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
545 (error "The mode \"%s\" does not take full advantage of imenu.el yet." |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
546 mode-name)))) |
6230 | 547 |
548 (defun imenu--replace-spaces (name replacement) | |
549 ;; Replace all spaces in NAME with REPLACEMENT. | |
550 ;; That second argument should be a string. | |
551 (mapconcat | |
552 (function | |
553 (lambda (ch) | |
554 (if (char-equal ch ?\ ) | |
555 replacement | |
556 (char-to-string ch)))) | |
557 name | |
558 "")) | |
559 | |
560 (defun imenu--flatten-index-alist (index-alist &optional concat-names prefix) | |
561 ;; Takes a nested INDEX-ALIST and returns a flat index alist. | |
562 ;; If optional CONCAT-NAMES is non-nil, then a nested index has its | |
563 ;; name and a space concatenated to the names of the children. | |
564 ;; Third argument PREFIX is for internal use only. | |
565 (mapcan | |
566 (function | |
567 (lambda (item) | |
568 (let* ((name (car item)) | |
569 (pos (cdr item)) | |
570 (new-prefix (and concat-names | |
571 (if prefix | |
572 (concat prefix imenu-level-separator name) | |
573 name)))) | |
574 (cond | |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
575 ((or (markerp pos) (numberp pos)) |
6230 | 576 (list (cons new-prefix pos))) |
577 (t | |
578 (imenu--flatten-index-alist pos new-prefix)))))) | |
579 index-alist)) | |
580 | |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
581 ;;; |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
582 ;;; Generic index gathering function. |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
583 ;;; |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
584 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
585 (defun imenu--generic-function (patterns) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
586 ;; Built on some ideas that Erik Naggum <erik@naggum.no> once posted |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
587 ;; to comp.emacs |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
588 "Return an index of the current buffer as an alist. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
589 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
590 PATTERN is an alist with elements that look like this: (MENU-TITLE |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
591 REGEXP INDEX). |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
592 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
593 MENU-TITLE is a string used as the title for the submenu or nil if the |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
594 entries are not nested. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
595 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
596 REGEXP is a regexp that should match a construct in the buffer that is |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
597 to be displayed in the menu; i.e., function or variable definitions, |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
598 etc. It contains a substring which is the name to appear in the |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
599 menu. See the info section on Regexps for more information. |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
600 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
601 INDEX points to the substring in REGEXP that contains the name (of the |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
602 function, variable or type) that is to appear in the menu. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
603 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
604 For emacs-lisp-mode for example PATTERN would look like: |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
605 |
13645
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
606 '((nil \"^\\\\s-*(def\\\\(un\\\\|subst\\\\|macro\\\\|advice\\\\)\\\\s-+\\\\([-A-Za-z0-9]+\\\\)\" 2) |
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
607 (\"*Vars*\" \"^\\\\s-*(def\\\\(var\\\\|const\\\\)\\\\s-+\\\\([-A-Za-z0-9]+\\\\)\" 2) |
9681c6008417
(imenu-generic-expression, imenu--generic-function): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
12707
diff
changeset
|
608 (\"*Types*\" \"^\\\\s-*(def\\\\(type\\\\|struct\\\\|class\\\\|ine-condition\\\\)\\\\s-+\\\\([-A-Za-z0-9]+\\\\)\" 2))' |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
609 |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
610 Returns an index of the current buffer as an alist. The elements in |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
611 the alist look like: (INDEX-NAME . INDEX-POSITION). They may also be |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
612 nested index lists like (INDEX-NAME . INDEX-ALIST) depending on |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
613 pattern. |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
614 |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
615 \(imenu--generic-function PATTERN\)." |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
616 |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
617 (let ((index-alist (list 'dummy)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
618 (found nil) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
619 (global-regexp |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
620 (concat "\\(" |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
621 (mapconcat |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
622 (function (lambda (pattern) (identity (cadr pattern)))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
623 patterns "\\)\\|\\(") |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
624 "\\)")) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
625 prev-pos) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
626 |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
627 (goto-char (point-max)) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
628 (imenu-progress-message prev-pos 0 t) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
629 (save-match-data |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
630 (while (re-search-backward global-regexp nil t) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
631 (imenu-progress-message prev-pos nil t) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
632 (setq found nil) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
633 (save-excursion |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
634 (goto-char (match-beginning 0)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
635 (mapcar |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
636 (function |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
637 (lambda (pat) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
638 (let ((menu-title (car pat)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
639 (regexp (cadr pat)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
640 (index (caddr pat))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
641 (if (and (not found) ; Only allow one entry; |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
642 (looking-at regexp)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
643 (let ((beg (match-beginning index)) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
644 (end (match-end index))) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
645 (setq found t) |
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
646 (push |
14575
69a5f0592433
(imenu--generic-function): Ignore text properties.
Karl Heuer <kwzh@gnu.org>
parents:
14169
diff
changeset
|
647 (cons (buffer-substring-no-properties beg end) beg) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
648 (cdr |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
649 (or (assoc menu-title index-alist) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
650 (car (push |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
651 (cons menu-title '()) |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
652 index-alist)))))))))) |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
653 patterns)))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
654 (imenu-progress-message prev-pos 100 t) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
655 (let ((main-element (assq nil index-alist))) |
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
656 (nconc (delq main-element (delq 'dummy index-alist)) main-element)))) |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
657 |
6230 | 658 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
659 ;;; | |
660 ;;; The main functions for this package! | |
661 ;;; | |
662 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | |
663 | |
664 (defun imenu--completion-buffer (index-alist &optional prompt) | |
665 "Let the user select from INDEX-ALIST in a completion buffer with PROMPT. | |
666 | |
667 Returns t for rescan and otherwise a position number." | |
668 ;; Create a list for this buffer only when needed. | |
669 (let (name choice | |
10093
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
670 (prepared-index-alist |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
671 (mapcar |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
672 (function |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
673 (lambda (item) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
674 (cons (imenu--replace-spaces (car item) imenu-space-replacement) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
675 (cdr item)))) |
caafb376e619
(imenu-generic-expression): New variable.
Karl Heuer <kwzh@gnu.org>
parents:
10072
diff
changeset
|
676 index-alist))) |
10221
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
677 (if (eq imenu-always-use-completion-buffer-p 'never) |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
678 (setq name (completing-read (or prompt "Index item: ") |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
679 prepared-index-alist |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
680 nil t nil 'imenu--history-list)) |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
681 (save-window-excursion |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
682 ;; Display the completion buffer |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
683 (with-output-to-temp-buffer "*Completions*" |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
684 (display-completion-list |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
685 (all-completions "" prepared-index-alist ))) |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
686 (let ((minibuffer-setup-hook |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
687 (function (lambda () |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
688 (let ((buffer (current-buffer))) |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
689 (save-excursion |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
690 (set-buffer "*Completions*") |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
691 (setq completion-reference-buffer buffer))))))) |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
692 ;; Make a completion question |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
693 (setq name (completing-read (or prompt "Index item: ") |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
694 prepared-index-alist |
34b66bff7aec
(imenu-always-use-completion-buffer-p): A value of
Richard M. Stallman <rms@gnu.org>
parents:
10093
diff
changeset
|
695 nil t nil 'imenu--history-list))))) |
7350
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
696 (cond ((not (stringp name)) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
697 nil) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
698 ((string= name (car imenu--rescan-item)) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
699 t) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
700 (t |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
701 (setq choice (assoc name prepared-index-alist)) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
702 (if (listp (cdr choice)) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
703 (imenu--completion-buffer (cdr choice) prompt) |
542ab48d0f18
(imenu-default-create-index-function):
Richard M. Stallman <rms@gnu.org>
parents:
7319
diff
changeset
|
704 choice))))) |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
705 |
6230 | 706 (defun imenu--mouse-menu (index-alist event &optional title) |
707 "Let the user select from a buffer index from a mouse menu. | |
708 | |
709 INDEX-ALIST is the buffer index and EVENT is a mouse event. | |
710 | |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
711 Returns t for rescan and otherwise an element or subelement of INDEX-ALIST." |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
712 (setq index-alist (imenu--split-submenus index-alist)) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
713 (let* ((menu (imenu--split-menu index-alist |
6230 | 714 (or title (buffer-name)))) |
715 position) | |
15374
6b1faae68eba
(imenu--mouse-menu): Always use nested keymaps.
Richard M. Stallman <rms@gnu.org>
parents:
15335
diff
changeset
|
716 (setq menu (imenu--create-keymap-1 (car menu) |
6b1faae68eba
(imenu--mouse-menu): Always use nested keymaps.
Richard M. Stallman <rms@gnu.org>
parents:
15335
diff
changeset
|
717 (if (< 1 (length (cdr menu))) |
6b1faae68eba
(imenu--mouse-menu): Always use nested keymaps.
Richard M. Stallman <rms@gnu.org>
parents:
15335
diff
changeset
|
718 (cdr menu) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
719 (cdr (car (cdr menu)))))) |
6230 | 720 (setq position (x-popup-menu event menu)) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
721 (cond ((eq position nil) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
722 position) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
723 ;; If one call to x-popup-menu handled the nested menus, |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
724 ;; find the result by looking down the menus here. |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
725 ((and (listp position) |
15411
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
726 (numberp (car position)) |
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
727 (stringp (nth (1- (length position)) position))) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
728 (let ((final menu)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
729 (while position |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
730 (setq final (assoc (car position) final)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
731 (setq position (cdr position))) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
732 (cdr (cdr (cdr final))))) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
733 ;; If x-popup-menu went just one level and found a leaf item, |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
734 ;; return the INDEX-ALIST element for that. |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
735 ((and (consp position) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
736 (stringp (car position)) |
15411
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
737 (null (cdr position))) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
738 (or (string= (car position) (car imenu--rescan-item)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
739 (assq (car position) index-alist))) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
740 ;; If x-popup-menu went just one level |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
741 ;; and found a non-leaf item (a submenu), |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
742 ;; recurse to handle the rest. |
15411
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
743 ((listp position) |
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
744 (imenu--mouse-menu position event |
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
745 (if title |
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
746 (concat title imenu-level-separator |
9691904c57a5
(imenu--mouse-menu): Don't check imenu-use-keymap-menu.
Richard M. Stallman <rms@gnu.org>
parents:
15374
diff
changeset
|
747 (car (rassq position index-alist))) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
748 (car (rassq position index-alist)))))))) |
6230 | 749 |
6241 | 750 (defun imenu-choose-buffer-index (&optional prompt alist) |
6230 | 751 "Let the user select from a buffer index and return the chosen index. |
752 | |
753 If the user originally activated this function with the mouse, a mouse | |
754 menu is used. Otherwise a completion buffer is used and the user is | |
755 prompted with PROMPT. | |
756 | |
6241 | 757 If you call this function with index alist ALIST, then it lets the user |
758 select from ALIST. | |
759 | |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
760 With no index alist ALIST, it calls `imenu--make-index-alist' to |
6241 | 761 create the index alist. |
762 | |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
763 If `imenu-always-use-completion-buffer-p' is non-nil, then the |
6230 | 764 completion buffer is always used, no matter if the mouse was used or |
765 not. | |
766 | |
767 The returned value is on the form (INDEX-NAME . INDEX-POSITION)." | |
768 (let (index-alist | |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
769 (mouse-triggered (listp last-nonmenu-event)) |
6230 | 770 (result t) ) |
771 ;; If selected by mouse, see to that the window where the mouse is | |
772 ;; really is selected. | |
773 (and mouse-triggered | |
12396
d0c82df80d70
(imenu-choose-buffer-index): Understand that (menu-bar)
Richard M. Stallman <rms@gnu.org>
parents:
12394
diff
changeset
|
774 (not (equal last-nonmenu-event '(menu-bar))) |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
775 (let ((window (posn-window (event-start last-nonmenu-event)))) |
12635
f12b1374fb5b
(imenu-choose-buffer-index): Avoid trying to select WINDOW if it is nil.
Richard M. Stallman <rms@gnu.org>
parents:
12396
diff
changeset
|
776 (or (framep window) (null window) (select-window window)))) |
6230 | 777 ;; Create a list for this buffer only when needed. |
778 (while (eq result t) | |
6241 | 779 (setq index-alist (if alist alist (imenu--make-index-alist))) |
6230 | 780 (setq result |
781 (if (and mouse-triggered | |
782 (not imenu-always-use-completion-buffer-p)) | |
8296
b2b493c007ff
(imenu-choose-buffer-index): Use last-nonmenu-event
Richard M. Stallman <rms@gnu.org>
parents:
8256
diff
changeset
|
783 (imenu--mouse-menu index-alist last-nonmenu-event) |
6230 | 784 (imenu--completion-buffer index-alist prompt))) |
785 (and (eq result t) | |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
786 (imenu--cleanup) |
6230 | 787 (setq imenu--index-alist nil))) |
788 result)) | |
789 | |
12394
4fbc70e4d5e7
(imenu-use-keymap-menu): New variable.
Richard M. Stallman <rms@gnu.org>
parents:
10795
diff
changeset
|
790 ;;;###autoload |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
791 (defun imenu-add-to-menubar (name) |
14657
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
792 "Adds an `imenu' entry to the menu bar for the current buffer. |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
793 NAME is a string used to name the menu bar item. |
14657
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
794 See the command `imenu' for more information." |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
795 (interactive "sImenu menu item name: ") |
14657
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
796 (let ((newmap (make-sparse-keymap)) |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
797 (menu-bar (lookup-key (current-local-map) [menu-bar]))) |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
798 (define-key newmap [menu-bar] |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
799 (append (make-sparse-keymap) menu-bar)) |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
800 (define-key newmap [menu-bar index] |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
801 (cons name (nconc (make-sparse-keymap "Imenu") |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
802 (make-sparse-keymap)))) |
4bedd113757f
(imenu-add-to-menubar): Add menu item for current buf only.
Richard M. Stallman <rms@gnu.org>
parents:
14656
diff
changeset
|
803 (use-local-map (append newmap (current-local-map)))) |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
804 (add-hook 'menu-bar-update-hook 'imenu-update-menubar)) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
805 |
14642
01e8fdb45deb
(imenu-buffer-menubar): Add defvar.
Karl Heuer <kwzh@gnu.org>
parents:
14575
diff
changeset
|
806 (defvar imenu-buffer-menubar nil) |
01e8fdb45deb
(imenu-buffer-menubar): Add defvar.
Karl Heuer <kwzh@gnu.org>
parents:
14575
diff
changeset
|
807 |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
808 (defun imenu-update-menubar () |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
809 (and (current-local-map) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
810 (keymapp (lookup-key (current-local-map) [menu-bar index])) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
811 (let ((index-alist (imenu--make-index-alist t))) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
812 ;; Don't bother updating if the index-alist has not changed |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
813 ;; since the last time we did it. |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
814 (or (equal index-alist imenu--last-menubar-index-alist) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
815 (let (menu menu1 old) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
816 (setq imenu--last-menubar-index-alist index-alist) |
14726
35e1cfdd29a4
(imenu--menubar-select): No longer interactive.
Richard M. Stallman <rms@gnu.org>
parents:
14725
diff
changeset
|
817 (setq index-alist (imenu--split-submenus index-alist)) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
818 (setq menu (imenu--split-menu index-alist |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
819 (buffer-name))) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
820 (setq menu1 (imenu--create-keymap-1 (car menu) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
821 (if (< 1 (length (cdr menu))) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
822 (cdr menu) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
823 (cdr (car (cdr menu)))) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
824 t)) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
825 (setq old (lookup-key (current-local-map) [menu-bar index])) |
15831
d110af120b19
(imenu-update-menubar): Fix code to install the new menu.
Richard M. Stallman <rms@gnu.org>
parents:
15411
diff
changeset
|
826 (setcdr old (cdr menu1))))))) |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
827 |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
828 (defun imenu--menubar-select (item) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
829 "Use Imenu to select the function or variable named in this menu item." |
14796
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
830 (if (equal item '("*Rescan*" . -99)) |
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
831 (progn |
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
832 (imenu--cleanup) |
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
833 (setq imenu--index-alist nil) |
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
834 (imenu-update-menubar)) |
29e7001fecf0
(imenu--menubar-select): Handle the "rescan" item.
Richard M. Stallman <rms@gnu.org>
parents:
14733
diff
changeset
|
835 (imenu item))) |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
836 |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
837 ;;;###autoload |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
838 (defun imenu (index-item) |
7319
cd73ba498964
(imenu): Renamed from goto-index-pos.
Richard M. Stallman <rms@gnu.org>
parents:
6909
diff
changeset
|
839 "Jump to a place in the buffer chosen using a buffer menu or mouse menu. |
6909
9e59751db725
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
6241
diff
changeset
|
840 See `imenu-choose-buffer-index' for more information." |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
841 (interactive |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
842 (list (save-restriction |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
843 (widen) |
15335
cd47abda6c84
(imenu): In interactive spec, pass the entire
Richard M. Stallman <rms@gnu.org>
parents:
14816
diff
changeset
|
844 (imenu-choose-buffer-index)))) |
13798
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
845 ;; Convert a string to an alist element. |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
846 (if (stringp index-item) |
4eac65d000d3
(imenu-update-menubar): New function.
Karl Heuer <kwzh@gnu.org>
parents:
13645
diff
changeset
|
847 (setq index-item (assoc index-item (imenu--make-index-alist)))) |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
848 (and index-item |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
849 (progn |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
850 (push-mark) |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
851 (cond |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
852 ((markerp (cdr index-item)) |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
853 (if (or (< (marker-position (cdr index-item)) (point-min)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
854 (> (marker-position (cdr index-item)) (point-max))) |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
855 ;; widen if outside narrowing |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
856 (widen)) |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
857 (goto-char (marker-position (cdr index-item)))) |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
858 (t |
16148
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
859 (if (or (< (cdr index-item) (point-min)) |
8ca583c0b988
(imenu): Tests for when to widen were backwards.
Richard M. Stallman <rms@gnu.org>
parents:
15929
diff
changeset
|
860 (> (cdr index-item) (point-max))) |
12664
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
861 ;; widen if outside narrowing |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
862 (widen)) |
ce1cae301efe
(imenu--history-list): Don't make this buffer-local.
Richard M. Stallman <rms@gnu.org>
parents:
12635
diff
changeset
|
863 (goto-char (cdr index-item))))))) |
8408
109166e311ce
(imenu, imenu--flatten-index-alist): Add marker support.
Richard M. Stallman <rms@gnu.org>
parents:
8296
diff
changeset
|
864 |
6230 | 865 (provide 'imenu) |
866 | |
867 ;;; imenu.el ends here |