diff options
| author | Karl Heuer | 1995-12-13 20:26:13 +0000 |
|---|---|---|
| committer | Karl Heuer | 1995-12-13 20:26:13 +0000 |
| commit | 0640d7bff76b15d424650c1d561c0aa3e7bdc85d (patch) | |
| tree | 2e4b6bbdff58445d56a069f790808b1f4de6d0cb | |
| parent | 482a1bd2302d8cd97d8e94d4f99af848dda0a784 (diff) | |
| download | emacs-0640d7bff76b15d424650c1d561c0aa3e7bdc85d.tar.gz emacs-0640d7bff76b15d424650c1d561c0aa3e7bdc85d.zip | |
(bibtex-auto-fill-function): Adapted for use with
changed autofill policy of emacs-19.30 (uses now fill-prefix
instead of indent-line-function).
(bibtex-indent-line-function): Removed (not used any more).
(bibtex-make-field): Was broken when called
non-interactively.
(bibtex-make-field): Point is now placed on closing
brace or quote (suggested by Karl Eichwalder <ke@ke.Central.DE>).
(bibtex-clean-entry): Comma after last field isn't
deleted anymore (new standard in BibTeX 0.99 and 1.xx).
(bibtex-enclosing-reference-maybe-empty-head): Works with entries
with comma after last field.
(bibtex-reference): Permits entries with comma after last field.
(bibtex-font-lock-keywords): Enhanced to support new field-name
characters (suggested by Martin Maechler
<maechler@stat.math.ethz.ch>).
(bibtex-field-name): Now numbers (not as the first sign), dashes,
and underscores are allowed (suggested by Martin Maechler
<maechler@stat.math.ethz.ch> and Oren Patashnik
<opbibtex@labrea.Stanford.EDU>).
(bibtex-make-field): Was broken on lines containing
non-parenthesized entries (reported by Karl Eichwalder
<ke@ke.Central.DE>).
(bibtex-validate-buffer): Changed so that preamble
references are ignored (same as string entries) (reported by
Martin Maechler <maechler@stat.math.ethz.ch>).
(bibtex-enclosing-reference-maybe-empty-head):
New function to be used in case reference head may be empty.
(bibtex-clean-entry, bibtex-pop-previous, bibtex-pop-next): Uses
now bibtex-enclosing-reference-maybe-empty-head.
(bibtex-mode): Added support for font-lock mode.
(bibtex-font-lock-keywords): New variable with font-lock keywords
for BibTeX mode.
(bibtex-make-optional-field): Not longer interactive
(suggested by Karl Eichwalder <karl@pertron.central.de>).
(bibtex-maintain-sorted-entries): Set to nil, since it
requires more user attention and more restricted files to have
this set to t.
(bibtex-maintain-sorted-entries,
bibtex-sort-ignore-string-entries): Made buffer local, since it
may depend on the buffer which preferences to use.
(bibtex-validate-buffer): Looking for correct sort order only when
bibtex-maintain-sorted-entries is non-nil.
Put a comment in the `KNOWN BUGS' section about the
quote-inside-quotes problem.
(whole file): Changed string `true' in some documentation strings
to `non-nil' (e.g. `if variable has a true/non-nil value').
(bibtex-mode-map): Changed `move/edit' to `bibtex-edit'.
(bibtex-sort-entries): Now works correctly with
`@String' entries inside BibTeX files (i.e. after the occurence of
other references).
(bibtex-validate-buffer): Inserted code which looks if entries are
balanced (a single non-escaped quote inside braces was not
detected till now, but bibtex-sort-entries stumbles about it).
(bibtex-entry): bibtex-move-outside-of-entry is only
called when bibtex-maintain-sorted-entries is nil (otherwise
bibtex-find-entry-location determines the correct location).
(bibtex-find-entry-location): Now uses binary search. As before,
it assumes that the buffer is sorted without duplicates (but as
before it is only called when bibtex-maintain-sorted-entries is
t). Ignores `@String' entries if told so via variable
bibtex-sort-ignore-string-entries.
(bibtex-clean-entry): Respect
bibtex-maintain-sorted-entries when inserting autokey.
(bibtex-validate-buffer): Searching whole buffer for duplicates
and correct order is now done directly instead of calling
bibtex-find-entry-location (since this is to be reprogrammed to
use a binary search instead a sequential one).
(bibtex-parse-keys): May now be called with an
optional parameter which (if t) tells bibtex-parse-keys that it
should abort if input is pending.
(bibtex-mode): The instance of bibtex-parse-keys called in
auto-save-mode-hook is now called with this new parameter set to
t, so an auto-save caused by exceeding auto-save-interval is now
aborted immediately if user is still typing.
(bibtex-print-help-message, bibtex-clean-entry): Use
now constant strings instead of custom ones.
(bibtex-clean-entry): Changed the call of
bibtex-enclosing-reference to a more specific call so entries
without a key (here allowed) can be handled.
(bibtex-reference-key): Cleared off parentheses (caused string
entries enclosed by parentheses instead of braces to be not added
to bibtex-completion-candidates).
(bibtex-complete-string): Made it use bibtex-string.
(bibtex-keys,
bibtex-buffer-last-parsed-for-keys-tick): New buffer-local
variables to make parsing of BibTeX buffer for reference keys
(needed by TAB completion in minibuffer when entering key) more
occasional.
(bibtex-parse-keys): New function to parse for keys (functionality
was partially included in bibtex-entry).
(bibtex-entry): Changed to use bibtex-parse-keys.
(bibtex-mode): Installs bibtex-parse-keys as an
auto-save-mode-hook, so whole buffer is parsed at most when it is
autosaved.
(bibtex-clean-entry): Calls bibtex-parse-keys on the new entry, so
bibtex-keys remains consistent for new entries that are finished
by calling this function (most should).
(bibtex-inside-field): Be independent on current
setting of bibtex-field-right-delimiter (allows more intermixing
between quotes and braces).
(bibtex-make-field): Last change didn't make it work correctly
when called non-interactively by bibtex-entry (fixed).
| -rw-r--r-- | lisp/textmodes/bibtex.el | 647 |
1 files changed, 400 insertions, 247 deletions
diff --git a/lisp/textmodes/bibtex.el b/lisp/textmodes/bibtex.el index 3f8fc533024..a84d5f10afc 100644 --- a/lisp/textmodes/bibtex.el +++ b/lisp/textmodes/bibtex.el | |||
| @@ -43,6 +43,10 @@ | |||
| 43 | ;; 2. Calling bibtex-find-text in a string entry results in the | 43 | ;; 2. Calling bibtex-find-text in a string entry results in the |
| 44 | ;; error message "Can't find enclosing Bibtex field" instead of | 44 | ;; error message "Can't find enclosing Bibtex field" instead of |
| 45 | ;; moving to the empty string. [reported by gernot@cs.unsw.oz.au] | 45 | ;; moving to the empty string. [reported by gernot@cs.unsw.oz.au] |
| 46 | ;; 3. Quotes inside quote-parenthesized fields (like | ||
| 47 | ;; `author = "Stefan Sch{\"o}f"') break bibtex-validate-buffer. | ||
| 48 | ;; Further, you must use braces here, if you want to set | ||
| 49 | ;; bibtex-maintain-sorted-entries to a non-nil value. | ||
| 46 | 50 | ||
| 47 | ;; (current keeper: schoef@informatik.uni-oldenburg.de | 51 | ;; (current keeper: schoef@informatik.uni-oldenburg.de |
| 48 | ;; previous: alarson@src.honeywell.com) | 52 | ;; previous: alarson@src.honeywell.com) |
| @@ -78,19 +82,24 @@ name of the field, second element = comment to appear in the echo area).") | |||
| 78 | "*If non-nil, bibtex-clean-entry will delete all empty optional fields.") | 82 | "*If non-nil, bibtex-clean-entry will delete all empty optional fields.") |
| 79 | 83 | ||
| 80 | (defvar bibtex-sort-ignore-string-entries t | 84 | (defvar bibtex-sort-ignore-string-entries t |
| 81 | "*If true, BibTeX @STRING entries are not sort-significant. | 85 | "*If non-nil, BibTeX @STRING entries are not sort-significant. |
| 82 | That means they are ignored when determining ordering of the buffer | 86 | That means they are ignored when determining ordering of the buffer |
| 83 | (e.g. sorting, locating alphabetical position for new entries, etc.).") | 87 | (e.g. sorting, locating alphabetical position for new entries, etc.). |
| 88 | This variable is buffer local.") | ||
| 89 | (make-variable-buffer-local 'bibtex-sort-ignore-string-entries) | ||
| 84 | 90 | ||
| 85 | (defvar bibtex-maintain-sorted-entries nil | 91 | (defvar bibtex-maintain-sorted-entries nil |
| 86 | "*If true, bibtex-mode maintains all BibTeX entries in sorted order. | 92 | "*If non-nil, bibtex-mode maintains all BibTeX entries in sorted order. |
| 87 | Setting this variable to nil will strip off some comfort (e.g. TAB | 93 | Setting this variable to nil will strip off some comfort (e.g. TAB |
| 88 | completion for reference keys) from bibtex-mode.") | 94 | completion for reference keys in minibuffer, automatic detection of |
| 95 | duplicates) from bibtex-mode. See also bibtex-sort-ignore-string-entries. | ||
| 96 | This variable is buffer local.") | ||
| 97 | (make-variable-buffer-local 'bibtex-maintain-sorted-entries) | ||
| 89 | 98 | ||
| 90 | (defvar bibtex-entry-field-alist | 99 | (defvar bibtex-entry-field-alist |
| 91 | '( | 100 | '( |
| 92 | ("Article" . (((("author" "Author1 [and Author2 ...] [and others]") | 101 | ("Article" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 93 | ("title" "Title of the article (will be converted to lowercase)") | 102 | ("title" "Title of the article (BibTeX converts it to lowercase)") |
| 94 | ("journal" "Name of the journal (use string, remove braces)") | 103 | ("journal" "Name of the journal (use string, remove braces)") |
| 95 | ("year" "Year of publication")) | 104 | ("year" "Year of publication")) |
| 96 | (("volume" "Volume of the journal") | 105 | (("volume" "Volume of the journal") |
| @@ -99,7 +108,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 99 | ("pages" "Pages in the journal") | 108 | ("pages" "Pages in the journal") |
| 100 | ("note" "Remarks to be put at the end of the \\bibitem"))) | 109 | ("note" "Remarks to be put at the end of the \\bibitem"))) |
| 101 | ((("author" "Author1 [and Author2 ...] [and others]") | 110 | ((("author" "Author1 [and Author2 ...] [and others]") |
| 102 | ("title" "Title of the article (will be converted to lowercase)")) | 111 | ("title" "Title of the article (BibTeX converts it to lowercase)")) |
| 103 | (("journal" "Name of the journal (use string, remove braces)") | 112 | (("journal" "Name of the journal (use string, remove braces)") |
| 104 | ("year" "Year of publication") | 113 | ("year" "Year of publication") |
| 105 | ("volume" "Volume of the journal") | 114 | ("volume" "Volume of the journal") |
| @@ -119,7 +128,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 119 | ("edition" "Edition of the book as a capitalized English word") | 128 | ("edition" "Edition of the book as a capitalized English word") |
| 120 | ("month" "Month of the publication as a string (remove braces)") | 129 | ("month" "Month of the publication as a string (remove braces)") |
| 121 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 130 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 122 | ("Booklet" . (((("title" "Title of the booklet (will be converted to lowercase)")) | 131 | ("Booklet" . (((("title" "Title of the booklet (BibTeX converts it to lowercase)")) |
| 123 | (("author" "Author1 [and Author2 ...] [and others]") | 132 | (("author" "Author1 [and Author2 ...] [and others]") |
| 124 | ("howpublished" "The way in which the booklet was published") | 133 | ("howpublished" "The way in which the booklet was published") |
| 125 | ("address" "Address of the publisher") | 134 | ("address" "Address of the publisher") |
| @@ -157,7 +166,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 157 | ("type" "Word to use instead of \"chapter\"") | 166 | ("type" "Word to use instead of \"chapter\"") |
| 158 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 167 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 159 | ("InCollection" . (((("author" "Author1 [and Author2 ...] [and others]") | 168 | ("InCollection" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 160 | ("title" "Title of the article in book (will be converted to lowercase)") | 169 | ("title" "Title of the article in book (BibTeX converts it to lowercase)") |
| 161 | ("booktitle" "Name of the book") | 170 | ("booktitle" "Name of the book") |
| 162 | ("publisher" "Publishing company") | 171 | ("publisher" "Publishing company") |
| 163 | ("year" "Year of publication")) | 172 | ("year" "Year of publication")) |
| @@ -173,7 +182,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 173 | ("pages" "Pages in the book") | 182 | ("pages" "Pages in the book") |
| 174 | ("note" "Remarks to be put at the end of the \\bibitem"))) | 183 | ("note" "Remarks to be put at the end of the \\bibitem"))) |
| 175 | ((("author" "Author1 [and Author2 ...] [and others]") | 184 | ((("author" "Author1 [and Author2 ...] [and others]") |
| 176 | ("title" "Title of the article in book (will be converted to lowercase)") | 185 | ("title" "Title of the article in book (BibTeX converts it to lowercase)") |
| 177 | ("booktitle" "Name of the book")) | 186 | ("booktitle" "Name of the book")) |
| 178 | (("publisher" "Publishing company") | 187 | (("publisher" "Publishing company") |
| 179 | ("year" "Year of publication") | 188 | ("year" "Year of publication") |
| @@ -189,7 +198,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 189 | ("pages" "Pages in the book") | 198 | ("pages" "Pages in the book") |
| 190 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 199 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 191 | ("InProceedings" . (((("author" "Author1 [and Author2 ...] [and others]") | 200 | ("InProceedings" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 192 | ("title" "Title of the article in proceedings (will be converted to lowercase)") | 201 | ("title" "Title of the article in proceedings (BibTeX converts it to lowercase)") |
| 193 | ("booktitle" "Name of the conference proceedings") | 202 | ("booktitle" "Name of the conference proceedings") |
| 194 | ("year" "Year of publication")) | 203 | ("year" "Year of publication")) |
| 195 | (("editor" "Editor1 [and Editor2 ...] [and others]") | 204 | (("editor" "Editor1 [and Editor2 ...] [and others]") |
| @@ -203,7 +212,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 203 | ("pages" "Pages in the conference proceedings") | 212 | ("pages" "Pages in the conference proceedings") |
| 204 | ("note" "Remarks to be put at the end of the \\bibitem"))) | 213 | ("note" "Remarks to be put at the end of the \\bibitem"))) |
| 205 | ((("author" "Author1 [and Author2 ...] [and others]") | 214 | ((("author" "Author1 [and Author2 ...] [and others]") |
| 206 | ("title" "Title of the article in proceedings (will be converted to lowercase)") | 215 | ("title" "Title of the article in proceedings (BibTeX converts it to lowercase)") |
| 207 | ("booktitle" "Name of the conference proceedings")) | 216 | ("booktitle" "Name of the conference proceedings")) |
| 208 | (("editor" "Editor1 [and Editor2 ...] [and others]") | 217 | (("editor" "Editor1 [and Editor2 ...] [and others]") |
| 209 | ("volume" "Volume of the conference proceedings in the series") | 218 | ("volume" "Volume of the conference proceedings in the series") |
| @@ -226,7 +235,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 226 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 235 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 227 | 236 | ||
| 228 | ("MastersThesis" . (((("author" "Author1 [and Author2 ...] [and others]") | 237 | ("MastersThesis" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 229 | ("title" "Title of the master\'s thesis (will be converted to lowercase)") | 238 | ("title" "Title of the master\'s thesis (BibTeX converts it to lowercase)") |
| 230 | ("school" "School where the master\'s thesis was written") | 239 | ("school" "School where the master\'s thesis was written") |
| 231 | ("year" "Year of publication")) | 240 | ("year" "Year of publication")) |
| 232 | (("address" "Address of the school (if not part of field \"school\") or country") | 241 | (("address" "Address of the school (if not part of field \"school\") or country") |
| @@ -235,7 +244,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 235 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 244 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 236 | ("Misc" . ((() | 245 | ("Misc" . ((() |
| 237 | (("author" "Author1 [and Author2 ...] [and others]") | 246 | (("author" "Author1 [and Author2 ...] [and others]") |
| 238 | ("title" "Title of the reference (will be converted to lowercase)") | 247 | ("title" "Title of the reference (BibTeX converts it to lowercase)") |
| 239 | ("howpublished" "The way in which the reference was published") | 248 | ("howpublished" "The way in which the reference was published") |
| 240 | ("year" "Year of publication") | 249 | ("year" "Year of publication") |
| 241 | ("month" "Month of the publication as a string (remove braces)") | 250 | ("month" "Month of the publication as a string (remove braces)") |
| @@ -260,7 +269,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 260 | ("month" "Month of the publication as a string (remove braces)") | 269 | ("month" "Month of the publication as a string (remove braces)") |
| 261 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 270 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 262 | ("TechReport" . (((("author" "Author1 [and Author2 ...] [and others]") | 271 | ("TechReport" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 263 | ("title" "Title of the technical report (will be converted to lowercase)") | 272 | ("title" "Title of the technical report (BibTeX converts it to lowercase)") |
| 264 | ("institution" "Sponsoring institution of the report") | 273 | ("institution" "Sponsoring institution of the report") |
| 265 | ("year" "Year of publication")) | 274 | ("year" "Year of publication")) |
| 266 | (("type" "Type of the report (if other than \"technical report\")") | 275 | (("type" "Type of the report (if other than \"technical report\")") |
| @@ -269,7 +278,7 @@ completion for reference keys) from bibtex-mode.") | |||
| 269 | ("month" "Month of the publication as a string (remove braces)") | 278 | ("month" "Month of the publication as a string (remove braces)") |
| 270 | ("note" "Remarks to be put at the end of the \\bibitem"))))) | 279 | ("note" "Remarks to be put at the end of the \\bibitem"))))) |
| 271 | ("Unpublished" . (((("author" "Author1 [and Author2 ...] [and others]") | 280 | ("Unpublished" . (((("author" "Author1 [and Author2 ...] [and others]") |
| 272 | ("title" "Title of the unpublished reference (will be converted to lowercase)") | 281 | ("title" "Title of the unpublished reference (BibTeX converts it to lowercase)") |
| 273 | ("note" "Remarks to be put at the end of the \\bibitem")) | 282 | ("note" "Remarks to be put at the end of the \\bibitem")) |
| 274 | (("year" "Year of publication") | 283 | (("year" "Year of publication") |
| 275 | ("month" "Month of the publication as a string (remove braces)"))))) | 284 | ("month" "Month of the publication as a string (remove braces)"))))) |
| @@ -397,6 +406,21 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 397 | (defvar bibtex-autokey-edit-before-use t | 406 | (defvar bibtex-autokey-edit-before-use t |
| 398 | "*If non-nil, user is allowed to edit the generated key before it is used.") | 407 | "*If non-nil, user is allowed to edit the generated key before it is used.") |
| 399 | 408 | ||
| 409 | (defvar bibtex-font-lock-keywords | ||
| 410 | (list | ||
| 411 | "^@[A-Za-z]*[({]" | ||
| 412 | ;; reference type | ||
| 413 | '("^\\([ \t]*OPT[A-Za-z_-][A-Za-z0-9_-]*\\)[ \t]*=" | ||
| 414 | 1 font-lock-comment-face) | ||
| 415 | ;; optional field names | ||
| 416 | '("^\\([ \t]*[A-Za-z_-][A-Za-z0-9_-]*\\)[ \t]*=" | ||
| 417 | 1 font-lock-function-name-face) | ||
| 418 | ;; field names | ||
| 419 | '("^@[A-Za-z]*[({]\\([^\n,]*\\)," | ||
| 420 | 1 font-lock-string-face) | ||
| 421 | ;; reference labels | ||
| 422 | ) | ||
| 423 | "*Fonts to use in BibTeX mode") | ||
| 400 | 424 | ||
| 401 | 425 | ||
| 402 | ;; Syntax Table, Keybindings and BibTeX Entry List | 426 | ;; Syntax Table, Keybindings and BibTeX Entry List |
| @@ -434,7 +458,6 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 434 | (define-key km "\M-\C-e" 'bibtex-end-of-entry) | 458 | (define-key km "\M-\C-e" 'bibtex-end-of-entry) |
| 435 | (define-key km "\C-c\C-b" 'bibtex-entry) | 459 | (define-key km "\C-c\C-b" 'bibtex-entry) |
| 436 | (define-key km "\C-c\C-q" 'bibtex-hide-entry-bodies) | 460 | (define-key km "\C-c\C-q" 'bibtex-hide-entry-bodies) |
| 437 | (define-key km "\C-c\C-a" 'show-all) | ||
| 438 | (define-key km "\C-c\C-rn" 'bibtex-narrow-to-entry) | 461 | (define-key km "\C-c\C-rn" 'bibtex-narrow-to-entry) |
| 439 | (define-key km "\C-c\C-rw" 'widen) | 462 | (define-key km "\C-c\C-rw" 'widen) |
| 440 | (define-key km "\C-c\C-o" 'bibtex-remove-OPT) | 463 | (define-key km "\C-c\C-o" 'bibtex-remove-OPT) |
| @@ -459,29 +482,29 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 459 | (define-key km "\C-c\C-e\C-u" 'bibtex-Unpublished) | 482 | (define-key km "\C-c\C-e\C-u" 'bibtex-Unpublished) |
| 460 | km)) | 483 | km)) |
| 461 | 484 | ||
| 462 | (define-key bibtex-mode-map [menu-bar move/edit] | 485 | (define-key bibtex-mode-map [menu-bar bibtex-edit] |
| 463 | (cons "BibTeX-Edit" (make-sparse-keymap "BibTeX-Edit"))) | 486 | (cons "BibTeX-Edit" (make-sparse-keymap "BibTeX-Edit"))) |
| 464 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-print-help-message] | 487 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-print-help-message] |
| 465 | '("Help about Current Field" . bibtex-print-help-message)) | 488 | '("Help about Current Field" . bibtex-print-help-message)) |
| 466 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-complete-string] | 489 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-complete-string] |
| 467 | '("String Complete" . bibtex-complete-string)) | 490 | '("String Complete" . bibtex-complete-string)) |
| 468 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-next-field] | 491 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-next-field] |
| 469 | '("Next Field" . bibtex-next-field)) | 492 | '("Next Field" . bibtex-next-field)) |
| 470 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-find-text] | 493 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-find-text] |
| 471 | '("End of Field" . bibtex-find-text)) | 494 | '("End of Field" . bibtex-find-text)) |
| 472 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-pop-previous] | 495 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-pop-previous] |
| 473 | '("Snatch from Similar Preceding Field" . bibtex-pop-previous)) | 496 | '("Snatch from Similar Preceding Field" . bibtex-pop-previous)) |
| 474 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-pop-next] | 497 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-pop-next] |
| 475 | '("Snatch from Similar Following Field" . bibtex-pop-next)) | 498 | '("Snatch from Similar Following Field" . bibtex-pop-next)) |
| 476 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-remove-OPT] | 499 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-remove-OPT] |
| 477 | '("Remove OPT" . bibtex-remove-OPT)) | 500 | '("Remove OPT" . bibtex-remove-OPT)) |
| 478 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-remove-double-quotes-or-braces] | 501 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-remove-double-quotes-or-braces] |
| 479 | '("Remove Quotes or Braces" . bibtex-remove-double-quotes-or-braces)) | 502 | '("Remove Quotes or Braces" . bibtex-remove-double-quotes-or-braces)) |
| 480 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-clean-entry] | 503 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-clean-entry] |
| 481 | '("Clean Up Entry" . bibtex-clean-entry)) | 504 | '("Clean Up Entry" . bibtex-clean-entry)) |
| 482 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-sort-entries] | 505 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-sort-entries] |
| 483 | '("Sort Entries" . bibtex-sort-entries)) | 506 | '("Sort Entries" . bibtex-sort-entries)) |
| 484 | (define-key bibtex-mode-map [menu-bar move/edit bibtex-validate-buffer] | 507 | (define-key bibtex-mode-map [menu-bar bibtex-edit bibtex-validate-buffer] |
| 485 | '("Validate Entries" . bibtex-validate-buffer)) | 508 | '("Validate Entries" . bibtex-validate-buffer)) |
| 486 | 509 | ||
| 487 | (define-key bibtex-mode-map [menu-bar entry-types] | 510 | (define-key bibtex-mode-map [menu-bar entry-types] |
| @@ -534,6 +557,18 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 534 | ;; buffer-local. | 557 | ;; buffer-local. |
| 535 | (make-variable-buffer-local 'bibtex-completion-candidates) | 558 | (make-variable-buffer-local 'bibtex-completion-candidates) |
| 536 | 559 | ||
| 560 | (defvar bibtex-keys nil) | ||
| 561 | ;; Candidates for TAB completion when entering a reference key using | ||
| 562 | ;; the minibuffer. Initialized in bibtex-mode and updated for each | ||
| 563 | ;; new entry. This variable is buffer-local. | ||
| 564 | (make-variable-buffer-local 'bibtex-keys) | ||
| 565 | |||
| 566 | (defvar bibtex-buffer-last-parsed-for-keys-tick nil) | ||
| 567 | ;; Remembers the value returned by buffer-modified-tick when buffer | ||
| 568 | ;; was parsed for keys the last time. | ||
| 569 | (make-variable-buffer-local 'bibtex-keys) | ||
| 570 | |||
| 571 | |||
| 537 | 572 | ||
| 538 | ;; Functions to Parse the BibTeX Entries | 573 | ;; Functions to Parse the BibTeX Entries |
| 539 | 574 | ||
| @@ -550,7 +585,7 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 550 | (defconst bibtex-text-in-cfield 2) | 585 | (defconst bibtex-text-in-cfield 2) |
| 551 | ;; The regexp subexpression number of the text part in bibtex-cfield. | 586 | ;; The regexp subexpression number of the text part in bibtex-cfield. |
| 552 | 587 | ||
| 553 | (defconst bibtex-field-name "[A-Za-z][]A-Za-z0-9.:;?!`'()/*@_+=-]*") | 588 | (defconst bibtex-field-name "[A-Za-z_-][A-Za-z0-9_-]*") |
| 554 | ;; Regexp defining the name part of a BibTeX field. | 589 | ;; Regexp defining the name part of a BibTeX field. |
| 555 | 590 | ||
| 556 | (defconst bibtex-field-const "[0-9A-Za-z][A-Za-z0-9:_+-]*" | 591 | (defconst bibtex-field-const "[0-9A-Za-z][A-Za-z0-9:_+-]*" |
| @@ -562,7 +597,8 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 562 | "{\\(\\({\\(\\({[^}]*}\\)\\|\\([^{}]\\)\\)*}\\)\\|\\([^{}]\\)\\)*}" | 597 | "{\\(\\({\\(\\({[^}]*}\\)\\|\\([^{}]\\)\\)*}\\)\\|\\([^{}]\\)\\)*}" |
| 563 | ;; maximal twice nested {} | 598 | ;; maximal twice nested {} |
| 564 | "\\)\\|\\(" | 599 | "\\)\\|\\(" |
| 565 | "\"[^\"]*[^\\\\]\"\\|\"\"\\)")) | 600 | "\"[^\"]*[^\\\\]\"\\|\"\"" |
| 601 | "\\)")) | ||
| 566 | ;; Match either a string or an empty string. | 602 | ;; Match either a string or an empty string. |
| 567 | 603 | ||
| 568 | (defconst bibtex-field-string-or-const | 604 | (defconst bibtex-field-string-or-const |
| @@ -572,11 +608,10 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 572 | (defconst bibtex-field-text | 608 | (defconst bibtex-field-text |
| 573 | (concat | 609 | (concat |
| 574 | "\\(" bibtex-field-string-or-const "\\)" | 610 | "\\(" bibtex-field-string-or-const "\\)" |
| 575 | "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*\\|" | 611 | "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*")) |
| 576 | "{[^{}]*[^\\\\]}")) | ||
| 577 | ;; Regexp defining the text part of a BibTeX field: either a string, | 612 | ;; Regexp defining the text part of a BibTeX field: either a string, |
| 578 | ;; or an empty string, or a constant followed by one or more # / | 613 | ;; or an empty string, or a constant followed by one or more # / |
| 579 | ;; constant pairs. Also matches simple {...} patterns. | 614 | ;; constant pairs. |
| 580 | 615 | ||
| 581 | (defconst bibtex-field | 616 | (defconst bibtex-field |
| 582 | (bibtex-cfield bibtex-field-name bibtex-field-text)) | 617 | (bibtex-cfield bibtex-field-name bibtex-field-text)) |
| @@ -588,19 +623,26 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 588 | (defconst bibtex-text-in-field bibtex-text-in-cfield) | 623 | (defconst bibtex-text-in-field bibtex-text-in-cfield) |
| 589 | ;; The regexp subexpression number of the text part in BibTeX-field. | 624 | ;; The regexp subexpression number of the text part in BibTeX-field. |
| 590 | 625 | ||
| 591 | (defconst bibtex-reference-type | 626 | (defconst bibtex-reference-type "@[A-Za-z]+") |
| 592 | "@[A-Za-z]+") | ||
| 593 | ;; Regexp defining the type part of a BibTeX reference entry. | 627 | ;; Regexp defining the type part of a BibTeX reference entry. |
| 594 | 628 | ||
| 629 | (defconst bibtex-reference-key "[A-Za-z][A-Za-z0-9.:;?!`'/*@_+-]*") | ||
| 630 | ;; Regexp defining the label part of a BibTeX reference entry. | ||
| 631 | |||
| 595 | (defconst bibtex-reference-head | 632 | (defconst bibtex-reference-head |
| 596 | (concat "^\\( \\|\t\\)*\\(" | 633 | (concat "^\\( \\|\t\\)*\\(" |
| 597 | bibtex-reference-type | 634 | bibtex-reference-type |
| 598 | "\\)[ \t]*[({]\\(" | 635 | "\\)[ \t]*[({]\\(" |
| 599 | bibtex-field-name | 636 | bibtex-reference-key |
| 600 | "\\)")) | 637 | "\\)")) |
| 601 | ;; Regexp defining format of the header line of a BibTeX reference | 638 | ;; Regexp defining format of the header line of a BibTeX reference |
| 602 | ;; entry. | 639 | ;; entry. |
| 603 | 640 | ||
| 641 | (defconst bibtex-reference-maybe-empty-head | ||
| 642 | (concat bibtex-reference-head "?")) | ||
| 643 | ;; Regexp defining format of the header line of a maybe empty | ||
| 644 | ;; BibTeX reference entry (without reference key). | ||
| 645 | |||
| 604 | (defconst bibtex-type-in-head 2) | 646 | (defconst bibtex-type-in-head 2) |
| 605 | ;; The regexp subexpression number of the type part in | 647 | ;; The regexp subexpression number of the type part in |
| 606 | ;; bibtex-reference-head. | 648 | ;; bibtex-reference-head. |
| @@ -612,7 +654,7 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 612 | (defconst bibtex-reference | 654 | (defconst bibtex-reference |
| 613 | (concat bibtex-reference-head | 655 | (concat bibtex-reference-head |
| 614 | "\\([ \t\n]*" bibtex-field "\\)*" | 656 | "\\([ \t\n]*" bibtex-field "\\)*" |
| 615 | "[ \t\n]*[})]")) | 657 | "[ \t\n]*,?[ \t\n]*[})]")) |
| 616 | ;; Regexp defining the format of a BibTeX reference entry. | 658 | ;; Regexp defining the format of a BibTeX reference entry. |
| 617 | 659 | ||
| 618 | (defconst bibtex-type-in-reference bibtex-type-in-head) | 660 | (defconst bibtex-type-in-reference bibtex-type-in-head) |
| @@ -625,13 +667,13 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 625 | 667 | ||
| 626 | (defconst bibtex-string | 668 | (defconst bibtex-string |
| 627 | (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\(" | 669 | (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\(" |
| 628 | bibtex-field-name | 670 | bibtex-reference-key |
| 629 | "\\)[ \t\n]*=[ \t\n]*\\(" | 671 | "\\)[ \t\n]*=[ \t\n]*\\(" |
| 630 | bibtex-field-text | 672 | bibtex-field-text |
| 631 | "\\)[ \t\n]*[})]")) | 673 | "\\)[ \t\n]*[})]")) |
| 632 | ;; Regexp defining the format of a BibTeX string entry. | 674 | ;; Regexp defining the format of a BibTeX string entry. |
| 633 | 675 | ||
| 634 | (defconst bibtex-name-in-string 1) | 676 | (defconst bibtex-key-in-string 1) |
| 635 | ;; The regexp subexpression of the name part in bibtex-string. | 677 | ;; The regexp subexpression of the name part in bibtex-string. |
| 636 | 678 | ||
| 637 | (defconst bibtex-text-in-string 2) | 679 | (defconst bibtex-text-in-string 2) |
| @@ -709,18 +751,19 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 709 | ;; Call FUN for each BibTeX entry starting with the current. Do this | 751 | ;; Call FUN for each BibTeX entry starting with the current. Do this |
| 710 | ;; to the end of the file. FUN is called with one argument, the key | 752 | ;; to the end of the file. FUN is called with one argument, the key |
| 711 | ;; of the entry, and with point inside the entry. If | 753 | ;; of the entry, and with point inside the entry. If |
| 712 | ;; bibtex-sort-ignore-string-entries is true, FUN will not be called | 754 | ;; bibtex-sort-ignore-string-entries is non-nil, FUN will not be called |
| 713 | ;; for @string entries. | 755 | ;; for @string entries. |
| 714 | (bibtex-beginning-of-entry) | 756 | (bibtex-beginning-of-entry) |
| 715 | (while (re-search-forward "^@[^{]*{[ \t]*\\([^, ]*\\)" nil t) | 757 | (while (re-search-forward bibtex-reference-head nil t) |
| 716 | (if (and bibtex-sort-ignore-string-entries | 758 | (if (and bibtex-sort-ignore-string-entries |
| 717 | (string-equal "@string{" | 759 | (string-equal "@string" |
| 718 | (downcase (buffer-substring-no-properties | 760 | (downcase (buffer-substring-no-properties |
| 719 | (match-beginning 0) | 761 | (match-beginning bibtex-type-in-head) |
| 720 | (match-beginning 1))))) | 762 | (match-end bibtex-type-in-head))))) |
| 721 | nil | 763 | nil |
| 722 | (funcall fun (buffer-substring-no-properties | 764 | (funcall fun (buffer-substring-no-properties |
| 723 | (match-beginning 1) (match-end 1)))))) | 765 | (match-beginning bibtex-key-in-head) |
| 766 | (match-end bibtex-key-in-head)))))) | ||
| 724 | 767 | ||
| 725 | (defun bibtex-flash-head () | 768 | (defun bibtex-flash-head () |
| 726 | ;; Flash at BibTeX reference head before point, if exists. | 769 | ;; Flash at BibTeX reference head before point, if exists. |
| @@ -755,22 +798,24 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 755 | (defun beginning-of-first-bibtex-entry () | 798 | (defun beginning-of-first-bibtex-entry () |
| 756 | ;; Go to the beginning of the first BibTeX entry in buffer. | 799 | ;; Go to the beginning of the first BibTeX entry in buffer. |
| 757 | (goto-char (point-min)) | 800 | (goto-char (point-min)) |
| 758 | (cond | 801 | (cond |
| 759 | ((re-search-forward "^@" nil 'move) | 802 | ((re-search-forward "^@" nil 'move) |
| 760 | (beginning-of-line)) | 803 | (beginning-of-line)) |
| 761 | ((and (bobp) (eobp)) | 804 | ((and (bobp) (eobp)) |
| 762 | nil) | 805 | nil) |
| 763 | (t | 806 | (t |
| 764 | (message "Warning: No BibTeX entries found!")))) | 807 | (message "Warning: No BibTeX entries found!")))) |
| 765 | 808 | ||
| 766 | (defun bibtex-inside-field () | 809 | (defun bibtex-inside-field () |
| 767 | ;; Try to avoid point being at end of a BibTeX field. | 810 | ;; Try to avoid point being at end of a BibTeX field. |
| 768 | (end-of-line) | 811 | (end-of-line) |
| 769 | (skip-chars-backward " \t") ;MON - maybe delete these chars? | 812 | (skip-chars-backward " \t") |
| 770 | (cond ((= (preceding-char) ?,) | 813 | (cond ((= (preceding-char) ?,) |
| 771 | (forward-char -2))) ; -1 --> -2 sct@dcs.edinburgh.ac.uk | 814 | (forward-char -2))) |
| 772 | (cond ((= (preceding-char) (aref bibtex-field-right-delimiter 0)) | 815 | (cond ((or |
| 773 | (forward-char -1)))) ;MON - only go back if quote | 816 | (= (preceding-char) ?}) |
| 817 | (= (preceding-char) ?\")) | ||
| 818 | (forward-char -1)))) | ||
| 774 | 819 | ||
| 775 | (defun bibtex-enclosing-field () | 820 | (defun bibtex-enclosing-field () |
| 776 | ;; Search for BibTeX field enclosing point. Point moves to end of | 821 | ;; Search for BibTeX field enclosing point. Point moves to end of |
| @@ -784,22 +829,44 @@ See the documentation of function bibtex-generate-autokey for further detail.") | |||
| 784 | (error "Can't find enclosing BibTeX field."))))) | 829 | (error "Can't find enclosing BibTeX field."))))) |
| 785 | 830 | ||
| 786 | (defun bibtex-enclosing-reference () | 831 | (defun bibtex-enclosing-reference () |
| 787 | ;; Search for BibTeX reference enclosing point. Point moves to begin | 832 | ;; Search for BibTeX reference enclosing point. Point moves to |
| 788 | ;; of reference. (match-end 0) denotes end of reference. | 833 | ;; beginning of reference. Beginning/end of reference is given by |
| 789 | ;; Hacked up for speed. Parsing isn't guaranteed any more. | 834 | ;; (match-beginning/match-end 0). |
| 790 | ;; schoef@informatik.uni-oldenburg.de | 835 | (let ((old-point (point))) |
| 791 | ;; sct@dcs.edinburgh.ac.uk | 836 | (if (not |
| 837 | (re-search-backward bibtex-reference-head (point-min) t)) | ||
| 838 | (progn | ||
| 839 | (error "Can't find enclosing BibTeX reference.") | ||
| 840 | (goto-char old-point))) | ||
| 841 | (goto-char (match-beginning bibtex-type-in-head)) | ||
| 842 | (let ((pnt (point))) | ||
| 843 | (if (not | ||
| 844 | (re-search-forward bibtex-reference (point-max) t)) | ||
| 845 | (progn | ||
| 846 | (error "Can't find enclosing BibTeX reference.") | ||
| 847 | (goto-char old-point)) | ||
| 848 | (goto-char pnt))))) | ||
| 849 | |||
| 850 | (defun bibtex-enclosing-reference-maybe-empty-head () | ||
| 851 | ;; Search for BibTeX reference enclosing point. Point moves to | ||
| 852 | ;; beginning of reference. Beginning/end of reference is given by | ||
| 853 | ;; (match-beginning/match-end 0). | ||
| 792 | (let ((old-point (point))) | 854 | (let ((old-point (point))) |
| 793 | (if (not | 855 | (if (not |
| 794 | (re-search-backward | 856 | (re-search-backward |
| 795 | "^@[A-Za-z]+[ \t\n]*[{(][^, \t\n]*[ \t\n]*," | 857 | bibtex-reference-maybe-empty-head (point-min) t)) |
| 796 | (point-min) t)) | ||
| 797 | (progn | 858 | (progn |
| 798 | (error "Can't find enclosing BibTeX reference.") | 859 | (error "Can't find enclosing BibTeX reference.") |
| 799 | (goto-char old-point))) | 860 | (goto-char old-point))) |
| 861 | (goto-char (match-beginning bibtex-type-in-head)) | ||
| 800 | (let ((pnt (point))) | 862 | (let ((pnt (point))) |
| 801 | (if (not | 863 | (if (not |
| 802 | (re-search-forward "^[)}]$" (point-max) t)) | 864 | (re-search-forward |
| 865 | (concat | ||
| 866 | bibtex-reference-maybe-empty-head | ||
| 867 | "\\([ \t\n]*" bibtex-field "\\)*" | ||
| 868 | "[ \t\n]*,?[ \t\n]*[})]") | ||
| 869 | (point-max) t)) | ||
| 803 | (progn | 870 | (progn |
| 804 | (error "Can't find enclosing BibTeX reference.") | 871 | (error "Can't find enclosing BibTeX reference.") |
| 805 | (goto-char old-point)) | 872 | (goto-char old-point)) |
| @@ -939,8 +1006,8 @@ The generation algorithm works as follows: | |||
| 939 | (progn | 1006 | (progn |
| 940 | (goto-char min) | 1007 | (goto-char min) |
| 941 | (if (or | 1008 | (if (or |
| 942 | (search-forward-regexp "^[ \t]*author[ \t]*=" max t) | 1009 | (re-search-forward "^[ \t]*author[ \t]*=" max t) |
| 943 | (search-forward-regexp "^[ \t]*editor[ \t]*=" max t)) | 1010 | (re-search-forward "^[ \t]*editor[ \t]*=" max t)) |
| 944 | (let* (bibtex-help-message | 1011 | (let* (bibtex-help-message |
| 945 | (start (progn | 1012 | (start (progn |
| 946 | (bibtex-find-text t) | 1013 | (bibtex-find-text t) |
| @@ -995,7 +1062,7 @@ The generation algorithm works as follows: | |||
| 995 | (yearfield | 1062 | (yearfield |
| 996 | (progn | 1063 | (progn |
| 997 | (goto-char min) | 1064 | (goto-char min) |
| 998 | (if (search-forward-regexp | 1065 | (if (re-search-forward |
| 999 | "^[ \t]*year[ \t]*=[ \t]*\\([0-9]*\\)" max t) | 1066 | "^[ \t]*year[ \t]*=[ \t]*\\([0-9]*\\)" max t) |
| 1000 | (buffer-substring-no-properties | 1067 | (buffer-substring-no-properties |
| 1001 | (match-beginning 1) (match-end 1)) | 1068 | (match-beginning 1) (match-end 1)) |
| @@ -1011,7 +1078,7 @@ The generation algorithm works as follows: | |||
| 1011 | (titlefield | 1078 | (titlefield |
| 1012 | (progn | 1079 | (progn |
| 1013 | (goto-char min) | 1080 | (goto-char min) |
| 1014 | (if (search-forward-regexp | 1081 | (if (re-search-forward |
| 1015 | "^[ \t]*title[ \t]*=" max t) | 1082 | "^[ \t]*title[ \t]*=" max t) |
| 1016 | (let* (bibtex-help-message | 1083 | (let* (bibtex-help-message |
| 1017 | (start (progn | 1084 | (start (progn |
| @@ -1112,6 +1179,62 @@ The generation algorithm works as follows: | |||
| 1112 | (goto-char pnt) | 1179 | (goto-char pnt) |
| 1113 | autokey)) | 1180 | autokey)) |
| 1114 | 1181 | ||
| 1182 | (defun bibtex-parse-keys (add &optional abortable) | ||
| 1183 | ;; Sets bibtex-keys to the keys used in the whole (possibly | ||
| 1184 | ;; restricted) buffer (either as entry keys or as crossref entries). | ||
| 1185 | ;; If ADD is non-nil adds the new keys to bibtex-keys instead of | ||
| 1186 | ;; simply resetting it. If ABORTABLE is non-nil abort on user input. | ||
| 1187 | (if bibtex-maintain-sorted-entries | ||
| 1188 | (let ((labels (if add | ||
| 1189 | bibtex-keys)) | ||
| 1190 | label | ||
| 1191 | (case-fold-search t)) | ||
| 1192 | (save-excursion | ||
| 1193 | (goto-char (point-min)) | ||
| 1194 | (if (not add) | ||
| 1195 | (message "Parsing reference keys...")) | ||
| 1196 | |||
| 1197 | (if (not | ||
| 1198 | (catch 'userkey | ||
| 1199 | (while | ||
| 1200 | (re-search-forward | ||
| 1201 | (concat | ||
| 1202 | "\\(" | ||
| 1203 | bibtex-reference-head | ||
| 1204 | "\\)\\|\\(" | ||
| 1205 | "^[ \t\n]*crossref[ \t\n]*=[ \t\n]*[{\"]\\([A-Za-z][]A-Za-z0-9.:;?!`'()/*@_+-]*\\)[}\"],?$" | ||
| 1206 | "\\)") | ||
| 1207 | nil t) | ||
| 1208 | (if (and | ||
| 1209 | abortable | ||
| 1210 | (input-pending-p)) | ||
| 1211 | (throw 'userkey t)) | ||
| 1212 | (if (match-beginning (1+ bibtex-key-in-head)) | ||
| 1213 | (setq | ||
| 1214 | label | ||
| 1215 | (buffer-substring-no-properties | ||
| 1216 | (match-beginning (1+ bibtex-key-in-head)) | ||
| 1217 | (match-end (1+ bibtex-key-in-head)))) | ||
| 1218 | (setq | ||
| 1219 | label | ||
| 1220 | (buffer-substring-no-properties | ||
| 1221 | (match-beginning (+ 3 bibtex-key-in-head)) | ||
| 1222 | (match-end (+ 3 bibtex-key-in-head))))) | ||
| 1223 | (if (not (assoc label labels)) | ||
| 1224 | (setq labels | ||
| 1225 | (cons (list label) labels)))))) | ||
| 1226 | (progn | ||
| 1227 | (setq | ||
| 1228 | bibtex-buffer-last-parsed-for-keys-tick | ||
| 1229 | (buffer-modified-tick)) | ||
| 1230 | (if (not add) | ||
| 1231 | (message "Parsing reference keys... done")) | ||
| 1232 | (setq bibtex-keys labels))))))) | ||
| 1233 | |||
| 1234 | (defun bibtex-auto-fill-function () | ||
| 1235 | (let ((fill-prefix (make-string (+ bibtex-text-alignment 1) ? ))) | ||
| 1236 | (do-auto-fill))) | ||
| 1237 | |||
| 1115 | 1238 | ||
| 1116 | 1239 | ||
| 1117 | ;; Interactive Functions: | 1240 | ;; Interactive Functions: |
| @@ -1226,29 +1349,45 @@ non-nil." | |||
| 1226 | (set-buffer bufname) | 1349 | (set-buffer bufname) |
| 1227 | (insert-file-contents fullfilename) | 1350 | (insert-file-contents fullfilename) |
| 1228 | (goto-char (point-min)) | 1351 | (goto-char (point-min)) |
| 1229 | (while (search-forward-regexp bibtex-string nil t) | 1352 | (while (re-search-forward bibtex-string nil t) |
| 1230 | (setq | 1353 | (setq |
| 1231 | compl | 1354 | compl |
| 1232 | (append | 1355 | (append |
| 1233 | compl | 1356 | compl |
| 1234 | (list | 1357 | (list |
| 1235 | (list (buffer-substring-no-properties | 1358 | (list (buffer-substring-no-properties |
| 1236 | (match-beginning bibtex-name-in-string) | 1359 | (match-beginning bibtex-key-in-string) |
| 1237 | (match-end bibtex-name-in-string))))))) | 1360 | (match-end bibtex-key-in-string))))))) |
| 1238 | (kill-buffer bufname) | 1361 | (kill-buffer bufname) |
| 1239 | (set-buffer curbuf) | 1362 | (set-buffer curbuf) |
| 1240 | (setq bibtex-completion-candidates compl)) | 1363 | (setq bibtex-completion-candidates compl)) |
| 1241 | (error "File %s not in $BIBINPUTS paths" filename))))) | 1364 | (error "File %s not in $BIBINPUTS paths" filename))))) |
| 1242 | bibtex-string-files) | 1365 | bibtex-string-files) |
| 1366 | (add-hook | ||
| 1367 | 'auto-save-hook | ||
| 1368 | (function | ||
| 1369 | (lambda () | ||
| 1370 | (if (and | ||
| 1371 | bibtex-maintain-sorted-entries | ||
| 1372 | (eq major-mode 'bibtex-mode) | ||
| 1373 | (not | ||
| 1374 | (eq (buffer-modified-tick) | ||
| 1375 | bibtex-buffer-last-parsed-for-keys-tick))) | ||
| 1376 | (bibtex-parse-keys nil t))))) | ||
| 1377 | (bibtex-parse-keys nil) | ||
| 1243 | (make-local-variable 'paragraph-start) | 1378 | (make-local-variable 'paragraph-start) |
| 1244 | (setq paragraph-start "[ \f\n\t]*$") | 1379 | (setq paragraph-start "[ \f\n\t]*$") |
| 1245 | (make-local-variable 'comment-start) | 1380 | (make-local-variable 'comment-start) |
| 1246 | (setq comment-start "%") | 1381 | (setq comment-start "%") |
| 1247 | (auto-fill-mode 1) ; nice alignments | 1382 | (auto-fill-mode 1) |
| 1248 | (setq left-margin (+ bibtex-text-alignment 1)) | 1383 | (setq auto-fill-function 'bibtex-auto-fill-function) |
| 1384 | (set (make-local-variable 'font-lock-defaults) | ||
| 1385 | '(bibtex-font-lock-keywords nil t ((?$ . "\"")))) | ||
| 1249 | (run-hooks 'bibtex-mode-hook)) | 1386 | (run-hooks 'bibtex-mode-hook)) |
| 1250 | 1387 | ||
| 1251 | (defun bibtex-entry (entry-type &optional required optional) | 1388 | (defun bibtex-entry (entry-type &optional required optional) |
| 1389 | "Inserts a new BibTeX entry. | ||
| 1390 | Calls the value of bibtex-add-entry-hook if that value is non-nil." | ||
| 1252 | (interactive (let* ((completion-ignore-case t) | 1391 | (interactive (let* ((completion-ignore-case t) |
| 1253 | (e-t (completing-read | 1392 | (e-t (completing-read |
| 1254 | "Entry Type: " | 1393 | "Entry Type: " |
| @@ -1268,33 +1407,14 @@ non-nil." | |||
| 1268 | optional (elt c-ref 1)) | 1407 | optional (elt c-ref 1)) |
| 1269 | (setq required (elt r-n-o 0) | 1408 | (setq required (elt r-n-o 0) |
| 1270 | optional (elt r-n-o 1))))) | 1409 | optional (elt r-n-o 1))))) |
| 1271 | (let* | 1410 | (let ((key |
| 1272 | (labels | 1411 | (if bibtex-maintain-sorted-entries |
| 1273 | label | 1412 | (completing-read |
| 1274 | (case-fold-search t) | 1413 | (format "%s key: " entry-type) |
| 1275 | (key | 1414 | bibtex-keys)))) |
| 1276 | (if bibtex-maintain-sorted-entries | 1415 | (if bibtex-maintain-sorted-entries |
| 1277 | (progn | 1416 | (bibtex-find-entry-location key) |
| 1278 | (save-excursion | 1417 | (bibtex-move-outside-of-entry)) |
| 1279 | (goto-char (point-min)) | ||
| 1280 | (while | ||
| 1281 | (re-search-forward | ||
| 1282 | "\\(^@[a-z]+[ \t\n]*[{(][ \t\n]*\\([^ ,\t\n]+\\)[ \t\n]*,\\)\\|\\(^[ \t\n]*crossref[ \t\n]*=[ \t\n]*[{\"]\\([^ ,\t\n]*\\)[}\"],$\\)" | ||
| 1283 | nil t) | ||
| 1284 | (if (match-beginning 2) | ||
| 1285 | (setq label (buffer-substring-no-properties | ||
| 1286 | (match-beginning 2) (match-end 2))) | ||
| 1287 | (setq label (buffer-substring-no-properties | ||
| 1288 | (match-beginning 4) (match-end 4)))) | ||
| 1289 | (if (not (assoc label labels)) | ||
| 1290 | (setq labels | ||
| 1291 | (cons (list label) labels))))) | ||
| 1292 | (completing-read | ||
| 1293 | (format "%s key: " entry-type) | ||
| 1294 | labels))))) | ||
| 1295 | (if key | ||
| 1296 | (bibtex-find-entry-location key)) | ||
| 1297 | (bibtex-move-outside-of-entry) | ||
| 1298 | (insert "@" entry-type "{") | 1418 | (insert "@" entry-type "{") |
| 1299 | (if key | 1419 | (if key |
| 1300 | (insert key)) | 1420 | (insert key)) |
| @@ -1310,8 +1430,7 @@ non-nil." | |||
| 1310 | (if bibtex-include-OPTannote | 1430 | (if bibtex-include-OPTannote |
| 1311 | (bibtex-make-optional-field '("annote"))) | 1431 | (bibtex-make-optional-field '("annote"))) |
| 1312 | (insert "\n}\n\n")) | 1432 | (insert "\n}\n\n")) |
| 1313 | (if key | 1433 | (bibtex-next-field t) |
| 1314 | (bibtex-next-field t)) | ||
| 1315 | (run-hooks 'bibtex-add-entry-hook))) | 1434 | (run-hooks 'bibtex-add-entry-hook))) |
| 1316 | 1435 | ||
| 1317 | (defun bibtex-print-help-message () | 1436 | (defun bibtex-print-help-message () |
| @@ -1326,21 +1445,21 @@ non-nil." | |||
| 1326 | (search-failed | 1445 | (search-failed |
| 1327 | (goto-char pnt) | 1446 | (goto-char pnt) |
| 1328 | (error "Not on BibTeX field"))) | 1447 | (error "Not on BibTeX field"))) |
| 1329 | (re-search-backward | 1448 | (let ((mb (match-beginning bibtex-name-in-field)) |
| 1330 | "^[ \t]*\\([A-Za-z]+\\)[ \t\n]*=" nil t) | 1449 | (me (match-end bibtex-name-in-field))) |
| 1331 | (let ((mb (match-beginning 1)) | 1450 | (goto-char mb) |
| 1332 | (me (match-end 1))) | ||
| 1333 | (buffer-substring-no-properties | 1451 | (buffer-substring-no-properties |
| 1334 | (if (looking-at "^[ \t]*OPT") | 1452 | (if (looking-at "OPT") |
| 1335 | (+ 3 mb) | 1453 | (+ 3 mb) |
| 1336 | mb) | 1454 | mb) |
| 1337 | me)))) | 1455 | me)))) |
| 1338 | (reference-type | 1456 | (reference-type |
| 1339 | (progn | 1457 | (progn |
| 1340 | (re-search-backward | 1458 | (re-search-backward |
| 1341 | "^@\\([A-Za-z]+\\)[ \t\n]*[{(][^, \t\n]*[ \t\n]*," nil t) | 1459 | bibtex-reference-maybe-empty-head nil t) |
| 1342 | (buffer-substring-no-properties | 1460 | (buffer-substring-no-properties |
| 1343 | (match-beginning 1) (match-end 1)))) | 1461 | (1+ (match-beginning bibtex-type-in-head)) |
| 1462 | (match-end bibtex-type-in-head)))) | ||
| 1344 | (entry-list | 1463 | (entry-list |
| 1345 | (assoc-ignore-case reference-type | 1464 | (assoc-ignore-case reference-type |
| 1346 | bibtex-entry-field-alist)) | 1465 | bibtex-entry-field-alist)) |
| @@ -1373,21 +1492,25 @@ non-nil." | |||
| 1373 | 1492 | ||
| 1374 | (defun bibtex-make-field (e-t) | 1493 | (defun bibtex-make-field (e-t) |
| 1375 | "Makes a field named E-T in current BibTeX entry." | 1494 | "Makes a field named E-T in current BibTeX entry." |
| 1376 | (interactive "sBibTeX entry type: ") | 1495 | (interactive "sBibTeX field name: ") |
| 1377 | (let ((name (if (consp e-t) | 1496 | (let ((name (if (consp e-t) |
| 1378 | (elt e-t 0) | 1497 | (elt e-t 0) |
| 1379 | e-t))) | 1498 | e-t))) |
| 1380 | (bibtex-find-text nil) | 1499 | (if (interactive-p) |
| 1381 | (forward-char 1) | 1500 | (progn |
| 1501 | (bibtex-find-text nil) | ||
| 1502 | (if (looking-at "[}\"]") | ||
| 1503 | (forward-char 1)))) | ||
| 1382 | (insert ",\n") | 1504 | (insert ",\n") |
| 1383 | (indent-to-column bibtex-name-alignment) | 1505 | (indent-to-column bibtex-name-alignment) |
| 1384 | (insert name " = ") | 1506 | (insert name " = ") |
| 1385 | (indent-to-column bibtex-text-alignment) | 1507 | (indent-to-column bibtex-text-alignment) |
| 1386 | (insert bibtex-field-left-delimiter bibtex-field-right-delimiter))) | 1508 | (insert bibtex-field-left-delimiter bibtex-field-right-delimiter) |
| 1509 | (if (interactive-p) | ||
| 1510 | (forward-char -1)))) | ||
| 1387 | 1511 | ||
| 1388 | (defun bibtex-make-optional-field (e-t) | 1512 | (defun bibtex-make-optional-field (e-t) |
| 1389 | "Makes an optional field named E-T in current BibTeX entry." | 1513 | "Makes an optional field named E-T in current BibTeX entry." |
| 1390 | (interactive "sOptional BibTeX entry type: ") | ||
| 1391 | (if (consp e-t) | 1514 | (if (consp e-t) |
| 1392 | (setq e-t (cons (concat "OPT" (car e-t)) (cdr e-t))) | 1515 | (setq e-t (cons (concat "OPT" (car e-t)) (cdr e-t))) |
| 1393 | (setq e-t (concat "OPT" e-t))) | 1516 | (setq e-t (concat "OPT" e-t))) |
| @@ -1459,13 +1582,9 @@ With argument, show all text." | |||
| 1459 | 1582 | ||
| 1460 | (defun bibtex-sort-entries () | 1583 | (defun bibtex-sort-entries () |
| 1461 | "Sort BibTeX entries alphabetically by key. | 1584 | "Sort BibTeX entries alphabetically by key. |
| 1462 | Text before the first BibTeX entry, and following the last is not affected. | 1585 | Text outside of BibTeX entries is not affected. If |
| 1463 | If bibtex-sort-ignore-string-entries is true, @string entries will be ignored. | 1586 | bibtex-sort-ignore-string-entries is non-nil, @string entries will be |
| 1464 | 1587 | ignored." | |
| 1465 | Bugs: | ||
| 1466 | 1. Text between the closing brace ending one BibTeX entry, and the @ starting | ||
| 1467 | the next, is considered part of the PRECEDING entry. Perhaps it should be | ||
| 1468 | part of the following entry." | ||
| 1469 | (interactive) | 1588 | (interactive) |
| 1470 | (save-restriction | 1589 | (save-restriction |
| 1471 | (beginning-of-first-bibtex-entry) | 1590 | (beginning-of-first-bibtex-entry) |
| @@ -1475,104 +1594,114 @@ Bugs: | |||
| 1475 | (goto-char (point-max)) | 1594 | (goto-char (point-max)) |
| 1476 | (bibtex-end-of-entry) | 1595 | (bibtex-end-of-entry) |
| 1477 | (point))) | 1596 | (point))) |
| 1597 | (if bibtex-sort-ignore-string-entries | ||
| 1598 | (if (re-search-forward bibtex-reference nil 'move) | ||
| 1599 | (goto-char (match-beginning 0)))) | ||
| 1478 | (sort-subr | 1600 | (sort-subr |
| 1479 | nil | 1601 | nil |
| 1480 | ;; NEXTREC function | 1602 | ;; NEXTREC function |
| 1481 | 'forward-line | ||
| 1482 | ;; ENDREC function | ||
| 1483 | (function | 1603 | (function |
| 1484 | (lambda () | 1604 | (lambda () |
| 1485 | (and | 1605 | (if bibtex-sort-ignore-string-entries |
| 1486 | (re-search-forward "}\\s-*\n[\n \t]*@" nil 'move) | 1606 | (if (re-search-forward bibtex-reference nil 'move) |
| 1487 | (forward-char -2)))) | 1607 | (goto-char (match-beginning 0))) |
| 1608 | (if (re-search-forward bibtex-reference-head nil 'move) | ||
| 1609 | (goto-char (match-beginning 0)))))) | ||
| 1610 | ;; ENDREC function | ||
| 1611 | 'bibtex-end-of-entry | ||
| 1488 | ;; STARTKEY function | 1612 | ;; STARTKEY function |
| 1489 | (if bibtex-sort-ignore-string-entries | ||
| 1490 | (function | ||
| 1491 | (lambda () | ||
| 1492 | (while | ||
| 1493 | (and | ||
| 1494 | (re-search-forward "^\\s-*\\([@a-zA-Z]*\\)\\s-*{\\s-*") | ||
| 1495 | (string-equal | ||
| 1496 | "@string" | ||
| 1497 | (downcase | ||
| 1498 | (buffer-substring-no-properties | ||
| 1499 | (match-beginning 1) | ||
| 1500 | (match-end 1)))))) | ||
| 1501 | nil)) | ||
| 1502 | (function | ||
| 1503 | (lambda () | ||
| 1504 | (re-search-forward "{\\s-*")))) | ||
| 1505 | ;; ENDKEY function | ||
| 1506 | (function | 1613 | (function |
| 1507 | (lambda () | 1614 | (lambda () |
| 1508 | (search-forward ",")))))) | 1615 | (if bibtex-sort-ignore-string-entries |
| 1616 | (progn | ||
| 1617 | (re-search-forward bibtex-reference) | ||
| 1618 | (buffer-substring-no-properties | ||
| 1619 | (match-beginning bibtex-key-in-reference) | ||
| 1620 | (match-end bibtex-key-in-reference))) | ||
| 1621 | (re-search-forward bibtex-reference-head) | ||
| 1622 | (buffer-substring-no-properties | ||
| 1623 | (match-beginning bibtex-key-in-head) | ||
| 1624 | (match-end bibtex-key-in-head))))) | ||
| 1625 | ;; ENDKEY function | ||
| 1626 | nil))) | ||
| 1509 | 1627 | ||
| 1510 | (defun bibtex-find-entry-location (entry-name &optional ignore-errors) | 1628 | (defun bibtex-find-entry-location (entry-name &optional ignore-dups) |
| 1511 | "Looking for place to put the BibTeX entry named ENTRY-NAME. | 1629 | "Looking for place to put the BibTeX entry named ENTRY-NAME. |
| 1512 | Searches from beginning of buffer. Buffer is assumed to be in sorted | 1630 | Performs a binary search (therefore, buffer is assumed to be in sorted |
| 1513 | order, without duplicates (see \\[bibtex-sort-entries]), if it is not, | 1631 | order, without duplicates (see \\[bibtex-validate-buffer]), if it is |
| 1514 | an error will be signalled. However, if optional argument | 1632 | not, bibtex-find-entry-location will fail). If entry-name is already |
| 1515 | IGNORE-ERRORS is non-nil, no error messages about duplicate entries or | 1633 | used as a reference key, an error is signalled. However, if optional |
| 1516 | sort order violences are signalled, but the error handling is assumed | 1634 | variable IGNORE-DUPS is non-nil, no error messages about duplicate |
| 1517 | to be made in the calling function. Nil is returned, if any error | 1635 | entries are signalled, but the error handling is assumed to be made in |
| 1518 | occured during search for location of the new entry, and t in all | 1636 | the calling function. Nil is returned, if an duplicate entry error |
| 1519 | other cases. If an error occured, point is not moved." | 1637 | occured, and t in all other cases." |
| 1520 | (interactive "sBibtex entry key: ") | 1638 | (let* ((left |
| 1521 | (let ((noerr t) | 1639 | (progn |
| 1522 | (previous nil) | 1640 | (beginning-of-first-bibtex-entry) |
| 1523 | (pnt (point)) | 1641 | (if bibtex-sort-ignore-string-entries |
| 1524 | point) | 1642 | (re-search-forward bibtex-reference nil `move) |
| 1525 | (beginning-of-first-bibtex-entry) | 1643 | (bibtex-end-of-entry)) |
| 1526 | (or | 1644 | (point))) |
| 1527 | (catch 'done | 1645 | (right |
| 1528 | (map-bibtex-entries | 1646 | (progn |
| 1529 | (function | 1647 | (goto-char (point-max)) |
| 1530 | (lambda (current) | 1648 | (if bibtex-sort-ignore-string-entries |
| 1531 | (cond ((string-equal entry-name current) | 1649 | (re-search-backward bibtex-reference nil `move) |
| 1532 | (setq noerr nil) | 1650 | (bibtex-beginning-of-entry)) |
| 1533 | (bibtex-beginning-of-entry) | 1651 | (point))) |
| 1534 | (if ignore-errors | 1652 | actual-point |
| 1535 | (throw 'done t) | 1653 | actual-key |
| 1536 | (error "Entry duplicates existing!"))) | 1654 | (done (>= left right)) |
| 1537 | ((or (null previous) | 1655 | new |
| 1538 | (string< previous current)) | 1656 | dup) |
| 1539 | (setq previous current | 1657 | (while (not done) |
| 1540 | point (point)) | 1658 | (setq actual-point (/ (+ left right) 2)) |
| 1541 | (if (string< entry-name current) | 1659 | (goto-char actual-point) |
| 1542 | (progn | 1660 | (bibtex-beginning-of-entry) |
| 1543 | (bibtex-beginning-of-entry) | 1661 | (setq actual-key |
| 1544 | ;; Many schemes append strings to | 1662 | (if bibtex-sort-ignore-string-entries |
| 1545 | ;; existing entries to resolve them, | 1663 | (progn |
| 1546 | ;; so initial substring matches may | 1664 | (re-search-forward bibtex-reference) |
| 1547 | ;; indicate a duplicate entry. | 1665 | (buffer-substring-no-properties |
| 1548 | (let ((idx | 1666 | (match-beginning bibtex-key-in-reference) |
| 1549 | (string-match | 1667 | (match-end bibtex-key-in-reference))) |
| 1550 | (regexp-quote entry-name) current))) | 1668 | (re-search-forward bibtex-reference-head) |
| 1551 | (if (and | 1669 | (buffer-substring-no-properties |
| 1552 | (integerp idx) | 1670 | (match-beginning bibtex-key-in-head) |
| 1553 | (zerop idx) | 1671 | (match-end bibtex-key-in-head)))) |
| 1554 | ;; (not ignore-errors) | 1672 | (cond |
| 1555 | (not (equal entry-name ""))) | 1673 | ((string-lessp entry-name actual-key) |
| 1556 | (progn | 1674 | (setq new (match-beginning 0)) |
| 1557 | (message | 1675 | (if (equal right new) |
| 1558 | "Warning: Entry %s may be a duplicate of %s!" | 1676 | (setq done t) |
| 1559 | entry-name current) | 1677 | (setq right new))) |
| 1560 | (ding t)))) | 1678 | ((string-lessp actual-key entry-name) |
| 1561 | (throw 'done t)))) | 1679 | (setq new (match-end 0)) |
| 1562 | ((string-equal previous current) | 1680 | (if (equal left new) |
| 1563 | (setq noerr nil) | 1681 | (setq done t) |
| 1564 | (if ignore-errors | 1682 | (setq left new))) |
| 1565 | (throw 'done t) | 1683 | ((string-equal actual-key entry-name) |
| 1566 | (error "Duplicate here with previous!"))) | 1684 | (setq dup t |
| 1567 | (t | 1685 | done t) |
| 1568 | (setq noerr nil) | 1686 | (if (not ignore-dups) |
| 1569 | (if ignore-errors | 1687 | (error "Entry with key `%s' already exists!" entry-name))))) |
| 1570 | (throw 'done t) | 1688 | (if dup |
| 1571 | (error "Entries out of order here!")))))))) | 1689 | nil |
| 1572 | (goto-char (point-max))) | 1690 | (goto-char right) |
| 1573 | (if (not noerr) | 1691 | (if (re-search-forward bibtex-reference nil t) |
| 1574 | (goto-char pnt)) | 1692 | (progn |
| 1575 | noerr)) | 1693 | (setq actual-key |
| 1694 | (buffer-substring-no-properties | ||
| 1695 | (match-beginning bibtex-key-in-reference) | ||
| 1696 | (match-end bibtex-key-in-reference))) | ||
| 1697 | (if (string-lessp actual-key entry-name) | ||
| 1698 | ;; even greater than last entry --> we must append | ||
| 1699 | (progn | ||
| 1700 | (goto-char (match-end 0)) | ||
| 1701 | (newline (forward-line 2)) | ||
| 1702 | (beginning-of-line)) | ||
| 1703 | (goto-char right)))) | ||
| 1704 | t))) | ||
| 1576 | 1705 | ||
| 1577 | (defun bibtex-validate-buffer () | 1706 | (defun bibtex-validate-buffer () |
| 1578 | "Validate if the current BibTeX buffer is syntactically correct. | 1707 | "Validate if the current BibTeX buffer is syntactically correct. |
| @@ -1581,11 +1710,14 @@ you can put comments here)." | |||
| 1581 | (interactive) | 1710 | (interactive) |
| 1582 | (let ((pnt (point)) | 1711 | (let ((pnt (point)) |
| 1583 | (max (point-max))) | 1712 | (max (point-max))) |
| 1713 | ;; looking if entries fit syntactical structure | ||
| 1584 | (goto-char (point-min)) | 1714 | (goto-char (point-min)) |
| 1585 | (while (< (re-search-forward "@\\|\\'") max) | 1715 | (while (< (re-search-forward "@\\|\\'") max) |
| 1586 | (forward-char -1) | 1716 | (forward-char -1) |
| 1587 | (let ((p (point))) | 1717 | (let ((p (point))) |
| 1588 | (if (looking-at "@string") | 1718 | (if (or |
| 1719 | (looking-at "@string") | ||
| 1720 | (looking-at "@preamble")) | ||
| 1589 | (forward-char) | 1721 | (forward-char) |
| 1590 | (if (not (and | 1722 | (if (not (and |
| 1591 | (re-search-forward bibtex-reference nil t) | 1723 | (re-search-forward bibtex-reference nil t) |
| @@ -1593,8 +1725,32 @@ you can put comments here)." | |||
| 1593 | (progn | 1725 | (progn |
| 1594 | (goto-char p) | 1726 | (goto-char p) |
| 1595 | (error "Bad entry begins here")))))) | 1727 | (error "Bad entry begins here")))))) |
| 1596 | (bibtex-find-entry-location (make-string 10 255)) | 1728 | ;; looking if entries are balanced (a single non-escaped quote |
| 1597 | ;; find duplicates | 1729 | ;; inside braces is not detected by the former check, but |
| 1730 | ;; bibtex-sort-entries stumbles about it | ||
| 1731 | (goto-char (point-min)) | ||
| 1732 | (map-bibtex-entries | ||
| 1733 | (function | ||
| 1734 | (lambda (current) | ||
| 1735 | (bibtex-beginning-of-entry) | ||
| 1736 | (forward-sexp 2)))) | ||
| 1737 | ;; looking for correct sort order and duplicates | ||
| 1738 | (if bibtex-maintain-sorted-entries | ||
| 1739 | (let ((entry-name (make-string 10 255)) | ||
| 1740 | (previous nil) | ||
| 1741 | point) | ||
| 1742 | (beginning-of-first-bibtex-entry) | ||
| 1743 | (map-bibtex-entries | ||
| 1744 | (function | ||
| 1745 | (lambda (current) | ||
| 1746 | (cond ((or (null previous) | ||
| 1747 | (string< previous current)) | ||
| 1748 | (setq previous current | ||
| 1749 | point (point))) | ||
| 1750 | ((string-equal previous current) | ||
| 1751 | (error "Duplicate here with previous!")) | ||
| 1752 | (t | ||
| 1753 | (error "Entries out of order here!")))))))) | ||
| 1598 | (goto-char pnt) | 1754 | (goto-char pnt) |
| 1599 | (message "BibTeX buffer is syntactically correct"))) | 1755 | (message "BibTeX buffer is syntactically correct"))) |
| 1600 | 1756 | ||
| @@ -1720,7 +1876,7 @@ intermixed with \\[bibtex-pop-next] (bibtex-pop-next)." | |||
| 1720 | t | 1876 | t |
| 1721 | ) | 1877 | ) |
| 1722 | (t | 1878 | (t |
| 1723 | (bibtex-enclosing-reference) | 1879 | (bibtex-enclosing-reference-maybe-empty-head) |
| 1724 | (setq bibtex-pop-previous-search-point (point)) | 1880 | (setq bibtex-pop-previous-search-point (point)) |
| 1725 | (setq bibtex-pop-next-search-point (match-end 0)))) | 1881 | (setq bibtex-pop-next-search-point (match-end 0)))) |
| 1726 | (goto-char bibtex-pop-previous-search-point) | 1882 | (goto-char bibtex-pop-previous-search-point) |
| @@ -1797,7 +1953,7 @@ intermixed with \\[bibtex-pop-previous] (bibtex-pop-previous)." | |||
| 1797 | t | 1953 | t |
| 1798 | ) | 1954 | ) |
| 1799 | (t | 1955 | (t |
| 1800 | (bibtex-enclosing-reference) | 1956 | (bibtex-enclosing-reference-maybe-empty-head) |
| 1801 | (setq bibtex-pop-previous-search-point (point)) | 1957 | (setq bibtex-pop-previous-search-point (point)) |
| 1802 | (setq bibtex-pop-next-search-point (match-end 0)))) | 1958 | (setq bibtex-pop-next-search-point (match-end 0)))) |
| 1803 | (goto-char bibtex-pop-next-search-point) | 1959 | (goto-char bibtex-pop-next-search-point) |
| @@ -1871,7 +2027,7 @@ given, calculate a new entry label." | |||
| 1871 | bibtex-field-left-delimiter | 2027 | bibtex-field-left-delimiter |
| 1872 | bibtex-field-right-delimiter))) | 2028 | bibtex-field-right-delimiter))) |
| 1873 | (setq crossref-there t)))))) | 2029 | (setq crossref-there t)))))) |
| 1874 | (bibtex-enclosing-reference) | 2030 | (bibtex-enclosing-reference-maybe-empty-head) |
| 1875 | (re-search-forward bibtex-reference-type) | 2031 | (re-search-forward bibtex-reference-type) |
| 1876 | (let ((begin-type (1+ (match-beginning 0))) | 2032 | (let ((begin-type (1+ (match-beginning 0))) |
| 1877 | (end-type (match-end 0))) | 2033 | (end-type (match-end 0))) |
| @@ -1965,19 +2121,13 @@ given, calculate a new entry label." | |||
| 1965 | (t | 2121 | (t |
| 1966 | (goto-char end-field))))))))) | 2122 | (goto-char end-field))))))))) |
| 1967 | (goto-char start) | 2123 | (goto-char start) |
| 1968 | (bibtex-end-of-entry) | 2124 | (bibtex-end-of-entry)) |
| 1969 | ;; sct@dcs.edinburgh.ac.uk | ||
| 1970 | (save-excursion | ||
| 1971 | (forward-line -1) | ||
| 1972 | (end-of-line) | ||
| 1973 | (if (eq (preceding-char) ?,) | ||
| 1974 | (backward-delete-char 1)))) | ||
| 1975 | (let* ((eob (progn | 2125 | (let* ((eob (progn |
| 1976 | (bibtex-end-of-entry) | 2126 | (bibtex-end-of-entry) |
| 1977 | (point))) | 2127 | (point))) |
| 1978 | (key (progn | 2128 | (key (progn |
| 1979 | (bibtex-beginning-of-entry) | 2129 | (bibtex-beginning-of-entry) |
| 1980 | (if (search-forward-regexp | 2130 | (if (re-search-forward |
| 1981 | bibtex-reference-head eob t) | 2131 | bibtex-reference-head eob t) |
| 1982 | (buffer-substring-no-properties | 2132 | (buffer-substring-no-properties |
| 1983 | (match-beginning bibtex-key-in-head) | 2133 | (match-beginning bibtex-key-in-head) |
| @@ -1992,30 +2142,39 @@ given, calculate a new entry label." | |||
| 1992 | (bibtex-generate-autokey)) | 2142 | (bibtex-generate-autokey)) |
| 1993 | (bibtex-generate-autokey)))) | 2143 | (bibtex-generate-autokey)))) |
| 1994 | (bibtex-beginning-of-entry) | 2144 | (bibtex-beginning-of-entry) |
| 1995 | (search-forward-regexp "^@[A-Za-z]+[ \t]*[({]\\([^,]*\\)") | 2145 | (re-search-forward bibtex-reference-maybe-empty-head) |
| 1996 | (delete-region (match-beginning 1) | 2146 | (if (match-beginning bibtex-key-in-head) |
| 1997 | (match-end 1)) | 2147 | (delete-region (match-beginning bibtex-key-in-head) |
| 2148 | (match-end bibtex-key-in-head))) | ||
| 1998 | (insert autokey) | 2149 | (insert autokey) |
| 1999 | (let ((start (progn | 2150 | (let ((start (progn |
| 2000 | (bibtex-beginning-of-entry) | 2151 | (bibtex-beginning-of-entry) |
| 2001 | (point))) | 2152 | (point))) |
| 2002 | (end (progn | 2153 | (end (progn |
| 2003 | (bibtex-end-of-entry) | 2154 | (bibtex-end-of-entry) |
| 2004 | (search-forward-regexp "^@" nil 'move) | 2155 | (re-search-forward "^@" nil 'move) |
| 2005 | (beginning-of-line) | 2156 | (beginning-of-line) |
| 2006 | (point))) | 2157 | (point))) |
| 2007 | last-command) | 2158 | last-command) |
| 2008 | (kill-region start end) | 2159 | (kill-region start end) |
| 2009 | (let ((success (bibtex-find-entry-location autokey t))) | 2160 | (let ((success |
| 2161 | (or | ||
| 2162 | (not bibtex-maintain-sorted-entries) | ||
| 2163 | (bibtex-find-entry-location autokey t)))) | ||
| 2010 | (yank) | 2164 | (yank) |
| 2011 | (setq kill-ring (cdr kill-ring)) | 2165 | (setq kill-ring (cdr kill-ring)) |
| 2012 | (if success | 2166 | (forward-char -1) |
| 2013 | (bibtex-beginning-of-entry) | 2167 | (bibtex-beginning-of-entry) |
| 2014 | (goto-char start)) | 2168 | (re-search-forward bibtex-reference-head) |
| 2015 | (search-forward-regexp bibtex-reference-head) | ||
| 2016 | (if (not success) | 2169 | (if (not success) |
| 2017 | (error | 2170 | (error |
| 2018 | "BibTeX buffer was or has become invalid (call `bibtex-validate-buffer')"))))))))) | 2171 | "New inserted reference may be a duplicate.")))))))) |
| 2172 | (save-excursion | ||
| 2173 | (let ((start (progn (bibtex-beginning-of-entry) (point))) | ||
| 2174 | (end (progn (bibtex-end-of-entry) (point)))) | ||
| 2175 | (save-restriction | ||
| 2176 | (narrow-to-region start end) | ||
| 2177 | (bibtex-parse-keys t))))) | ||
| 2019 | 2178 | ||
| 2020 | (defun bibtex-complete-string () | 2179 | (defun bibtex-complete-string () |
| 2021 | "Complete word fragment before point to longest prefix of a defined string. | 2180 | "Complete word fragment before point to longest prefix of a defined string. |
| @@ -2032,20 +2191,14 @@ If point is not after the part of a word, all strings are listed." | |||
| 2032 | (completion (save-excursion | 2191 | (completion (save-excursion |
| 2033 | (progn | 2192 | (progn |
| 2034 | (while (re-search-backward | 2193 | (while (re-search-backward |
| 2035 | "@string[ \t\n]*{" (point-min) t) | 2194 | bibtex-string (point-min) t) |
| 2036 | (goto-char (match-end 0)) | 2195 | (setq string-list |
| 2037 | (let ((pnt (point)) | 2196 | (cons |
| 2038 | (strt (match-beginning 0))) | 2197 | (list |
| 2039 | (re-search-forward "[ \t\n]*=" | 2198 | (buffer-substring-no-properties |
| 2040 | (point-max) t) | 2199 | (match-beginning bibtex-key-in-string) |
| 2041 | (goto-char (match-beginning 0)) | 2200 | (match-end bibtex-key-in-string))) |
| 2042 | (setq string-list | 2201 | string-list))) |
| 2043 | (cons | ||
| 2044 | (list | ||
| 2045 | (buffer-substring-no-properties | ||
| 2046 | pnt (point))) | ||
| 2047 | string-list)) | ||
| 2048 | (goto-char strt))) | ||
| 2049 | (setq string-list | 2202 | (setq string-list |
| 2050 | (sort string-list | 2203 | (sort string-list |
| 2051 | (lambda(x y) | 2204 | (lambda(x y) |