view lisp/textmodes/bib-mode.el @ 13728:4b7903cfa7ee

(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).
author Karl Heuer <kwzh@gnu.org>
date Wed, 13 Dec 1995 20:26:13 +0000
parents 10e417efb12a
children 8058d6f606de
line wrap: on
line source

;;; bib-mode.el --- bib-mode, major mode for editing bib files.

;; Copyright (C) 1989 Free Software Foundation, Inc.

;; Maintainer: FSF
;; Keywords: bib

;; This file is part of GNU Emacs.

;; GNU Emacs is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 2, or (at your option)
;; any later version.

;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
;; GNU General Public License for more details.

;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs; see the file COPYING.  If not, write to
;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.

;;; Commentary:

;;   GNU Emacs code to help maintain databases compatible with (troff)
;;   refer and lookbib.  The file bib-file should be set to your 
;;   bibliography file.  Keys are automagically inserted as you type,
;;   and appropriate keys are presented for various kinds of entries.

;;; Code:

(defvar bib-file "~/my-bibliography.bib" 
   "Default name of file used by `addbib'.")

(defvar unread-bib-file "~/to-be-read.bib"
   "Default name of file used by `unread-bib' in Bib mode.")

(defvar bib-mode-map (copy-keymap text-mode-map))
(define-key bib-mode-map "\C-M" 'return-key-bib)
(define-key bib-mode-map "\C-c\C-u" 'unread-bib)
(define-key bib-mode-map "\C-c\C-@" 'mark-bib)
(define-key bib-mode-map "\e`" 'abbrev-mode)
(defvar bib-mode-abbrev-table nil
   "Abbrev table used in Bib mode")

(defun addbib ()
   "Set up editor to add to troff bibliography file specified 
by global variable `bib-file'.  See description of `bib-mode'."
   (interactive)
   (find-file bib-file)
   (goto-char (point-max))
   (bib-mode)
   )
   
(defun bib-mode ()
   "Mode for editing `lookbib' style bibliographies.  
Hit RETURN to get next % field key.
If you want to ignore this field, just hit RETURN again.
Use `text-mode' to turn this feature off.

 journal papers:                    A* T D J V N P K W X
 articles in books & proceedings:   A* T D B E* I C P K W X 
 tech reports:                      A* T D R I C K W X
 books:                             A* T D I C K W X

Fields:

A uthor		T itle		D ate  		J ournal
V olume		N umber		P age		K eywords
B in book or proceedings	E ditor		C ity & state
I nstitution, school, or publisher
R eport number or 'phd thesis' or 'masters thesis' or 'draft' or 
     'unnumbered' or 'unpublished'
W here can be found locally (login name, or ailib, etc.)
X comments (not used in indexing)

\\[unread-bib] appends current entry to a different file (for example,
a file of papers to be read in the future), given by the value of the
variable `unread-bib-file'.
\\[mark-bib] marks current or previous entry.
Abbreviations are saved in `bib-mode-abbrev-table'.
Hook can be stored in `bib-mode-hook'.
Field keys given by variable `bib-assoc'.

Commands:
\\{bib-mode-map}
"
   (interactive)
   (text-mode)
   (use-local-map bib-mode-map)
   (setq mode-name "Bib")
   (setq major-mode 'bib-mode)
   (define-abbrev-table 'bib-mode-abbrev-table ())
   (setq local-abbrev-table bib-mode-abbrev-table)
   (abbrev-mode 1)
   (run-hooks 'bib-mode-hook)
   )

(defconst bib-assoc '(
		   (" *$" . "%A ")
		   ("%A ." . "%A ")
		   ("%A $" . "%T ")
		   ("%T " . "%D ")
		   ("%D " . "%J ")
		   ("%J ." . "%V ")
		   ("%V " . "%N ")
		   ("%N " . "%P ")
		   ("%P " . "%K ")
		   ("%K " . "%W ")
		   ("%W " . "%X ")
		   ("%X " . "")
		   ("%J $" . "%B ")
		   ("%B ." . "%E ")
		   ("%E ." . "%E ")
		   ("%E $" . "%I ")
		   ("%I " . "%C ")
		   ("%C " . "%P ")
		   ("%B $" . "%R ")
		   ("%R " . "%I ")
		   )
		   
"Describes bibliographic database format.  A line beginning with
the car of an entry is followed by one beginning with the cdr.
")

(defun bib-find-key (slots)
   (cond
      ((null slots)
	 (if (bobp)
	    ""
	    (progn (previous-line 1) (bib-find-key bib-assoc))))
      ((looking-at (car (car slots)))
	 (cdr (car slots)))
      (t (bib-find-key (cdr slots)))
      ))


(defvar bib-auto-capitalize t 
"*True to automatically capitalize appropriate fields in Bib mode.")

(defconst bib-capitalized-fields "%[AETCBIJR]")

(defun return-key-bib ()
  "Magic when user hits return, used by `bib-mode'."
  (interactive)
  (if (eolp)
    (let (empty new-key beg-current end-current)
      (beginning-of-line)
      (setq empty (looking-at "%. $"))
      (if (not empty)
	(progn
	  (end-of-line)
	  (newline)
	  (forward-line -1)
	  ))
      (end-of-line)
      (setq end-current (point))
      (beginning-of-line)
      (setq beg-current (point))
      (setq new-key (bib-find-key bib-assoc))
      (if (and (not empty) bib-auto-capitalize
	    (looking-at bib-capitalized-fields))
	(save-excursion
	  (capitalize-title-region (+ (point) 3) end-current)))
      (goto-char beg-current)
      (if empty
	(kill-line nil)
	(forward-line 1)
	)
      (insert-string new-key))
    (newline)))

(defun mark-bib ()
   "Set mark at beginning of current or previous bib entry, point at end."
   (interactive)
   (beginning-of-line nil)
   (if (looking-at "^ *$") (re-search-backward "[^ \n]" nil 2))
   (re-search-backward "^ *$" nil 2)
   (re-search-forward "^%")
   (beginning-of-line nil)
   (push-mark (point))
   (re-search-forward "^ *$" nil 2)
   (next-line 1)
   (beginning-of-line nil))

(defun unread-bib ()
   "Append current or previous entry to file of unread papers
named by variable `unread-bib-file'."
   (interactive)
   (mark-bib)
   (if (get-file-buffer unread-bib-file)
      (append-to-buffer (get-file-buffer unread-bib-file) (mark) (point))
      (append-to-file (mark) (point) unread-bib-file)))


(defvar capitalize-title-stop-words
   (concat
      "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
      "by\\|with\\|that\\|its")
   "Words not to be capitialized in a title (unless they're the first word
in the title).")

(defvar capitalize-title-stop-regexp
   (concat "\\(" capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))

(defun capitalize-title-region (begin end)
   "Like `capitalize-region', but don't capitalize stop words, except the first."
   (interactive "r")
   (let ((case-fold-search nil) (orig-syntax-table (syntax-table)))
      (unwind-protect
	 (save-restriction
	    (set-syntax-table text-mode-syntax-table)
	    (narrow-to-region begin end)
	    (goto-char (point-min))
	    (if (looking-at "[A-Z][a-z]*[A-Z]")
	       (forward-word 1)
	       (capitalize-word 1))
	    (while (re-search-forward "\\<" nil t)
	       (if (looking-at "[A-Z][a-z]*[A-Z]")
		  (forward-word 1)
		  (if (let ((case-fold-search t))
			 (looking-at capitalize-title-stop-regexp))
		     (downcase-word 1)
		     (capitalize-word 1)))
	       ))
	 (set-syntax-table orig-syntax-table))))


(defun capitalize-title (s)
   "Like `capitalize', but don't capitalize stop words, except the first."
   (save-excursion
      (set-buffer (get-buffer-create "$$$Scratch$$$"))
      (erase-buffer)
      (insert s)
      (capitalize-title-region (point-min) (point-max))
      (buffer-string)))

(provide 'bib-mode)

;;; bib-mode.el ends here