Replace Lisp calls to delete-backward-char by delete-char.
[bpt/emacs.git] / lisp / textmodes / reftex-auc.el
CommitLineData
818226ac 1;;; reftex-auc.el --- RefTeX's interface to AUCTeX
f2e3589a
GM
2
3;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
114f9c96 4;; 2006, 2007, 2008, 2009, 2010 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-auc)
31(require 'reftex)
32;;;
33
f29263b3
DN
34(declare-function TeX-argument-insert "ext:tex" (name optional &optional prefix))
35(declare-function TeX-argument-prompt "ext:tex" (optional prompt default &optional complete))
36(declare-function multi-prompt "ext:multi-prompt"
37 (separator
38 unique prompt table
39 &optional mp-predicate require-match initial history))
40(declare-function LaTeX-add-index-entries "ext:tex" (&rest entries) t)
41(declare-function LaTeX-add-labels "ext:tex" (&rest entries) t)
42(declare-function LaTeX-bibitem-list "ext:tex" () t)
43(declare-function LaTeX-index-entry-list "ext:tex" () t)
44(declare-function LaTeX-label-list "ext:tex" () t)
45
1a9461d0
CD
46(defun reftex-plug-flag (which)
47 ;; Tell if a certain flag is set in reftex-plug-into-AUCTeX
48 (or (eq t reftex-plug-into-AUCTeX)
49 (and (listp reftex-plug-into-AUCTeX)
3666daf6 50 (nth which reftex-plug-into-AUCTeX))))
1a9461d0
CD
51
52(defun reftex-arg-label (optional &optional prompt definition)
53 "Use `reftex-label', `reftex-reference' or AUCTeX's code to insert label arg.
54What is being used depends upon `reftex-plug-into-AUCTeX'."
55 (let (label)
56 (cond
57 ((and definition (reftex-plug-flag 1))
58 ;; Create a new label, with a temporary brace for `reftex-what-macro'
59 (unwind-protect
3666daf6 60 (progn (insert "{") (setq label (or (reftex-label nil t) "")))
d355a0b7 61 (delete-char -1)))
1a9461d0
CD
62 ((and (not definition) (reftex-plug-flag 2))
63 ;; Reference a label with RefTeX
64 (setq label (reftex-reference nil t)))
65 (t
66 ;; AUCTeX's default mechanism
67 (setq label (completing-read (TeX-argument-prompt optional prompt "Key")
3666daf6 68 (LaTeX-label-list)))))
1a9461d0 69 (if (and definition (not (string-equal "" label)))
3666daf6 70 (LaTeX-add-labels label))
1a9461d0
CD
71 (TeX-argument-insert label optional)))
72
73(defun reftex-arg-cite (optional &optional prompt definition)
74 "Use `reftex-citation' or AUCTeX's code to insert a cite-key macro argument.
75What is being used depends upon `reftex-plug-into-AUCTeX'."
76 (let (items)
77 (cond
78 ((and (not definition) (reftex-plug-flag 3))
79 (setq items (list (or (reftex-citation t) ""))))
80 (t
81 (setq prompt (concat (if optional "(Optional) " "")
5b76833f
RF
82 (if prompt prompt "Add key")
83 " (default none): "))
1a9461d0
CD
84 (setq items (multi-prompt "," t prompt (LaTeX-bibitem-list)))))
85 (apply 'LaTeX-add-bibitems items)
86 (TeX-argument-insert (mapconcat 'identity items ",") optional)))
87
88
89(defun reftex-arg-index-tag (optional &optional prompt &rest args)
ceb4c4d3 90 "Prompt for an index tag with completion.
1a9461d0
CD
91This is the name of an index, not the entry."
92 (let (tag taglist)
93 (setq prompt (concat (if optional "(Optional) " "")
5b76833f
RF
94 (if prompt prompt "Index tag")
95 " (default none): "))
1a9461d0 96 (if (and reftex-support-index (reftex-plug-flag 4))
3666daf6
CD
97 ;; Use RefTeX completion
98 (progn
99 (reftex-access-scan-info nil)
ceb4c4d3
TTN
100 (setq taglist
101 (cdr (assoc 'index-tags
3666daf6
CD
102 (symbol-value reftex-docstruct-symbol)))
103 tag (completing-read prompt (mapcar 'list taglist))))
1a9461d0
CD
104 ;; Just ask like AUCTeX does.
105 (setq tag (read-string prompt)))
106 (TeX-argument-insert tag optional)))
107
108(defun reftex-arg-index (optional &optional prompt &rest args)
109 "Prompt for an index entry completing with known entries.
110Completion is specific for just one index, if the macro or a tag
111argument identify one of multiple indices."
112 (let* (tag key)
113 (if (and reftex-support-index (reftex-plug-flag 4))
3666daf6
CD
114 (progn
115 (reftex-access-scan-info nil)
116 (setq tag (reftex-what-index-tag)
117 key (reftex-index-complete-key (or tag "idx"))))
1a9461d0 118 (setq key (completing-read (TeX-argument-prompt optional prompt "Key")
3666daf6 119 (LaTeX-index-entry-list))))
1a9461d0
CD
120 (unless (string-equal "" key)
121 (LaTeX-add-index-entries key))
122 (TeX-argument-insert key optional)))
123
124(defun reftex-what-index-tag ()
125 ;; Look backward to find out what index the macro at point belongs to
126 (let ((macro (save-excursion
3666daf6
CD
127 (and (re-search-backward "\\\\[a-zA-Z*]+" nil t)
128 (match-string 0))))
129 tag entry)
1a9461d0 130 (when (and macro
3666daf6 131 (setq entry (assoc macro reftex-index-macro-alist)))
1a9461d0
CD
132 (setq tag (nth 1 entry))
133 (cond
134 ((stringp tag) tag)
135 ((integerp tag)
3666daf6
CD
136 (save-excursion
137 (goto-char (match-end 1))
138 (or (reftex-nth-arg tag (nth 6 entry)) "idx")))
1a9461d0
CD
139 (t "idx")))))
140
141(defvar LaTeX-label-function)
142(defun reftex-plug-into-AUCTeX ()
143 ;; Replace AUCTeX functions with RefTeX functions.
144 ;; Which functions are replaced is controlled by the variable
145 ;; `reftex-plug-into-AUCTeX'.
ceb4c4d3 146
1a9461d0
CD
147 (if (reftex-plug-flag 0)
148 (setq LaTeX-label-function 'reftex-label)
149 (setq LaTeX-label-function nil))
150
151 (and (or (reftex-plug-flag 1) (reftex-plug-flag 2))
152 (fboundp 'TeX-arg-label)
153 (fset 'TeX-arg-label 'reftex-arg-label))
154
155 (and (reftex-plug-flag 3)
156 (fboundp 'TeX-arg-cite)
157 (fset 'TeX-arg-cite 'reftex-arg-cite))
ceb4c4d3
TTN
158
159 (and (reftex-plug-flag 4)
1a9461d0
CD
160 (fboundp 'TeX-arg-index-tag)
161 (fset 'TeX-arg-index-tag 'reftex-arg-index-tag))
ceb4c4d3 162 (and (reftex-plug-flag 4)
1a9461d0
CD
163 (fboundp 'TeX-arg-index)
164 (fset 'TeX-arg-index 'reftex-arg-index)))
165
166(defun reftex-toggle-plug-into-AUCTeX ()
167 "Toggle Interface between AUCTeX and RefTeX on and off."
168 (interactive)
169 (unless (and (featurep 'tex-site) (featurep 'latex))
170 (error "AUCTeX's LaTeX mode does not seem to be loaded"))
171 (setq reftex-plug-into-AUCTeX (not reftex-plug-into-AUCTeX))
172 (reftex-plug-into-AUCTeX)
173 (if reftex-plug-into-AUCTeX
174 (message "RefTeX has been plugged into AUCTeX.")
175 (message "RefTeX no longer interacts with AUCTeX.")))
176
177(defun reftex-add-label-environments (entry-list)
178 "Add label environment descriptions to `reftex-label-alist-style'.
179The format of ENTRY-LIST is exactly like `reftex-label-alist'. See there
180for details.
181This function makes it possible to support RefTeX from AUCTeX style files.
182The entries in ENTRY-LIST will be processed after the user settings in
183`reftex-label-alist', and before the defaults (specified in
184`reftex-default-label-alist-entries'). Any changes made to
185`reftex-label-alist-style' will raise a flag to the effect that
186the label information is recompiled on next use."
187 (unless reftex-docstruct-symbol
188 (reftex-tie-multifile-symbols))
189 (when (and reftex-docstruct-symbol
3666daf6 190 (symbolp reftex-docstruct-symbol))
1a9461d0 191 (let ((list (get reftex-docstruct-symbol 'reftex-label-alist-style))
3666daf6 192 entry changed)
1a9461d0 193 (while entry-list
3666daf6
CD
194 (setq entry (pop entry-list))
195 (unless (member entry list)
196 (setq reftex-tables-dirty t
197 changed t)
198 (push entry list)))
1a9461d0 199 (when changed
3666daf6 200 (put reftex-docstruct-symbol 'reftex-label-alist-style list)))))
1a9461d0
CD
201(defalias 'reftex-add-to-label-alist 'reftex-add-label-environments)
202
203(defun reftex-add-section-levels (entry-list)
204 "Add entries to the value of `reftex-section-levels'.
205The added values are kept local to the current document. The format
206of ENTRY-LIST is a list of cons cells (\"MACRONAME\" . LEVEL). See
207`reftex-section-levels' for an example."
208 (unless reftex-docstruct-symbol
209 (reftex-tie-multifile-symbols))
210 (when (and reftex-docstruct-symbol
3666daf6 211 (symbolp reftex-docstruct-symbol))
1a9461d0 212 (let ((list (get reftex-docstruct-symbol 'reftex-section-levels))
3666daf6 213 entry changed)
1a9461d0 214 (while entry-list
3666daf6
CD
215 (setq entry (pop entry-list))
216 (unless (member entry list)
217 (setq reftex-tables-dirty t
218 changed t)
219 (push entry list)))
1a9461d0 220 (when changed
3666daf6 221 (put reftex-docstruct-symbol 'reftex-section-levels list)))))
1a9461d0
CD
222
223(defun reftex-notice-new-section ()
224 (reftex-notice-new 1 'force))
225
cbee283d 226;; arch-tag: 4a798e68-3405-421c-a09b-0269aac64ab4
1a9461d0 227;;; reftex-auc.el ends here