Mercurial > emacs
changeset 561:a819dc25b9e7
*** empty log message ***
author | Jim Blandy <jimb@redhat.com> |
---|---|
date | Sat, 22 Feb 1992 21:47:46 +0000 |
parents | 68111c4a3885 |
children | 0d73d7b5fff0 |
files | lisp/textmodes/bibtex.el |
diffstat | 1 files changed, 129 insertions(+), 46 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/textmodes/bibtex.el Sat Feb 22 21:15:26 1992 +0000 +++ b/lisp/textmodes/bibtex.el Sat Feb 22 21:47:46 1992 +0000 @@ -17,6 +17,35 @@ ;; along with GNU Emacs; see the file COPYING. If not, write to ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. +;;; Mike Newton (newton@gumby.cs.caltech.edu) 92.2.11 +;;; * Fixed bibtex-field string to allow things like: +;;; author = "{S}schr\"odinger" or +;;; author = "{S}schr\"{o}dinger" or +;;; author = "{S}schr{\"o}dinger" or +;;; NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE +;;; NOTE: This is the last update I plan to do. +;;; NOTE: the previous version was submitted and, according to RMS, +;;; accepted as the release version for ver 19. +;;; NOTE: PLEASE DO NOT SEND ME ANY MORE 'PLEASE ADD THIS' MESSAGES. +;;; NOTE: I am no longer taking care of this package. +;;; NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE NOTE + +;;; Mike Newton (newton@gumby.cs.caltech.edu) 91.1.24 +;;; * bibtex-make-optional-field : modified to make fields align up after +;;; the OPT's have been removed. +;;; * bibtex-make-optional-field : modified to check bibtex-use-OPT-prefix +;;; * bibtex-make*field : modified to call new procedure: +;;; * bibtex-insert-field-delimeters : which does delimeter insertion based on +;;; * bibtex-curly-delimeters : a list of atoms +;;; * fixed spelling of bibtex-name-alignment wherever used +;;; * bibtex-inside-field : allows '}'s at end +;;; * bibtex-find-text : allows '{' and '}'s at start or end +;;; * bibtex-enclosing-regexp fixed for case where start-point was at end of +;;; pattern. +;;; * bibtex-clean-entry : allow bibtex-save-OPT to save some optional fields +;;; * bibtex-move-outside-of-entry : could overwrite first line of a following +;;; comment or other text if it did not look like a bibtex entry + ;;; Mike Newton (newton@gumby.cs.caltech.edu) 91.1.20 ;;; * bibtex.el/bibtex-mode : updated comments to indicate new use of ;;; address, add minor explanations and fix small omissions. @@ -117,26 +146,35 @@ (define-abbrev-table 'bibtex-mode-abbrev-table ()) (defvar bibtex-mode-map (make-sparse-keymap) "") (defvar bibtex-pop-previous-search-point nil - "Next point where `bibtex-pop-previous' should start looking for a similar + "Next point where bibtex-pop-previous should start looking for a similar entry.") (defvar bibtex-pop-next-search-point nil - "Next point where `bibtex-pop-next' should start looking for a similar + "Next point where bibtex-pop-next should start looking for a similar entry.") (defvar bibtex-clean-entry-zap-empty-opts t - "*If non-nil, `bibtex-clean-entry' will delete all empty optional fields.") + "*If non-nil, bibtex-clean-entry will delete all empty optional fields.") (defvar bibtex-include-OPTcrossref t - "*If non-nil, all entries will have an `OPTcrossref' field.") + "*If non-nil, all entries will have an OPTcrossref field.") (defvar bibtex-include-OPTkey t - "*If non-nil, all entries will have an `OPTkey' field.") + "*If non-nil, all entries will have an OPTkey field.") (defvar bibtex-include-OPTannote t - "*If non-nil, all entries will have an `OPTannote' field.") + "*If non-nil, all entries will have an OPTannote field.") +(defvar bibtex-use-OPT-prefix t + "*If non-nil, put OPT string before optionals. Usually desired!") +(defvar bibtex-save-OPT nil + "*List of atoms (representing strings) which are optional fields that +should not be deleted if null.") +(defvar bibtex-curly-delimeters nil + "List of atoms representing strings (in any case) that should have curly +braces used as their delimeters instead of double quotes.") + ;; note: the user should be allowed to have their own list of always ;; available optional fields. exs: "keywords" "categories" (defvar bibtex-mode-user-optional-fields nil ;no default value - "*List of optional fields that user always wants present in a bibtex entry. -One possibility is for ``keywords''") + "*List of optional fields that user want to have as always present +when making a bibtex entry. One possibility is for ``keywords''") ;;; A bibtex file is a sequence of entries, either string definitions @@ -149,16 +187,16 @@ ;;; fields (defun bibtex-cfield (name text) - "Create a regexp for a bibtex field of name NAME and text TEXT." + "Create a regexp for a bibtex field of name NAME and text TEXT" (concat ",[ \t\n]*\\(" name "\\)[ \t\n]*=[ \t\n]*\\(" text "\\)")) (defconst bibtex-name-in-cfield 1 - "The regexp subexpression number of the name part in `bibtex-cfield'.") + "The regexp subexpression number of the name part in bibtex-cfield.") (defconst bibtex-text-in-cfield 2 - "The regexp subexpression number of the text part in `bibtex-cfield'.") + "The regexp subexpression number of the text part in bibtex-cfield.") (defconst bibtex-field-name "[A-Za-z][---A-Za-z0-9:_+]*" "Regexp defining the name part of a bibtex field.") @@ -171,17 +209,27 @@ ;; key = {Volume-2}, ;; note = "Volume~2 is listed under Knuth \cite{book-full}" ;; i have added a few of these, but not all! -- MON +;; 92.2.11: also must handle: +;; author = "{S}schr\"odinger" or +;; author = "{S}schr\"{o}dinger" or +;; author = "{S}schr{\"o}dinger" or + (defconst bibtex-field-const "[0-9A-Za-z][---A-Za-z0-9:_+]*" "Format of a bibtex field constant.") -(defconst bibtex-field-string + +(defconst bibtex-field-string ;;was:(concat "\"[^\"]*[^\\\\]\"\\|\"\"") (concat - "\"[^\"]*[^\\\\]\"\\|\"\"") - "Match either a string or an empty string.") + "\"\\([^\"]*[\\\\][\"]\\)*[^\"]*[^\\\\]\"" + "\\|" ;ie: OR + "\"\"" + "\\|" ;ie: OR + "\"[^\"]*[^\\\\]\"") + "Match either a \"-d string or an empty string or a plain string.") (defconst bibtex-field-string-or-const (concat bibtex-field-const "\\|" bibtex-field-string) - "Match either `bibtex-field-string' or `bibtex-field-const'.") + "Match either bibtex-field-string or bibtex-field-const.") ;(defconst bibtex-field-text ; "\"[^\"]*[^\\\\]\"\\|\"\"\\|[0-9A-Za-z][---A-Za-z0-9:_+]*" @@ -191,60 +239,64 @@ (concat "\\(" bibtex-field-string-or-const "\\)" "\\([ \t\n]+#[ \t\n]+\\(" bibtex-field-string-or-const "\\)\\)*\\|" - "{[^{}]*[^\\\\]}") + "{[^{}]*[^\\\\]}" "\\|" "{}") "Regexp defining the text part of a bibtex field: either a string, or an empty string, or a constant followed by one or more # / constant pairs. -Also matches simple {...} patterns.") +Also matches simple {...} patterns, including the special case {}.") (defconst bibtex-field (bibtex-cfield bibtex-field-name bibtex-field-text) "Regexp defining the format of a bibtex field") (defconst bibtex-name-in-field bibtex-name-in-cfield - "The regexp subexpression number of the name part in `bibtex-field'.") + "The regexp subexpression number of the name part in bibtex-field") (defconst bibtex-text-in-field bibtex-text-in-cfield - "The regexp subexpression number of the text part in `bibtex-field'.") + "The regexp subexpression number of the text part in bibtex-field") ;;; references (defconst bibtex-reference-type "@[A-Za-z]+" - "Regexp defining the type part of a bibtex reference entry.") + "Regexp defining the type part of a bibtex reference entry") + (defconst bibtex-reference-head (concat "^[ \t]*\\(" bibtex-reference-type "\\)[ \t]*[({]\\(" bibtex-field-name "\\)") - "Regexp defining format of the header line of a bibtex reference entry.") + "Regexp defining format of the header line of a bibtex reference entry") (defconst bibtex-type-in-head 1 - "The regexp subexpression number of the type part in `bibtex-reference-head'.") + "The regexp subexpression number of the type part in bibtex-reference-head") (defconst bibtex-key-in-head 2 - "The regexp subexpression number of the key part in `bibtex-reference-head'.") + "The regexp subexpression number of the key part in +bibtex-reference-head") (defconst bibtex-reference (concat bibtex-reference-head "\\([ \t\n]*" bibtex-field "\\)*" "[ \t\n]*[})]") - "Regexp defining the format of a bibtex reference entry.") + "Regexp defining the format of a bibtex reference entry") (defconst bibtex-type-in-reference bibtex-type-in-head - "The regexp subexpression number of the type part in `bibtex-reference'.") + "The regexp subexpression number of the type part in bibtex-reference") (defconst bibtex-key-in-reference bibtex-key-in-head - "The regexp subexpression number of the key part in `bibtex-reference'.") + "The regexp subexpression number of the key part in +bibtex-reference") -;;; strings +;;; string definitions. note bibtex-string is a constant and a defun ! (defconst bibtex-string (concat "^[ \t]*@[sS][tT][rR][iI][nN][gG][ \t\n]*[({][ \t\n]*\\(" bibtex-field-name "\\)[ \t\n]*=[ \t\n]*\\(" bibtex-field-text "\\)[ \t\n]*[})]") - "Regexp defining the format of a bibtex string entry.") + "Regexp defining the format of a bibtex string entry") + (defconst bibtex-name-in-string 1 - "The regexp subexpression of the name part in `bibtex-string'.") + "The regexp subexpression of the name part in bibtex-string") (defconst bibtex-text-in-string 2 - "The regexp subexpression of the text part in `bibtex-string'.") + "The regexp subexpression of the text part in bibtex-string") -(defconst bibtex-name-alignement 2 +(defconst bibtex-name-alignment 2 "Alignment for the name part in BibTeX fields. Chosen on aesthetic grounds only.") @@ -254,7 +306,6 @@ ;;; bibtex mode: -;;;###autoload (defun bibtex-mode () "Major mode for editing bibtex files. @@ -409,7 +460,9 @@ (t (backward-paragraph) (forward-paragraph))) - (re-search-forward "[ \t\n]*" (point-max) t)) + (re-search-forward "[ \t\n]*" (point-max) t) + (insert "\n") + (forward-char -1)) ;; ;; note: this should really take lists of strings OR of lists. in the @@ -436,22 +489,40 @@ (up-list -1) (forward-char 1)) +(defun bibtex-insert-field-delimeters (str) + "Insert double quotes (default) or, if STR is in the list +bibtex-curly-delimeters, insert curly brackets." + (if (and (boundp 'bibtex-curly-delimeters) + bibtex-curly-delimeters + (memq (car (read-from-string (downcase str))) + bibtex-curly-delimeters)) + (insert "\{\}") + (insert "\"\""))) + (defun bibtex-make-field (str) (interactive "sBibTeX entry type: ") (insert ",\n") - (indent-to-column bibtex-name-alignement) + (indent-to-column bibtex-name-alignment) (insert str " = ") (indent-to-column bibtex-text-alignment) - (insert "\"\"") + (bibtex-insert-field-delimeters str) nil) +;; modified to make fields align up _after_ the OPT's have been removed + (defun bibtex-make-optional-field (str) (interactive "sOptional BibTeX entry type: ") (insert ",\n") - (indent-to-column bibtex-name-alignement) - (insert "OPT" str " = ") - (indent-to-column bibtex-text-alignment) - (insert "\"\"") + (indent-to-column bibtex-name-alignment) + (insert str " = ") + (indent-to-column bibtex-text-alignment) ;align nicely, then,... + (bibtex-insert-field-delimeters str) + (if bibtex-use-OPT-prefix + (progn + (beginning-of-line) + (move-to-column bibtex-name-alignment) ;go back to name and put in OPT + (insert "OPT") + (end-of-line))) nil) ;; What to do about crossref? if present, journal and year are @@ -594,10 +665,10 @@ (if arg (progn (goto-char (match-beginning bibtex-text-in-field)) - (if (looking-at "\"") + (if (or (looking-at "\"") (looking-at "{")) (forward-char 1))) (goto-char (match-end bibtex-text-in-field)) - (if (= (preceding-char) ?\") + (if (or (= (preceding-char) ?\") (= (preceding-char) ?})) (forward-char -1)))) (defun bibtex-remove-OPT () @@ -618,7 +689,7 @@ (skip-chars-backward " \t") ;delete these chars? -- MON (cond ((= (preceding-char) ?,) (forward-char -1))) - (cond ((= (preceding-char) ?\") + (cond ((or (= (preceding-char) ?\") (= (preceding-char) ?\})) (forward-char -1)))) ;only go back if quote @@ -835,7 +906,7 @@ (re-search-forward regexp right nil 1) (if (> (match-beginning 0) initial) (signal 'search-failed (list regexp))) - (while (<= (match-end 0) initial) + (while (< (match-end 0) initial) ;<= --> < -- MON (re-search-forward regexp right nil 1) (if (> (match-beginning 0) initial) (signal 'search-failed (list regexp)))) @@ -862,9 +933,16 @@ (looking-at "OPT") bibtex-clean-entry-zap-empty-opts) (goto-char begin-text) - (if (looking-at "\"\"") ; empty: delete whole field + (if (and (looking-at "\"\"") ; empty: delete whole field + (boundp 'bibtex-save-OPT) + bibtex-save-OPT + (not (memq (car (read-from-string + (buffer-substring + (+ begin-name 3) + end-name))) + bibtex-save-OPT))) (delete-region begin-field end-field) - ; otherwise: not empty, delete "OPT" + ;; otherwise: not empty, delete "OPT" (goto-char begin-name) (delete-char (length "OPT")) (goto-char begin-field) ; and loop to go through next test @@ -888,7 +966,12 @@ (equal (buffer-substring begin-name (+ begin-name 3)) - "opt"))) + "opt") + (memq (car (read-from-string + (buffer-substring + begin-name + end-name))) + bibtex-save-OPT))) (error "Mandatory field ``%s'' is empty" (buffer-substring begin-name end-name)))) (t