[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/lisp/textmodes/bibtex.el,v
From: |
Roland Winkler |
Subject: |
[Emacs-diffs] Changes to emacs/lisp/textmodes/bibtex.el,v |
Date: |
Sun, 17 Feb 2008 21:02:29 +0000 |
CVSROOT: /sources/emacs
Module name: emacs
Changes by: Roland Winkler <winkler> 08/02/17 21:02:29
Index: bibtex.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/textmodes/bibtex.el,v
retrieving revision 1.132
retrieving revision 1.133
diff -u -b -r1.132 -r1.133
--- bibtex.el 9 Jan 2008 01:35:45 -0000 1.132
+++ bibtex.el 17 Feb 2008 21:02:29 -0000 1.133
@@ -935,7 +935,7 @@
Each rule should be of the form (REGEXP . SUBEXP), where SUBEXP
specifies which parenthesized expression in REGEXP is a cited key.
Case is significant.
-Used by `bibtex-find-crossref' and for font-locking."
+Used by `bibtex-search-crossref' and for font-locking."
:group 'bibtex
:type '(repeat (cons (regexp :tag "Regexp")
(integer :tag "Number"))))
@@ -978,8 +978,8 @@
(define-key km "\C-c}" 'bibtex-remove-delimiters)
(define-key km "\C-c\C-c" 'bibtex-clean-entry)
(define-key km "\C-c\C-q" 'bibtex-fill-entry)
- (define-key km "\C-c\C-s" 'bibtex-find-entry)
- (define-key km "\C-c\C-x" 'bibtex-find-crossref)
+ (define-key km "\C-c\C-s" 'bibtex-search-entry)
+ (define-key km "\C-c\C-x" 'bibtex-search-crossref)
(define-key km "\C-c\C-t" 'bibtex-copy-summary-as-kill)
(define-key km "\C-c?" 'bibtex-print-help-message)
(define-key km "\C-c\C-p" 'bibtex-pop-previous)
@@ -1035,8 +1035,8 @@
"--"
["Make Entry Visible" bibtex-reposition-window t])
("Moving in BibTeX Buffers"
- ["Find Entry" bibtex-find-entry t]
- ["Find Crossref Entry" bibtex-find-crossref t])
+ ["Search Entry" bibtex-search-entry t]
+ ["Search Crossref Entry" bibtex-search-crossref t])
"--"
("Operating on Current Field"
["Fill Field" fill-paragraph t]
@@ -1546,7 +1546,7 @@
(setq bounds (bibtex-search-forward-field
"\\(OPT\\)?crossref" end))))
(let ((crossref-field (bibtex-text-in-field-bounds bounds t)))
- (if (bibtex-find-crossref crossref-field)
+ (if (bibtex-search-crossref crossref-field)
;; Do not pass FOLLOW-CROSSREF because we want
;; to follow crossrefs only one level of recursion.
(bibtex-text-in-field field))))))))
@@ -1887,9 +1887,6 @@
(setq bibtex-field-strings-opt
(bibtex-field-re-init bibtex-field-strings-alist 'strings)))
- (save-excursion
- (save-restriction
- (bibtex-narrow-to-entry)
(let ((case-fold-search t)
(format (if (eq bibtex-entry-format t)
'(realign opts-or-alts required-fields numerical-fields
@@ -1897,13 +1894,20 @@
last-comma delimiters unify-case braces
strings)
bibtex-entry-format))
- bounds crossref-key req-field-list default-field-list field-list)
+ bounds crossref-key req-field-list default-field-list field-list
+ alt-fields error-field-name)
+ (unwind-protect
+ ;; formatting (undone if error occurs)
+ (atomic-change-group
+ (save-excursion
+ (save-restriction
+ (bibtex-narrow-to-entry)
;; There are more elegant high-level functions for several tasks
;; done by `bibtex-format-entry'. However, they contain some
;; redundancy compared with what we need to do anyway.
;; So for speed-up we avoid using them.
- ;; (`bibtex-format-entry' is called many times by `bibtex-reformat'.)
+ ;; (`bibtex-format-entry' is called often by `bibtex-reformat'.)
;; identify entry type
(goto-char (point-min))
@@ -1961,6 +1965,10 @@
(empty-field (equal "" (bibtex-text-in-field-bounds bounds
t)))
deleted)
+ ;; keep track of alternatives
+ (if (nth 3 (assoc-string field-name req-field-list t))
+ (push field-name alt-fields))
+
(if (memq 'opts-or-alts format)
;; delete empty optional and alternative fields
;; (but keep empty required fields)
@@ -2039,8 +2047,8 @@
(goto-char beg)
(insert "{")))))
- ;; replace field text by BibTeX string constants according to
- ;; `bibtex-field-strings-alist'.
+ ;; replace field text by BibTeX string constants
+ ;; according to `bibtex-field-strings-alist'.
(when (and (memq 'strings format)
(setq temp (cdr (assoc-string field-name
bibtex-field-strings-opt t))))
@@ -2069,7 +2077,7 @@
(let ((title (save-excursion
(save-restriction
(widen)
- (if (bibtex-find-entry crossref-key t)
+ (if (bibtex-search-entry crossref-key
t)
(bibtex-text-in-field "title"))))))
(when title
(setq empty-field nil)
@@ -2077,9 +2085,10 @@
(insert title))))
;; if empty field is a required field, complain
- (if (and empty-field
+ (when (and empty-field
(memq 'required-fields format)
(assoc-string field-name req-field-list t))
+ (setq error-field-name field-name)
(error "Mandatory field `%s' is empty" field-name))
;; unify case of field name
@@ -2109,9 +2118,13 @@
(error "Mandatory field `%s' is missing" (car fname)))))
(if alt-list
(cond ((= found 0)
+ (if alt-fields
+ (setq error-field-name (car (last
alt-fields))))
(error "Alternative mandatory field `%s' is missing"
alt-list))
((> found 1)
+ (if alt-fields
+ (setq error-field-name (car (last
alt-fields))))
(error "Alternative fields `%s' are defined %s times"
alt-list found))))))
@@ -2134,7 +2147,14 @@
;; realign and fill entry
(if (memq 'realign format)
- (bibtex-fill-entry))))))
+ (bibtex-fill-entry)))))
+
+ ;; Unwindform: move to location where error occured if possible
+ (when error-field-name
+ (bibtex-beginning-of-entry)
+ (goto-char (bibtex-start-of-text-in-field
+ (bibtex-search-forward-field error-field-name)))
+ (bibtex-find-text)))))
(defun bibtex-field-re-init (regexp-alist type)
"Calculate optimized value for bibtex-regexp-TYPE-opt.
@@ -2425,6 +2445,7 @@
Return alist of keys if parsing was completed, `aborted' otherwise.
If `bibtex-parse-keys-fast' is non-nil, use fast but simplified algorithm
for parsing BibTeX keys. If parsing fails, try to set this variable to nil."
+ (if (eq major-mode 'bibtex-mode)
(let (ref-keys crossref-keys)
(save-excursion
(save-match-data
@@ -2440,7 +2461,7 @@
"\\(\"[^\"]*\"\\|{[^}]*}\\)[ \t\n]*[,})]")))
(while (re-search-forward re nil t)
(if (and abortable (input-pending-p))
- ;; user has aborted by typing a key --> return `aborted'
+ ;; user has aborted by typing a key: return `aborted'
(throw 'userkey 'aborted))
(cond ((match-end 3)
;; This is a crossref.
@@ -2464,7 +2485,7 @@
(lambda (key beg end)
(if (and abortable
(input-pending-p))
- ;; user has aborted by typing a key --> return `aborted'
+ ;; user has aborted by typing a key: return `aborted'
(throw 'userkey 'aborted))
(if verbose (bibtex-progress-message))
(unless (assoc key ref-keys)
@@ -2479,7 +2500,7 @@
(if verbose
(bibtex-progress-message 'done))
;; successful operation --> return `bibtex-reference-keys'
- (setq bibtex-reference-keys ref-keys))))))
+ (setq bibtex-reference-keys ref-keys)))))))
(defun bibtex-parse-strings (&optional add abortable)
"Set `bibtex-strings' to the string definitions in the whole buffer.
@@ -2700,7 +2721,7 @@
Use `bibtex-summary-function' to generate summary."
(save-excursion
(if (and (stringp key)
- (bibtex-find-entry key t))
+ (bibtex-search-entry key t))
(message "Ref: %s" (funcall bibtex-summary-function)))))
(defun bibtex-copy-summary-as-kill (&optional arg)
@@ -2856,7 +2877,7 @@
(setq start (1+ (match-beginning 1))
end (1- (match-end 1))
found (>= start pnt)))
- (if found (bibtex-button start end 'bibtex-find-crossref
+ (if found (bibtex-button start end 'bibtex-search-crossref
(buffer-substring-no-properties start end)
start t))
found))
@@ -2869,7 +2890,7 @@
(if (re-search-forward (car matcher) bound t)
(let ((start (match-beginning (cdr matcher)))
(end (match-end (cdr matcher))))
- (bibtex-button start end 'bibtex-find-crossref
+ (bibtex-button start end 'bibtex-search-crossref
(buffer-substring-no-properties start end)
start t t)
t))))
@@ -2884,9 +2905,9 @@
'bibtex-function 'bibtex-url
'help-echo (purecopy "mouse-2, RET: follow URL"))
-(define-button-type 'bibtex-find-crossref
+(define-button-type 'bibtex-search-crossref
'action 'bibtex-button-action
- 'bibtex-function 'bibtex-find-crossref
+ 'bibtex-function 'bibtex-search-crossref
'help-echo (purecopy "mouse-2, RET: follow crossref"))
(defun bibtex-button (beg end type &rest args)
@@ -3452,7 +3473,7 @@
nil ; ENDKEY function
'bibtex-lessp)) ; PREDICATE
-(defun bibtex-find-crossref (crossref-key &optional pnt split noerror)
+(defun bibtex-search-crossref (crossref-key &optional pnt split noerror)
"Move point to the beginning of BibTeX entry CROSSREF-KEY.
If `bibtex-files' is non-nil, search all these files.
Otherwise the search is limited to the current buffer.
@@ -3497,7 +3518,7 @@
(let (buffer pos eqb)
(save-excursion
- (setq pos (bibtex-find-entry crossref-key t)
+ (setq pos (bibtex-search-entry crossref-key t)
buffer (current-buffer)))
(setq eqb (eq buffer (current-buffer)))
(cond ((not pos)
@@ -3514,13 +3535,15 @@
(beginning-of-line)
(if (and eqb (> pnt pos) (not noerror))
(error "The referencing entry must precede the crossrefed
entry!"))))
- ;; `bibtex-find-crossref' is called noninteractively during
+ ;; `bibtex-search-crossref' is called noninteractively during
;; clean-up of an entry. Then it is not possible to check
;; whether the current entry and the crossrefed entry have
;; the correct sorting order.
(eqb (goto-char pos))
(t (set-buffer buffer) (goto-char pos)))
pos))
+;; backward compatibility
+(defalias 'bibtex-find-crossref 'bibtex-search-crossref)
(defun bibtex-dist (pos beg end)
"Return distance between POS and region delimited by BEG and END."
@@ -3528,26 +3551,30 @@
((< pos beg) (- beg pos))
(t (- pos end))))
-(defun bibtex-find-entry (key &optional global start display)
+;;;###autoload
+(defun bibtex-search-entry (key &optional global start display)
"Move point to the beginning of BibTeX entry named KEY.
Return position of entry if KEY is found or nil if not found.
-With prefix arg GLOBAL non-nil, search KEY in `bibtex-files'.
-Otherwise the search is limited to the current buffer.
-Optional arg START is buffer position where the search starts.
-If it is nil, start search at beginning of buffer.
+With GLOBAL non-nil, search KEY in `bibtex-files'. Otherwise the search
+is limited to the current buffer. Optional arg START is buffer position
+where the search starts. If it is nil, start search at beginning of buffer.
If DISPLAY is non-nil, display the buffer containing KEY.
-Otherwise, use `set-buffer'. DISPLAY is t when called interactively."
- (interactive (list (bibtex-read-key "Find key: " nil current-prefix-arg)
- current-prefix-arg nil t))
+Otherwise, use `set-buffer'.
+When called interactively, GLOBAL is t if there is a prefix arg or the current
+mode is not `bibtex-mode', START is nil, and DISPLAY is t."
+ (interactive
+ (let ((global (or current-prefix-arg (not (eq major-mode 'bibtex-mode)))))
+ (list (bibtex-read-key "Find key: " nil global) global nil t)))
(if (and global bibtex-files)
(let ((buffer-list (bibtex-initialize t))
buffer found)
(while (and (not found)
(setq buffer (pop buffer-list)))
(with-current-buffer buffer
- (if (cdr (assoc-string key bibtex-reference-keys))
- ;; `bibtex-find-entry' moves point if key found
- (setq found (bibtex-find-entry key)))))
+ (if (and (listp bibtex-reference-keys)
+ (cdr (assoc-string key bibtex-reference-keys)))
+ ;; `bibtex-search-entry' moves point if key found
+ (setq found (bibtex-search-entry key)))))
(cond ((and found display)
(let ((same-window-buffer-names
(cons (buffer-name buffer) same-window-buffer-names)))
@@ -3572,6 +3599,8 @@
(if display (bibtex-reposition-window)))
(display (message "Key `%s' not found" key)))
pnt)))
+;; backward compatibility
+(defalias 'bibtex-find-entry 'bibtex-search-entry)
(defun bibtex-prepare-new-entry (index)
"Prepare a new BibTeX entry with index INDEX.
@@ -3590,7 +3619,7 @@
(cond ((or (null key)
(and (stringp key)
(string-equal key ""))
- (and (not (setq key-exist (bibtex-find-entry key)))
+ (and (not (setq key-exist (bibtex-search-entry key)))
(not bibtex-maintain-sorted-entries)))
(bibtex-move-outside-of-entry))
;; if key-exist is non-nil due to the previous cond clause
@@ -3708,7 +3737,7 @@
(dolist (key (with-current-buffer buffer bibtex-reference-keys))
(when (and (cdr key)
(cdr (assoc-string (car key) bibtex-reference-keys)))
- (bibtex-find-entry (car key))
+ (bibtex-search-entry (car key))
(push (cons (bibtex-current-line)
(format "Duplicate key `%s' in %s" (car key)
(abbreviate-file-name (buffer-file-name
buffer))))
@@ -3830,7 +3859,7 @@
(dolist (buffer buffer-list)
(dolist (key (cdr (assq buffer buffer-key-list)))
(when (assoc-string key current-keys)
- (bibtex-find-entry key)
+ (bibtex-search-entry key)
(push (format "%s:%d: Duplicate key `%s' in %s\n"
(buffer-file-name) (bibtex-current-line) key
(abbreviate-file-name (buffer-file-name buffer)))
@@ -4143,15 +4172,13 @@
(error "Not inside a BibTeX entry")))
(entry-type (bibtex-type-in-head))
(key (bibtex-key-in-head)))
- ;; formatting (undone if error occurs)
- (atomic-change-group
(cond ((bibtex-string= entry-type "preamble")
;; (bibtex-format-preamble)
(error "No clean up of @Preamble entries"))
((bibtex-string= entry-type "string")
(setq entry-type 'string))
;; (bibtex-format-string)
- (t (bibtex-format-entry))))
+ (t (bibtex-format-entry)))
;; set key
(when (or new-key (not key))
(setq key (bibtex-generate-autokey))
@@ -4190,9 +4217,9 @@
(setq error (not (bibtex-prepare-new-entry index))
start (point)) ; update start
(save-excursion (insert entry)))
- (bibtex-find-entry key)
+ (bibtex-search-entry key)
(setq error (or (/= (point) start)
- (bibtex-find-entry key nil end))))
+ (bibtex-search-entry key nil end))))
(if error
(error "New inserted entry yields duplicate key"))
(dolist (buffer (bibtex-initialize))
- [Emacs-diffs] Changes to emacs/lisp/textmodes/bibtex.el,v,
Roland Winkler <=