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