home *** CD-ROM | disk | FTP | other *** search
- ;;; 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))
-
-