diff options
Diffstat (limited to 'lisp/bibtex.el')
-rw-r--r-- | lisp/bibtex.el | 426 |
1 files changed, 426 insertions, 0 deletions
diff --git a/lisp/bibtex.el b/lisp/bibtex.el new file mode 100644 index 00000000000..6b0e6217cc5 --- /dev/null +++ b/lisp/bibtex.el @@ -0,0 +1,426 @@ +;;; Simple BibTeX mode for GNU Emacs +;;; Bengt Martensson 87-06-28 +;;; changes by Marc Shapiro shapiro@inria.inria.fr 15-oct-1986 +;;; (align long lines nicely; C-c C-o checks for the "OPT" string; +;;; TAB goes to the end of the string; use lower case; use +;;; run-hooks) +;;; Marc Shapiro 19-oct-1987 +;;; add X window menu option; bug fixes. TAB, LFD, C-c " and C-c C-o now +;;; behave consistently; deletion never occurs blindly. +;;; Marc Shapiro 3-nov-87 +;;; addition for France: DEAthesis +;;; Skip Montanaro <steinmetz!sprite!montanaro> 7-dec-87, Shapiro 10-dec-87 +;;; before inserting an entry, make sure we are outside of a bib entry +;;; Marc Shapiro 14-dec-87 +;;; Cosmetic fixes. Fixed small bug in bibtex-move-outside-of-entry. + +;;; NOTE by Marc Shapiro, 14-dec-87: +;;; (bibtex-x-environment) binds an X menu for bibtex mode to x-button-c-right. +;;; Trouble is, in Emacs 18.44 you can't have a mode-specific mouse binding, +;;; so it will remain active in all windows. Yuck! + +;;; Bengt Martensson 88-05-06: +;;; Added Sun menu support. Locally bound to right mouse button in +;;; bibtex-mode. Emacs 18.49 allows local mouse bindings!! +;;; Commented out vtxxx-keys and DEAthesis. Changed documentation slightly. + +(defvar bibtex-mode-syntax-table nil "") +(defvar bibtex-mode-abbrev-table nil "") +(define-abbrev-table 'bibtex-mode-abbrev-table ()) +(defvar bibtex-mode-map (make-sparse-keymap) "") + +(defun bibtex-mode () + "Major mode for editing bibtex files. Commands: +\\{bibtex-mode-map} + +A command such as \\[bibtex-Book] will outline the fields for a BibTeX +book entry. + +The optional fields are preceded by ""OPT"", thus ignored by BibTeX. +Use \\[bibtex-remove-opt] to remove ""OPT"" on the current line. + +Use \\[bibtex-find-it] to position the dot at the end of the string on the same line. +Use \\[bibtex-next-position] to move to the next position to fill in. Use \\[kill-current-line] +to kill the whole line. + +M-x bibtex-x-environment binds a mode-specific X menu to control+right +mouse button. +M-x bibtex-sun-environment binds a mode-specific Sun menu to right +mouse button. + +Fields: + address + Publisher's address + annote + Long annotation used for annotated bibliographies (begins sentence) + author + Name(s) of author(s), in BibTeX name format + booktitle + Book title when the thing being referenced isn't the whole book. + For book entries, the title field should be used instead. + chapter + Chapter number + edition + Edition of a book (e.g., ""second"") + editor + Name(s) of editor(s), in BibTeX name format. + If there is also an author field, then the editor field should be + for the book or collection that the work appears in + howpublished + How something strange has been published (begins sentence) + institution + Sponsoring institution + journal + Journal name (macros are provided for many) + key + Alphabetizing and labeling key (needed when no author or editor) + month + Month (macros are provided) + note + To help the reader find a reference (begins sentence) + number + Number of a journal or technical report + organization + Organization (sponsoring a conference) + pages + Page number or numbers (use `--' to separate a range) + publisher + Publisher name + school + School name (for theses) + series + The name of a series or set of books. + An individual book will will also have it's own title + title + The title of the thing being referenced + type + Type of a Techreport (e.g., ""Research Note"") to be used instead of + the default ""Technical Report"" + volume + Volume of a journal or multivolume work + year + Year---should contain only numerals +--------------------------------------------------------- +Entry to this mode calls the value of bibtex-mode-hook +if that value is non-nil." + (interactive) + (kill-all-local-variables) + (if (not bibtex-mode-syntax-table) + (setq bibtex-mode-syntax-table (copy-syntax-table))) + (set-syntax-table bibtex-mode-syntax-table) + (modify-syntax-entry ?\$ "$$ ") + (modify-syntax-entry ?\% "< ") + (modify-syntax-entry ?\f "> ") + (modify-syntax-entry ?\n "> ") + (modify-syntax-entry ?' "w ") + (modify-syntax-entry ?@ "w ") + (use-local-map bibtex-mode-map) + (setq major-mode 'bibtex-mode) + + + (setq mode-name "BibTeX") + (set-syntax-table bibtex-mode-syntax-table) + (setq local-abbrev-table bibtex-mode-abbrev-table) + (make-local-variable 'paragraph-start) + (setq paragraph-start "^[ \f\n\t]*$") + + (define-key bibtex-mode-map "\t" 'bibtex-find-it) + (define-key bibtex-mode-map "\n" 'bibtex-next-position) + ;;(define-key bibtex-mode-map "\e[25~" 'bibtex-next-position) + (define-key bibtex-mode-map "\C-c\"" 'bibtex-remove-double-quotes) + ;;(define-key bibtex-mode-map "\C-c\eOS" 'kill-current-line) + (define-key bibtex-mode-map "\C-c\C-k" 'kill-current-line) + (define-key bibtex-mode-map "\C-c\C-a" 'bibtex-Article) + (define-key bibtex-mode-map "\C-c\C-b" 'bibtex-Book) + ;;(define-key bibtex-mode-map "\C-c\C-d" 'bibtex-DEAthesis) + (define-key bibtex-mode-map "\C-c\C-c" 'bibtex-InProceedings) + (define-key bibtex-mode-map "\C-c\C-i" 'bibtex-InBook) + (define-key bibtex-mode-map "\C-ci" 'bibtex-InCollection) + (define-key bibtex-mode-map "\C-cI" 'bibtex-InProceedings) + (define-key bibtex-mode-map "\C-c\C-m" 'bibtex-Manual) + (define-key bibtex-mode-map "\C-cm" 'bibtex-MastersThesis) + (define-key bibtex-mode-map "\C-cM" 'bibtex-Misc) + (define-key bibtex-mode-map "\C-c\C-o" 'bibtex-remove-opt) + (define-key bibtex-mode-map "\C-c\C-p" 'bibtex-PhdThesis) + (define-key bibtex-mode-map "\C-cp" 'bibtex-Proceedings) + (define-key bibtex-mode-map "\C-c\C-t" 'bibtex-TechReport) + (define-key bibtex-mode-map "\C-c\C-s" 'bibtex-string) + (define-key bibtex-mode-map "\C-c\C-u" 'bibtex-Unpublished) + (define-key bibtex-mode-map "\C-c?" 'describe-mode) + + ; nice alignements + (auto-fill-mode 1) + (setq left-margin 17) + + (run-hooks 'bibtex-mode-hook)) + +(defun bibtex-move-outside-of-entry () + "Make sure we are outside of a bib entry" + (if (or + (= (point) (point-max)) + (= (point) (point-min)) + (looking-at "[ \n]*@") + ) + t + (progn + (backward-paragraph) + (forward-paragraph))) + (re-search-forward "[ \t\n]*" (point-max) t)) + +(defun bibtex-entry (entry-type required optional) + (bibtex-move-outside-of-entry) + (insert (concat "@" entry-type "{,\n\n}\n\n")) + (previous-line 3) + (insert (mapconcat 'bibtex-make-entry required ",\n")) + (if required (insert ",\n")) + (insert (mapconcat 'bibtex-make-opt-entry optional ",\n")) + (up-list -1) + (forward-char 1)) + +(defun bibtex-make-entry (str) + (interactive "s") + (concat " " str " = \t""""")) + +(defun bibtex-make-opt-entry (str) + (interactive "s") + (concat " OPT" str " = \t""""")) + +(defun bibtex-Article () + (interactive) + (bibtex-entry "Article" '("author" "title" "journal" "year") + '("volume" "number" "pages" "month" "note"))) + +(defun bibtex-Book () + (interactive) + (bibtex-entry "Book" '("author" "title" "publisher" "year") + '("editor" "volume" "series" "address" + "edition" "month" "note"))) + +(defun bibtex-Booklet () + (interactive) + (bibtex-entry "Booklet" '("title") + '("author" "howpublished" "address" "month" "year" "note"))) + +;;; France: Dipl\^{o}me d'Etudes Approfondies (similar to Master's) +;(defun bibtex-DEAthesis () +; (interactive) +; (bibtex-entry "DEAthesis" '("author" "title" "school" "year") +; '("address" "month" "note"))) + +(defun bibtex-InBook () + (interactive) + (bibtex-entry "InBook" '("author" "title" "chapter" "publisher" "year") + '("editor" "pages" "volume" "series" "address" + "edition" "month" "note"))) + +(defun bibtex-InCollection () + (interactive) + (bibtex-entry "InCollection" '("author" "title" "booktitle" + "publisher" "year") + '("editor" "chapter" "pages" "address" "month" "note"))) + + +(defun bibtex-InProceedings () + (interactive) + (bibtex-entry "InProceedings" '("author" "title" "booktitle" "year") + '("editor" "pages" "organization" "publisher" + "address" "month" "note"))) + +(defun bibtex-Manual () + (interactive) + (bibtex-entry "Manual" '("title") + '("author" "organization" "address" "edition" "year" + "month" "note"))) + +(defun bibtex-MastersThesis () + (interactive) + (bibtex-entry "MastersThesis" '("author" "title" "school" "year") + '("address" "month" "note"))) + +(defun bibtex-Misc () + (interactive) + (bibtex-entry "Misc" '() + '("author" "title" "howpublished" "year" "month" "note"))) + +(defun bibtex-PhdThesis () + (interactive) + (bibtex-entry "PhDThesis" '("author" "title" "school" "year") + '("address" "month" "note"))) + +(defun bibtex-Proceedings () + (interactive) + (bibtex-entry "Proceedings" '("title" "year") + '("editor" "publisher" "organization" + "address" "month" "note"))) +(defun bibtex-TechReport () + (interactive) + (bibtex-entry "TechReport" '("author" "title" "institution" "year") + '("type" "number" "address" "month" "note"))) + + +(defun bibtex-Unpublished () + (interactive) + (bibtex-entry "Unpublished" '("author" "title" "note") + '("year" "month"))) + +(defun bibtex-string () + (interactive) + (bibtex-move-outside-of-entry) + (insert "@string{ = """"}\n") + (previous-line 1) + (forward-char 8)) + +(defun bibtex-next-position () + "Finds next position to write in." + (interactive) + (forward-line 1) + (bibtex-find-it)) + +(defun bibtex-find-it () + (interactive) + "Find position on current line (if possible) to add entry text." + (beginning-of-line) + (let ((beg (point))) + (end-of-line) + (search-backward "," beg t) + (backward-char 1) + (if (looking-at """") + t + (forward-char 1)) + )) + +(defun bibtex-remove-opt () + "Removes the 'OPT' starting optional arguments." + (interactive) + (beginning-of-line) + (forward-char 2) + (if (looking-at "OPT") + (delete-char 3)) + (bibtex-find-it)) + +(defun kill-current-line () + "Kills the current line." + (interactive) + (beginning-of-line) + (kill-line 1)) + +(defun bibtex-remove-double-quotes () + "Removes """" around string." + (interactive) + (bibtex-find-it) + (let + ((here (point)) + (eol (progn (end-of-line) (point)))) + (beginning-of-line) + (if (search-forward """" eol t) + (progn + (delete-char -1) + (if (search-forward """" eol t) + (delete-char -1) + )) + (goto-char here)) + ) + ) + + +;;; X window menus for bibtex mode + +(defun bibtex-x-help (arg) + "Mouse commands for BibTeX mode" + + (let ((selection + (x-popup-menu + arg + '("BibTeX commands" + ("Document types" + ("article in Conference Proceedings" . bibtex-InProceedings) + ("article in journal" . bibtex-Article) + ("Book" . bibtex-Book) + ("Booklet" . bibtex-Booklet) + ("Master's Thesis" . bibtex-MastersThesis) + ;;("DEA Thesis" . bibtex-DEAthesis) + ("PhD. Thesis" . bibtex-PhdThesis) + ("Technical Report" . bibtex-TechReport) + ("technical Manual" . bibtex-Manual) + ("Conference Proceedings" . bibtex-Proceedings) + ("in a Book" . bibtex-InBook) + ("in a Collection" . bibtex-InCollection) + ("miscellaneous" . bibtex-Misc) + ("unpublished" . bibtex-Unpublished) + ) + ("others" + ("next field" . bibtex-next-position) + ("to end of field" . bibtex-find-it) + ("remove OPT" . bibtex-remove-opt) + ("remove quotes" . bibtex-remove-double-quotes) + ("remove this line" . kill-current-line) + ("describe BibTeX mode" . describe-mode) + ("string" . bibtex-string)))))) + (and selection (call-interactively selection)))) + +(defun bibtex-x-environment () + "Set up X menus for BibTeX mode. Call it as bibtex-mode-hook, or interactively" + (interactive) + (require 'x-mouse) + (define-key mouse-map x-button-c-right 'bibtex-x-help) + ) + +;; Please don't send anything to bug-gnu-emacs about these Sunwindows functions +;; since we aren't interested. See etc/SUN-SUPPORT for the reasons why +;; we consider this nothing but a distraction from our work. + +(defmenu bibtex-sun-entry-menu + ("Article In Conf. Proc." + (lambda () (eval-in-window *menu-window* (bibtex-InProceedings)))) + ("Article In Journal" + (lambda () (eval-in-window *menu-window* (bibtex-Article)))) + ("Book" + (lambda () (eval-in-window *menu-window* (bibtex-Book)))) + ("Booklet" + (lambda () (eval-in-window *menu-window* (bibtex-Booklet)))) + ("Master's Thesis" + (lambda () (eval-in-window *menu-window* (bibtex-MastersThesis)))) + ;;("DEA Thesis" bibtex-DEAthesis) + ("PhD. Thesis" + (lambda () (eval-in-window *menu-window* (bibtex-PhdThesis)))) + ("Technical Report" + (lambda () (eval-in-window *menu-window* (bibtex-TechReport)))) + ("Technical Manual" + (lambda () (eval-in-window *menu-window* (bibtex-Manual)))) + ("Conference Proceedings" + (lambda () (eval-in-window *menu-window* (bibtex-Proceedings)))) + ("In A Book" + (lambda () (eval-in-window *menu-window* (bibtex-InBook)))) + ("In A Collection" + (lambda () (eval-in-window *menu-window* (bibtex-InCollection)))) + ("Miscellaneous" + (lambda () (eval-in-window *menu-window* (bibtex-Misc)))) + ("Unpublished" + (lambda () (eval-in-window *menu-window* (bibtex-Unpublished))))) + +(defmenu bibtex-sun-menu + ("BibTeX menu") + ("add entry" . bibtex-sun-entry-menu) + ("add string" + (lambda () (eval-in-window *menu-window* (bibtex-string)))) + ;("next field" bibtex-next-position) + ;("to end of field" bibtex-find-it) +; ("remove OPT" +; (lambda () (eval-in-window *menu-window* (bibtex-remove-opt)))) +; ("remove quotes" +; (lambda () (eval-in-window *menu-window* (bibtex-remove-double-quotes)))) +; ("remove this line" +; (lambda () (eval-in-window *menu-window* (kill-current-line)))) + ("describe BibTeX mode" + (lambda () (eval-in-window *menu-window* (describe-mode)))) + ("Main Emacs menu" . emacs-menu)) + +(defun bibtex-sun-menu-eval (window x y) + "Pop-up menu of BibTeX commands." + (sun-menu-evaluate window (1+ x) (1- y) 'bibtex-sun-menu)) + +(defun bibtex-sun-environment () + "Set up sun menus for BibTeX mode. Call it as bibtex-mode-hook, or interactively" + (interactive) + (local-set-mouse '(text right) 'bibtex-sun-menu-eval)) + |