Add 2012 to FSF copyright years for Emacs files
[bpt/emacs.git] / lisp / textmodes / reftex-cite.el
index e16aef9..31001c7 100644 (file)
@@ -1,11 +1,11 @@
 ;;; reftex-cite.el --- creating citations with RefTeX
 
-;; Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
-;;   2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1997-2012 Free Software Foundation, Inc.
 
 ;; Author: Carsten Dominik <dominik@science.uva.nl>
 ;; Maintainer: auctex-devel@gnu.org
 ;; Version: 4.31
+;; Package: reftex
 
 ;; This file is part of GNU Emacs.
 
   (unless (eq (get 'reftex-default-bibliography :reftex-raw)
               reftex-default-bibliography)
     (put 'reftex-default-bibliography :reftex-expanded
-         (reftex-locate-bibliography-files 
+         (reftex-locate-bibliography-files
           default-directory reftex-default-bibliography))
     (put 'reftex-default-bibliography :reftex-raw
          reftex-default-bibliography))
   (get 'reftex-default-bibliography :reftex-expanded))
 
 (defun reftex-bib-or-thebib ()
-  ;; Tests if BibTeX or \begin{tehbibliography} should be used for the
+  ;; Tests if BibTeX or \begin{thebibliography} should be used for the
   ;; citation
   ;; Find the bof of the current file
   (let* ((docstruct (symbol-value reftex-docstruct-symbol))
   ;; If RETURN is non-nil, just return the entry and restore point.
 
   (let* ((re
-          (if item 
+          (if item
               (concat "\\\\bibitem\\(\\[[^]]*\\]\\)?{" (regexp-quote key) "}")
             (concat "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*" (regexp-quote key)
                     "[, \t\r\n}]")))
           (when return
             ;; Just return the relevant entry
             (if item (goto-char (match-end 0)))
-            (setq return (buffer-substring 
+            (setq return (buffer-substring
                           (point) (reftex-end-of-bib-entry item)))
            (goto-char oldpos) ;; restore point.
             (set-buffer buffer-conf)
         (error "No BibTeX entry with citation key %s" key)))))
 
 (defun reftex-end-of-bib-entry (item)
-  (save-excursion 
+  (save-excursion
     (condition-case nil
-        (if item 
+        (if item
             (progn (end-of-line)
                    (re-search-forward
                     "\\\\bibitem\\|\\end{thebibliography}")
 
     ;; Read a regexp, completing on known citation keys.
     (setq default (regexp-quote (reftex-get-bibkey-default)))
-    (setq re-list 
-          (split-string 
-           (completing-read 
+    (setq re-list
+          (split-string
+           (completing-read
             (concat
              "Regex { && Regex...}: "
              "[" default "]: ")
             (if reftex-mode
                 (if (fboundp 'LaTeX-bibitem-list)
                     (LaTeX-bibitem-list)
-                  (cdr (assoc 'bibview-cache 
+                  (cdr (assoc 'bibview-cache
                               (symbol-value reftex-docstruct-symbol))))
               nil)
             nil nil nil 'reftex-cite-regexp-hist)
                    (error (goto-char key-point)
                           (throw 'search-again nil)))
                  (setq end-point (point))
-                 
+
                  ;; Ignore @string, @comment and @c entries or things
                  ;; outside entries
                  (when (or (string= (downcase (match-string 2)) "string")
                            (< (point) key-point)) ; this means match not in {}
                    (goto-char key-point)
                    (throw 'search-again nil))
-                 
+
                  ;; Well, we have got a match
                  ;;(setq entry (concat
                  ;;             (buffer-substring start-point (point)) "\n"))
                  (setq entry (buffer-substring start-point (point)))
-                 
+
                  ;; Check if other regexp match as well
                  (setq re-list rest-re)
                  (while re-list
                      ;; nope - move on
                      (throw 'search-again nil))
                    (pop re-list))
-                 
+
                  (setq alist (reftex-parse-bibtex-entry
                               nil start-point end-point))
                  (push (cons "&entry" entry) alist)
-                 
+
                  ;; check for crossref entries
                  (if (assoc "crossref" alist)
                      (setq alist
                            (append
                             alist (reftex-get-crossref-alist alist))))
-                 
+
                  ;; format the entry
                  (push (cons "&formatted" (reftex-format-bib-entry alist))
                        alist)
-                 
+
                  ;; make key the first element
                  (push (reftex-get-bib-field "&key" alist) alist)
-                 
+
                  ;; add it to the list
                  (push alist found-list)))))
           (reftex-kill-temporary-buffers))))
     (unless files
       (error "Need file name to find thebibliography environment"))
     (while (setq file (pop files))
-      (setq buf (reftex-get-file-buffer-force 
+      (setq buf (reftex-get-file-buffer-force
                  file (not reftex-keep-temporary-buffers)))
       (unless buf
         (error "No such file %s" file))
       (message "Scanning thebibliography environment in %s" file)
 
-      (save-excursion
-        (set-buffer buf)
-        (save-restriction
-          (widen)
-          (goto-char (point-min))
-          (while (re-search-forward 
-                  "\\(\\`\\|[\n\r]\\)[ \t]*\\\\begin{thebibliography}" nil t)
-            (beginning-of-line 2)
-            (setq start (point))
-            (if (re-search-forward 
-                 "\\(\\`\\|[\n\r]\\)[ \t]*\\\\end{thebibliography}" nil t)
-                (progn
-                  (beginning-of-line 1)
-                  (setq end (point))))
-            (when (and start end)
-              (setq entries 
-                    (append entries
-                      (mapcar 'reftex-parse-bibitem
-                        (delete ""
-                                (split-string 
-                                 (buffer-substring-no-properties start end)
-                                 "[ \t\n\r]*\\\\bibitem\\(\\[[^]]*]\\)*"))))))
-            (goto-char end)))))
+      (with-current-buffer buf
+       (save-excursion
+         (save-restriction
+           (widen)
+           (goto-char (point-min))
+           (while (re-search-forward
+                   "\\(\\`\\|[\n\r]\\)[ \t]*\\\\begin{thebibliography}" nil t)
+             (beginning-of-line 2)
+             (setq start (point))
+             (if (re-search-forward
+                  "\\(\\`\\|[\n\r]\\)[ \t]*\\\\end{thebibliography}" nil t)
+                 (progn
+                   (beginning-of-line 1)
+                   (setq end (point))))
+             (when (and start end)
+               (setq entries
+                     (append entries
+                             (mapcar 'reftex-parse-bibitem
+                                     (delete ""
+                                             (split-string
+                                              (buffer-substring-no-properties
+                                               start end)
+                                              "[ \t\n\r]*\\\\bibitem[ \t]*\
+\\(\\[[^]]*]\\)*\[ \t]*"))))))
+             (goto-char end))))))
     (unless entries
       (error "No bibitems found"))
 
     ;; Read a regexp, completing on known citation keys.
     (setq default (regexp-quote (reftex-get-bibkey-default)))
-    (setq re-list 
-          (split-string 
-           (completing-read 
+    (setq re-list
+          (split-string
+           (completing-read
             (concat
              "Regex { && Regex...}: "
              "[" default "]: ")
             (if reftex-mode
                 (if (fboundp 'LaTeX-bibitem-list)
                     (LaTeX-bibitem-list)
-                  (cdr (assoc 'bibview-cache 
+                  (cdr (assoc 'bibview-cache
                               (symbol-value reftex-docstruct-symbol))))
               nil)
             nil nil nil 'reftex-cite-regexp-hist)
         (error "Empty regular expression"))
 
     (while (and (setq re (pop re-list)) entries)
-      (setq entries 
+      (setq entries
             (delq nil (mapcar
                        (lambda (x)
                          (if (string-match re (cdr (assoc "&entry" x)))
                              x nil))
                        entries))))
-    (setq entries 
-          (mapcar 
+    (setq entries
+          (mapcar
             (lambda (x)
               (push (cons "&formatted" (reftex-format-bibitem x)) x)
               (push (reftex-get-bib-field "&key" x) x)
@@ -653,12 +655,12 @@ While entering the regexp, completion on knows citation keys is possible.
 
     (when (eq (car selected-entries) 'concat)
       ;; All keys go into a single command - we need to trick a little
-      ;; FIXME: Unfortunately, this meens that commenting does not work right.
+      ;; FIXME: Unfortunately, this means that commenting does not work right.
       (pop selected-entries)
       (let ((concat-keys (mapconcat 'car selected-entries ",")))
-        (setq insert-entries 
+        (setq insert-entries
               (list (list concat-keys (cons "&key" concat-keys))))))
-    
+
     (unless no-insert
 
       ;; We shall insert this into the buffer...
@@ -685,7 +687,7 @@ While entering the regexp, completion on knows citation keys is possible.
         ;; it has to go.  If there is only a single arg and empty, it can go
         ;; as well.
         (when reftex-cite-cleanup-optional-args
-          (cond 
+          (cond
            ((string-match "\\([a-zA-Z0-9]\\)\\[\\]{" string)
             (setq string (replace-match "\\1{" nil nil string)))
            ((string-match "\\[\\]\\(\\[[a-zA-Z0-9., ]+\\]\\)" string)
@@ -724,7 +726,7 @@ While entering the regexp, completion on knows citation keys is possible.
             (decf arg)
             (reftex-do-citation arg))
         (forward-char 1)))
-    
+
     ;; Return the citation key
     (car (car selected-entries))))
 
@@ -738,7 +740,7 @@ While entering the regexp, completion on knows citation keys is possible.
      (no-insert
       ;; Format does not really matter because nothing will be inserted.
       (setq format "%l"))
-     
+
      ((and (stringp macro)
            (string-match "\\`\\\\cite\\|cite\\'" macro))
       ;; We are already inside a cite macro
@@ -759,7 +761,7 @@ While entering the regexp, completion on knows citation keys is possible.
       (when (listp format)
         (setq key
               (or format-key
-                  (reftex-select-with-char 
+                  (reftex-select-with-char
                    "" (concat "SELECT A CITATION FORMAT\n\n"
                               (mapconcat
                                (lambda (x)
@@ -788,8 +790,8 @@ While entering the regexp, completion on knows citation keys is possible.
 
   (let ((bibtype (reftex-bib-or-thebib))
         found-list rtn key data selected-entries)
-    (while 
-        (not 
+    (while
+        (not
          (catch 'done
            ;; Scan bibtex files
            (setq found-list
@@ -804,31 +806,30 @@ While entering the regexp, completion on knows citation keys is possible.
                 (reftex-extract-bib-entries-from-thebibliography
                  (reftex-uniquify
                   (mapcar 'cdr
-                          (reftex-all-assq 
+                          (reftex-all-assq
                            'thebib (symbol-value reftex-docstruct-symbol))))))
                (reftex-default-bibliography
                 (message "Using default bibliography")
                 (reftex-extract-bib-entries (reftex-default-bibliography)))
                (t (error "No valid bibliography in this document, and no default available"))))
-           
+
            (unless found-list
              (error "Sorry, no matches found"))
-    
+
           ;; Remember where we came from
           (setq reftex-call-back-to-this-buffer (current-buffer))
           (set-marker reftex-select-return-marker (point))
-    
+
           ;; Offer selection
           (save-window-excursion
             (delete-other-windows)
-            (let ((default-major-mode 'reftex-select-bib-mode))
-              (reftex-kill-buffer "*RefTeX Select*")
-              (switch-to-buffer-other-window "*RefTeX Select*")
-              (unless (eq major-mode 'reftex-select-bib-mode)
-                (reftex-select-bib-mode))
-              (let ((buffer-read-only nil))
-                (erase-buffer)
-                (reftex-insert-bib-matches found-list)))
+            (reftex-kill-buffer "*RefTeX Select*")
+            (switch-to-buffer-other-window "*RefTeX Select*")
+            (unless (eq major-mode 'reftex-select-bib-mode)
+              (reftex-select-bib-mode))
+            (let ((buffer-read-only nil))
+              (erase-buffer)
+              (reftex-insert-bib-matches found-list))
             (setq buffer-read-only t)
             (if (= 0 (buffer-size))
                 (error "No matches found"))
@@ -858,15 +859,15 @@ While entering the regexp, completion on knows citation keys is possible.
                 (goto-char 1))
                ((eq key ?A)
                 ;; Take all (marked)
-                (setq selected-entries 
+                (setq selected-entries
                       (if reftex-select-marked
                           (mapcar 'car (nreverse reftex-select-marked))
                         found-list))
                 (throw 'done t))
                ((eq key ?a)
                 ;; Take all (marked), and push the symbol 'concat
-                (setq selected-entries 
-                      (cons 'concat 
+                (setq selected-entries
+                      (cons 'concat
                             (if reftex-select-marked
                                 (mapcar 'car (nreverse reftex-select-marked))
                               found-list)))
@@ -885,9 +886,9 @@ While entering the regexp, completion on knows citation keys is possible.
                ((or (eq key ?\C-m)
                     (eq key 'return))
                 ;; Take selected
-                (setq selected-entries 
+                (setq selected-entries
                       (if reftex-select-marked
-                          (cons 'concat 
+                          (cons 'concat
                                 (mapcar 'car (nreverse reftex-select-marked)))
                         (if data (list data) nil)))
                 (throw 'done t))
@@ -927,7 +928,7 @@ While entering the regexp, completion on knows citation keys is possible.
   (let ((file (read-file-name "File to create: ")))
     (find-file-other-window file)
     (if (> (buffer-size) 0)
-        (unless (yes-or-no-p 
+        (unless (yes-or-no-p
                  (format "Overwrite non-empty file %s? " file))
           (error "Abort")))
     (erase-buffer)
@@ -1047,7 +1048,7 @@ While entering the regexp, completion on knows citation keys is possible.
 (defun reftex-make-cite-echo-string (entry docstruct-symbol)
   ;; Format a bibtex entry for the echo area and cache the result.
   (let* ((key (reftex-get-bib-field "&key" entry))
-         (string 
+         (string
           (let* ((reftex-cite-punctuation '(" " " & " " etal.")))
             (reftex-format-citation entry reftex-cite-view-format)))
          (cache (assq 'bibview-cache (symbol-value docstruct-symbol)))
@@ -1077,8 +1078,7 @@ While entering the regexp, completion on knows citation keys is possible.
         bibfile-list item bibtype)
 
     (catch 'exit
-      (save-excursion
-        (set-buffer reftex-call-back-to-this-buffer)
+      (with-current-buffer reftex-call-back-to-this-buffer
         (setq bibtype (reftex-bib-or-thebib))
         (cond
          ((eq bibtype 'bib)
@@ -1089,7 +1089,7 @@ While entering the regexp, completion on knows citation keys is possible.
           (setq bibfile-list
                 (reftex-uniquify
                  (mapcar 'cdr
-                         (reftex-all-assq 
+                         (reftex-all-assq
                           'thebib (symbol-value reftex-docstruct-symbol))))
                 item t))
          (reftex-default-bibliography
@@ -1100,17 +1100,17 @@ While entering the regexp, completion on knows citation keys is possible.
         (setq bibfile-list (reftex-visited-files bibfile-list)))
 
       (condition-case nil
-          (reftex-pop-to-bibtex-entry 
+          (reftex-pop-to-bibtex-entry
            key bibfile-list (not reftex-keep-temporary-buffers) t item)
         (error (ding))))
-      
+
     (select-window win)))
 
 ;;; Global BibTeX file
 (defun reftex-all-used-citation-keys ()
   (reftex-access-scan-info)
   (let ((files (reftex-all-document-files)) file keys kk k)
-    (save-excursion
+    (save-current-buffer
       (while (setq file (pop files))
         (set-buffer (reftex-get-file-buffer-force file 'mark))
         (save-excursion
@@ -1132,13 +1132,13 @@ While entering the regexp, completion on knows citation keys is possible.
   "Create a new BibTeX database file with all entries referenced in document.
 The command prompts for a filename and writes the collected entries to
 that file.  Only entries referenced in the current document with
-any \\cite-like macros are used. 
+any \\cite-like macros are used.
 The sequence in the new file is the same as it was in the old database."
   (interactive "FNew BibTeX file: ")
   (let ((keys (reftex-all-used-citation-keys))
         (files (reftex-get-bibfile-list))
         file key entries beg end entry)
-    (save-excursion
+    (save-current-buffer
       (while (setq file (pop files))
         (set-buffer (reftex-get-file-buffer-force file 'mark))
         (reftex-with-special-syntax-for-bib
@@ -1146,9 +1146,8 @@ The sequence in the new file is the same as it was in the old database."
            (save-restriction
              (widen)
              (goto-char (point-min))
-             (while (re-search-forward 
-                     "^[ \t]*@[a-zA-Z]+[ \t]*{\\([^ \t\r\n]+\\),"
-                     nil t)
+             (while (re-search-forward "^[ \t]*@\\(?:\\w\\|\\s_\\)+[ \t\n\r]*\
+\[{(][ \t\n\r]*\\([^ \t\n\r,]+\\)" nil t)
                (setq key (match-string 1)
                      beg (match-beginning 0)
                      end (progn
@@ -1163,7 +1162,7 @@ The sequence in the new file is the same as it was in the old database."
                        keys (delete key keys)))))))))
     (find-file-other-window bibfile)
     (if (> (buffer-size) 0)
-        (unless (yes-or-no-p 
+        (unless (yes-or-no-p
                  (format "Overwrite non-empty file %s? " bibfile))
           (error "Abort")))
     (erase-buffer)
@@ -1174,5 +1173,4 @@ The sequence in the new file is the same as it was in the old database."
              (length entries))))
 
 
-;; arch-tag: d53d0a5a-ab32-4b52-a846-2a7c3527cd89
 ;;; reftex-cite.el ends here