|
|
1.1 ! root 1: ;;; Simple BibTeX mode for GNU Emacs ! 2: ;;; Bengt Martensson 87-06-28 ! 3: ;;; changes by Marc Shapiro [email protected] 15-oct-1986 ! 4: ;;; (align long lines nicely; C-c C-o checks for the "OPT" string; ! 5: ;;; TAB goes to the end of the string; use lower case; use ! 6: ;;; run-hooks) ! 7: ;;; Marc Shapiro 19-oct-1987 ! 8: ;;; add X window menu option; bug fixes. TAB, LFD, C-c " and C-c C-o now ! 9: ;;; behave consistently; deletion never occurs blindly. ! 10: ;;; Marc Shapiro 3-nov-87 ! 11: ;;; addition for France: DEAthesis ! 12: ;;; Skip Montanaro <steinmetz!sprite!montanaro> 7-dec-87, Shapiro 10-dec-87 ! 13: ;;; before inserting an entry, make sure we are outside of a bib entry ! 14: ;;; Marc Shapiro 14-dec-87 ! 15: ;;; Cosmetic fixes. Fixed small bug in bibtex-move-outside-of-entry. ! 16: ! 17: ;;; NOTE by Marc Shapiro, 14-dec-87: ! 18: ;;; (bibtex-x-environment) binds an X menu for bibtex mode to x-button-c-right. ! 19: ;;; Trouble is, in Emacs 18.44 you can't have a mode-specific mouse binding, ! 20: ;;; so it will remain active in all windows. Yuck! ! 21: ! 22: ;;; Bengt Martensson 88-05-06: ! 23: ;;; Added Sun menu support. Locally bound to right mouse button in ! 24: ;;; bibtex-mode. Emacs 18.49 allows local mouse bindings!! ! 25: ;;; Commented out vtxxx-keys and DEAthesis. Changed documentation slightly. ! 26: ! 27: (defvar bibtex-mode-syntax-table nil "") ! 28: (defvar bibtex-mode-abbrev-table nil "") ! 29: (define-abbrev-table 'bibtex-mode-abbrev-table ()) ! 30: (defvar bibtex-mode-map (make-sparse-keymap) "") ! 31: ! 32: (defun bibtex-mode () ! 33: "Major mode for editing bibtex files. Commands: ! 34: \\{bibtex-mode-map} ! 35: ! 36: A command such as \\[bibtex-Book] will outline the fields for a BibTeX ! 37: book entry. ! 38: ! 39: The optional fields are preceded by ""OPT"", thus ignored by BibTeX. ! 40: Use \\[bibtex-remove-opt] to remove ""OPT"" on the current line. ! 41: ! 42: Use \\[bibtex-find-it] to position the dot at the end of the string on the same line. ! 43: Use \\[bibtex-next-position] to move to the next position to fill in. Use \\[kill-current-line] ! 44: to kill the whole line. ! 45: ! 46: M-x bibtex-x-environment binds a mode-specific X menu to control+right ! 47: mouse button. ! 48: M-x bibtex-sun-environment binds a mode-specific Sun menu to right ! 49: mouse button. ! 50: ! 51: Fields: ! 52: address ! 53: Publisher's address ! 54: annote ! 55: Long annotation used for annotated bibliographies (begins sentence) ! 56: author ! 57: Name(s) of author(s), in BibTeX name format ! 58: booktitle ! 59: Book title when the thing being referenced isn't the whole book. ! 60: For book entries, the title field should be used instead. ! 61: chapter ! 62: Chapter number ! 63: edition ! 64: Edition of a book (e.g., ""second"") ! 65: editor ! 66: Name(s) of editor(s), in BibTeX name format. ! 67: If there is also an author field, then the editor field should be ! 68: for the book or collection that the work appears in ! 69: howpublished ! 70: How something strange has been published (begins sentence) ! 71: institution ! 72: Sponsoring institution ! 73: journal ! 74: Journal name (macros are provided for many) ! 75: key ! 76: Alphabetizing and labeling key (needed when no author or editor) ! 77: month ! 78: Month (macros are provided) ! 79: note ! 80: To help the reader find a reference (begins sentence) ! 81: number ! 82: Number of a journal or technical report ! 83: organization ! 84: Organization (sponsoring a conference) ! 85: pages ! 86: Page number or numbers (use `--' to separate a range) ! 87: publisher ! 88: Publisher name ! 89: school ! 90: School name (for theses) ! 91: series ! 92: The name of a series or set of books. ! 93: An individual book will will also have it's own title ! 94: title ! 95: The title of the thing being referenced ! 96: type ! 97: Type of a Techreport (e.g., ""Research Note"") to be used instead of ! 98: the default ""Technical Report"" ! 99: volume ! 100: Volume of a journal or multivolume work ! 101: year ! 102: Year---should contain only numerals ! 103: --------------------------------------------------------- ! 104: Entry to this mode calls the value of bibtex-mode-hook ! 105: if that value is non-nil." ! 106: (interactive) ! 107: (kill-all-local-variables) ! 108: (if (not bibtex-mode-syntax-table) ! 109: (setq bibtex-mode-syntax-table (copy-syntax-table))) ! 110: (set-syntax-table bibtex-mode-syntax-table) ! 111: (modify-syntax-entry ?\$ "$$ ") ! 112: (modify-syntax-entry ?\% "< ") ! 113: (modify-syntax-entry ?\f "> ") ! 114: (modify-syntax-entry ?\n "> ") ! 115: (modify-syntax-entry ?' "w ") ! 116: (modify-syntax-entry ?@ "w ") ! 117: (use-local-map bibtex-mode-map) ! 118: (setq major-mode 'bibtex-mode) ! 119: ! 120: ! 121: (setq mode-name "BibTeX") ! 122: (set-syntax-table bibtex-mode-syntax-table) ! 123: (setq local-abbrev-table bibtex-mode-abbrev-table) ! 124: (make-local-variable 'paragraph-start) ! 125: (setq paragraph-start "^[ \f\n\t]*$") ! 126: ! 127: (define-key bibtex-mode-map "\t" 'bibtex-find-it) ! 128: (define-key bibtex-mode-map "\n" 'bibtex-next-position) ! 129: ;;(define-key bibtex-mode-map "\e[25~" 'bibtex-next-position) ! 130: (define-key bibtex-mode-map "\C-c\"" 'bibtex-remove-double-quotes) ! 131: ;;(define-key bibtex-mode-map "\C-c\eOS" 'kill-current-line) ! 132: (define-key bibtex-mode-map "\C-c\C-k" 'kill-current-line) ! 133: (define-key bibtex-mode-map "\C-c\C-a" 'bibtex-Article) ! 134: (define-key bibtex-mode-map "\C-c\C-b" 'bibtex-Book) ! 135: ;;(define-key bibtex-mode-map "\C-c\C-d" 'bibtex-DEAthesis) ! 136: (define-key bibtex-mode-map "\C-c\C-c" 'bibtex-InProceedings) ! 137: (define-key bibtex-mode-map "\C-c\C-i" 'bibtex-InBook) ! 138: (define-key bibtex-mode-map "\C-ci" 'bibtex-InCollection) ! 139: (define-key bibtex-mode-map "\C-cI" 'bibtex-InProceedings) ! 140: (define-key bibtex-mode-map "\C-c\C-m" 'bibtex-Manual) ! 141: (define-key bibtex-mode-map "\C-cm" 'bibtex-MastersThesis) ! 142: (define-key bibtex-mode-map "\C-cM" 'bibtex-Misc) ! 143: (define-key bibtex-mode-map "\C-c\C-o" 'bibtex-remove-opt) ! 144: (define-key bibtex-mode-map "\C-c\C-p" 'bibtex-PhdThesis) ! 145: (define-key bibtex-mode-map "\C-cp" 'bibtex-Proceedings) ! 146: (define-key bibtex-mode-map "\C-c\C-t" 'bibtex-TechReport) ! 147: (define-key bibtex-mode-map "\C-c\C-s" 'bibtex-string) ! 148: (define-key bibtex-mode-map "\C-c\C-u" 'bibtex-Unpublished) ! 149: (define-key bibtex-mode-map "\C-c?" 'describe-mode) ! 150: ! 151: ; nice alignements ! 152: (auto-fill-mode 1) ! 153: (setq left-margin 17) ! 154: ! 155: (run-hooks 'bibtex-mode-hook)) ! 156: ! 157: (defun bibtex-move-outside-of-entry () ! 158: "Make sure we are outside of a bib entry" ! 159: (if (or ! 160: (= (point) (point-max)) ! 161: (= (point) (point-min)) ! 162: (looking-at "[ \n]*@") ! 163: ) ! 164: t ! 165: (progn ! 166: (backward-paragraph) ! 167: (forward-paragraph))) ! 168: (re-search-forward "[ \t\n]*" (point-max) t)) ! 169: ! 170: (defun bibtex-entry (entry-type required optional) ! 171: (bibtex-move-outside-of-entry) ! 172: (insert (concat "@" entry-type "{,\n\n}\n\n")) ! 173: (previous-line 3) ! 174: (insert (mapconcat 'bibtex-make-entry required ",\n")) ! 175: (if required (insert ",\n")) ! 176: (insert (mapconcat 'bibtex-make-opt-entry optional ",\n")) ! 177: (up-list -1) ! 178: (forward-char 1)) ! 179: ! 180: (defun bibtex-make-entry (str) ! 181: (interactive "s") ! 182: (concat " " str " = \t""""")) ! 183: ! 184: (defun bibtex-make-opt-entry (str) ! 185: (interactive "s") ! 186: (concat " OPT" str " = \t""""")) ! 187: ! 188: (defun bibtex-Article () ! 189: (interactive) ! 190: (bibtex-entry "Article" '("author" "title" "journal" "year") ! 191: '("volume" "number" "pages" "month" "note"))) ! 192: ! 193: (defun bibtex-Book () ! 194: (interactive) ! 195: (bibtex-entry "Book" '("author" "title" "publisher" "year") ! 196: '("editor" "volume" "series" "address" ! 197: "edition" "month" "note"))) ! 198: ! 199: (defun bibtex-Booklet () ! 200: (interactive) ! 201: (bibtex-entry "Booklet" '("title") ! 202: '("author" "howpublished" "address" "month" "year" "note"))) ! 203: ! 204: ;;; France: Dipl\^{o}me d'Etudes Approfondies (similar to Master's) ! 205: ;(defun bibtex-DEAthesis () ! 206: ; (interactive) ! 207: ; (bibtex-entry "DEAthesis" '("author" "title" "school" "year") ! 208: ; '("address" "month" "note"))) ! 209: ! 210: (defun bibtex-InBook () ! 211: (interactive) ! 212: (bibtex-entry "InBook" '("author" "title" "chapter" "publisher" "year") ! 213: '("editor" "pages" "volume" "series" "address" ! 214: "edition" "month" "note"))) ! 215: ! 216: (defun bibtex-InCollection () ! 217: (interactive) ! 218: (bibtex-entry "InCollection" '("author" "title" "booktitle" ! 219: "publisher" "year") ! 220: '("editor" "chapter" "pages" "address" "month" "note"))) ! 221: ! 222: ! 223: (defun bibtex-InProceedings () ! 224: (interactive) ! 225: (bibtex-entry "InProceedings" '("author" "title" "booktitle" "year") ! 226: '("editor" "pages" "organization" "publisher" ! 227: "address" "month" "note"))) ! 228: ! 229: (defun bibtex-Manual () ! 230: (interactive) ! 231: (bibtex-entry "Manual" '("title") ! 232: '("author" "organization" "address" "edition" "year" ! 233: "month" "note"))) ! 234: ! 235: (defun bibtex-MastersThesis () ! 236: (interactive) ! 237: (bibtex-entry "MastersThesis" '("author" "title" "school" "year") ! 238: '("address" "month" "note"))) ! 239: ! 240: (defun bibtex-Misc () ! 241: (interactive) ! 242: (bibtex-entry "Misc" '() ! 243: '("author" "title" "howpublished" "year" "month" "note"))) ! 244: ! 245: (defun bibtex-PhdThesis () ! 246: (interactive) ! 247: (bibtex-entry "PhDThesis" '("author" "title" "school" "year") ! 248: '("address" "month" "note"))) ! 249: ! 250: (defun bibtex-Proceedings () ! 251: (interactive) ! 252: (bibtex-entry "Proceedings" '("title" "year") ! 253: '("editor" "publisher" "organization" ! 254: "address" "month" "note"))) ! 255: (defun bibtex-TechReport () ! 256: (interactive) ! 257: (bibtex-entry "TechReport" '("author" "title" "institution" "year") ! 258: '("type" "number" "address" "month" "note"))) ! 259: ! 260: ! 261: (defun bibtex-Unpublished () ! 262: (interactive) ! 263: (bibtex-entry "Unpublished" '("author" "title" "note") ! 264: '("year" "month"))) ! 265: ! 266: (defun bibtex-string () ! 267: (interactive) ! 268: (bibtex-move-outside-of-entry) ! 269: (insert "@string{ = """"}\n") ! 270: (previous-line 1) ! 271: (forward-char 8)) ! 272: ! 273: (defun bibtex-next-position () ! 274: "Finds next position to write in." ! 275: (interactive) ! 276: (forward-line 1) ! 277: (bibtex-find-it)) ! 278: ! 279: (defun bibtex-find-it () ! 280: (interactive) ! 281: "Find position on current line (if possible) to add entry text." ! 282: (beginning-of-line) ! 283: (let ((beg (point))) ! 284: (end-of-line) ! 285: (search-backward "," beg t) ! 286: (backward-char 1) ! 287: (if (looking-at """") ! 288: t ! 289: (forward-char 1)) ! 290: )) ! 291: ! 292: (defun bibtex-remove-opt () ! 293: "Removes the 'OPT' starting optional arguments." ! 294: (interactive) ! 295: (beginning-of-line) ! 296: (forward-char 2) ! 297: (if (looking-at "OPT") ! 298: (delete-char 3)) ! 299: (bibtex-find-it)) ! 300: ! 301: (defun kill-current-line () ! 302: "Kills the current line." ! 303: (interactive) ! 304: (beginning-of-line) ! 305: (kill-line 1)) ! 306: ! 307: (defun bibtex-remove-double-quotes () ! 308: "Removes """" around string." ! 309: (interactive) ! 310: (bibtex-find-it) ! 311: (let ! 312: ((here (point)) ! 313: (eol (progn (end-of-line) (point)))) ! 314: (beginning-of-line) ! 315: (if (search-forward """" eol t) ! 316: (progn ! 317: (delete-char -1) ! 318: (if (search-forward """" eol t) ! 319: (delete-char -1) ! 320: )) ! 321: (goto-char here)) ! 322: ) ! 323: ) ! 324: ! 325: ! 326: ;;; X window menus for bibtex mode ! 327: ! 328: (defun bibtex-x-help (arg) ! 329: "Mouse commands for BibTeX mode" ! 330: ! 331: (let ((selection ! 332: (x-popup-menu ! 333: arg ! 334: '("BibTeX commands" ! 335: ("Document types" ! 336: ("article in Conference Proceedings" . bibtex-InProceedings) ! 337: ("article in journal" . bibtex-Article) ! 338: ("Book" . bibtex-Book) ! 339: ("Booklet" . bibtex-Booklet) ! 340: ("Master's Thesis" . bibtex-MastersThesis) ! 341: ;;("DEA Thesis" . bibtex-DEAthesis) ! 342: ("PhD. Thesis" . bibtex-PhdThesis) ! 343: ("Technical Report" . bibtex-TechReport) ! 344: ("technical Manual" . bibtex-Manual) ! 345: ("Conference Proceedings" . bibtex-Proceedings) ! 346: ("in a Book" . bibtex-InBook) ! 347: ("in a Collection" . bibtex-InCollection) ! 348: ("miscellaneous" . bibtex-Misc) ! 349: ("unpublished" . bibtex-Unpublished) ! 350: ) ! 351: ("others" ! 352: ("next field" . bibtex-next-position) ! 353: ("to end of field" . bibtex-find-it) ! 354: ("remove OPT" . bibtex-remove-opt) ! 355: ("remove quotes" . bibtex-remove-double-quotes) ! 356: ("remove this line" . kill-current-line) ! 357: ("describe BibTeX mode" . describe-mode) ! 358: ("string" . bibtex-string)))))) ! 359: (and selection (call-interactively selection)))) ! 360: ! 361: (defun bibtex-x-environment () ! 362: "Set up X menus for BibTeX mode. Call it as bibtex-mode-hook, or interactively" ! 363: (interactive) ! 364: (require 'x-mouse) ! 365: (define-key mouse-map x-button-c-right 'bibtex-x-help) ! 366: ) ! 367: ! 368: ;; Please don't send anything to bug-gnu-emacs about these Sunwindows functions ! 369: ;; since we aren't interested. See etc/SUN-SUPPORT for the reasons why ! 370: ;; we consider this nothing but a distraction from our work. ! 371: ! 372: (defmenu bibtex-sun-entry-menu ! 373: ("Article In Conf. Proc." ! 374: (lambda () (eval-in-window *menu-window* (bibtex-InProceedings)))) ! 375: ("Article In Journal" ! 376: (lambda () (eval-in-window *menu-window* (bibtex-Article)))) ! 377: ("Book" ! 378: (lambda () (eval-in-window *menu-window* (bibtex-Book)))) ! 379: ("Booklet" ! 380: (lambda () (eval-in-window *menu-window* (bibtex-Booklet)))) ! 381: ("Master's Thesis" ! 382: (lambda () (eval-in-window *menu-window* (bibtex-MastersThesis)))) ! 383: ;;("DEA Thesis" bibtex-DEAthesis) ! 384: ("PhD. Thesis" ! 385: (lambda () (eval-in-window *menu-window* (bibtex-PhdThesis)))) ! 386: ("Technical Report" ! 387: (lambda () (eval-in-window *menu-window* (bibtex-TechReport)))) ! 388: ("Technical Manual" ! 389: (lambda () (eval-in-window *menu-window* (bibtex-Manual)))) ! 390: ("Conference Proceedings" ! 391: (lambda () (eval-in-window *menu-window* (bibtex-Proceedings)))) ! 392: ("In A Book" ! 393: (lambda () (eval-in-window *menu-window* (bibtex-InBook)))) ! 394: ("In A Collection" ! 395: (lambda () (eval-in-window *menu-window* (bibtex-InCollection)))) ! 396: ("Miscellaneous" ! 397: (lambda () (eval-in-window *menu-window* (bibtex-Misc)))) ! 398: ("Unpublished" ! 399: (lambda () (eval-in-window *menu-window* (bibtex-Unpublished))))) ! 400: ! 401: (defmenu bibtex-sun-menu ! 402: ("BibTeX menu") ! 403: ("add entry" . bibtex-sun-entry-menu) ! 404: ("add string" ! 405: (lambda () (eval-in-window *menu-window* (bibtex-string)))) ! 406: ;("next field" bibtex-next-position) ! 407: ;("to end of field" bibtex-find-it) ! 408: ; ("remove OPT" ! 409: ; (lambda () (eval-in-window *menu-window* (bibtex-remove-opt)))) ! 410: ; ("remove quotes" ! 411: ; (lambda () (eval-in-window *menu-window* (bibtex-remove-double-quotes)))) ! 412: ; ("remove this line" ! 413: ; (lambda () (eval-in-window *menu-window* (kill-current-line)))) ! 414: ("describe BibTeX mode" ! 415: (lambda () (eval-in-window *menu-window* (describe-mode)))) ! 416: ("Main Emacs menu" . emacs-menu)) ! 417: ! 418: (defun bibtex-sun-menu-eval (window x y) ! 419: "Pop-up menu of BibTeX commands." ! 420: (sun-menu-evaluate window (1+ x) (1- y) 'bibtex-sun-menu)) ! 421: ! 422: (defun bibtex-sun-environment () ! 423: "Set up sun menus for BibTeX mode. Call it as bibtex-mode-hook, or interactively" ! 424: (interactive) ! 425: (local-set-mouse '(text right) 'bibtex-sun-menu-eval)) ! 426:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.