emacs-diffs
[Top][All Lists]
Advanced

[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))




reply via email to

[Prev in Thread] Current Thread [Next in Thread]