(fill-individual-paragraphs): Don't include
[bpt/emacs.git] / lisp / textmodes / bib-mode.el
CommitLineData
c0274f38
ER
1;;; bib-mode.el --- bib-mode, major mode for editing bib files.
2
9750e079
ER
3;; Copyright (C) 1989 Free Software Foundation, Inc.
4
e5167999 5;; Maintainer: FSF
e5167999
ER
6;; Keywords: bib
7
54369c0f
JB
8;; This file is part of GNU Emacs.
9
10;; GNU Emacs is free software; you can redistribute it and/or modify
11;; it under the terms of the GNU General Public License as published by
e5167999 12;; the Free Software Foundation; either version 2, or (at your option)
54369c0f
JB
13;; any later version.
14
15;; GNU Emacs is distributed in the hope that it will be useful,
16;; but WITHOUT ANY WARRANTY; without even the implied warranty of
17;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18;; GNU General Public License for more details.
19
20;; You should have received a copy of the GNU General Public License
b578f267
EN
21;; along with GNU Emacs; see the file COPYING. If not, write to the
22;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
23;; Boston, MA 02111-1307, USA.
54369c0f 24
e41b2db1 25;;; Commentary:
54369c0f 26
54369c0f
JB
27;; GNU Emacs code to help maintain databases compatible with (troff)
28;; refer and lookbib. The file bib-file should be set to your
29;; bibliography file. Keys are automagically inserted as you type,
30;; and appropriate keys are presented for various kinds of entries.
31
e41b2db1
ER
32;;; Code:
33
54369c0f
JB
34(defvar bib-file "~/my-bibliography.bib"
35 "Default name of file used by `addbib'.")
36
37(defvar unread-bib-file "~/to-be-read.bib"
38 "Default name of file used by `unread-bib' in Bib mode.")
39
40(defvar bib-mode-map (copy-keymap text-mode-map))
41(define-key bib-mode-map "\C-M" 'return-key-bib)
42(define-key bib-mode-map "\C-c\C-u" 'unread-bib)
43(define-key bib-mode-map "\C-c\C-@" 'mark-bib)
44(define-key bib-mode-map "\e`" 'abbrev-mode)
45(defvar bib-mode-abbrev-table nil
46 "Abbrev table used in Bib mode")
47
48(defun addbib ()
49 "Set up editor to add to troff bibliography file specified
50by global variable `bib-file'. See description of `bib-mode'."
51 (interactive)
52 (find-file bib-file)
53 (goto-char (point-max))
54 (bib-mode)
55 )
56
57(defun bib-mode ()
58 "Mode for editing `lookbib' style bibliographies.
59Hit RETURN to get next % field key.
60If you want to ignore this field, just hit RETURN again.
61Use `text-mode' to turn this feature off.
62
63 journal papers: A* T D J V N P K W X
64 articles in books & proceedings: A* T D B E* I C P K W X
65 tech reports: A* T D R I C K W X
66 books: A* T D I C K W X
67
68Fields:
69
70A uthor T itle D ate J ournal
71V olume N umber P age K eywords
72B in book or proceedings E ditor C ity & state
73I nstitution, school, or publisher
74R eport number or 'phd thesis' or 'masters thesis' or 'draft' or
75 'unnumbered' or 'unpublished'
76W here can be found locally (login name, or ailib, etc.)
77X comments (not used in indexing)
78
79\\[unread-bib] appends current entry to a different file (for example,
80a file of papers to be read in the future), given by the value of the
81variable `unread-bib-file'.
82\\[mark-bib] marks current or previous entry.
83Abbreviations are saved in `bib-mode-abbrev-table'.
84Hook can be stored in `bib-mode-hook'.
85Field keys given by variable `bib-assoc'.
86
87Commands:
88\\{bib-mode-map}
89"
90 (interactive)
91 (text-mode)
92 (use-local-map bib-mode-map)
93 (setq mode-name "Bib")
94 (setq major-mode 'bib-mode)
95 (define-abbrev-table 'bib-mode-abbrev-table ())
96 (setq local-abbrev-table bib-mode-abbrev-table)
97 (abbrev-mode 1)
98 (run-hooks 'bib-mode-hook)
99 )
100
101(defconst bib-assoc '(
102 (" *$" . "%A ")
103 ("%A ." . "%A ")
104 ("%A $" . "%T ")
105 ("%T " . "%D ")
106 ("%D " . "%J ")
107 ("%J ." . "%V ")
108 ("%V " . "%N ")
109 ("%N " . "%P ")
110 ("%P " . "%K ")
111 ("%K " . "%W ")
112 ("%W " . "%X ")
113 ("%X " . "")
114 ("%J $" . "%B ")
115 ("%B ." . "%E ")
116 ("%E ." . "%E ")
117 ("%E $" . "%I ")
118 ("%I " . "%C ")
119 ("%C " . "%P ")
120 ("%B $" . "%R ")
121 ("%R " . "%I ")
122 )
123
124"Describes bibliographic database format. A line beginning with
125the car of an entry is followed by one beginning with the cdr.
126")
127
128(defun bib-find-key (slots)
129 (cond
130 ((null slots)
131 (if (bobp)
132 ""
133 (progn (previous-line 1) (bib-find-key bib-assoc))))
134 ((looking-at (car (car slots)))
135 (cdr (car slots)))
136 (t (bib-find-key (cdr slots)))
137 ))
138
139
140(defvar bib-auto-capitalize t
141"*True to automatically capitalize appropriate fields in Bib mode.")
142
143(defconst bib-capitalized-fields "%[AETCBIJR]")
144
145(defun return-key-bib ()
146 "Magic when user hits return, used by `bib-mode'."
147 (interactive)
148 (if (eolp)
149 (let (empty new-key beg-current end-current)
150 (beginning-of-line)
151 (setq empty (looking-at "%. $"))
152 (if (not empty)
153 (progn
154 (end-of-line)
155 (newline)
156 (forward-line -1)
157 ))
158 (end-of-line)
159 (setq end-current (point))
160 (beginning-of-line)
161 (setq beg-current (point))
162 (setq new-key (bib-find-key bib-assoc))
163 (if (and (not empty) bib-auto-capitalize
164 (looking-at bib-capitalized-fields))
165 (save-excursion
7a953756 166 (bib-capitalize-title-region (+ (point) 3) end-current)))
54369c0f
JB
167 (goto-char beg-current)
168 (if empty
169 (kill-line nil)
170 (forward-line 1)
171 )
172 (insert-string new-key))
173 (newline)))
174
175(defun mark-bib ()
176 "Set mark at beginning of current or previous bib entry, point at end."
177 (interactive)
178 (beginning-of-line nil)
179 (if (looking-at "^ *$") (re-search-backward "[^ \n]" nil 2))
180 (re-search-backward "^ *$" nil 2)
181 (re-search-forward "^%")
182 (beginning-of-line nil)
183 (push-mark (point))
184 (re-search-forward "^ *$" nil 2)
185 (next-line 1)
186 (beginning-of-line nil))
187
188(defun unread-bib ()
189 "Append current or previous entry to file of unread papers
190named by variable `unread-bib-file'."
191 (interactive)
192 (mark-bib)
193 (if (get-file-buffer unread-bib-file)
194 (append-to-buffer (get-file-buffer unread-bib-file) (mark) (point))
195 (append-to-file (mark) (point) unread-bib-file)))
196
197
7a953756 198(defvar bib-capitalize-title-stop-words
54369c0f
JB
199 (concat
200 "the\\|and\\|of\\|is\\|a\\|an\\|of\\|for\\|in\\|to\\|in\\|on\\|at\\|"
201 "by\\|with\\|that\\|its")
7a953756 202 "Words not to be capitalized in a title (unless the first word).")
54369c0f 203
7a953756
RS
204(defvar bib-capitalize-title-stop-regexp
205 (concat "\\(" bib-capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
54369c0f 206
7a953756 207(defun bib-capitalize-title-region (begin end)
54369c0f
JB
208 "Like `capitalize-region', but don't capitalize stop words, except the first."
209 (interactive "r")
210 (let ((case-fold-search nil) (orig-syntax-table (syntax-table)))
211 (unwind-protect
212 (save-restriction
213 (set-syntax-table text-mode-syntax-table)
214 (narrow-to-region begin end)
215 (goto-char (point-min))
216 (if (looking-at "[A-Z][a-z]*[A-Z]")
217 (forward-word 1)
218 (capitalize-word 1))
219 (while (re-search-forward "\\<" nil t)
220 (if (looking-at "[A-Z][a-z]*[A-Z]")
221 (forward-word 1)
222 (if (let ((case-fold-search t))
7a953756 223 (looking-at bib-capitalize-title-stop-regexp))
54369c0f
JB
224 (downcase-word 1)
225 (capitalize-word 1)))
226 ))
227 (set-syntax-table orig-syntax-table))))
228
229
7a953756 230(defun bib-capitalize-title (s)
54369c0f
JB
231 "Like `capitalize', but don't capitalize stop words, except the first."
232 (save-excursion
233 (set-buffer (get-buffer-create "$$$Scratch$$$"))
234 (erase-buffer)
235 (insert s)
7a953756 236 (bib-capitalize-title-region (point-min) (point-max))
54369c0f 237 (buffer-string)))
49116ac0
JB
238
239(provide 'bib-mode)
240
c0274f38 241;;; bib-mode.el ends here