Add 2008 to copyright years.
[bpt/emacs.git] / lisp / textmodes / reftex-sel.el
CommitLineData
3afbc435 1;;; reftex-sel.el --- the selection modes for RefTeX
d5a2f2b0
GM
2
3;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
d7a0267c 4;; 2006, 2007 Free Software Foundation, Inc.
3ba2590f 5
6fbeb429 6;; Author: Carsten Dominik <dominik@science.uva.nl>
ce545621 7;; Maintainer: auctex-devel@gnu.org
5d2a58e0 8;; Version: 4.31
3ba2590f
RS
9
10;; This file is part of GNU Emacs.
11
12;; GNU Emacs is free software; you can redistribute it and/or modify
13;; it under the terms of the GNU General Public License as published by
5a9dffec 14;; the Free Software Foundation; either version 3, or (at your option)
3ba2590f
RS
15;; any later version.
16
17;; GNU Emacs is distributed in the hope that it will be useful,
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.
21
22;; You should have received a copy of the GNU General Public License
23;; along with GNU Emacs; see the file COPYING. If not, write to the
27e81652
TTN
24;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
25;; Boston, MA 02110-1301, USA.
1a9461d0 26
3afbc435
PJ
27;;; Commentary:
28
29;;; Code:
30
7c4d13cc 31(eval-when-compile (require 'cl))
1a9461d0
CD
32(provide 'reftex-sel)
33(require 'reftex)
34;;;
35
36(defvar reftex-select-label-map nil
37 "Keymap used for *RefTeX Select* buffer, when selecting a label.
38This keymap can be used to configure the label selection process which is
39started with the command \\[reftex-reference].")
40
41(defun reftex-select-label-mode ()
42 "Major mode for selecting a label in a LaTeX document.
43This buffer was created with RefTeX.
3666daf6 44It only has a meaningful keymap when you are in the middle of a
1a9461d0
CD
45selection process.
46To select a label, move the cursor to it and press RET.
47Press `?' for a summary of important key bindings.
48
49During a selection process, these are the local bindings.
50
51\\{reftex-select-label-map}"
52
53 (interactive)
54 (kill-all-local-variables)
7ac7387b
CD
55 (when (featurep 'xemacs)
56 ;; XEmacs needs the call to make-local-hook
57 (make-local-hook 'pre-command-hook)
58 (make-local-hook 'post-command-hook))
1a9461d0 59 (setq major-mode 'reftex-select-label-mode
3666daf6 60 mode-name "LSelect")
1a9461d0
CD
61 (set (make-local-variable 'reftex-select-marked) nil)
62 (when (syntax-table-p reftex-latex-syntax-table)
63 (set-syntax-table reftex-latex-syntax-table))
64 ;; We do not set a local map - reftex-select-item does this.
7b07114a 65 (run-hooks 'reftex-select-label-mode-hook))
1a9461d0
CD
66
67(defvar reftex-select-bib-map nil
68 "Keymap used for *RefTeX Select* buffer, when selecting a BibTeX entry.
69This keymap can be used to configure the BibTeX selection process which is
70started with the command \\[reftex-citation].")
71
72(defun reftex-select-bib-mode ()
73 "Major mode for selecting a citation key in a LaTeX document.
74This buffer was created with RefTeX.
3666daf6 75It only has a meaningful keymap when you are in the middle of a
1a9461d0
CD
76selection process.
77In order to select a citation, move the cursor to it and press RET.
78Press `?' for a summary of important key bindings.
79
80During a selection process, these are the local bindings.
81
82\\{reftex-select-label-map}"
83 (interactive)
84 (kill-all-local-variables)
7ac7387b
CD
85 (when (featurep 'xemacs)
86 ;; XEmacs needs the call to make-local-hook
87 (make-local-hook 'pre-command-hook)
88 (make-local-hook 'post-command-hook))
1a9461d0 89 (setq major-mode 'reftex-select-bib-mode
3666daf6 90 mode-name "BSelect")
1a9461d0
CD
91 (set (make-local-variable 'reftex-select-marked) nil)
92 ;; We do not set a local map - reftex-select-item does this.
7b07114a 93 (run-hooks 'reftex-select-bib-mode-hook))
1a9461d0 94
3b919c9f
CD
95;;; (defun reftex-get-offset (buf here-am-I &optional typekey toc index file)
96;;; ;; Find the correct offset data, like insert-docstruct would, but faster.
97;;; ;; Buffer BUF knows the correct docstruct to use.
98;;; ;; Basically this finds the first docstruct entry after HERE-I-AM which
99;;; ;; is of allowed type. The optional arguments specify what is allowed.
100;;; (catch 'exit
101;;; (save-excursion
102;;; (set-buffer buf)
103;;; (reftex-access-scan-info)
104;;; (let* ((rest (memq here-am-I (symbol-value reftex-docstruct-symbol)))
3666daf6
CD
105;;; entry)
106;;; (while (setq entry (pop rest))
107;;; (if (or (and typekey
108;;; (stringp (car entry))
109;;; (or (equal typekey " ")
110;;; (equal typekey (nth 1 entry))))
111;;; (and toc (eq (car entry) 'toc))
112;;; (and index (eq (car entry) 'index))
113;;; (and file
114;;; (memq (car entry) '(bof eof file-error))))
115;;; (throw 'exit entry)))
116;;; nil))))
3b919c9f 117
1a9461d0
CD
118(defun reftex-get-offset (buf here-am-I &optional typekey toc index file)
119 ;; Find the correct offset data, like insert-docstruct would, but faster.
120 ;; Buffer BUF knows the correct docstruct to use.
3b919c9f 121 ;; Basically this finds the first docstruct entry before HERE-I-AM which
1a9461d0
CD
122 ;; is of allowed type. The optional arguments specify what is allowed.
123 (catch 'exit
124 (save-excursion
125 (set-buffer buf)
126 (reftex-access-scan-info)
3b919c9f 127 (let* ((rest (symbol-value reftex-docstruct-symbol))
3666daf6
CD
128 lastentry entry)
129 (while (setq entry (pop rest))
130 (if (or (and typekey
131 (stringp (car entry))
132 (or (equal typekey " ")
133 (equal typekey (nth 1 entry))))
134 (and toc (eq (car entry) 'toc))
135 (and index (eq (car entry) 'index))
136 (and file
137 (memq (car entry) '(bof eof file-error))))
138 (setq lastentry entry))
139 (if (eq entry here-am-I)
140 (throw 'exit (or lastentry entry))))
141 nil))))
1a9461d0
CD
142
143(defun reftex-insert-docstruct
144 (buf toc labels index-entries files context counter show-commented
3666daf6 145 here-I-am xr-prefix toc-buffer)
1a9461d0
CD
146 ;; Insert an excerpt of the docstruct list.
147 ;; Return the data property of the entry corresponding to HERE-I-AM.
148 ;; BUF is the buffer which has the correct docstruct-symbol.
149 ;; LABELS non-nil means to include labels into the list.
150 ;; When a string, indicates the label type to include
11b4a0d2 151 ;; FILES non-nil means to display file boundaries.
1a9461d0
CD
152 ;; CONTEXT non-nil means to include label context.
153 ;; COUNTER means to count the labels.
154 ;; SHOW-COMMENTED means to include also labels which are commented out.
155 ;; HERE-I-AM is a member of the docstruct list. The function will return
156 ;; a used member near to this one, as a possible starting point.
157 ;; XR-PREFIX is the prefix to put in front of labels.
158 ;; TOC-BUFFER means this is to fill the toc buffer.
159 (let* ((font (reftex-use-fonts))
160 (cnt 0)
161 (index -1)
162 (toc-indent " ")
163 (label-indent
164 (concat "> "
165 (if toc (make-string (* 7 reftex-level-indent) ?\ ) "")))
166 (context-indent
167 (concat ". "
168 (if toc (make-string (* 7 reftex-level-indent) ?\ ) "")))
3666daf6
CD
169 (mouse-face
170 (if (memq reftex-highlight-selection '(mouse both))
171 reftex-mouse-selected-face
172 nil))
173 (label-face (reftex-verified-face reftex-label-face
174 'font-lock-constant-face
175 'font-lock-reference-face))
176 (index-face (reftex-verified-face reftex-index-face
177 'font-lock-constant-face
178 'font-lock-reference-face))
1a9461d0 179 all cell text label typekey note comment master-dir-re
3666daf6 180 prev-inserted offset from to index-tag docstruct-symbol)
1a9461d0
CD
181
182 ;; Pop to buffer buf to get the correct buffer-local variables
183 (save-excursion
184 (set-buffer buf)
185
186 ;; Ensure access to scanning info
187 (reftex-access-scan-info)
188
189 (setq docstruct-symbol reftex-docstruct-symbol
3666daf6 190 all (symbol-value reftex-docstruct-symbol)
1a9461d0
CD
191 reftex-active-toc nil
192 master-dir-re
193 (concat "\\`" (regexp-quote
194 (file-name-directory (reftex-TeX-master-file))))))
195
196 (set (make-local-variable 'reftex-docstruct-symbol) docstruct-symbol)
197 (set (make-local-variable 'reftex-prefix)
3666daf6 198 (cdr (assoc labels reftex-typekey-to-prefix-alist)))
1a9461d0
CD
199 (if (equal reftex-prefix " ") (setq reftex-prefix nil))
200
201 ;; Walk the docstruct and insert the appropriate stuff
202 (while (setq cell (pop all))
203
204 (incf index)
205 (setq from (point))
206
1a9461d0
CD
207 (cond
208
209 ((memq (car cell) '(bib thebib label-numbers appendix
3666daf6 210 master-dir bibview-cache is-multi xr xr-doc)))
1a9461d0
CD
211 ;; These are currently ignored
212
213 ((memq (car cell) '(bof eof file-error))
214 ;; Beginning or end of a file
215 (when files
3666daf6
CD
216 (setq prev-inserted cell)
217; (if (eq offset 'attention) (setq offset cell))
1a9461d0
CD
218 (insert
219 " File " (if (string-match master-dir-re (nth 1 cell))
220 (substring (nth 1 cell) (match-end 0))
221 (nth 1 cell))
222 (cond ((eq (car cell) 'bof) " starts here\n")
223 ((eq (car cell) 'eof) " ends here\n")
224 ((eq (car cell) 'file-error) " was not found\n")))
3666daf6 225 (setq to (point))
1a9461d0
CD
226 (when font
227 (put-text-property from to
228 'face reftex-file-boundary-face))
3666daf6
CD
229 (when toc-buffer
230 (if mouse-face
231 (put-text-property from (1- to)
232 'mouse-face mouse-face))
233 (put-text-property from to :data cell))))
1a9461d0
CD
234
235 ((eq (car cell) 'toc)
236 ;; a table of contents entry
7c4d13cc 237 (when (and toc
3666daf6
CD
238 (<= (nth 5 cell) reftex-toc-max-level))
239 (setq prev-inserted cell)
240; (if (eq offset 'attention) (setq offset cell))
1a9461d0
CD
241 (setq reftex-active-toc cell)
242 (insert (concat toc-indent (nth 2 cell) "\n"))
3666daf6
CD
243 (setq to (point))
244 (when font
245 (put-text-property from to
246 'face reftex-section-heading-face))
247 (when toc-buffer
248 (if mouse-face
249 (put-text-property from (1- to)
250 'mouse-face mouse-face))
251 (put-text-property from to :data cell))
252 (goto-char to)))
1a9461d0
CD
253
254 ((stringp (car cell))
255 ;; a label
256 (when (null (nth 2 cell))
257 ;; No context yet. Quick update.
3666daf6
CD
258 (setcdr cell (cdr (reftex-label-info-update cell)))
259 (put docstruct-symbol 'modified t))
1a9461d0
CD
260
261 (setq label (car cell)
262 typekey (nth 1 cell)
263 text (nth 2 cell)
264 comment (nth 4 cell)
265 note (nth 5 cell))
266
267 (when (and labels
3666daf6
CD
268 (or (eq labels t)
269 (string= typekey labels)
270 (string= labels " "))
1a9461d0
CD
271 (or show-commented (null comment)))
272
273 ;; Yes we want this one
274 (incf cnt)
3666daf6
CD
275 (setq prev-inserted cell)
276; (if (eq offset 'attention) (setq offset cell))
1a9461d0 277
3666daf6 278 (setq label (concat xr-prefix label))
1a9461d0
CD
279 (when comment (setq label (concat "% " label)))
280 (insert label-indent label)
281 (when font
3666daf6 282 (setq to (point))
1a9461d0
CD
283 (put-text-property
284 (- (point) (length label)) to
285 'face (if comment
286 'font-lock-comment-face
287 label-face))
3666daf6 288 (goto-char to))
1a9461d0
CD
289
290 (insert (if counter (format " (%d) " cnt) "")
291 (if comment " LABEL IS COMMENTED OUT " "")
292 (if (stringp note) (concat " " note) "")
293 "\n")
294 (setq to (point))
295
296 (when context
297 (insert context-indent text "\n")
298 (setq to (point)))
299 (put-text-property from to :data cell)
3666daf6
CD
300 (when mouse-face
301 (put-text-property from (1- to)
302 'mouse-face mouse-face))
1a9461d0
CD
303 (goto-char to)))
304
305 ((eq (car cell) 'index)
3666daf6
CD
306 ;; index entry
307 (when (and index-entries
308 (or (eq t index-entries)
309 (string= index-entries (nth 1 cell))))
310 (setq prev-inserted cell)
311; (if (eq offset 'attention) (setq offset cell))
312 (setq index-tag (format "<%s>" (nth 1 cell)))
313 (and font
314 (put-text-property 0 (length index-tag)
315 'face reftex-index-tag-face index-tag))
316 (insert label-indent index-tag " " (nth 7 cell))
317
318 (when font
319 (setq to (point))
320 (put-text-property
321 (- (point) (length (nth 7 cell))) to
322 'face index-face)
323 (goto-char to))
324 (insert "\n")
325 (setq to (point))
326
327 (when context
328 (insert context-indent (nth 2 cell) "\n")
329 (setq to (point)))
330 (put-text-property from to :data cell)
331 (when mouse-face
332 (put-text-property from (1- to)
333 'mouse-face mouse-face))
3b919c9f
CD
334 (goto-char to))))
335
3666daf6
CD
336 (if (eq cell here-I-am)
337 (setq offset 'attention))
3b919c9f 338 (if (and prev-inserted (eq offset 'attention))
3666daf6 339 (setq offset prev-inserted))
3b919c9f 340 )
1a9461d0
CD
341
342 (when (reftex-refontify)
343 ;; we need to fontify the buffer
344 (reftex-fontify-select-label-buffer buf))
345 (run-hooks 'reftex-display-copied-context-hook)
346 offset))
347
348(defun reftex-find-start-point (fallback &rest locations)
349 ;; Set point to the first available LOCATION. When a LOCATION is a list,
350 ;; search for such a :data text property. When it is an integer,
351 ;; use is as line number. FALLBACK is a buffer position used if everything
352 ;; else fails.
353 (catch 'exit
354 (goto-char (point-min))
355 (let (loc pos)
356 (while locations
3666daf6
CD
357 (setq loc (pop locations))
358 (cond
359 ((null loc))
360 ((listp loc)
361 (setq pos (text-property-any (point-min) (point-max) :data loc))
362 (when pos
363 (goto-char pos)
364 (throw 'exit t)))
365 ((integerp loc)
366 (when (<= loc (count-lines (point-min) (point-max)))
367 (goto-line loc)
368 (throw 'exit t)))))
1a9461d0
CD
369 (goto-char fallback))))
370
371(defvar reftex-last-data nil)
372(defvar reftex-last-line nil)
373(defvar reftex-select-marked nil)
374
375(defun reftex-select-item (prompt help-string keymap
3666daf6
CD
376 &optional offset
377 call-back cb-flag)
1a9461d0
CD
378;; Select an item, using PROMPT. The function returns a key indicating
379;; an exit status, along with a data structure indicating which item was
380;; selected.
381;; HELP-STRING contains help. KEYMAP is a keymap with the available
382;; selection commands.
383;; OFFSET can be a label list item which will be selected at start.
384;; When it is t, point will start out at the beginning of the buffer.
385;; Any other value will cause restart where last selection left off.
386;; When CALL-BACK is given, it is a function which is called with the index
387;; of the element.
388;; CB-FLAG is the initial value of that flag.
389
390 (let* (ev data last-data (selection-buffer (current-buffer)))
391
392 (setq reftex-select-marked nil)
393
394 (setq ev
395 (catch 'myexit
396 (save-window-excursion
397 (setq truncate-lines t)
398
3666daf6
CD
399 ;; Find a good starting point
400 (reftex-find-start-point
401 (point-min) offset reftex-last-data reftex-last-line)
1a9461d0 402 (beginning-of-line 1)
3666daf6 403 (set (make-local-variable 'reftex-last-follow-point) (point))
1a9461d0
CD
404
405 (unwind-protect
3666daf6
CD
406 (progn
407 (use-local-map keymap)
408 (add-hook 'pre-command-hook 'reftex-select-pre-command-hook nil t)
409 (add-hook 'post-command-hook 'reftex-select-post-command-hook nil t)
410 (princ prompt)
411 (set-marker reftex-recursive-edit-marker (point))
412 ;; XEmacs does not run post-command-hook here
413 (and (featurep 'xemacs) (run-hooks 'post-command-hook))
414 (recursive-edit))
415
416 (set-marker reftex-recursive-edit-marker nil)
417 (save-excursion
418 (set-buffer selection-buffer)
419 (use-local-map nil)
420 (remove-hook 'pre-command-hook 'reftex-select-pre-command-hook t)
421 (remove-hook 'post-command-hook
422 'reftex-select-post-command-hook t))
423 ;; Kill the mark overlays
3a1e8128 424 (mapcar (lambda (c) (reftex-delete-overlay (nth 1 c)))
3666daf6 425 reftex-select-marked)))))
1a9461d0
CD
426
427 (set (make-local-variable 'reftex-last-line)
3666daf6 428 (+ (count-lines (point-min) (point)) (if (bolp) 1 0)))
1a9461d0
CD
429 (set (make-local-variable 'reftex-last-data) last-data)
430 (reftex-kill-buffer "*RefTeX Help*")
431 (setq reftex-callback-fwd (not reftex-callback-fwd)) ;; ;-)))
432 (message "")
433 (list ev data last-data)))
434
435;; The following variables are all bound dynamically in `reftex-select-item'.
436;; The defvars are here only to silence the byte compiler.
437
438(defvar found-list)
439(defvar cb-flag)
440(defvar data)
441(defvar prompt)
442(defvar last-data)
443(defvar call-back)
444(defvar help-string)
445(defvar refstyle)
446
447;; The selection commands
448
449(defun reftex-select-pre-command-hook ()
450 (reftex-unhighlight 1)
451 (reftex-unhighlight 0))
452
453(defun reftex-select-post-command-hook ()
454 (let (b e)
455 (setq data (get-text-property (point) :data))
456 (setq last-data (or data last-data))
3666daf6 457
1a9461d0 458 (when (and data cb-flag
3666daf6 459 (not (equal reftex-last-follow-point (point))))
1a9461d0 460 (setq reftex-last-follow-point (point))
3666daf6
CD
461 (funcall call-back data reftex-callback-fwd
462 (not reftex-revisit-to-follow)))
1a9461d0 463 (if data
3666daf6
CD
464 (setq b (or (previous-single-property-change
465 (1+ (point)) :data)
466 (point-min))
467 e (or (next-single-property-change
468 (point) :data)
469 (point-max)))
1a9461d0
CD
470 (setq b (point) e (point)))
471 (and (memq reftex-highlight-selection '(cursor both))
3666daf6 472 (reftex-highlight 1 b e))
1a9461d0 473 (if (or (not (pos-visible-in-window-p b))
3666daf6
CD
474 (not (pos-visible-in-window-p e)))
475 (recenter '(4)))
1a9461d0
CD
476 (unless (current-message)
477 (princ prompt))))
478
479(defun reftex-select-next (&optional arg)
480 "Move to next selectable item."
481 (interactive "p")
482 (setq reftex-callback-fwd t)
483 (or (eobp) (forward-char 1))
484 (re-search-forward "^[^. \t\n\r]" nil t arg)
485 (beginning-of-line 1))
486(defun reftex-select-previous (&optional arg)
487 "Move to previous selectable item."
488 (interactive "p")
489 (setq reftex-callback-fwd nil)
490 (re-search-backward "^[^. \t\n\r]" nil t arg))
70d797cd
CD
491(defun reftex-select-jump (arg)
492 "Jump to a specific section. E.g. '3 z' jumps to section 3.
493Useful for large TOC's."
494 (interactive "P")
495 (goto-char (point-min))
496 (re-search-forward
497 (concat "^ *" (number-to-string (if (numberp arg) arg 1)) " ")
498 nil t)
499 (beginning-of-line))
1a9461d0
CD
500(defun reftex-select-next-heading (&optional arg)
501 "Move to next table of contentes line."
502 (interactive "p")
503 (end-of-line)
504 (re-search-forward "^ " nil t arg)
505 (beginning-of-line))
506(defun reftex-select-previous-heading (&optional arg)
507 "Move to previous table of contentes line."
508 (interactive "p")
509 (re-search-backward "^ " nil t arg))
510(defun reftex-select-quit ()
511 "Abort selection process."
512 (interactive)
513 (throw 'myexit nil))
514(defun reftex-select-keyboard-quit ()
515 "Abort selection process."
516 (interactive)
517 (throw 'exit t))
518(defun reftex-select-jump-to-previous ()
519 "Jump back to where previous selection process left off."
520 (interactive)
521 (let (pos)
522 (cond
523 ((and (local-variable-p 'reftex-last-data (current-buffer))
3666daf6
CD
524 reftex-last-data
525 (setq pos (text-property-any (point-min) (point-max)
526 :data reftex-last-data)))
1a9461d0
CD
527 (goto-char pos))
528 ((and (local-variable-p 'reftex-last-line (current-buffer))
3666daf6 529 (integerp reftex-last-line))
1a9461d0
CD
530 (goto-line reftex-last-line))
531 (t (ding)))))
532(defun reftex-select-toggle-follow ()
533 "Toggle follow mode: Other window follows with full context."
534 (interactive)
535 (setq reftex-last-follow-point -1)
536 (setq cb-flag (not cb-flag)))
537(defun reftex-select-toggle-varioref ()
538 "Toggle the macro used for referencing the label between \\ref and \\vref."
539 (interactive)
540 (if (string= refstyle "\\ref")
541 (setq refstyle "\\vref")
542 (setq refstyle "\\ref"))
543 (force-mode-line-update))
544(defun reftex-select-toggle-fancyref ()
545 "Toggle the macro used for referencing the label between \\ref and \\vref."
546 (interactive)
547 (setq refstyle
3666daf6
CD
548 (cond ((string= refstyle "\\ref") "\\fref")
549 ((string= refstyle "\\fref") "\\Fref")
550 (t "\\ref")))
1a9461d0
CD
551 (force-mode-line-update))
552(defun reftex-select-show-insertion-point ()
553 "Show the point from where selection was started in another window."
554 (interactive)
555 (let ((this-window (selected-window)))
556 (unwind-protect
3666daf6
CD
557 (progn
558 (switch-to-buffer-other-window
559 (marker-buffer reftex-select-return-marker))
560 (goto-char (marker-position reftex-select-return-marker))
561 (recenter '(4)))
1a9461d0
CD
562 (select-window this-window))))
563(defun reftex-select-callback ()
564 "Show full context in another window."
565 (interactive)
566 (if data (funcall call-back data reftex-callback-fwd nil) (ding)))
567(defun reftex-select-accept ()
568 "Accept the currently selected item."
569 (interactive)
570 (throw 'myexit 'return))
571(defun reftex-select-mouse-accept (ev)
572 "Accept the item at the mouse click."
573 (interactive "e")
574 (mouse-set-point ev)
575 (setq data (get-text-property (point) :data))
576 (setq last-data (or data last-data))
577 (throw 'myexit 'return))
578(defun reftex-select-read-label ()
579 "Use minibuffer to read a label to reference, with completion."
580 (interactive)
3666daf6
CD
581 (let ((label (completing-read
582 "Label: " (symbol-value reftex-docstruct-symbol)
583 nil nil reftex-prefix)))
1a9461d0
CD
584 (unless (or (equal label "") (equal label reftex-prefix))
585 (throw 'myexit label))))
586(defun reftex-select-read-cite ()
587 "Use minibuffer to read a citation key with completion."
588 (interactive)
589 (let* ((key (completing-read "Citation key: " found-list))
3666daf6 590 (entry (assoc key found-list)))
1a9461d0
CD
591 (cond
592 ((or (null key) (equal key "")))
593 (entry
594 (setq data entry)
595 (setq last-data data)
596 (throw 'myexit 'return))
597 (t (throw 'myexit key)))))
598
599(defun reftex-select-mark (&optional separator)
600 "Mark the entry."
601 (interactive)
602 (let* ((data (get-text-property (point) :data))
3666daf6 603 boe eoe ovl)
1a9461d0
CD
604 (or data (error "No entry to mark at point"))
605 (if (assq data reftex-select-marked)
3666daf6 606 (error "Entry is already marked"))
1a9461d0 607 (setq boe (or (previous-single-property-change (1+ (point)) :data)
3666daf6
CD
608 (point-min))
609 eoe (or (next-single-property-change (point) :data) (point-max)))
3a1e8128 610 (setq ovl (reftex-make-overlay boe eoe))
1a9461d0 611 (push (list data ovl separator) reftex-select-marked)
3a1e8128
CD
612 (reftex-overlay-put ovl 'face reftex-select-mark-face)
613 (reftex-overlay-put ovl 'before-string
614 (if separator
615 (format "*%c%d* " separator
616 (length reftex-select-marked))
617 (format "*%d* " (length reftex-select-marked))))
1a9461d0
CD
618 (message "Entry has mark no. %d" (length reftex-select-marked))))
619
620(defun reftex-select-mark-comma ()
621 "Mark the entry and store the `comma' separator."
622 (interactive)
623 (reftex-select-mark ?,))
624(defun reftex-select-mark-to ()
625 "Mark the entry and store the `to' separator."
626 (interactive)
627 (reftex-select-mark ?-))
628(defun reftex-select-mark-and ()
629 "Mark the entry and store `and' to separator."
630 (interactive)
631 (reftex-select-mark ?+))
632
633(defun reftex-select-unmark ()
634 "Unmark the entry."
635 (interactive)
636 (let* ((data (get-text-property (point) :data))
3666daf6
CD
637 (cell (assq data reftex-select-marked))
638 (ovl (nth 1 cell))
639 (cnt 0)
640 sep)
1a9461d0
CD
641 (unless cell
642 (error "No marked entry at point"))
3a1e8128 643 (and ovl (reftex-delete-overlay ovl))
1a9461d0 644 (setq reftex-select-marked (delq cell reftex-select-marked))
3a1e8128
CD
645 (setq cnt (1+ (length reftex-select-marked)))
646 (mapcar (lambda (c)
647 (setq sep (nth 2 c))
648 (reftex-overlay-put (nth 1 c) 'before-string
649 (if sep
650 (format "*%c%d* " sep (decf cnt))
651 (format "*%d* " (decf cnt)))))
652 reftex-select-marked)
1a9461d0
CD
653 (message "Entry no longer marked")))
654
655(defun reftex-select-help ()
656 "Display a summary of the special key bindings."
657 (interactive)
658 (with-output-to-temp-buffer "*RefTeX Help*"
659 (princ help-string))
660 (reftex-enlarge-to-fit "*RefTeX Help*" t))
661
662;; Common bindings in reftex-select-label-map and reftex-select-bib-map
663(let ((map (make-sparse-keymap)))
664 (substitute-key-definition
3666daf6 665 'next-line 'reftex-select-next map global-map)
1a9461d0 666 (substitute-key-definition
3666daf6 667 'previous-line 'reftex-select-previous map global-map)
1a9461d0
CD
668 (substitute-key-definition
669 'keyboard-quit 'reftex-select-keyboard-quit map global-map)
670 (substitute-key-definition
3666daf6 671 'newline 'reftex-select-accept map global-map)
1a9461d0
CD
672
673 (loop for x in
3666daf6
CD
674 '((" " . reftex-select-callback)
675 ("n" . reftex-select-next)
676 ([(down)] . reftex-select-next)
677 ("p" . reftex-select-previous)
678 ([(up)] . reftex-select-previous)
679 ("f" . reftex-select-toggle-follow)
680 ("\C-m" . reftex-select-accept)
681 ([(return)] . reftex-select-accept)
682 ("q" . reftex-select-quit)
683 ("." . reftex-select-show-insertion-point)
684 ("?" . reftex-select-help))
685 do (define-key map (car x) (cdr x)))
1a9461d0
CD
686
687 ;; The mouse-2 binding
688 (if (featurep 'xemacs)
689 (define-key map [(button2)] 'reftex-select-mouse-accept)
1607e1bb
CD
690 (define-key map [(mouse-2)] 'reftex-select-mouse-accept)
691 (define-key map [follow-link] 'mouse-face))
692
1a9461d0
CD
693
694 ;; Digit arguments
695 (loop for key across "0123456789" do
3666daf6 696 (define-key map (vector (list key)) 'digit-argument))
1a9461d0
CD
697 (define-key map "-" 'negative-argument)
698
699 ;; Make two maps
700 (setq reftex-select-label-map map)
701 (setq reftex-select-bib-map (copy-keymap map)))
702
703;; Specific bindings in reftex-select-label-map
704(loop for key across "aAcgFlrRstx#%" do
705 (define-key reftex-select-label-map (vector (list key))
3666daf6
CD
706 (list 'lambda '()
707 "Press `?' during selection to find out about this key."
708 '(interactive) (list 'throw '(quote myexit) key))))
1a9461d0
CD
709
710(loop for x in
711 '(("b" . reftex-select-jump-to-previous)
3666daf6
CD
712 ("z" . reftex-select-jump)
713 ("v" . reftex-select-toggle-varioref)
714 ("V" . reftex-select-toggle-fancyref)
715 ("m" . reftex-select-mark)
716 ("u" . reftex-select-unmark)
717 ("," . reftex-select-mark-comma)
718 ("-" . reftex-select-mark-to)
719 ("+" . reftex-select-mark-and)
720 ([(tab)] . reftex-select-read-label)
721 ("\C-i" . reftex-select-read-label)
722 ("\C-c\C-n" . reftex-select-next-heading)
723 ("\C-c\C-p" . reftex-select-previous-heading))
1a9461d0
CD
724 do
725 (define-key reftex-select-label-map (car x) (cdr x)))
726
727;; Specific bindings in reftex-select-bib-map
f3c18bd0 728(loop for key across "grRaAeE" do
1a9461d0 729 (define-key reftex-select-bib-map (vector (list key))
3666daf6
CD
730 (list 'lambda '()
731 "Press `?' during selection to find out about this key."
732 '(interactive) (list 'throw '(quote myexit) key))))
1a9461d0
CD
733
734(loop for x in
735 '(("\C-i" . reftex-select-read-cite)
3666daf6
CD
736 ([(tab)] . reftex-select-read-cite)
737 ("m" . reftex-select-mark)
738 ("u" . reftex-select-unmark))
1a9461d0 739 do (define-key reftex-select-bib-map (car x) (cdr x)))
3666daf6 740
1a9461d0 741
ab5796a9 742;;; arch-tag: 842078ff-0586-4e0b-957e-536e08218464
1a9461d0 743;;; reftex-sel.el ends here