Mercurial > emacs
annotate lisp/textmodes/bibtex.el @ 2436:80aafda1127b
* keyboard.c (parse_modifiers, apply_modifiers): Make sure we're
not trying to create modifier masks using integers which are
unrepresentable as lisp values.
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Wed, 31 Mar 1993 07:19:25 +0000 |
parents | 10e417efb12a |
children | 2465861025cd |
rev | line source |
---|---|
662
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
584
diff
changeset
|
1 ;;; bibtex.el --- BibTeX mode for GNU Emacs |
8a533acedb77
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
584
diff
changeset
|
2 |
845 | 3 ;; Copyright (C) 1992 Free Software Foundation, Inc. |
4 | |
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
5 ;; Author: Bengt Martensson <ubrinf!mond!bengt> |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
6 ;; Mark Shapiro <shapiro@corto.inria.fr> |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
7 ;; Mike Newton <newton@gumby.cs.caltech.edu> |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
8 ;; Aaron Larson <alarson@src.honeywell.com> |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
9 ;; Maintainer: Mark Shapiro <shapiro@corto.inria.fr> |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
10 ;; Keywords: tex, bib |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
11 |
257 | 12 ;; This file is part of GNU Emacs. |
13 | |
14 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
15 ;; it under the terms of the GNU General Public License as published by | |
1851 | 16 ;; the Free Software Foundation; either version 2, or (at your option) |
257 | 17 ;; any later version. |
18 | |
19 ;; GNU Emacs is distributed in the hope that it will be useful, | |
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
22 ;; GNU General Public License for more details. | |
23 | |
24 ;; You should have received a copy of the GNU General Public License | |
25 ;; along with GNU Emacs; see the file COPYING. If not, write to | |
26 ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | |
27 | |
2307
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
28 ;;; Commentary: |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
29 |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
30 ;; A major mode for entering and editing BibTex files, validating |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
31 ;; them, canonicalizing them, and sorting them. Includes entry |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
32 ;; commands tailored to many different formats (book, master's this, |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
33 ;; journal article, etc). Has loads of options. |
10e417efb12a
Added or corrected Commentary sections
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
1851
diff
changeset
|
34 |
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
35 ;;; Change Log: |
561 | 36 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
37 ;;; alarson@src.honeywell.com 92-Jan-31 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
38 ;;; Added support for: ispell, beginning/end of entry movement, a simple |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
39 ;;; outline like mode (hide the bodies of bibtex entries), support for |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
40 ;;; sorting bibtex entries, and maintaining them in sorted order, and |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
41 ;;; simple buffer validation. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
42 ;;; User visible functions added: |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
43 ;;; ispell-{abstract,bibtex-entry}, {beginning,end}-of-bibtex-entry |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
44 ;;; hide-bibtex-entry-bodies, sort-bibtex-entries, validate-bibtex- |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
45 ;;; buffer, find-bibtex-duplicates |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
46 ;;; user visible variables added: |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
47 ;;; bibtex-maintain-sorted-entries |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
48 ;;; new local keybindings: |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
49 ;;; " TeX-insert-quote |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
50 ;;; C-c$ ispell-bibtex-entry |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
51 ;;; M-C-a beginning-of-bibtex-entry |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
52 ;;; M-C-e end-of-bibtex-entry |
257 | 53 ;;; Mike Newton (newton@gumby.cs.caltech.edu) 90.11.17 |
54 ;;; * Handle items like | |
55 ;;; title = poft # "Fifth Tri-quaterly" # random-conf, | |
56 ;;; and title = {This title is inside curlies} | |
57 ;;; * added user settable, always present, optional fields | |
58 ;;; * fixed 'bibtex-find-it's doc string's location | |
59 ;;; * bibtex-field-text made more general (it wouldnt handle the # construct) | |
60 ;;; and it now handles a small subset of the {} cases | |
61 | |
62 ;;; Bengt Martensson, March 6 | |
63 ;;; Adapted to Bibtex 0.99 by updating the optional fields according | |
64 ;;; to the document BibTeXing, Oren Patashnik, dated January 31, 1988. | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
65 ;;; Updated documentation strings accordingly. Added (provide 'bibtex). |
257 | 66 ;;; If bibtex-include-OPT-crossref is non-nil, every entry will have |
67 ;;; an OPTcrossref field, analogously for bibtex-include-OPTkey and | |
68 ;;; bibtex-include-OPTannote. Added bibtex-preamble, bound to ^C^EP, | |
69 ;;; and also found in X- and sun-menus. Cleaned up the sun-menu | |
70 ;;; stuff, and made it more uniform with the X-menu stuff. Marc: I | |
71 ;;; strongly suspect that I broke your parsing... (Or, more | |
72 ;;; correctly, BibTeX 0.99 broke it.) | |
73 ;;; Added bibtex-clean-entry-zap-empty-opts, defvar'd to t. If it | |
74 ;;; is nil, bibtex-clean-entry will leave empty optional fields alone. | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
75 |
257 | 76 ;;; Marc Shapiro 1-feb-89: integrated changes by Bengt Martensson 88-05-06: |
77 ;;; Added Sun menu support. Locally bound to right mouse button in | |
78 ;;; bibtex-mode. Emacs 18.49 allows local mouse bindings!! | |
79 ;;; Commented out DEAthesis. | |
80 | |
81 ;;; Marc Shapiro 6-oct-88 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
82 ;;; * skip-whitespace replaced by skip-chars-forward |
257 | 83 ;;; * use indent-to-column instead of inserting tabs (changes to |
84 ;;; bibtex-entry, bibtex-make-entry, bibtex-make-OPT-entry, renamed to | |
85 ;;; bibtex-make-optional-entry) | |
86 ;;; * C-c C-k deletes the current OPT entry entirely | |
87 ;;; * C-c C-d replaces text of field with "" | |
88 ;;; * renamed bibtex-find-it to bibtex-find-text. With arg, now goes to | |
89 ;;; start of text. Fixed bugs in it. | |
90 | |
91 ;;; Marc Shapiro 23-sep-88 | |
92 ;;; * bibtex-clean-entry moves past end of entry. | |
93 ;;; * bibtex-clean-entry signals mandatory fields left empty. | |
94 | |
95 ;;; Marc Shapiro 18-jul-88 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
96 ;;; * Fixed bug in bibtex-flash-entry |
257 | 97 ;;; * Moved all the entry type keystrokes to "C-c C-e something" (instead of |
98 ;;; "C-c something" previously) to make room for more. C-c C-e is | |
99 ;;; supposed to stand for "entry" [idea taken from mail-mode]. Moved | |
100 ;;; bibtex-pop-previous to C-c C-p and bibtex-pop-next to C-c C-n. | |
101 ;;; * removed binding for "\e[25~" | |
102 ;;; * replaced bibtex-clean-optionals by bibtex-clean-entry, bound to | |
103 ;;; C-c C-c | |
104 | |
105 ;;; Marc Shapiro 13-jul-88 [based on ideas by Sacha Krakowiak of IMAG] | |
106 ;;; * bibtex-pop-previous replaces current field with value of | |
107 ;;; similar field in previous entry. May be called n times in a row | |
108 ;;; (or with arg n) to pop similar field of n'th previous entry. | |
109 ;;; There is also a bibtex-pop-next to get similar field of next | |
110 ;;; entry. | |
111 ;;; * C-c C-k now kills all empty optional fields of current entry, and | |
112 ;;; removes "OPT" for those optional fields which have text. | |
113 | |
114 ;;; Marc Shapiro 14-dec-87 | |
115 ;;; Cosmetic fixes. Fixed small bug in bibtex-move-outside-of-entry. | |
116 ;;; Skip Montanaro <steinmetz!sprite!montanaro> 7-dec-87, Shapiro 10-dec-87 | |
117 ;;; before inserting an entry, make sure we are outside of a bib entry | |
118 ;;; Marc Shapiro 3-nov-87 | |
119 ;;; addition for France: DEAthesis | |
120 ;;; Marc Shapiro 19-oct-1987 | |
121 ;;; add X window menu option; bug fixes. TAB, LFD, C-c " and C-c C-o now | |
122 ;;; behave consistently; deletion never occurs blindly. | |
123 ;;; Marc Shapiro <shapiro@inria.inria.fr> 15-oct-1986 | |
124 ;;; align long lines nicely; C-c C-o checks for the "OPT" string; | |
125 ;;; TAB goes to the end of the string; use lower case; use | |
126 ;;; run-hooks | |
127 | |
128 ;;; Bengt Martensson <ubrinf!mond!bengt> 87-06-28 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
129 ;;; Bengt Martensson <bengt@mathematik.uni-Bremen.de> 87-06-28 |
257 | 130 ;;; Original version |
131 | |
132 ;;; NOTE by Marc Shapiro, 14-dec-87: | |
133 ;;; (bibtex-x-environment) binds an X menu for bibtex mode to x-button-c-right. | |
134 ;;; Trouble is, in Emacs 18.44 you can't have a mode-specific mouse binding, | |
135 ;;; so it will remain active in all windows. Yuck! | |
136 | |
810
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
137 ;;; Code: |
80303373daae
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
807
diff
changeset
|
138 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
139 (provide 'bibtex) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
140 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
141 ;;; these guys typically don't have autoloads...[alarson:19920131.1548CST] |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
142 (if (not (fboundp 'TeX-insert-quote)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
143 (autoload 'TeX-insert-quote "tex-mode")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
144 (if (not (fboundp 'sort-subr)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
145 (autoload 'sort-subr "sort")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
146 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
147 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
148 |
257 | 149 (defvar bibtex-mode-syntax-table nil "") |
150 (defvar bibtex-mode-abbrev-table nil "") | |
151 (define-abbrev-table 'bibtex-mode-abbrev-table ()) | |
152 (defvar bibtex-mode-map (make-sparse-keymap) "") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
153 |
257 | 154 (defvar bibtex-pop-previous-search-point nil |
561 | 155 "Next point where bibtex-pop-previous should start looking for a similar |
257 | 156 entry.") |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
157 |
257 | 158 (defvar bibtex-pop-next-search-point nil |
561 | 159 "Next point where bibtex-pop-next should start looking for a similar |
257 | 160 entry.") |
161 | |
162 (defvar bibtex-clean-entry-zap-empty-opts t | |
561 | 163 "*If non-nil, bibtex-clean-entry will delete all empty optional fields.") |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
164 |
257 | 165 (defvar bibtex-include-OPTcrossref t |
561 | 166 "*If non-nil, all entries will have an OPTcrossref field.") |
257 | 167 (defvar bibtex-include-OPTkey t |
561 | 168 "*If non-nil, all entries will have an OPTkey field.") |
257 | 169 (defvar bibtex-include-OPTannote t |
561 | 170 "*If non-nil, all entries will have an OPTannote field.") |
257 | 171 |
172 ;; note: the user should be allowed to have their own list of always | |
173 ;; available optional fields. exs: "keywords" "categories" | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
174 |
257 | 175 (defvar bibtex-mode-user-optional-fields nil ;no default value |
561 | 176 "*List of optional fields that user want to have as always present |
177 when making a bibtex entry. One possibility is for ``keywords''") | |
257 | 178 |
179 | |
180 ;;; A bibtex file is a sequence of entries, either string definitions | |
181 ;;; or reference entries. A reference entry has a type part, a | |
182 ;;; key part, and a comma-separated sequence of fields. A string | |
183 ;;; entry has a single field. A field has a left and right part, | |
184 ;;; separated by a '='. The left part is the name, the right part is | |
185 ;;; the text. Here come the definitions allowing to create and/or parse | |
186 ;;; entries and fields: | |
187 | |
188 ;;; fields | |
189 (defun bibtex-cfield (name text) | |
561 | 190 "Create a regexp for a bibtex field of name NAME and text TEXT" |
257 | 191 (concat ",[ \t\n]*\\(" |
192 name | |
193 "\\)[ \t\n]*=[ \t\n]*\\(" | |
194 text | |
195 "\\)")) | |
196 (defconst bibtex-name-in-cfield 1 | |
561 | 197 "The regexp subexpression number of the name part in bibtex-cfield.") |
257 | 198 (defconst bibtex-text-in-cfield 2 |
561 | 199 "The regexp subexpression number of the text part in bibtex-cfield.") |
257 | 200 |
201 (defconst bibtex-field-name "[A-Za-z][---A-Za-z0-9:_+]*" | |
202 "Regexp defining the name part of a bibtex field.") | |
203 | |
204 ;; bibtex-field-text must be able to handle | |
205 ;; title = "Proc. Fifteenth Annual" # STOC, | |
206 ;; month = "10~" # jan, | |
207 ;; year = "{\noopsort{1973c}}1981", | |
208 ;; month = apr # "-" # may, | |
209 ;; key = {Volume-2}, | |
210 ;; note = "Volume~2 is listed under Knuth \cite{book-full}" | |
211 ;; i have added a few of these, but not all! -- MON | |
212 | |
213 (defconst bibtex-field-const | |
214 "[0-9A-Za-z][---A-Za-z0-9:_+]*" | |
215 "Format of a bibtex field constant.") | |
561 | 216 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
217 (defconst bibtex-field-string |
257 | 218 (concat |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
219 "\"[^\"]*[^\\\\]\"\\|\"\"") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
220 "Match either a string or an empty string.") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
221 |
257 | 222 (defconst bibtex-field-string-or-const |
223 (concat bibtex-field-const "\\|" bibtex-field-string) | |
561 | 224 "Match either bibtex-field-string or bibtex-field-const.") |
257 | 225 |
226 (defconst bibtex-field-text | |
227 (concat | |
228 "\\(" bibtex-field-string-or-const "\\)" | |
229 "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*\\|" | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
230 "{[^{}]*[^\\\\]}") |
257 | 231 "Regexp defining the text part of a bibtex field: either a string, or |
232 an empty string, or a constant followed by one or more # / constant pairs. | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
233 Also matches simple {...} patterns.") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
234 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
235 ;(defconst bibtex-field-text |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
236 ; "\"[^\"]*[^\\\\]\"\\|\"\"\\|[0-9A-Za-z][---A-Za-z0-9:_+]*" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
237 ; "Regexp defining the text part of a bibtex field: either a string, or an empty string, or a constant.") |
257 | 238 |
239 (defconst bibtex-field | |
240 (bibtex-cfield bibtex-field-name bibtex-field-text) | |
241 "Regexp defining the format of a bibtex field") | |
242 | |
243 (defconst bibtex-name-in-field bibtex-name-in-cfield | |
561 | 244 "The regexp subexpression number of the name part in bibtex-field") |
257 | 245 (defconst bibtex-text-in-field bibtex-text-in-cfield |
561 | 246 "The regexp subexpression number of the text part in bibtex-field") |
257 | 247 |
248 ;;; references | |
249 (defconst bibtex-reference-type | |
250 "@[A-Za-z]+" | |
561 | 251 "Regexp defining the type part of a bibtex reference entry") |
257 | 252 (defconst bibtex-reference-head |
253 (concat "^[ \t]*\\(" | |
254 bibtex-reference-type | |
255 "\\)[ \t]*[({]\\(" | |
256 bibtex-field-name | |
257 "\\)") | |
561 | 258 "Regexp defining format of the header line of a bibtex reference entry") |
257 | 259 (defconst bibtex-type-in-head 1 |
561 | 260 "The regexp subexpression number of the type part in bibtex-reference-head") |
257 | 261 (defconst bibtex-key-in-head 2 |
561 | 262 "The regexp subexpression number of the key part in |
263 bibtex-reference-head") | |
257 | 264 |
265 (defconst bibtex-reference | |
266 (concat bibtex-reference-head | |
267 "\\([ \t\n]*" bibtex-field "\\)*" | |
268 "[ \t\n]*[})]") | |
561 | 269 "Regexp defining the format of a bibtex reference entry") |
257 | 270 (defconst bibtex-type-in-reference bibtex-type-in-head |
561 | 271 "The regexp subexpression number of the type part in bibtex-reference") |
257 | 272 (defconst bibtex-key-in-reference bibtex-key-in-head |
561 | 273 "The regexp subexpression number of the key part in |
274 bibtex-reference") | |
257 | 275 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
276 ;;; strings |
257 | 277 (defconst bibtex-string |
278 (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\(" | |
279 bibtex-field-name | |
280 "\\)[ \t\n]*=[ \t\n]*\\(" | |
281 bibtex-field-text | |
282 "\\)[ \t\n]*[})]") | |
561 | 283 "Regexp defining the format of a bibtex string entry") |
257 | 284 (defconst bibtex-name-in-string 1 |
561 | 285 "The regexp subexpression of the name part in bibtex-string") |
257 | 286 (defconst bibtex-text-in-string 2 |
561 | 287 "The regexp subexpression of the text part in bibtex-string") |
257 | 288 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
289 (defconst bibtex-name-alignement 2 |
257 | 290 "Alignment for the name part in BibTeX fields. |
291 Chosen on aesthetic grounds only.") | |
292 | |
293 (defconst bibtex-text-alignment (length " organization = ") | |
294 "Alignment for the text part in BibTeX fields. | |
295 Equal to the space needed for the longest name part.") | |
296 | |
297 ;;; bibtex mode: | |
298 | |
299 (defun bibtex-mode () | |
300 "Major mode for editing bibtex files. | |
301 | |
302 \\{bibtex-mode-map} | |
303 | |
304 A command such as \\[bibtex-Book] will outline the fields for a BibTeX book entry. | |
305 | |
306 The optional fields start with the string OPT, and thus ignored by BibTeX. | |
307 The OPT string may be removed from a field with \\[bibtex-remove-OPT]. | |
308 \\[bibtex-kill-optional-field] kills the current optional field entirely. | |
309 \\[bibtex-remove-double-quotes] removes the double-quotes around the text of | |
310 the current field. \\[bibtex-empty-field] replaces the text of the current | |
311 field with the default \"\". | |
312 | |
313 The command \\[bibtex-clean-entry] cleans the current entry, i.e. (i) removes | |
314 double-quotes from entirely numerical fields, (ii) removes OPT from all | |
315 non-empty optional fields, (iii) removes all empty optional fields, and (iv) | |
316 checks that no non-optional fields are empty. | |
317 | |
318 Use \\[bibtex-find-text] to position the dot at the end of the current field. | |
319 Use \\[bibtex-next-field] to move to end of the next field. | |
320 | |
321 \\[bibtex-x-environment] binds a mode-specific X menu to control+right | |
322 mouse button. | |
323 \\[bibtex-sun-environment] binds a mode-specific Sun menu to right | |
324 mouse button. | |
325 | |
326 Fields: | |
327 address | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
328 Publisher's address |
257 | 329 annote |
330 Long annotation used for annotated bibliographies (begins sentence) | |
331 author | |
332 Name(s) of author(s), in BibTeX name format | |
333 booktitle | |
334 Book title when the thing being referenced isn't the whole book. | |
335 For book entries, the title field should be used instead. | |
336 chapter | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
337 Chapter number |
257 | 338 crossref |
339 The database key of the entry being cross referenced. | |
340 edition | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
341 Edition of a book (e.g., ""second"") |
257 | 342 editor |
343 Name(s) of editor(s), in BibTeX name format. | |
344 If there is also an author field, then the editor field should be | |
345 for the book or collection that the work appears in | |
346 howpublished | |
347 How something strange has been published (begins sentence) | |
348 institution | |
349 Sponsoring institution | |
350 journal | |
351 Journal name (macros are provided for many) | |
352 key | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
353 Alphabetizing and labeling key (needed when no author or editor) |
257 | 354 month |
355 Month (macros are provided) | |
356 note | |
357 To help the reader find a reference (begins sentence) | |
358 number | |
359 Number of a journal or technical report | |
360 organization | |
361 Organization (sponsoring a conference) | |
362 pages | |
363 Page number or numbers (use `--' to separate a range) | |
364 publisher | |
365 Publisher name | |
366 school | |
367 School name (for theses) | |
368 series | |
369 The name of a series or set of books. | |
370 An individual book will will also have it's own title | |
371 title | |
372 The title of the thing being referenced | |
373 type | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
374 Type of a technical report (e.g., ""Research Note"") to be used |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
375 instead of the default ""Technical Report"" |
257 | 376 volume |
377 Volume of a journal or multivolume work | |
378 year | |
379 Year---should contain only numerals | |
380 --------------------------------------------------------- | |
381 Entry to this mode calls the value of bibtex-mode-hook if that value is | |
382 non-nil." | |
383 (interactive) | |
384 (kill-all-local-variables) | |
385 (if bibtex-mode-syntax-table | |
386 (set-syntax-table bibtex-mode-syntax-table) | |
387 (setq bibtex-mode-syntax-table (make-syntax-table)) | |
388 (set-syntax-table bibtex-mode-syntax-table) | |
389 (modify-syntax-entry ?\" ".") | |
390 (modify-syntax-entry ?$ "$$ ") | |
391 (modify-syntax-entry ?% "< ") | |
392 (modify-syntax-entry ?' "w ") | |
393 (modify-syntax-entry ?@ "w ") | |
394 (modify-syntax-entry ?\\ "\\") | |
395 (modify-syntax-entry ?\f "> ") | |
396 (modify-syntax-entry ?\n "> ") | |
397 (modify-syntax-entry ?~ " ")) | |
398 (use-local-map bibtex-mode-map) | |
399 (setq major-mode 'bibtex-mode) | |
400 | |
401 | |
402 (setq mode-name "BibTeX") | |
403 (set-syntax-table bibtex-mode-syntax-table) | |
404 (setq local-abbrev-table bibtex-mode-abbrev-table) | |
405 (make-local-variable 'paragraph-start) | |
406 (setq paragraph-start "^[ \f\n\t]*$") | |
407 | |
408 (define-key bibtex-mode-map "\t" 'bibtex-find-text) | |
409 (define-key bibtex-mode-map "\n" 'bibtex-next-field) | |
410 (define-key bibtex-mode-map "\C-c\"" 'bibtex-remove-double-quotes) | |
411 (define-key bibtex-mode-map "\C-c\C-c" 'bibtex-clean-entry) | |
412 (define-key bibtex-mode-map "\C-c?" 'describe-mode) | |
413 (define-key bibtex-mode-map "\C-c\C-p" 'bibtex-pop-previous) | |
414 (define-key bibtex-mode-map "\C-c\C-n" 'bibtex-pop-next) | |
415 (define-key bibtex-mode-map "\C-c\C-k" 'bibtex-kill-optional-field) | |
416 (define-key bibtex-mode-map "\C-c\C-d" 'bibtex-empty-field) | |
417 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
418 ;; [alarson:19920131.1543CST] |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
419 (define-key bibtex-mode-map "\"" 'TeX-insert-quote) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
420 (define-key bibtex-mode-map "\C-c$" 'ispell-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
421 (define-key bibtex-mode-map "\M-\C-a" 'beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
422 (define-key bibtex-mode-map "\M-\C-e" 'end-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
423 |
257 | 424 (define-key bibtex-mode-map "\C-c\C-e\C-a" 'bibtex-Article) |
425 (define-key bibtex-mode-map "\C-c\C-e\C-b" 'bibtex-Book) | |
426 (define-key bibtex-mode-map "\C-c\C-e\C-d" 'bibtex-DEAthesis) | |
427 (define-key bibtex-mode-map "\C-c\C-e\C-c" 'bibtex-InProceedings) | |
428 (define-key bibtex-mode-map "\C-c\C-e\C-i" 'bibtex-InBook) | |
429 (define-key bibtex-mode-map "\C-c\C-ei" 'bibtex-InCollection) | |
430 (define-key bibtex-mode-map "\C-c\C-eI" 'bibtex-InProceedings) | |
431 (define-key bibtex-mode-map "\C-c\C-e\C-m" 'bibtex-Manual) | |
432 (define-key bibtex-mode-map "\C-c\C-em" 'bibtex-MastersThesis) | |
433 (define-key bibtex-mode-map "\C-c\C-eM" 'bibtex-Misc) | |
434 (define-key bibtex-mode-map "\C-c\C-o" 'bibtex-remove-OPT) | |
435 (define-key bibtex-mode-map "\C-c\C-e\C-p" 'bibtex-PhdThesis) | |
436 (define-key bibtex-mode-map "\C-c\C-ep" 'bibtex-Proceedings) | |
437 (define-key bibtex-mode-map "\C-c\C-eP" 'bibtex-preamble) | |
438 (define-key bibtex-mode-map "\C-c\C-e\C-t" 'bibtex-TechReport) | |
439 (define-key bibtex-mode-map "\C-c\C-e\C-s" 'bibtex-string) | |
440 (define-key bibtex-mode-map "\C-c\C-e\C-u" 'bibtex-Unpublished) | |
441 | |
442 (auto-fill-mode 1) ; nice alignements | |
443 (setq left-margin (+ bibtex-text-alignment 1)) | |
444 | |
445 (run-hooks 'bibtex-mode-hook)) | |
446 | |
447 (defun bibtex-move-outside-of-entry () | |
448 "Make sure we are outside of a bib entry" | |
449 (cond ((or | |
450 (= (point) (point-max)) | |
451 (= (point) (point-min)) | |
452 (looking-at "[ \n]*@") | |
453 ) | |
454 t) | |
455 (t | |
456 (backward-paragraph) | |
457 (forward-paragraph))) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
458 (re-search-forward "[ \t\n]*" (point-max) t)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
459 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
460 (defun ispell-abstract () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
461 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
462 (beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
463 (re-search-forward "^[ \t]*[OPT]*abstract[ \t]*=") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
464 (ispell-region (point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
465 (save-excursion (forward-sexp) (point)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
466 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
467 (defun beginning-of-bibtex-entry () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
468 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
469 (re-search-backward "^@" nil 'move)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
470 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
471 (defun end-of-bibtex-entry () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
472 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
473 (re-search-forward "}$" nil 'move)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
474 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
475 (defun ispell-bibtex-entry () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
476 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
477 (ispell-region (progn (beginning-of-bibtex-entry) (point)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
478 (progn (end-of-bibtex-entry) (point)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
479 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
480 (defun narrow-to-bibtex-entry () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
481 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
482 (save-excursion |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
483 (narrow-to-region (progn (beginning-of-bibtex-entry) (point)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
484 (progn (end-of-bibtex-entry) (point))))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
485 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
486 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
487 (defun beginning-of-first-bibtex-entry () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
488 (goto-char (point-min)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
489 (cond |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
490 ((re-search-forward "^@" nil 'move) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
491 (beginning-of-line)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
492 ((and (bobp) (eobp)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
493 nil) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
494 (t |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
495 (message "Warning: No bibtex entries found!")))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
496 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
497 (defun hide-bibtex-entry-bodies (&optional arg) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
498 "Hide all lines between first and last bibtex entries not beginning with @. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
499 With argument, show all text." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
500 (interactive "P") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
501 (beginning-of-first-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
502 ;; subst-char-in-region modifies the buffer, despite what the |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
503 ;; documentation says... |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
504 (let ((modifiedp (buffer-modified-p)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
505 (buffer-read-only nil)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
506 (if arg |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
507 (subst-char-in-region (point) (point-max) ?\r ?\n t) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
508 (while (save-excursion (re-search-forward "\n[^@]" (point-max) t)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
509 (save-excursion (replace-regexp "\n\\([^@]\\)" "\r\\1")))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
510 (setq selective-display (not arg)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
511 (set-buffer-modified-p modifiedp))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
512 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
513 (defun sort-bibtex-entries () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
514 "Sort bibtex entries alphabetically by key. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
515 Text before the first bibtex entry, and following the last is not effected. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
516 Bugs: |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
517 1. Text between the closing brace ending one bibtex entry, and the @ starting |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
518 the next, is considered part of the PRECEEDING entry. Perhaps it should be |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
519 part of the following entry." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
520 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
521 (save-restriction |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
522 (beginning-of-first-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
523 (narrow-to-region (point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
524 (save-excursion |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
525 (goto-char (point-max)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
526 (beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
527 (end-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
528 (point))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
529 (sort-subr nil ; reversep |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
530 ;; begining of record function |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
531 'forward-line |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
532 ;; end of record function |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
533 (function (lambda () (and (re-search-forward "}[ \t]*\n[\n \t]*@" nil 'move) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
534 (forward-char -2)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
535 ;; start of key function |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
536 (function (lambda () (re-search-forward "{[ \t]*") nil)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
537 ;; end of key function |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
538 (function (lambda () (search-forward ","))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
539 ))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
540 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
541 (defun map-bibtex-entries (fun) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
542 "Call FUN for each bibtex entry starting with the current, to the end of the file. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
543 FUN is called with one argument, the key of the entry, and with point inside the entry." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
544 (beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
545 (while (re-search-forward "^@[^{]*{[ \t]*\\([^,]*\\)" nil t) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
546 (funcall fun (buffer-substring (match-beginning 1) (match-end 1))))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
547 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
548 (defun find-bibtex-entry-location (entry-name) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
549 (interactive "sBibtex entry key: ") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
550 "Searches from beginning of current buffer looking for place to put the |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
551 bibtex entry named ENTRY-NAME. Buffer is assumed to be in sorted order, |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
552 without duplicates (see \\[sort-bibtex-entries]), if it is not, an error will |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
553 be signalled." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
554 (let ((previous nil) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
555 point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
556 (beginning-of-first-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
557 (or (catch 'done |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
558 (map-bibtex-entries (function (lambda (current) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
559 (cond |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
560 ((string-equal entry-name current) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
561 (error "Entry duplicates existing!")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
562 ((or (null previous) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
563 (string< previous current)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
564 (setq previous current |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
565 point (point)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
566 (if (string< entry-name current) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
567 (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
568 (beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
569 ;; Many schemes append strings to |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
570 ;; existing entries to resolve them, |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
571 ;; so initial substring matches may |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
572 ;; indicate a duplicate entry. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
573 (let ((idx (string-match (regexp-quote entry-name) current))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
574 (if (and (integerp idx) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
575 (zerop idx)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
576 (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
577 (message "Warning: Entry %s may be a duplicate of %s!" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
578 entry-name current) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
579 (ding t)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
580 (throw 'done t)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
581 ((string-equal previous current) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
582 (error "Duplicate here with previous!")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
583 (t (error "Entries out of order here!"))))))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
584 (end-of-bibtex-entry)))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
585 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
586 (defun validate-bibtex-buffer () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
587 "Find some typical errors in bibtex files. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
588 1. At signs (@) not as first char of a line. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
589 2. Double quotes (\") inside strings. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
590 3. Closing braces (}) not the last character of a line." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
591 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
592 (let ((point (point))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
593 (while (re-search-forward ".@" nil t) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
594 (let* ((foo (parse-partial-sexp (save-excursion (beginning-of-bibtex-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
595 (point)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
596 (point))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
597 (in-a-string (nth 3 foo))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
598 (if (not in-a-string) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
599 (error "At sign (@) out of place!")))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
600 (goto-char point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
601 (while (search-forward "\"" nil t) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
602 (or (looking-at "[,}][ \t]*$") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
603 ;; some versions put closing brace on separate line. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
604 (looking-at "[ \t]*\n}") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
605 (save-excursion |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
606 (save-restriction |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
607 (narrow-to-region (point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
608 (progn (beginning-of-line) (point))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
609 (looking-at "^[ \t]*[a-zA-Z]+[ \t]*=[ \t]*\"$"))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
610 (error "Quote out of place, or missing \",\" or \"}\"!"))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
611 (goto-char point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
612 ;; This is only approximate, should actually search for close braces, |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
613 ;; then see if they are inside a string, or at the end of a line. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
614 ;; This just gets the typical case of whitespace after a closing brace. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
615 (while (search-forward "}[ \t]+$" nil t) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
616 (error "Brace not last char of line!")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
617 (goto-char point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
618 (message "Bibtex buffer appears o.k."))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
619 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
620 (defun find-bibtex-duplicates () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
621 "Searches forward in current buffer looking for duplicate bibtex entries. |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
622 Buffer is assumed to be sorted, see \\[sort-bibtex-entries]" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
623 (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
624 (let ((point (point))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
625 ;; errors if things are not right... |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
626 (find-bibtex-entry-location (make-string 10 255)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
627 (goto-char point) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
628 (message "No duplicates found!"))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
629 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
630 |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
631 (defvar bibtex-maintain-sorted-entries nil |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
632 "*If true, bibtex-mode will attempt to maintain all bibtex entries in |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
633 sorted order.") |
257 | 634 |
635 ;; | |
636 ;; note: this should really take lists of strings OR of lists. in the | |
637 ;; second case, one can use either list. (ie: | |
638 ;; "name" (("crossref") ("journal" "year")) ) | |
639 ;; | |
640 | |
641 (defun bibtex-entry (entry-type required optional) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
642 (let (key) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
643 (if bibtex-maintain-sorted-entries |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
644 (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
645 (setq key (read-string (format "%s key: " entry-type))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
646 (find-bibtex-entry-location key))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
647 (bibtex-move-outside-of-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
648 (insert "@" entry-type "{") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
649 (mapcar 'bibtex-make-field required) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
650 (if bibtex-include-OPTcrossref |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
651 (bibtex-make-optional-field "crossref")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
652 (if bibtex-include-OPTkey |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
653 (bibtex-make-optional-field "key")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
654 (mapcar 'bibtex-make-optional-field optional) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
655 (if bibtex-mode-user-optional-fields ;MON... |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
656 (mapcar 'bibtex-make-optional-field |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
657 bibtex-mode-user-optional-fields)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
658 (if bibtex-include-OPTannote |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
659 (bibtex-make-optional-field "annote")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
660 (insert "\n}\n\n") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
661 (forward-char -3) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
662 (up-list -1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
663 (forward-char 1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
664 (if key |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
665 (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
666 (insert key) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
667 (bibtex-next-field t))))) |
257 | 668 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
669 ;; (defun bibtex-entry (entry-type required optional) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
670 ;; (bibtex-move-outside-of-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
671 ;; (insert (concat "@" entry-type "{,\n\n}\n\n")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
672 ;; (previous-line 3) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
673 ;; (insert (mapconcat 'bibtex-make-entry required ",\n")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
674 ;; (if required |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
675 ;; (if optional |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
676 ;; (insert ",\n"))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
677 ;; (insert (mapconcat 'bibtex-make-OPT-entry optional ",\n")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
678 ;; (if bibtex-mode-user-optional-fields ;MON... |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
679 ;; (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
680 ;; (if optional |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
681 ;; (insert ",\n")) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
682 ;; (insert (mapconcat 'bibtex-make-OPT-entry |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
683 ;; bibtex-mode-user-optional-fields |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
684 ;; ",\n")))) ;MON |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
685 ;; (up-list -1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
686 ;; (forward-char 1)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
687 |
561 | 688 |
257 | 689 (defun bibtex-make-field (str) |
690 (interactive "sBibTeX entry type: ") | |
691 (insert ",\n") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
692 (indent-to-column bibtex-name-alignement) |
257 | 693 (insert str " = ") |
694 (indent-to-column bibtex-text-alignment) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
695 (insert "\"\"") |
257 | 696 nil) |
697 | |
698 (defun bibtex-make-optional-field (str) | |
699 (interactive "sOptional BibTeX entry type: ") | |
700 (insert ",\n") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
701 (indent-to-column bibtex-name-alignement) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
702 (insert "OPT" str " = ") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
703 (indent-to-column bibtex-text-alignment) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
704 (insert "\"\"") |
257 | 705 nil) |
706 | |
707 ;; What to do about crossref? if present, journal and year are | |
708 ;; both optional. Due to this, i move all of them into optional. -- MON | |
709 | |
710 (defun bibtex-Article () | |
711 (interactive) | |
712 (if bibtex-include-OPTcrossref | |
713 (bibtex-entry "Article" '("author" "title") | |
714 '("journal" "year" "volume" "number" "pages" | |
715 "month" "note")) | |
716 (bibtex-entry "Article" '("author" "title" "journal" "year") | |
717 '("volume" "number" "pages" "month" "note")))) | |
718 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
719 |
257 | 720 (defun bibtex-Book () |
721 (interactive) | |
722 (bibtex-entry "Book" '("author" "title" "publisher" "year") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
723 '("editor" "volume" "number" "series" "address" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
724 "edition" "month" "note"))) |
257 | 725 |
726 (defun bibtex-Booklet () | |
727 (interactive) | |
728 (bibtex-entry "Booklet" '("title") | |
729 '("author" "howpublished" "address" "month" "year" "note"))) | |
730 | |
731 ;; France: Dipl\^{o}me d'Etudes Approfondies (similar to Master's) | |
732 (defun bibtex-DEAthesis () | |
733 (interactive) | |
734 (bibtex-entry "DEAthesis" '("author" "title" "school" "year") | |
735 '("address" "month" "note"))) | |
736 | |
737 (defun bibtex-InBook () | |
738 (interactive) | |
739 (if bibtex-include-OPTcrossref | |
740 (bibtex-entry "InBook" '("author" "title" "chapter") | |
741 '("publisher" "year" "editor" "pages" "volume" "number" | |
742 "series" "address" "edition" "month" "type" "note")) | |
743 (bibtex-entry "InBook" '("author" "title" "chapter" "publisher" "year") | |
744 '("editor" "pages" "volume" "number" "series" "address" | |
745 "edition" "month" "type" "note")))) | |
746 | |
747 (defun bibtex-InCollection () | |
748 (interactive) | |
749 (if bibtex-include-OPTcrossref | |
750 (bibtex-entry "InCollection" '("author" "title") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
751 '("booktitle" "publisher" "year" |
257 | 752 "editor" "volume" "number" "series" "type" "chapter" |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
753 "pages" "address" "edition" "month" "note")) |
257 | 754 (bibtex-entry "InCollection" '("author" "title" |
755 "booktitle" "publisher" "year") | |
756 '("editor" "volume" "number" "series" "type" "chapter" | |
757 "pages" "address" "edition" "month" "note")))) | |
758 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
759 |
257 | 760 (defun bibtex-InProceedings () |
761 (interactive) | |
762 (if bibtex-include-OPTcrossref | |
763 (bibtex-entry "InProceedings" '("author" "title") | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
764 '("editor" "volume" "number" "series" "pages" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
765 "booktitle" "year" |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
766 "organization" "publisher" "address" "month" "note")) |
257 | 767 (bibtex-entry "InProceedings" '("author" "title" "booktitle" "year") |
768 '("editor" "volume" "number" "series" "pages" | |
769 "organization" "publisher" "address" "month" "note")))) | |
770 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
771 |
257 | 772 (defun bibtex-Manual () |
773 (interactive) | |
774 (bibtex-entry "Manual" '("title") | |
775 '("author" "organization" "address" "edition" "year" | |
776 "month" "note"))) | |
777 | |
778 (defun bibtex-MastersThesis () | |
779 (interactive) | |
780 (bibtex-entry "MastersThesis" '("author" "title" "school" "year") | |
781 '("address" "month" "note" "type"))) | |
782 | |
783 (defun bibtex-Misc () | |
784 (interactive) | |
785 (bibtex-entry "Misc" '() | |
786 '("author" "title" "howpublished" "year" "month" "note"))) | |
787 | |
788 (defun bibtex-PhdThesis () | |
789 (interactive) | |
790 (bibtex-entry "PhdThesis" '("author" "title" "school" "year") | |
791 '("address" "month" "type" "note"))) | |
792 | |
793 (defun bibtex-Proceedings () | |
794 (interactive) | |
795 (bibtex-entry "Proceedings" '("title" "year") | |
796 '("editor" "volume" "number" "series" "publisher" | |
797 "organization" "address" "month" "note"))) | |
798 | |
799 (defun bibtex-TechReport () | |
800 (interactive) | |
801 (bibtex-entry "TechReport" '("author" "title" "institution" "year") | |
802 '("type" "number" "address" "month" "note"))) | |
803 | |
804 (defun bibtex-Unpublished () | |
805 (interactive) | |
806 (bibtex-entry "Unpublished" '("author" "title" "note") | |
807 '("year" "month"))) | |
808 | |
809 (defun bibtex-string () | |
810 (interactive) | |
811 (bibtex-move-outside-of-entry) | |
812 (insert "@string{ = """"}\n") | |
813 (previous-line 1) | |
814 (forward-char 8)) | |
815 | |
816 (defun bibtex-preamble () | |
817 (interactive) | |
818 (bibtex-move-outside-of-entry) | |
819 (insert "@Preamble{}\n") | |
820 (previous-line 1) | |
821 (forward-char 10)) | |
822 | |
823 (defun bibtex-next-field (arg) | |
824 "Finds end of text of next BibTeX field; with arg, to its beginning" | |
825 (interactive "P") | |
826 (bibtex-inside-field) | |
827 (let ((start (point))) | |
828 (condition-case () | |
829 (progn | |
830 (bibtex-enclosing-field) | |
831 (goto-char (match-end 0)) | |
832 (forward-char 2)) | |
833 (error | |
834 (goto-char start) | |
835 (end-of-line) | |
836 (forward-char 1)))) | |
837 (bibtex-find-text arg)) | |
838 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
839 ;; (defun bibtex-next-field () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
840 ;; "Finds end of text of next field." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
841 ;; (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
842 ;; (condition-case () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
843 ;; (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
844 ;; (bibtex-inside-field) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
845 ;; (re-search-forward ",[ \t\n]*" (point-max) 1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
846 ;; (bibtex-enclosing-field) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
847 ;; (bibtex-inside-field)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
848 ;; (error nil))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
849 |
257 | 850 (defun bibtex-find-text (arg) |
851 "Go to end of text of current field; with arg, go to beginning." | |
852 (interactive "P") | |
853 (bibtex-inside-field) | |
854 (bibtex-enclosing-field) | |
855 (if arg | |
856 (progn | |
857 (goto-char (match-beginning bibtex-text-in-field)) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
858 (if (looking-at "\"") |
257 | 859 (forward-char 1))) |
860 (goto-char (match-end bibtex-text-in-field)) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
861 (if (= (preceding-char) ?\") |
257 | 862 (forward-char -1)))) |
863 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
864 ;; (defun bibtex-find-text () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
865 ;; "Go to end of text of current field." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
866 ;; (interactive) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
867 ;; (condition-case () |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
868 ;; (progn |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
869 ;; (bibtex-inside-field) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
870 ;; (bibtex-enclosing-field) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
871 ;; (goto-char (match-end bibtex-text-in-field)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
872 ;; (bibtex-inside-field)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
873 ;; (error nil))) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
874 |
257 | 875 (defun bibtex-remove-OPT () |
876 "Removes the 'OPT' starting optional arguments and goes to end of text" | |
877 (interactive) | |
878 (bibtex-inside-field) | |
879 (bibtex-enclosing-field) | |
880 (save-excursion | |
881 (goto-char (match-beginning bibtex-name-in-field)) | |
882 (if (looking-at "OPT") | |
883 (delete-char (length "OPT")))) | |
884 (bibtex-inside-field)) | |
885 | |
886 (defun bibtex-inside-field () | |
887 "Try to avoid point being at end of a bibtex field." | |
888 (interactive) | |
889 (end-of-line) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
890 (skip-chars-backward " \t") ;MON - maybe delete these chars? |
257 | 891 (cond ((= (preceding-char) ?,) |
892 (forward-char -1))) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
893 (cond ((= (preceding-char) ?\") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
894 (forward-char -1)))) ;MON - only go back if quote |
257 | 895 |
896 (defun bibtex-remove-double-quotes () | |
897 "Removes """" around string." | |
898 (interactive) | |
899 (save-excursion | |
900 (bibtex-inside-field) | |
901 (bibtex-enclosing-field) | |
902 (let ((start (match-beginning bibtex-text-in-field)) | |
903 (stop (match-end bibtex-text-in-field))) | |
904 (goto-char stop) | |
905 (forward-char -1) | |
906 (if (looking-at "\"") | |
907 (delete-char 1)) | |
908 (goto-char start) | |
909 (if (looking-at "\"") | |
910 (delete-char 1))))) | |
911 | |
912 (defun bibtex-kill-optional-field () | |
913 "Kill the entire enclosing optional BibTeX field" | |
914 (interactive) | |
915 (bibtex-inside-field) | |
916 (bibtex-enclosing-field) | |
917 (goto-char (match-beginning bibtex-name-in-field)) | |
918 (let ((the-end (match-end 0)) | |
919 (the-beginning (match-beginning 0))) | |
920 (if (looking-at "OPT") | |
921 (progn | |
922 (goto-char the-end) | |
923 (skip-chars-forward " \t\n,") | |
924 (kill-region the-beginning the-end)) | |
925 (error "Mandatory fields can't be killed")))) | |
926 | |
927 (defun bibtex-empty-field () | |
928 "Delete the text part of the current field, replace with empty text" | |
929 (interactive) | |
930 (bibtex-inside-field) | |
931 (bibtex-enclosing-field) | |
932 (goto-char (match-beginning bibtex-text-in-field)) | |
933 (kill-region (point) (match-end bibtex-text-in-field)) | |
934 (insert "\"\"") | |
935 (bibtex-find-text t)) | |
936 | |
937 | |
938 (defun bibtex-pop-previous (arg) | |
939 "Replace text of current field with the text of similar field in previous entry. | |
940 With arg, go up ARG entries. Repeated, goes up so many times. May be | |
941 intermixed with \\[bibtex-pop-next] (bibtex-pop-next)." | |
942 (interactive "p") | |
943 (bibtex-inside-field) | |
944 (save-excursion | |
945 ; parse current field | |
946 (bibtex-enclosing-field) | |
947 (let ((start-old-text (match-beginning bibtex-text-in-field)) | |
948 (stop-old-text (match-end bibtex-text-in-field)) | |
949 (start-name (match-beginning bibtex-name-in-field)) | |
950 (stop-name (match-end bibtex-name-in-field)) | |
951 (new-text)) | |
952 (goto-char start-name) | |
953 ; construct regexp for previous field with same name as this one | |
954 (let ((matching-entry | |
955 (bibtex-cfield | |
956 (buffer-substring (if (looking-at "OPT") | |
957 (+ (point) (length "OPT")) | |
958 (point)) | |
959 stop-name) | |
960 bibtex-field-text))) | |
961 | |
962 ; if executed several times in a row, start each search where the | |
963 ; last one finished | |
964 (cond ((or (eq last-command 'bibtex-pop-previous) | |
965 (eq last-command 'bibtex-pop-next)) | |
966 t | |
967 ) | |
968 (t | |
969 (bibtex-enclosing-reference) | |
970 (setq bibtex-pop-previous-search-point (match-beginning 0)) | |
971 (setq bibtex-pop-next-search-point (match-end 0)))) | |
972 (goto-char bibtex-pop-previous-search-point) | |
973 | |
974 ; Now search for arg'th previous similar field | |
975 (cond | |
976 ((re-search-backward matching-entry (point-min) t arg) | |
977 (setq new-text | |
978 (buffer-substring (match-beginning bibtex-text-in-cfield) | |
979 (match-end bibtex-text-in-cfield))) | |
980 ; Found a matching field. Remember boundaries. | |
981 (setq bibtex-pop-next-search-point (match-end 0)) | |
982 (setq bibtex-pop-previous-search-point (match-beginning 0)) | |
983 (bibtex-flash-head) | |
984 ; Go back to where we started, delete old text, and pop new. | |
985 (goto-char stop-old-text) | |
986 (delete-region start-old-text stop-old-text) | |
987 (insert new-text)) | |
988 (t ; search failed | |
989 (error "No previous matching BibTeX field.")))))) | |
990 (setq this-command 'bibtex-pop-previous)) | |
991 | |
992 (defun bibtex-pop-next (arg) | |
993 "Replace text of current field with the text of similar field in next entry. | |
994 With arg, go up ARG entries. Repeated, goes up so many times. May be | |
995 intermixed with \\[bibtex-pop-previous] (bibtex-pop-previous)." | |
996 (interactive "p") | |
997 (bibtex-inside-field) | |
998 (save-excursion | |
999 ; parse current field | |
1000 (bibtex-enclosing-field) | |
1001 (let ((start-old-text (match-beginning bibtex-text-in-field)) | |
1002 (stop-old-text (match-end bibtex-text-in-field)) | |
1003 (start-name (match-beginning bibtex-name-in-field)) | |
1004 (stop-name (match-end bibtex-name-in-field)) | |
1005 (new-text)) | |
1006 (goto-char start-name) | |
1007 ; construct regexp for next field with same name as this one, | |
1008 ; ignoring possible OPT's | |
1009 (let ((matching-entry | |
1010 (bibtex-cfield | |
1011 (buffer-substring (if (looking-at "OPT") | |
1012 (+ (point) (length "OPT")) | |
1013 (point)) | |
1014 stop-name) | |
1015 bibtex-field-text))) | |
1016 | |
1017 ; if executed several times in a row, start each search where the | |
1018 ; last one finished | |
1019 (cond ((or (eq last-command 'bibtex-pop-next) | |
1020 (eq last-command 'bibtex-pop-previous)) | |
1021 t | |
1022 ) | |
1023 (t | |
1024 (bibtex-enclosing-reference) | |
1025 (setq bibtex-pop-previous-search-point (match-beginning 0)) | |
1026 (setq bibtex-pop-next-search-point (match-end 0)))) | |
1027 (goto-char bibtex-pop-next-search-point) | |
1028 | |
1029 ; Now search for arg'th next similar field | |
1030 (cond | |
1031 ((re-search-forward matching-entry (point-max) t arg) | |
1032 (setq new-text | |
1033 (buffer-substring (match-beginning bibtex-text-in-cfield) | |
1034 (match-end bibtex-text-in-cfield))) | |
1035 ; Found a matching field. Remember boundaries. | |
1036 (setq bibtex-pop-next-search-point (match-end 0)) | |
1037 (setq bibtex-pop-previous-search-point (match-beginning 0)) | |
1038 (bibtex-flash-head) | |
1039 ; Go back to where we started, delete old text, and pop new. | |
1040 (goto-char stop-old-text) | |
1041 (delete-region start-old-text stop-old-text) | |
1042 (insert new-text)) | |
1043 (t ; search failed | |
1044 (error "No next matching BibTeX field.")))))) | |
1045 (setq this-command 'bibtex-pop-next)) | |
1046 | |
1047 (defun bibtex-flash-head () | |
1048 "Flash at BibTeX reference head before point, if exists. (Moves point)." | |
1049 (let ((flash)) | |
1050 (cond ((re-search-backward bibtex-reference-head (point-min) t) | |
1051 (goto-char (match-beginning bibtex-type-in-head)) | |
1052 (setq flash (match-end bibtex-key-in-reference))) | |
1053 (t | |
1054 (end-of-line) | |
1055 (skip-chars-backward " \t") | |
1056 (setq flash (point)) | |
1057 (beginning-of-line) | |
1058 (skip-chars-forward " \t"))) | |
1059 (if (pos-visible-in-window-p (point)) | |
1060 (sit-for 1) | |
1061 (message "From: %s" | |
1062 (buffer-substring (point) flash))))) | |
1063 | |
1064 | |
1065 | |
1066 (defun bibtex-enclosing-field () | |
1067 "Search for BibTeX field enclosing point. | |
1068 Point moves to end of field; also, use match-beginning and match-end | |
1069 to parse the field." | |
1070 (condition-case errname | |
1071 (bibtex-enclosing-regexp bibtex-field) | |
1072 (search-failed | |
1073 (error "Can't find enclosing BibTeX field.")))) | |
1074 | |
1075 (defun bibtex-enclosing-reference () | |
1076 "Search for BibTeX reference enclosing point. | |
1077 Point moves to end of reference; also, use match-beginning and match-end | |
1078 to parse the reference." | |
1079 (condition-case errname | |
1080 (bibtex-enclosing-regexp bibtex-reference) | |
1081 (search-failed | |
1082 (error "Can't find enclosing BibTeX reference.")))) | |
1083 | |
1084 (defun bibtex-enclosing-regexp (regexp) | |
1085 "Search for REGEXP enclosing point. | |
1086 Point moves to end of REGEXP. See also match-beginning and match-end. | |
1087 If an enclosing REGEXP is not found, signals search-failed; point is left in | |
1088 an undefined location. | |
1089 | |
1090 [Doesn't something like this exist already?]" | |
1091 | |
1092 (interactive "sRegexp: ") | |
1093 ; compute reasonable limits for the loop | |
1094 (let* ((initial (point)) | |
1095 (right (if (re-search-forward regexp (point-max) t) | |
1096 (match-end 0) | |
1097 (point-max))) | |
1098 (left | |
1099 (progn | |
1100 (goto-char initial) | |
1101 (if (re-search-backward regexp (point-min) t) | |
1102 (match-beginning 0) | |
1103 (point-min))))) | |
1104 ; within the prescribed limits, loop until a match is found | |
1105 (goto-char left) | |
1106 (re-search-forward regexp right nil 1) | |
1107 (if (> (match-beginning 0) initial) | |
1108 (signal 'search-failed (list regexp))) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1109 (while (<= (match-end 0) initial) |
257 | 1110 (re-search-forward regexp right nil 1) |
1111 (if (> (match-beginning 0) initial) | |
1112 (signal 'search-failed (list regexp)))) | |
1113 )) | |
1114 | |
1115 (defun bibtex-clean-entry () | |
1116 "For all optional fields of current BibTeX entry: if empty, kill the whole field; otherwise, remove the \"OPT\" string in the name; if text numerical, remove double-quotes. For all mandatory fields: if empty, signal error." | |
1117 (interactive) | |
1118 (bibtex-enclosing-reference) | |
1119 (goto-char (match-beginning 0)) | |
1120 (let ((start (point))) | |
1121 (save-restriction | |
1122 (narrow-to-region start (match-end 0)) | |
1123 (while (re-search-forward bibtex-field (point-max) t 1) | |
1124 (let ((begin-field (match-beginning 0)) | |
1125 (end-field (match-end 0)) | |
1126 (begin-name (match-beginning bibtex-name-in-field)) | |
1127 (end-name (match-end bibtex-name-in-field)) | |
1128 (begin-text (match-beginning bibtex-text-in-field)) | |
1129 (end-text (match-end bibtex-text-in-field)) | |
1130 ) | |
1131 (goto-char begin-name) | |
1132 (cond ((and | |
1133 (looking-at "OPT") | |
1134 bibtex-clean-entry-zap-empty-opts) | |
1135 (goto-char begin-text) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1136 (if (looking-at "\"\"") ; empty: delete whole field |
257 | 1137 (delete-region begin-field end-field) |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1138 ; otherwise: not empty, delete "OPT" |
257 | 1139 (goto-char begin-name) |
1140 (delete-char (length "OPT")) | |
1141 (goto-char begin-field) ; and loop to go through next test | |
1142 )) | |
1143 (t | |
1144 (goto-char begin-text) | |
1145 (cond ((looking-at "\"[0-9]+\"") ; if numerical, | |
1146 (goto-char end-text) | |
1147 (delete-char -1) ; delete enclosing double-quotes | |
1148 (goto-char begin-text) | |
1149 (delete-char 1) | |
1150 (goto-char end-field) ; go to end for next search | |
1151 (forward-char -2) ; to compensate for the 2 quotes deleted | |
1152 ) | |
1153 ((looking-at "\"\"") ; if empty quotes, complain | |
1154 (forward-char 1) | |
1155 (if (not (or (equal (buffer-substring | |
1156 begin-name | |
1157 (+ begin-name 3)) | |
1158 "OPT") | |
1159 (equal (buffer-substring | |
1160 begin-name | |
1161 (+ begin-name 3)) | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1162 "opt"))) |
257 | 1163 (error "Mandatory field ``%s'' is empty" |
1164 (buffer-substring begin-name end-name)))) | |
1165 (t | |
1166 (goto-char end-field)))))))) | |
1167 (goto-char start) | |
1168 (skip-chars-forward "@a-zA-Z") | |
1169 (bibtex-enclosing-reference) | |
1170 (goto-char (match-end 0)) | |
1171 (skip-chars-forward " \t\n"))) | |
1172 | |
1173 | |
1174 | |
1175 ;;; X window menus for bibtex mode | |
1176 | |
1177 (defun bibtex-x-help (arg) | |
1178 "Mouse commands for BibTeX mode" | |
1179 | |
1180 (let ((selection | |
1181 (x-popup-menu | |
1182 arg | |
1183 '("BibTeX commands" | |
1184 ("BibTeX entry types" | |
1185 (" article in conference Proceedings " . bibtex-InProceedings) | |
1186 (" Article in journal " . bibtex-Article) | |
1187 (" Book " . bibtex-Book) | |
1188 (" Booklet " . bibtex-Booklet) | |
1189 (" Conference " . bibtex-InProceedings) | |
1190 (" Master's Thesis " . bibtex-MastersThesis) | |
1191 (" DEA Thesis " . bibtex-DEAthesis) | |
1192 (" Phd. Thesis " . bibtex-PhdThesis) | |
1193 (" Technical Report " . bibtex-TechReport) | |
1194 (" technical Manual " . bibtex-Manual) | |
1195 (" conference Proceedings " . bibtex-Proceedings) | |
1196 (" a chapter in a Book " . bibtex-InBook) | |
1197 (" an article in a Collection " . bibtex-InCollection) | |
1198 (" miscellaneous " . bibtex-Misc) | |
1199 (" unpublished " . bibtex-Unpublished) | |
1200 (" string " . bibtex-string) | |
1201 (" preamble " . bibtex-preamble) | |
1202 ) | |
1203 ("Moving around and editing" | |
1204 (" next field " . bibtex-next-field) | |
1205 (" to end of field " . bibtex-find-text) | |
1206 ("snatch from similar preceding field" . bibtex-pop-previous) | |
1207 ("snatch from similar following field" . bibtex-pop-next) | |
1208 (" remove OPT " . bibtex-remove-OPT) | |
1209 (" remove quotes " | |
1210 . bibtex-remove-double-quotes) | |
1211 (" clean up entry " . bibtex-clean-entry) | |
1212 ) | |
1213 ("help" | |
1214 (" describe BibTeX mode " . describe-mode) | |
1215 ))))) | |
1216 (and selection (call-interactively selection)))) | |
1217 | |
1218 (defun bibtex-x-environment () | |
1219 "Set up X menus for BibTeX mode. Call it as bibtex-mode-hook, or interactively" | |
1220 (interactive) | |
1221 (require 'x-mouse) | |
1222 (define-key mouse-map x-button-c-right 'bibtex-x-help) | |
1223 ) | |
1224 | |
1225 | |
1226 | |
1227 ;; Please don't send anything to bug-gnu-emacs about these Sunwindows functions | |
1228 ;; since we aren't interested. See etc/SUN-SUPPORT for the reasons why | |
1229 ;; we consider this nothing but a distraction from our work. | |
1230 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1231 (defmacro eval-in-menu-window (&rest l) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1232 "Evaluates its argument in the window in which the mouse button was pressed." |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1233 (list 'eval-in-window '*menu-window* l)) |
257 | 1234 |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1235 ;(defmenu bibtex-sun-entry-menu |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1236 ; ("Article In Conf. Proc." eval-in-menu-window bibtex-InProceedings) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1237 ; ("Article In Journal" eval-in-menu-window bibtex-Article) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1238 ; ("Book" eval-in-menu-window bibtex-Book) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1239 ; ("Booklet" eval-in-menu-window bibtex-Booklet) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1240 ; ("Master's Thesis" eval-in-menu-window bibtex-MastersThesis) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1241 ; ("PhD. Thesis" eval-in-menu-window bibtex-PhdThesis) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1242 ; ("Technical Report" eval-in-menu-window bibtex-TechReport) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1243 ; ("Technical Manual" eval-in-menu-window bibtex-Manual) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1244 ; ("Conference Proceedings" eval-in-menu-window bibtex-Proceedings) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1245 ; ("In A Book" eval-in-menu-window bibtex-InBook) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1246 ; ("In A Collection" eval-in-menu-window bibtex-InCollection) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1247 ; ("Miscellaneous" eval-in-menu-window bibtex-Misc) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1248 ; ("Unpublished" eval-in-menu-window bibtex-Unpublished) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1249 ; ("string" eval-in-menu-window bibtex-string) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1250 ; ("preamble" eval-in-menu-window bibtex-preamble)) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1251 ; |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1252 ;(defmenu bibtex-sun-menu |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1253 ; ("BibTeX menu") |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1254 ; ("add entry" . bibtex-sun-entry-menu) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1255 ; ("next field" eval-in-menu-window bibtex-next-field nil) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1256 ; ("to end of field" eval-in-menu-window bibtex-find-text nil) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1257 ; ("snatch similar preceding field" eval-in-menu-window bibtex-pop-previous 1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1258 ; ("snatch similar following field" eval-in-menu-window bibtex-pop-next 1) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1259 ; ("remove OPT" eval-in-menu-window bibtex-remove-OPT) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1260 ; ("remove quotes" eval-in-menu-window bibtex-remove-double-quotes) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1261 ; ("clean entry" eval-in-menu-window bibtex-clean-entry) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1262 ; ("describe BibTeX mode" eval-in-menu-window describe-mode) |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1263 ; ("Main Emacs menu" . emacs-menu)) |
257 | 1264 |
1265 (defun bibtex-sun-menu-eval (window x y) | |
1266 "Pop-up menu of BibTeX commands." | |
1267 (sun-menu-evaluate window (1+ x) (1- y) 'bibtex-sun-menu)) | |
1268 | |
1269 (defun bibtex-sun-environment () | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1270 "Set up sun menus for BibTeX mode. Call it as bibtex-mode-hook, or |
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1271 interactively" |
257 | 1272 (interactive) |
1273 (local-set-mouse '(text right) 'bibtex-sun-menu-eval)) | |
1274 | |
807
4f28bd14272c
*** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents:
662
diff
changeset
|
1275 ;;; bibtex-mode.el ends here |