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