2021-02-10 04:42:37 +01:00
|
|
|
;;; bib-mode.el --- major mode for editing bib files -*- lexical-binding: t -*-
|
1992-05-30 23:54:21 +00:00
|
|
|
|
2022-01-01 02:45:51 -05:00
|
|
|
;; Copyright (C) 1989, 2001-2022 Free Software Foundation, Inc.
|
1992-07-22 04:22:30 +00:00
|
|
|
|
2009-01-10 23:17:44 +00:00
|
|
|
;; Author: Henry Kautz
|
|
|
|
;; (according to authors.el)
|
2019-05-25 13:43:06 -07:00
|
|
|
;; Maintainer: emacs-devel@gnu.org
|
1992-07-16 21:47:34 +00:00
|
|
|
;; Keywords: bib
|
|
|
|
|
1991-02-04 22:07:47 +00:00
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 04:34:22 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
1991-02-04 22:07:47 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 04:34:22 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
1991-02-04 22:07:47 +00:00
|
|
|
|
|
|
|
;; 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
|
2017-09-13 15:52:52 -07:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
1991-02-04 22:07:47 +00:00
|
|
|
|
1993-03-22 03:27:18 +00:00
|
|
|
;;; Commentary:
|
1991-02-04 22:07:47 +00:00
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
;; 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.
|
* lisp/textmodes: Use lexical-binding
* lisp/textmodes/enriched.el: Use lexical-binding.
(enriched-mode): Use `delete-dups` to avoid `add-to-list` on
a local variable.
* lisp/textmodes/makeinfo.el: Use lexical-binding.
(makeinfo-region): Remove unused var `filename-or-header`.
* lisp/textmodes/refbib.el: Use lexical-binding.
(r2b-put-field): Remove unused var `multi-line`.
(r2b-barf-output): Remove unused var `match`.
* lisp/textmodes/refer.el: Use lexical-binding.
(refer-find-entry-internal): Remove unused vars `old-buffer` and `found`.
* lisp/textmodes/reftex-auc.el: Use lexical-binding.
(LaTeX-add-bibitems): Declare function.
(reftex-plug-into-AUCTeX): Use `add-function` and `advice-add` so we
can properly unplug.
* lisp/textmodes/reftex-cite.el: Use lexical-binding.
(reftex-create-bibtex-file): Remove unused var `file`.
(reftex--found-list): Declare var.
(reftex-offer-bib-menu): Rename local var to `reftex--found-list`.
* lisp/textmodes/reftex-dcr.el: Use lexical-binding.
(reftex-use-itimer-in-xemacs): Delete XEmacs-only var.
(reftex-toggle-auto-view-crossref): Delete XEmacs-only code.
(reftex-start-itimer-once): Delete XEmacs-only function.
* lisp/textmodes/reftex-global.el: Use lexical-binding.
(reftex-isearch-push-state-function): Use a closure instead of `(lambda).
* lisp/textmodes/reftex-index.el: Use lexical-binding.
(mark-active, transient-mark-mode): Delete var declarations.
(reftex-index-mode-map): Remove XEmacs-only code.
Use `mapc` so we can use closures instead of hand-built lambdas.
(reftex-index-next, reftex-index-previous): Tweak interactive spec to
remove unused prefix arg and mark it as a motion command.
(reftex-index-phrases-font-lock-keywords)
(reftex-index-phrases-font-lock-keywords): Move initialization into
declaration.
(reftex-index-initialize-phrases-buffer, reftex-index-phrases-mode)
reftex-index-phrases-apply-to-region: Remove XEmacs-only code.
(TeX-master): Remove redundant declaration.
(reftex--chars-first): Rename dynvar from `chars-first`. Adjust all uses.
* lisp/textmodes/reftex-parse.el: Use lexical-binding.
* lisp/textmodes/reftex-ref.el: Use lexical-binding.
(reftex-label): Remove always-nil var `text`.
(reftex-refstyle): Declare before first use.
(<toplevel>): Use closures rather than `eval` when building commands from
`reftex-ref-style-alist`.
* lisp/textmodes/reftex-sel.el: Use lexical-binding.
(reftex-select-label-mode-map, reftex-select-bib-mode-map):
Use `mapc` so we can use closures instead of hand-built lambdas.
(reftex-select-label-mode, reftex-select-bib-mode): Remove XEmacs-only code.
(reftex-select-data, reftex-select-prompt, reftex-refstyle):
Move declaration before first use.
(reftex--found-list, reftex--cb-flag, reftex--last-data)
(reftex--call-back, reftex--help-string): Move declaration before use,
and rename by adding `reftext--` prefix. Adjust all uses in this file.
For `reftex--found-list` adjust corresponding uses in `reftex-cite.el`.
(reftex-select-item): Explicitly let-bind them.
Remove XEmacs-only code.
* lisp/textmodes/reftex-toc.el: Use lexical-binding.
(reftex-toc-mode-map, reftex-toc-mode, reftex-toc-restore-region)
(reftex-toc-next, reftex-toc-previous, reftex-toc-next-heading)
(reftex-toc-previous-heading, reftex-toggle-auto-toc-recenter
(reftex-make-separate-toc-frame): Remove XEmacs-only code.
* lisp/textmodes/reftex-vars.el: Use lexical-binding.
* lisp/textmodes/reftex.el: Use lexical-binding.
(reftex-mode-map, reftex-mode, reftex-fontify-select-label-buffer)
(reftex-verified-face): Remove XEmacs-only code.
(reftex-region-active-p, reftex-overlay-put, reftex-move-overlay)
(reftex-make-overlay, reftex-get-buffer-visiting, reftex-delete-overlay):
Redefine as obsolete aliases. Replace all callers.
(current-message): Remove XEmacs-only definition.
* lisp/textmodes/remember.el: Use lexical-binding.
* lisp/textmodes/table.el (<toplevel>): Use closures rather than `(lambda)
to build commands.
* lisp/textmodes/texinfmt.el: Use lexical-binding.
(texinfo-example-start): Declare var.
(texinfo-format-region, texinfo-format-buffer-1): Remove unused var
`last-input-buffer`.
(texinfo-format-scan): Use `dlet` to bind `whitespace-silent`.
(texinfo-optional-braces-discard, texinfo-format-parse-line-args)
(texinfo-format-parse-args): Remove unused var `start`.
(texinfo-multitable-widths): Remove unused var `start-of-templates`.
(texinfo-multitable-item): Strength-reduce `eval` to `symbol-value`.
(texinfo-alias): Remove unused vars `start` and `args`.
(texinfo-defun-type symbol-property): Change the car to help the type
symbol rather than an expression returning it.
(texinfo-format-deffn): Remove corresponding `eval`.
(texinfo-clear): Remove unused var `value`.
(texinfo-format-ifeq): Remove unused var `end`.
* lisp/textmodes/texinfo.el: Use lexical-binding.
(tex-show-print-queue): Declare function.
* lisp/textmodes/texnfo-upd.el: Use lexical-binding.
(texinfo-start-menu-description): Remove unused var `end`.
(texinfo-insert-node-lines): Remove unused var `beginning-marker`.
(texinfo-multiple-files-update): Remove unused vars `next-node-name`
and `previous-node-name`.
* lisp/textmodes/two-column.el: Use lexical-binding.
2021-03-17 23:32:39 -04:00
|
|
|
|
1993-03-22 03:27:18 +00:00
|
|
|
;;; Code:
|
2001-07-15 16:15:35 +00:00
|
|
|
|
1998-02-22 17:34:42 +00:00
|
|
|
(defgroup bib nil
|
|
|
|
"Major mode for editing bib files."
|
|
|
|
:prefix "bib-"
|
2003-08-20 18:32:51 +00:00
|
|
|
:group 'external
|
2016-10-08 16:37:42 +03:00
|
|
|
:group 'text)
|
1993-03-22 03:27:18 +00:00
|
|
|
|
1998-02-22 17:34:42 +00:00
|
|
|
(defcustom bib-file "~/my-bibliography.bib"
|
2022-07-29 18:31:19 +02:00
|
|
|
"Default name of file used by `bib-add'."
|
* lisp/textmodes: Use lexical-binding
* lisp/textmodes/enriched.el: Use lexical-binding.
(enriched-mode): Use `delete-dups` to avoid `add-to-list` on
a local variable.
* lisp/textmodes/makeinfo.el: Use lexical-binding.
(makeinfo-region): Remove unused var `filename-or-header`.
* lisp/textmodes/refbib.el: Use lexical-binding.
(r2b-put-field): Remove unused var `multi-line`.
(r2b-barf-output): Remove unused var `match`.
* lisp/textmodes/refer.el: Use lexical-binding.
(refer-find-entry-internal): Remove unused vars `old-buffer` and `found`.
* lisp/textmodes/reftex-auc.el: Use lexical-binding.
(LaTeX-add-bibitems): Declare function.
(reftex-plug-into-AUCTeX): Use `add-function` and `advice-add` so we
can properly unplug.
* lisp/textmodes/reftex-cite.el: Use lexical-binding.
(reftex-create-bibtex-file): Remove unused var `file`.
(reftex--found-list): Declare var.
(reftex-offer-bib-menu): Rename local var to `reftex--found-list`.
* lisp/textmodes/reftex-dcr.el: Use lexical-binding.
(reftex-use-itimer-in-xemacs): Delete XEmacs-only var.
(reftex-toggle-auto-view-crossref): Delete XEmacs-only code.
(reftex-start-itimer-once): Delete XEmacs-only function.
* lisp/textmodes/reftex-global.el: Use lexical-binding.
(reftex-isearch-push-state-function): Use a closure instead of `(lambda).
* lisp/textmodes/reftex-index.el: Use lexical-binding.
(mark-active, transient-mark-mode): Delete var declarations.
(reftex-index-mode-map): Remove XEmacs-only code.
Use `mapc` so we can use closures instead of hand-built lambdas.
(reftex-index-next, reftex-index-previous): Tweak interactive spec to
remove unused prefix arg and mark it as a motion command.
(reftex-index-phrases-font-lock-keywords)
(reftex-index-phrases-font-lock-keywords): Move initialization into
declaration.
(reftex-index-initialize-phrases-buffer, reftex-index-phrases-mode)
reftex-index-phrases-apply-to-region: Remove XEmacs-only code.
(TeX-master): Remove redundant declaration.
(reftex--chars-first): Rename dynvar from `chars-first`. Adjust all uses.
* lisp/textmodes/reftex-parse.el: Use lexical-binding.
* lisp/textmodes/reftex-ref.el: Use lexical-binding.
(reftex-label): Remove always-nil var `text`.
(reftex-refstyle): Declare before first use.
(<toplevel>): Use closures rather than `eval` when building commands from
`reftex-ref-style-alist`.
* lisp/textmodes/reftex-sel.el: Use lexical-binding.
(reftex-select-label-mode-map, reftex-select-bib-mode-map):
Use `mapc` so we can use closures instead of hand-built lambdas.
(reftex-select-label-mode, reftex-select-bib-mode): Remove XEmacs-only code.
(reftex-select-data, reftex-select-prompt, reftex-refstyle):
Move declaration before first use.
(reftex--found-list, reftex--cb-flag, reftex--last-data)
(reftex--call-back, reftex--help-string): Move declaration before use,
and rename by adding `reftext--` prefix. Adjust all uses in this file.
For `reftex--found-list` adjust corresponding uses in `reftex-cite.el`.
(reftex-select-item): Explicitly let-bind them.
Remove XEmacs-only code.
* lisp/textmodes/reftex-toc.el: Use lexical-binding.
(reftex-toc-mode-map, reftex-toc-mode, reftex-toc-restore-region)
(reftex-toc-next, reftex-toc-previous, reftex-toc-next-heading)
(reftex-toc-previous-heading, reftex-toggle-auto-toc-recenter
(reftex-make-separate-toc-frame): Remove XEmacs-only code.
* lisp/textmodes/reftex-vars.el: Use lexical-binding.
* lisp/textmodes/reftex.el: Use lexical-binding.
(reftex-mode-map, reftex-mode, reftex-fontify-select-label-buffer)
(reftex-verified-face): Remove XEmacs-only code.
(reftex-region-active-p, reftex-overlay-put, reftex-move-overlay)
(reftex-make-overlay, reftex-get-buffer-visiting, reftex-delete-overlay):
Redefine as obsolete aliases. Replace all callers.
(current-message): Remove XEmacs-only definition.
* lisp/textmodes/remember.el: Use lexical-binding.
* lisp/textmodes/table.el (<toplevel>): Use closures rather than `(lambda)
to build commands.
* lisp/textmodes/texinfmt.el: Use lexical-binding.
(texinfo-example-start): Declare var.
(texinfo-format-region, texinfo-format-buffer-1): Remove unused var
`last-input-buffer`.
(texinfo-format-scan): Use `dlet` to bind `whitespace-silent`.
(texinfo-optional-braces-discard, texinfo-format-parse-line-args)
(texinfo-format-parse-args): Remove unused var `start`.
(texinfo-multitable-widths): Remove unused var `start-of-templates`.
(texinfo-multitable-item): Strength-reduce `eval` to `symbol-value`.
(texinfo-alias): Remove unused vars `start` and `args`.
(texinfo-defun-type symbol-property): Change the car to help the type
symbol rather than an expression returning it.
(texinfo-format-deffn): Remove corresponding `eval`.
(texinfo-clear): Remove unused var `value`.
(texinfo-format-ifeq): Remove unused var `end`.
* lisp/textmodes/texinfo.el: Use lexical-binding.
(tex-show-print-queue): Declare function.
* lisp/textmodes/texnfo-upd.el: Use lexical-binding.
(texinfo-start-menu-description): Remove unused var `end`.
(texinfo-insert-node-lines): Remove unused var `beginning-marker`.
(texinfo-multiple-files-update): Remove unused vars `next-node-name`
and `previous-node-name`.
* lisp/textmodes/two-column.el: Use lexical-binding.
2021-03-17 23:32:39 -04:00
|
|
|
:type 'file)
|
1991-02-04 22:07:47 +00:00
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(define-obsolete-variable-alias 'unread-bib-file 'bib-unread-file "29.1")
|
|
|
|
(defcustom bib-unread-file "~/to-be-read.bib"
|
|
|
|
"Default name of file used by `bib-unread' in Bib mode."
|
|
|
|
:type 'file
|
|
|
|
:version "29.1")
|
1991-02-04 22:07:47 +00:00
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(defvar-keymap bib-mode-map
|
|
|
|
:parent text-mode-map
|
|
|
|
"RET" #'bib-return-key
|
|
|
|
"C-c C-u" #'bib-unread
|
|
|
|
"C-c C-@" #'bib-mark
|
|
|
|
"M-`" #'abbrev-mode)
|
1991-02-04 22:07:47 +00:00
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(defun bib-add ()
|
2003-02-04 13:30:45 +00:00
|
|
|
"Set up editor to add to troff bibliography file specified
|
1991-02-04 22:07:47 +00:00
|
|
|
by global variable `bib-file'. See description of `bib-mode'."
|
|
|
|
(interactive)
|
|
|
|
(find-file bib-file)
|
|
|
|
(goto-char (point-max))
|
|
|
|
(bib-mode)
|
|
|
|
)
|
2003-02-04 13:30:45 +00:00
|
|
|
|
2001-10-13 19:22:43 +00:00
|
|
|
(define-derived-mode bib-mode text-mode "Bib"
|
2003-02-04 13:30:45 +00:00
|
|
|
"Mode for editing `lookbib' style bibliographies.
|
1991-02-04 22:07:47 +00:00
|
|
|
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
|
2003-02-04 13:30:45 +00:00
|
|
|
articles in books & proceedings: A* T D B E* I C P K W X
|
1991-02-04 22:07:47 +00:00
|
|
|
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
|
Prefer directed to neutral quotes
Prefer directed to neutral quotes in docstings and diagnostics.
In docstrings, escape apostrophes that would otherwise be translated
to curved quotes using the newer, simpler rules.
* admin/unidata/unidata-gen.el (unidata-gen-table):
* lisp/align.el (align-region):
* lisp/allout.el (allout-mode, allout-solicit-alternate-bullet):
* lisp/bookmark.el (bookmark-default-annotation-text):
* lisp/calc/calc-aent.el (math-read-if, math-read-factor):
* lisp/calc/calc-lang.el (math-read-giac-subscr)
(math-read-math-subscr):
* lisp/calc/calc-misc.el (report-calc-bug):
* lisp/calc/calc-prog.el (calc-fix-token-name)
(calc-read-parse-table-part):
* lisp/cedet/ede/pmake.el (ede-proj-makefile-insert-dist-rules):
* lisp/cedet/semantic/complete.el (semantic-displayor-show-request):
* lisp/dabbrev.el (dabbrev-expand):
* lisp/emacs-lisp/checkdoc.el (checkdoc-this-string-valid-engine):
* lisp/emacs-lisp/elint.el (elint-get-top-forms):
* lisp/emacs-lisp/lisp-mnt.el (lm-verify):
* lisp/emulation/viper-cmd.el (viper-toggle-search-style):
* lisp/erc/erc-button.el (erc-nick-popup):
* lisp/erc/erc.el (erc-cmd-LOAD, erc-handle-login):
* lisp/eshell/em-dirs.el (eshell/cd):
* lisp/eshell/em-glob.el (eshell-glob-regexp):
* lisp/eshell/em-pred.el (eshell-parse-modifiers):
* lisp/eshell/esh-arg.el (eshell-parse-arguments):
* lisp/eshell/esh-opt.el (eshell-show-usage):
* lisp/files-x.el (modify-file-local-variable):
* lisp/filesets.el (filesets-add-buffer, filesets-remove-buffer)
(filesets-update-pre010505):
* lisp/find-cmd.el (find-generic, find-to-string):
* lisp/gnus/auth-source.el (auth-source-netrc-parse-entries):
* lisp/gnus/gnus-agent.el (gnus-agent-check-overview-buffer)
(gnus-agent-fetch-headers):
* lisp/gnus/gnus-int.el (gnus-start-news-server):
* lisp/gnus/gnus-registry.el:
(gnus-registry--split-fancy-with-parent-internal):
* lisp/gnus/gnus-score.el (gnus-summary-increase-score):
* lisp/gnus/gnus-start.el (gnus-convert-old-newsrc):
* lisp/gnus/gnus-topic.el (gnus-topic-rename):
* lisp/gnus/legacy-gnus-agent.el (gnus-agent-unlist-expire-days):
* lisp/gnus/nnmairix.el (nnmairix-widget-create-query):
* lisp/gnus/spam.el (spam-check-blackholes):
* lisp/mail/feedmail.el (feedmail-run-the-queue):
* lisp/mpc.el (mpc-playlist-rename):
* lisp/net/ange-ftp.el (ange-ftp-shell-command):
* lisp/net/mairix.el (mairix-widget-create-query):
* lisp/net/tramp-cache.el:
* lisp/obsolete/otodo-mode.el (todo-more-important-p):
* lisp/obsolete/pgg-gpg.el (pgg-gpg-process-region):
* lisp/obsolete/pgg-pgp.el (pgg-pgp-process-region):
* lisp/obsolete/pgg-pgp5.el (pgg-pgp5-process-region):
* lisp/org/ob-core.el (org-babel-goto-named-src-block)
(org-babel-goto-named-result):
* lisp/org/ob-fortran.el (org-babel-fortran-ensure-main-wrap):
* lisp/org/ob-ref.el (org-babel-ref-resolve):
* lisp/org/org-agenda.el (org-agenda-prepare):
* lisp/org/org-bibtex.el (org-bibtex-fields):
* lisp/org/org-clock.el (org-clock-notify-once-if-expired)
(org-clock-resolve):
* lisp/org/org-feed.el (org-feed-parse-atom-entry):
* lisp/org/org-habit.el (org-habit-parse-todo):
* lisp/org/org-mouse.el (org-mouse-popup-global-menu)
(org-mouse-context-menu):
* lisp/org/org-table.el (org-table-edit-formulas):
* lisp/org/ox.el (org-export-async-start):
* lisp/play/dunnet.el (dun-score, dun-help, dun-endgame-question)
(dun-rooms, dun-endgame-questions):
* lisp/progmodes/ada-mode.el (ada-goto-matching-start):
* lisp/progmodes/ada-xref.el (ada-find-executable):
* lisp/progmodes/antlr-mode.el (antlr-options-alists):
* lisp/progmodes/flymake.el (flymake-parse-err-lines)
(flymake-start-syntax-check-process):
* lisp/progmodes/python.el (python-define-auxiliary-skeleton):
* lisp/progmodes/sql.el (sql-comint):
* lisp/progmodes/verilog-mode.el (verilog-load-file-at-point):
* lisp/server.el (server-get-auth-key):
* lisp/subr.el (version-to-list):
* lisp/textmodes/reftex-ref.el (reftex-label):
* lisp/textmodes/reftex-toc.el (reftex-toc-rename-label):
* lisp/vc/ediff-diff.el (ediff-same-contents):
* lisp/vc/vc-cvs.el (vc-cvs-mode-line-string):
* test/automated/tramp-tests.el (tramp-test33-asynchronous-requests):
Use directed rather than neutral quotes in diagnostics.
2015-08-24 23:39:33 -07:00
|
|
|
R eport number or `phd thesis' or `masters thesis' or `draft' or
|
|
|
|
`unnumbered' or `unpublished'
|
1991-02-04 22:07:47 +00:00
|
|
|
W here can be found locally (login name, or ailib, etc.)
|
|
|
|
X comments (not used in indexing)
|
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
\\[bib-unread] appends current entry to a different file (for example,
|
1991-02-04 22:07:47 +00:00
|
|
|
a file of papers to be read in the future), given by the value of the
|
2022-07-29 18:31:19 +02:00
|
|
|
variable `bib-unread-file'.
|
|
|
|
\\[bib-mark] marks current or previous entry.
|
1991-02-04 22:07:47 +00:00
|
|
|
Abbreviations are saved in `bib-mode-abbrev-table'.
|
|
|
|
Hook can be stored in `bib-mode-hook'.
|
|
|
|
Field keys given by variable `bib-assoc'.
|
|
|
|
|
|
|
|
Commands:
|
2001-10-13 19:22:43 +00:00
|
|
|
\\{bib-mode-map}"
|
|
|
|
(abbrev-mode 1))
|
|
|
|
|
|
|
|
(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.")
|
1991-02-04 22:07:47 +00:00
|
|
|
|
|
|
|
(defun bib-find-key (slots)
|
|
|
|
(cond
|
|
|
|
((null slots)
|
|
|
|
(if (bobp)
|
|
|
|
""
|
2007-10-19 18:41:09 +00:00
|
|
|
(progn (forward-line -1) (bib-find-key bib-assoc))))
|
1991-02-04 22:07:47 +00:00
|
|
|
((looking-at (car (car slots)))
|
|
|
|
(cdr (car slots)))
|
|
|
|
(t (bib-find-key (cdr slots)))
|
|
|
|
))
|
|
|
|
|
|
|
|
|
1998-02-22 17:34:42 +00:00
|
|
|
(defcustom bib-auto-capitalize t
|
2021-09-22 20:26:40 +02:00
|
|
|
"Non-nil to automatically capitalize appropriate fields in Bib mode."
|
2021-02-10 04:42:37 +01:00
|
|
|
:type 'boolean)
|
1991-02-04 22:07:47 +00:00
|
|
|
|
|
|
|
(defconst bib-capitalized-fields "%[AETCBIJR]")
|
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(defun bib-return-key ()
|
1991-02-04 22:07:47 +00:00
|
|
|
"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
|
1996-09-22 21:48:30 +00:00
|
|
|
(bib-capitalize-title-region (+ (point) 3) end-current)))
|
1991-02-04 22:07:47 +00:00
|
|
|
(goto-char beg-current)
|
|
|
|
(if empty
|
|
|
|
(kill-line nil)
|
|
|
|
(forward-line 1)
|
|
|
|
)
|
2001-11-26 16:18:39 +00:00
|
|
|
(insert new-key))
|
1991-02-04 22:07:47 +00:00
|
|
|
(newline)))
|
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(defun bib-mark ()
|
1991-02-04 22:07:47 +00:00
|
|
|
"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)
|
2017-04-28 11:25:26 +03:00
|
|
|
(push-mark)
|
1991-02-04 22:07:47 +00:00
|
|
|
(re-search-forward "^ *$" nil 2)
|
2007-10-19 18:41:09 +00:00
|
|
|
(forward-line 1)
|
1991-02-04 22:07:47 +00:00
|
|
|
(beginning-of-line nil))
|
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(defun bib-unread ()
|
|
|
|
"Append current or previous entry to file of unread papers
|
|
|
|
named by variable `bib-unread-file'."
|
|
|
|
(interactive)
|
|
|
|
(bib-mark)
|
|
|
|
(if (get-file-buffer bib-unread-file)
|
|
|
|
(append-to-buffer (get-file-buffer bib-unread-file) (mark) (point))
|
|
|
|
(append-to-file (mark) (point) bib-unread-file)))
|
1991-02-04 22:07:47 +00:00
|
|
|
|
|
|
|
|
1996-09-22 21:48:30 +00:00
|
|
|
(defvar bib-capitalize-title-stop-words
|
1991-02-04 22:07:47 +00:00
|
|
|
(concat
|
2019-03-18 17:02:01 -07:00
|
|
|
"the\\|and\\|of\\|is\\|a\\|an\\|for\\|in\\|to\\|on\\|at\\|"
|
1991-02-04 22:07:47 +00:00
|
|
|
"by\\|with\\|that\\|its")
|
1996-09-22 21:48:30 +00:00
|
|
|
"Words not to be capitalized in a title (unless the first word).")
|
1991-02-04 22:07:47 +00:00
|
|
|
|
1996-09-22 21:48:30 +00:00
|
|
|
(defvar bib-capitalize-title-stop-regexp
|
|
|
|
(concat "\\(" bib-capitalize-title-stop-words "\\)\\(\\b\\|'\\)"))
|
1991-02-04 22:07:47 +00:00
|
|
|
|
1996-09-22 21:48:30 +00:00
|
|
|
(defun bib-capitalize-title-region (begin end)
|
1991-02-04 22:07:47 +00:00
|
|
|
"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))
|
1996-09-22 21:48:30 +00:00
|
|
|
(looking-at bib-capitalize-title-stop-regexp))
|
1991-02-04 22:07:47 +00:00
|
|
|
(downcase-word 1)
|
|
|
|
(capitalize-word 1)))
|
|
|
|
))
|
|
|
|
(set-syntax-table orig-syntax-table))))
|
|
|
|
|
1996-09-22 21:48:30 +00:00
|
|
|
(defun bib-capitalize-title (s)
|
2022-07-30 11:52:05 +02:00
|
|
|
"Like `capitalize', but don't capitalize stop words, except the first."
|
|
|
|
(with-temp-buffer
|
|
|
|
(insert s)
|
|
|
|
(bib-capitalize-title-region (point-min) (point-max))
|
|
|
|
(buffer-string)))
|
1992-03-16 20:39:07 +00:00
|
|
|
|
2022-07-29 18:31:19 +02:00
|
|
|
(define-obsolete-function-alias 'addbib #'bib-add "29.1")
|
|
|
|
(define-obsolete-function-alias 'return-key-bib #'bib-return-key "29.1")
|
|
|
|
(define-obsolete-function-alias 'mark-bib #'bib-mark "29.1")
|
|
|
|
(define-obsolete-function-alias 'unread-bib #'bib-unread "29.1")
|
|
|
|
|
1992-03-16 20:39:07 +00:00
|
|
|
(provide 'bib-mode)
|
|
|
|
|
1992-05-30 23:54:21 +00:00
|
|
|
;;; bib-mode.el ends here
|