Mercurial > emacs
changeset 27170:3cba3e588544
renamed reftex-vcr.el to reftex-dcr.el
author | Carsten Dominik <dominik@science.uva.nl> |
---|---|
date | Wed, 05 Jan 2000 09:15:48 +0000 |
parents | 88db110ec82e |
children | 9bbf5e11a633 |
files | lisp/textmodes/reftex-dcr.el lisp/textmodes/reftex-vcr.el lisp/textmodes/reftex.el |
diffstat | 3 files changed, 479 insertions(+), 478 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lisp/textmodes/reftex-dcr.el Wed Jan 05 09:15:48 2000 +0000 @@ -0,0 +1,475 @@ +;;; reftex-dcr.el - Viewing cross references and citations with RefTeX +;; Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. + +;; Author: Carsten Dominik <dominik@strw.LeidenUniv.nl> +;; Version: 4.9 +;; Keywords: tex + +;; This file is part of GNU Emacs. + +;; GNU Emacs is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; 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 +;; along with GNU Emacs; see the file COPYING. If not, write to the +;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(eval-when-compile (require 'cl)) +(provide 'reftex-vcr) +(provide 'reftex-dcr) +(require 'reftex) +;;; + +(defun reftex-view-crossref (&optional arg auto-how) + "View cross reference of macro at point. Point must be on the KEY +argument. When at at `\ref' macro, show corresponding `\label' +definition, also in external documents (`xr'). When on a label, show +a locations where KEY is referenced. Subsequent calls find additional +locations. When on a `\cite', show the associated `\bibitem' macro or +the BibTeX database entry. When on a `\bibitem', show a `\cite' macro +which uses this KEY. When on an `\index', show other locations marked +by the same index entry. +To define additional cross referencing items, use the option +`reftex-view-crossref-extra'. See also `reftex-view-crossref-from-bibtex'. +With one or two C-u prefixes, enforce rescanning of the document. +With argument 2, select the window showing the cross reference. +AUTO-HOW is only for the automatic crossref display and is handed through +to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'." + + (interactive "P") + ;; See where we are. + (let* ((macro (car (reftex-what-macro-safe 1))) + (key (reftex-this-word "^{}%\n\r,")) + dw) + + (if (or (null macro) (reftex-in-comment)) + (error "Not on a crossref macro argument")) + + (setq reftex-call-back-to-this-buffer (current-buffer)) + + (cond + ((string-match "\\`\\\\cite\\|cite\\*?\\'" macro) + ;; A citation macro: search for bibitems or BibTeX entries + (setq dw (reftex-view-cr-cite arg key auto-how))) + ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro) + ;; A reference macro: search for labels + (setq dw (reftex-view-cr-ref arg key auto-how))) + (auto-how nil) ;; No further action for automatic display (speed) + ((or (equal macro "\\label") + (member macro reftex-macros-with-labels)) + ;; A label macro: search for reference macros + (reftex-access-scan-info arg) + (setq dw (reftex-view-regexp-match + (format reftex-find-reference-format (regexp-quote key)) + 4 nil nil))) + ((equal macro "\\bibitem") + ;; A bibitem macro: search for citations + (reftex-access-scan-info arg) + (setq dw (reftex-view-regexp-match + (format reftex-find-citation-regexp-format (regexp-quote key)) + 3 nil nil))) + ((member macro reftex-macros-with-index) + (reftex-access-scan-info arg) + (setq dw (reftex-view-regexp-match + (format reftex-find-index-entry-regexp-format + (regexp-quote key)) + 3 nil nil))) + (t + (reftex-access-scan-info arg) + (catch 'exit + (let ((list reftex-view-crossref-extra) + entry mre action group) + (while (setq entry (pop list)) + (setq mre (car entry) + action (nth 1 entry) + group (nth 2 entry)) + (when (string-match mre macro) + (setq dw (reftex-view-regexp-match + (format action key) group nil nil)) + (throw 'exit t)))) + (error "Not on a crossref macro argument")))) + (if (and (eq arg 2) (windowp dw)) (select-window dw)))) + +(defun reftex-view-cr-cite (arg key how) + ;; View crossreference of a ref cite. HOW can have the values + ;; nil: Show in another window. + ;; echo: Show one-line info in echo area. + ;; tmp-window: Show in small window and arrange for window to disappear. + + ;; Ensure access to scanning info + (reftex-access-scan-info (or arg current-prefix-arg)) + + (if (eq how 'tmp-window) + ;; Remember the window configuration + (put 'reftex-auto-view-crossref 'last-window-conf + (current-window-configuration))) + + (let (files size item (pos (point)) (win (selected-window)) pop-win) + ;; Find the citation mode and the file list + (cond + ((assq 'bib (symbol-value reftex-docstruct-symbol)) + (setq item nil + files (reftex-get-bibfile-list))) + ((assq 'thebib (symbol-value reftex-docstruct-symbol)) + (setq item t + files (reftex-uniquify + (mapcar 'cdr + (reftex-all-assq + 'thebib (symbol-value reftex-docstruct-symbol)))))) + (reftex-default-bibliography + (setq item nil + files (reftex-default-bibliography))) + (how) ;; don't throw for special display + (t (error "Cannot display crossref"))) + + (if (eq how 'echo) + ;; Display in Echo area + (reftex-echo-cite key files item) + ;; Display in a window + (if (not (eq how 'tmp-window)) + ;; Normal display + (reftex-pop-to-bibtex-entry key files nil t item) + ;; A temporary window + (condition-case nil + (reftex-pop-to-bibtex-entry key files nil t item) + (error (goto-char pos) + (message "cite: no such citation key %s" key) + (error ""))) + ;; Resize the window + (setq size (max 1 (count-lines (point) + (reftex-end-of-bib-entry item)))) + (let ((window-min-height 2)) + (shrink-window (1- (- (window-height) size))) + (recenter 0)) + ;; Arrange restoration + (add-hook 'pre-command-hook 'reftex-restore-window-conf)) + + ;; Normal display in other window + (add-hook 'pre-command-hook 'reftex-highlight-shall-die) + (setq pop-win (selected-window)) + (select-window win) + (goto-char pos) + (when (equal arg 2) + (select-window pop-win))))) + +(defun reftex-view-cr-ref (arg label how) + ;; View crossreference of a ref macro. HOW can have the values + ;; nil: Show in another window. + ;; echo: Show one-line info in echo area. + ;; tmp-window: Show in small window and arrange for window to disappear. + + ;; Ensure access to scanning info + (reftex-access-scan-info (or arg current-prefix-arg)) + + (if (eq how 'tmp-window) + ;; Remember the window configuration + (put 'reftex-auto-view-crossref 'last-window-conf + (current-window-configuration))) + + (let* ((xr-data (assoc 'xr (symbol-value reftex-docstruct-symbol))) + (xr-re (nth 2 xr-data)) + (entry (assoc label (symbol-value reftex-docstruct-symbol))) + (win (selected-window)) pop-win (pos (point))) + + (if (and (not entry) (stringp label) xr-re (string-match xr-re label)) + ;; Label is defined in external document + (save-excursion + (save-match-data + (set-buffer + (or (reftex-get-file-buffer-force + (cdr (assoc (match-string 1 label) (nth 1 + xr-data)))) + (error "Problem with external label %s" label)))) + (setq label (substring label (match-end 1))) + (reftex-access-scan-info) + (setq entry + (assoc label (symbol-value reftex-docstruct-symbol))))) + (if (eq how 'echo) + ;; Display in echo area + (reftex-echo-ref label entry (symbol-value reftex-docstruct-symbol)) + (let ((window-conf (current-window-configuration))) + (condition-case nil + (reftex-show-label-location entry t nil t t) + (error (set-window-configuration window-conf) + (message "ref: Label %s not found" label) + (error "ref: Label %s not found" label)))) ;; 2nd is line OK + (add-hook 'pre-command-hook 'reftex-highlight-shall-die) + + (when (eq how 'tmp-window) + ;; Resize window and arrange restauration + (shrink-window (1- (- (window-height) 9))) + (recenter '(4)) + (add-hook 'pre-command-hook 'reftex-restore-window-conf)) + (setq pop-win (selected-window)) + (select-window win) + (goto-char pos) + (when (equal arg 2) + (select-window pop-win))))) + +(defun reftex-mouse-view-crossref (ev) + "View cross reference of \\ref or \\cite macro where you click. +If the macro at point is a \\ref, show the corresponding label definition. +If it is a \\cite, show the BibTeX database entry. +If there is no such macro at point, search forward to find one. +With argument, actually select the window showing the cross reference." + (interactive "e") + (mouse-set-point ev) + (reftex-view-crossref current-prefix-arg)) + +(defun reftex-view-crossref-when-idle () + ;; Display info about crossref at point in echo area or a window. + ;; This function was desigend to work with an idle timer. + ;; We try to get out of here as quickly as possible if the call is useless. + (and reftex-mode + ;; Make sure message area is free if we need it. + (or (eq reftex-auto-view-crossref 'window) (not (current-message))) + ;; Make sure we are not already displaying this one + (not (memq last-command '(reftex-view-crossref + reftex-mouse-view-crossref))) + ;; Quick precheck if this might be a relevant spot + ;; FIXME: Can fail with backslash in comment + (save-excursion + (search-backward "\\" nil t) + (looking-at "\\\\[a-zA-Z]*\\(cite\\|ref\\)")) + + (condition-case nil + (let ((current-prefix-arg nil)) + (cond + ((eq reftex-auto-view-crossref t) + (reftex-view-crossref -1 'echo)) + ((eq reftex-auto-view-crossref 'window) + (reftex-view-crossref -1 'tmp-window)) + (t nil))) + (error nil)))) + +(defun reftex-restore-window-conf () + (set-window-configuration (get 'reftex-auto-view-crossref 'last-window-conf)) + (put 'reftex-auto-view-crossref 'last-window-conf nil) + (remove-hook 'pre-command-hook 'reftex-restore-window-conf)) + +(defun reftex-echo-ref (label entry docstruct) + ;; Display crossref info in echo area. + (cond + ((null docstruct) + (message (substitute-command-keys (format reftex-no-info-message "ref")))) + ((null entry) + (message "ref: unknown label: %s" label)) + (t + (when (stringp (nth 2 entry)) + (message "ref(%s): %s" (nth 1 entry) (nth 2 entry))) + (let ((buf (get-buffer " *Echo Area*"))) + (when buf + (save-excursion + (set-buffer buf) + (run-hooks 'reftex-display-copied-context-hook))))))) + +(defun reftex-echo-cite (key files item) + ;; Display citation info in echo area. + (let* ((cache (assq 'bibview-cache (symbol-value reftex-docstruct-symbol))) + (cache-entry (assoc key (cdr cache))) + entry string buf (all-files files)) + + (if (and reftex-cache-cite-echo cache-entry) + ;; We can just use the cache + (setq string (cdr cache-entry)) + + ;; Need to look in the database + (unless reftex-revisit-to-echo + (setq files (reftex-visited-files files))) + + (setq entry + (condition-case nil + (save-excursion + (reftex-pop-to-bibtex-entry key files nil nil item t)) + (error + (if (and files (= (length all-files) (length files))) + (message "cite: no such database entry: %s" key) + (message (substitute-command-keys + (format reftex-no-info-message "cite")))) + nil))) + (when entry + (if item + (setq string (reftex-nicify-text entry)) + (setq string (reftex-make-cite-echo-string + (reftex-parse-bibtex-entry entry) + reftex-docstruct-symbol))))) + (unless (or (null string) (equal string "")) + (message "cite: %s" string)) + (when (setq buf (get-buffer " *Echo Area*")) + (save-excursion + (set-buffer buf) + (run-hooks 'reftex-display-copied-context-hook))))) + +(defvar reftex-use-itimer-in-xemacs nil + "*Non-nil means use the idle timers in XEmacs for crossref display. +Currently, idle timer restart is broken and we use the post-command-hook.") + +(defun reftex-toggle-auto-view-crossref () + "Toggle the automatic display of crossref information in the echo area. +When active, leaving point idle in the argument of a \\ref or \\cite macro +will display info in the echo area." + (interactive) + (if reftex-auto-view-crossref-timer + (progn + (if (featurep 'xemacs) + (if reftex-use-itimer-in-xemacs + (delete-itimer reftex-auto-view-crossref-timer) + (remove-hook 'post-command-hook 'reftex-start-itimer-once)) + (cancel-timer reftex-auto-view-crossref-timer)) + (setq reftex-auto-view-crossref-timer nil) + (message "Automatic display of crossref information was turned off")) + (setq reftex-auto-view-crossref-timer + (if (featurep 'xemacs) + (if reftex-use-itimer-in-xemacs + (start-itimer "RefTeX Idle Timer" + 'reftex-view-crossref-when-idle + reftex-idle-time reftex-idle-time t) + (add-hook 'post-command-hook 'reftex-start-itimer-once) + t) + (run-with-idle-timer + reftex-idle-time t 'reftex-view-crossref-when-idle))) + (unless reftex-auto-view-crossref + (setq reftex-auto-view-crossref t)) + (message "Automatic display of crossref information was turned on"))) + +(defun reftex-start-itimer-once () + (and reftex-mode + (not (itimer-live-p reftex-auto-view-crossref-timer)) + (setq reftex-auto-view-crossref-timer + (start-itimer "RefTeX Idle Timer" + 'reftex-view-crossref-when-idle + reftex-idle-time nil t)))) + +(defun reftex-view-crossref-from-bibtex (&optional arg) + "View location in a LaTeX document which cites the BibTeX entry at point. +Since BibTeX files can be used by many LaTeX documents, this function +prompts upon first use for a buffer in RefTeX mode. To reset this +link to a document, call the function with with a prefix arg. +Calling this function several times find successive citation locations." + (interactive "P") + (when arg + ;; Break connection to reference buffer + (remprop 'reftex-bibtex-view-cite-locations :ref-buffer)) + (let ((ref-buffer (get 'reftex-bibtex-view-cite-locations :ref-buffer))) + ;; Establish connection to reference buffer + (unless ref-buffer + (setq ref-buffer + (save-excursion + (completing-read + "Reference buffer: " + (delq nil + (mapcar + (lambda (b) + (set-buffer b) + (if reftex-mode (list (buffer-name b)) nil)) + (buffer-list))) + nil t))) + (put 'reftex-bibtex-view-cite-locations :ref-buffer ref-buffer)) + ;; Search for citations + (bibtex-beginning-of-entry) + (if (looking-at + "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*\\([^, \t\r\n}]+\\)") + (progn + (goto-char (match-beginning 1)) + (reftex-view-regexp-match + (format reftex-find-citation-regexp-format + (regexp-quote (match-string 1))) + 3 arg ref-buffer)) + (error "Cannot find citation key in BibTeX entry")))) + +(defun reftex-view-regexp-match (re &optional highlight-group new ref-buffer) + ;; Search for RE in current document or in the document of REF-BUFFER. + ;; Continue the search, if the same re was searched last. + ;; Highlight the group HIGHLIGHT-GROUP of the match. + ;; When NEW is non-nil, start a new search regardless. + ;; Match point is displayed in another window. + ;; Upon success, returns the window which displays the match. + + ;;; Decide if new search or continued search + (let* ((oldprop (get 'reftex-view-regexp-match :props)) + (newprop (list (current-buffer) re)) + (cont (and (not new) (equal oldprop newprop))) + (cnt (if cont (get 'reftex-view-regexp-match :cnt) 0)) + (current-window (selected-window)) + (window-conf (current-window-configuration)) + match pop-window) + (switch-to-buffer-other-window (or ref-buffer (current-buffer))) + ;; Search + (condition-case nil + (if cont + (setq match (reftex-global-search-continue)) + (reftex-access-scan-info) + (setq match (reftex-global-search re (reftex-all-document-files)))) + (error nil)) + ;; Evaluate the match. + (if match + (progn + (put 'reftex-view-regexp-match :props newprop) + (put 'reftex-view-regexp-match :cnt (incf cnt)) + (reftex-highlight 0 (match-beginning highlight-group) + (match-end highlight-group)) + (add-hook 'pre-command-hook 'reftex-highlight-shall-die) + (setq pop-window (selected-window))) + (remprop 'reftex-view-regexp-match :props) + (or cont (set-window-configuration window-conf))) + (select-window current-window) + (if match + (progn + (message "Match Nr. %s" cnt) + pop-window) + (if cont + (error "No further matches (total number of matches: %d)" cnt) + (error "No matches"))))) + +(defvar reftex-global-search-marker (make-marker)) +(defun reftex-global-search (regexp file-list) + ;; Start a search for REGEXP in all files of FILE-LIST + (put 'reftex-global-search :file-list file-list) + (put 'reftex-global-search :regexp regexp) + (move-marker reftex-global-search-marker nil) + (reftex-global-search-continue)) + +(defun reftex-global-search-continue () + ;; Continue a global search started with `reftex-global-search' + (unless (get 'reftex-global-search :file-list) + (error "No global search to continue")) + (let* ((file-list (get 'reftex-global-search :file-list)) + (regexp (get 'reftex-global-search :regexp)) + (buf (or (marker-buffer reftex-global-search-marker) + (reftex-get-file-buffer-force (car file-list)))) + (pos (or (marker-position reftex-global-search-marker) 1)) + file) + ;; Take up starting position + (unless buf (error "No such buffer %s" buf)) + (switch-to-buffer buf) + (widen) + (goto-char pos) + ;; Search and switch file if necessary + (if (catch 'exit + (while t + (when (re-search-forward regexp nil t) + (move-marker reftex-global-search-marker (point)) + (throw 'exit t)) + ;; No match - goto next file + (pop file-list) + (or file-list (throw 'exit nil)) + (setq file (car file-list) + buf (reftex-get-file-buffer-force file)) + (unless buf (error "Cannot access file %s" file)) + (put 'reftex-global-search :file-list file-list) + (switch-to-buffer buf) + (widen) + (goto-char 1))) + t + (move-marker reftex-global-search-marker nil) + (error "All files processed")))) + +;;; reftex-dcr.el ends here
--- a/lisp/textmodes/reftex-vcr.el Wed Jan 05 09:15:33 2000 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,474 +0,0 @@ -;;; reftex-vcr.el - Viewing cross references and citations with RefTeX -;; Copyright (c) 1997, 1998, 1999 Free Software Foundation, Inc. - -;; Author: Carsten Dominik <dominik@strw.LeidenUniv.nl> -;; Version: 4.9 -;; Keywords: tex - -;; This file is part of GNU Emacs. - -;; GNU Emacs is free software; you can redistribute it and/or modify -;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2, or (at your option) -;; any later version. - -;; 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 -;; along with GNU Emacs; see the file COPYING. If not, write to the -;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, -;; Boston, MA 02111-1307, USA. - -(eval-when-compile (require 'cl)) -(provide 'reftex-vcr) -(require 'reftex) -;;; - -(defun reftex-view-crossref (&optional arg auto-how) - "View cross reference of macro at point. Point must be on the KEY -argument. When at at `\ref' macro, show corresponding `\label' -definition, also in external documents (`xr'). When on a label, show -a locations where KEY is referenced. Subsequent calls find additional -locations. When on a `\cite', show the associated `\bibitem' macro or -the BibTeX database entry. When on a `\bibitem', show a `\cite' macro -which uses this KEY. When on an `\index', show other locations marked -by the same index entry. -To define additional cross referencing items, use the option -`reftex-view-crossref-extra'. See also `reftex-view-crossref-from-bibtex'. -With one or two C-u prefixes, enforce rescanning of the document. -With argument 2, select the window showing the cross reference. -AUTO-HOW is only for the automatic crossref display and is handed through -to the functions `reftex-view-cr-cite' and `reftex-view-cr-ref'." - - (interactive "P") - ;; See where we are. - (let* ((macro (car (reftex-what-macro-safe 1))) - (key (reftex-this-word "^{}%\n\r,")) - dw) - - (if (or (null macro) (reftex-in-comment)) - (error "Not on a crossref macro argument")) - - (setq reftex-call-back-to-this-buffer (current-buffer)) - - (cond - ((string-match "\\`\\\\cite\\|cite\\*?\\'" macro) - ;; A citation macro: search for bibitems or BibTeX entries - (setq dw (reftex-view-cr-cite arg key auto-how))) - ((string-match "\\`\\\\ref\\|ref\\(range\\)?\\*?\\'" macro) - ;; A reference macro: search for labels - (setq dw (reftex-view-cr-ref arg key auto-how))) - (auto-how nil) ;; No further action for automatic display (speed) - ((or (equal macro "\\label") - (member macro reftex-macros-with-labels)) - ;; A label macro: search for reference macros - (reftex-access-scan-info arg) - (setq dw (reftex-view-regexp-match - (format reftex-find-reference-format (regexp-quote key)) - 4 nil nil))) - ((equal macro "\\bibitem") - ;; A bibitem macro: search for citations - (reftex-access-scan-info arg) - (setq dw (reftex-view-regexp-match - (format reftex-find-citation-regexp-format (regexp-quote key)) - 3 nil nil))) - ((member macro reftex-macros-with-index) - (reftex-access-scan-info arg) - (setq dw (reftex-view-regexp-match - (format reftex-find-index-entry-regexp-format - (regexp-quote key)) - 3 nil nil))) - (t - (reftex-access-scan-info arg) - (catch 'exit - (let ((list reftex-view-crossref-extra) - entry mre action group) - (while (setq entry (pop list)) - (setq mre (car entry) - action (nth 1 entry) - group (nth 2 entry)) - (when (string-match mre macro) - (setq dw (reftex-view-regexp-match - (format action key) group nil nil)) - (throw 'exit t)))) - (error "Not on a crossref macro argument")))) - (if (and (eq arg 2) (windowp dw)) (select-window dw)))) - -(defun reftex-view-cr-cite (arg key how) - ;; View crossreference of a ref cite. HOW can have the values - ;; nil: Show in another window. - ;; echo: Show one-line info in echo area. - ;; tmp-window: Show in small window and arrange for window to disappear. - - ;; Ensure access to scanning info - (reftex-access-scan-info (or arg current-prefix-arg)) - - (if (eq how 'tmp-window) - ;; Remember the window configuration - (put 'reftex-auto-view-crossref 'last-window-conf - (current-window-configuration))) - - (let (files size item (pos (point)) (win (selected-window)) pop-win) - ;; Find the citation mode and the file list - (cond - ((assq 'bib (symbol-value reftex-docstruct-symbol)) - (setq item nil - files (reftex-get-bibfile-list))) - ((assq 'thebib (symbol-value reftex-docstruct-symbol)) - (setq item t - files (reftex-uniquify - (mapcar 'cdr - (reftex-all-assq - 'thebib (symbol-value reftex-docstruct-symbol)))))) - (reftex-default-bibliography - (setq item nil - files (reftex-default-bibliography))) - (how) ;; don't throw for special display - (t (error "Cannot display crossref"))) - - (if (eq how 'echo) - ;; Display in Echo area - (reftex-echo-cite key files item) - ;; Display in a window - (if (not (eq how 'tmp-window)) - ;; Normal display - (reftex-pop-to-bibtex-entry key files nil t item) - ;; A temporary window - (condition-case nil - (reftex-pop-to-bibtex-entry key files nil t item) - (error (goto-char pos) - (message "cite: no such citation key %s" key) - (error ""))) - ;; Resize the window - (setq size (max 1 (count-lines (point) - (reftex-end-of-bib-entry item)))) - (let ((window-min-height 2)) - (shrink-window (1- (- (window-height) size))) - (recenter 0)) - ;; Arrange restoration - (add-hook 'pre-command-hook 'reftex-restore-window-conf)) - - ;; Normal display in other window - (add-hook 'pre-command-hook 'reftex-highlight-shall-die) - (setq pop-win (selected-window)) - (select-window win) - (goto-char pos) - (when (equal arg 2) - (select-window pop-win))))) - -(defun reftex-view-cr-ref (arg label how) - ;; View crossreference of a ref macro. HOW can have the values - ;; nil: Show in another window. - ;; echo: Show one-line info in echo area. - ;; tmp-window: Show in small window and arrange for window to disappear. - - ;; Ensure access to scanning info - (reftex-access-scan-info (or arg current-prefix-arg)) - - (if (eq how 'tmp-window) - ;; Remember the window configuration - (put 'reftex-auto-view-crossref 'last-window-conf - (current-window-configuration))) - - (let* ((xr-data (assoc 'xr (symbol-value reftex-docstruct-symbol))) - (xr-re (nth 2 xr-data)) - (entry (assoc label (symbol-value reftex-docstruct-symbol))) - (win (selected-window)) pop-win (pos (point))) - - (if (and (not entry) (stringp label) xr-re (string-match xr-re label)) - ;; Label is defined in external document - (save-excursion - (save-match-data - (set-buffer - (or (reftex-get-file-buffer-force - (cdr (assoc (match-string 1 label) (nth 1 - xr-data)))) - (error "Problem with external label %s" label)))) - (setq label (substring label (match-end 1))) - (reftex-access-scan-info) - (setq entry - (assoc label (symbol-value reftex-docstruct-symbol))))) - (if (eq how 'echo) - ;; Display in echo area - (reftex-echo-ref label entry (symbol-value reftex-docstruct-symbol)) - (let ((window-conf (current-window-configuration))) - (condition-case nil - (reftex-show-label-location entry t nil t t) - (error (set-window-configuration window-conf) - (message "ref: Label %s not found" label) - (error "ref: Label %s not found" label)))) ;; 2nd is line OK - (add-hook 'pre-command-hook 'reftex-highlight-shall-die) - - (when (eq how 'tmp-window) - ;; Resize window and arrange restauration - (shrink-window (1- (- (window-height) 9))) - (recenter '(4)) - (add-hook 'pre-command-hook 'reftex-restore-window-conf)) - (setq pop-win (selected-window)) - (select-window win) - (goto-char pos) - (when (equal arg 2) - (select-window pop-win))))) - -(defun reftex-mouse-view-crossref (ev) - "View cross reference of \\ref or \\cite macro where you click. -If the macro at point is a \\ref, show the corresponding label definition. -If it is a \\cite, show the BibTeX database entry. -If there is no such macro at point, search forward to find one. -With argument, actually select the window showing the cross reference." - (interactive "e") - (mouse-set-point ev) - (reftex-view-crossref current-prefix-arg)) - -(defun reftex-view-crossref-when-idle () - ;; Display info about crossref at point in echo area or a window. - ;; This function was desigend to work with an idle timer. - ;; We try to get out of here as quickly as possible if the call is useless. - (and reftex-mode - ;; Make sure message area is free if we need it. - (or (eq reftex-auto-view-crossref 'window) (not (current-message))) - ;; Make sure we are not already displaying this one - (not (memq last-command '(reftex-view-crossref - reftex-mouse-view-crossref))) - ;; Quick precheck if this might be a relevant spot - ;; FIXME: Can fail with backslash in comment - (save-excursion - (search-backward "\\" nil t) - (looking-at "\\\\[a-zA-Z]*\\(cite\\|ref\\)")) - - (condition-case nil - (let ((current-prefix-arg nil)) - (cond - ((eq reftex-auto-view-crossref t) - (reftex-view-crossref -1 'echo)) - ((eq reftex-auto-view-crossref 'window) - (reftex-view-crossref -1 'tmp-window)) - (t nil))) - (error nil)))) - -(defun reftex-restore-window-conf () - (set-window-configuration (get 'reftex-auto-view-crossref 'last-window-conf)) - (put 'reftex-auto-view-crossref 'last-window-conf nil) - (remove-hook 'pre-command-hook 'reftex-restore-window-conf)) - -(defun reftex-echo-ref (label entry docstruct) - ;; Display crossref info in echo area. - (cond - ((null docstruct) - (message (substitute-command-keys (format reftex-no-info-message "ref")))) - ((null entry) - (message "ref: unknown label: %s" label)) - (t - (when (stringp (nth 2 entry)) - (message "ref(%s): %s" (nth 1 entry) (nth 2 entry))) - (let ((buf (get-buffer " *Echo Area*"))) - (when buf - (save-excursion - (set-buffer buf) - (run-hooks 'reftex-display-copied-context-hook))))))) - -(defun reftex-echo-cite (key files item) - ;; Display citation info in echo area. - (let* ((cache (assq 'bibview-cache (symbol-value reftex-docstruct-symbol))) - (cache-entry (assoc key (cdr cache))) - entry string buf (all-files files)) - - (if (and reftex-cache-cite-echo cache-entry) - ;; We can just use the cache - (setq string (cdr cache-entry)) - - ;; Need to look in the database - (unless reftex-revisit-to-echo - (setq files (reftex-visited-files files))) - - (setq entry - (condition-case nil - (save-excursion - (reftex-pop-to-bibtex-entry key files nil nil item t)) - (error - (if (and files (= (length all-files) (length files))) - (message "cite: no such database entry: %s" key) - (message (substitute-command-keys - (format reftex-no-info-message "cite")))) - nil))) - (when entry - (if item - (setq string (reftex-nicify-text entry)) - (setq string (reftex-make-cite-echo-string - (reftex-parse-bibtex-entry entry) - reftex-docstruct-symbol))))) - (unless (or (null string) (equal string "")) - (message "cite: %s" string)) - (when (setq buf (get-buffer " *Echo Area*")) - (save-excursion - (set-buffer buf) - (run-hooks 'reftex-display-copied-context-hook))))) - -(defvar reftex-use-itimer-in-xemacs nil - "*Non-nil means use the idle timers in XEmacs for crossref display. -Currently, idle timer restart is broken and we use the post-command-hook.") - -(defun reftex-toggle-auto-view-crossref () - "Toggle the automatic display of crossref information in the echo area. -When active, leaving point idle in the argument of a \\ref or \\cite macro -will display info in the echo area." - (interactive) - (if reftex-auto-view-crossref-timer - (progn - (if (featurep 'xemacs) - (if reftex-use-itimer-in-xemacs - (delete-itimer reftex-auto-view-crossref-timer) - (remove-hook 'post-command-hook 'reftex-start-itimer-once)) - (cancel-timer reftex-auto-view-crossref-timer)) - (setq reftex-auto-view-crossref-timer nil) - (message "Automatic display of crossref information was turned off")) - (setq reftex-auto-view-crossref-timer - (if (featurep 'xemacs) - (if reftex-use-itimer-in-xemacs - (start-itimer "RefTeX Idle Timer" - 'reftex-view-crossref-when-idle - reftex-idle-time reftex-idle-time t) - (add-hook 'post-command-hook 'reftex-start-itimer-once) - t) - (run-with-idle-timer - reftex-idle-time t 'reftex-view-crossref-when-idle))) - (unless reftex-auto-view-crossref - (setq reftex-auto-view-crossref t)) - (message "Automatic display of crossref information was turned on"))) - -(defun reftex-start-itimer-once () - (and reftex-mode - (not (itimer-live-p reftex-auto-view-crossref-timer)) - (setq reftex-auto-view-crossref-timer - (start-itimer "RefTeX Idle Timer" - 'reftex-view-crossref-when-idle - reftex-idle-time nil t)))) - -(defun reftex-view-crossref-from-bibtex (&optional arg) - "View location in a LaTeX document which cites the BibTeX entry at point. -Since BibTeX files can be used by many LaTeX documents, this function -prompts upon first use for a buffer in RefTeX mode. To reset this -link to a document, call the function with with a prefix arg. -Calling this function several times find successive citation locations." - (interactive "P") - (when arg - ;; Break connection to reference buffer - (remprop 'reftex-bibtex-view-cite-locations :ref-buffer)) - (let ((ref-buffer (get 'reftex-bibtex-view-cite-locations :ref-buffer))) - ;; Establish connection to reference buffer - (unless ref-buffer - (setq ref-buffer - (save-excursion - (completing-read - "Reference buffer: " - (delq nil - (mapcar - (lambda (b) - (set-buffer b) - (if reftex-mode (list (buffer-name b)) nil)) - (buffer-list))) - nil t))) - (put 'reftex-bibtex-view-cite-locations :ref-buffer ref-buffer)) - ;; Search for citations - (bibtex-beginning-of-entry) - (if (looking-at - "@[a-zA-Z]+[ \t\n\r]*[{(][ \t\n\r]*\\([^, \t\r\n}]+\\)") - (progn - (goto-char (match-beginning 1)) - (reftex-view-regexp-match - (format reftex-find-citation-regexp-format - (regexp-quote (match-string 1))) - 3 arg ref-buffer)) - (error "Cannot find citation key in BibTeX entry")))) - -(defun reftex-view-regexp-match (re &optional highlight-group new ref-buffer) - ;; Search for RE in current document or in the document of REF-BUFFER. - ;; Continue the search, if the same re was searched last. - ;; Highlight the group HIGHLIGHT-GROUP of the match. - ;; When NEW is non-nil, start a new search regardless. - ;; Match point is displayed in another window. - ;; Upon success, returns the window which displays the match. - - ;;; Decide if new search or continued search - (let* ((oldprop (get 'reftex-view-regexp-match :props)) - (newprop (list (current-buffer) re)) - (cont (and (not new) (equal oldprop newprop))) - (cnt (if cont (get 'reftex-view-regexp-match :cnt) 0)) - (current-window (selected-window)) - (window-conf (current-window-configuration)) - match pop-window) - (switch-to-buffer-other-window (or ref-buffer (current-buffer))) - ;; Search - (condition-case nil - (if cont - (setq match (reftex-global-search-continue)) - (reftex-access-scan-info) - (setq match (reftex-global-search re (reftex-all-document-files)))) - (error nil)) - ;; Evaluate the match. - (if match - (progn - (put 'reftex-view-regexp-match :props newprop) - (put 'reftex-view-regexp-match :cnt (incf cnt)) - (reftex-highlight 0 (match-beginning highlight-group) - (match-end highlight-group)) - (add-hook 'pre-command-hook 'reftex-highlight-shall-die) - (setq pop-window (selected-window))) - (remprop 'reftex-view-regexp-match :props) - (or cont (set-window-configuration window-conf))) - (select-window current-window) - (if match - (progn - (message "Match Nr. %s" cnt) - pop-window) - (if cont - (error "No further matches (total number of matches: %d)" cnt) - (error "No matches"))))) - -(defvar reftex-global-search-marker (make-marker)) -(defun reftex-global-search (regexp file-list) - ;; Start a search for REGEXP in all files of FILE-LIST - (put 'reftex-global-search :file-list file-list) - (put 'reftex-global-search :regexp regexp) - (move-marker reftex-global-search-marker nil) - (reftex-global-search-continue)) - -(defun reftex-global-search-continue () - ;; Continue a global search started with `reftex-global-search' - (unless (get 'reftex-global-search :file-list) - (error "No global search to continue")) - (let* ((file-list (get 'reftex-global-search :file-list)) - (regexp (get 'reftex-global-search :regexp)) - (buf (or (marker-buffer reftex-global-search-marker) - (reftex-get-file-buffer-force (car file-list)))) - (pos (or (marker-position reftex-global-search-marker) 1)) - file) - ;; Take up starting position - (unless buf (error "No such buffer %s" buf)) - (switch-to-buffer buf) - (widen) - (goto-char pos) - ;; Search and switch file if necessary - (if (catch 'exit - (while t - (when (re-search-forward regexp nil t) - (move-marker reftex-global-search-marker (point)) - (throw 'exit t)) - ;; No match - goto next file - (pop file-list) - (or file-list (throw 'exit nil)) - (setq file (car file-list) - buf (reftex-get-file-buffer-force file)) - (unless buf (error "Cannot access file %s" file)) - (put 'reftex-global-search :file-list file-list) - (switch-to-buffer buf) - (widen) - (goto-char 1))) - t - (move-marker reftex-global-search-marker nil) - (error "All files processed")))) - -;;; reftex-vcr.el ends here
--- a/lisp/textmodes/reftex.el Wed Jan 05 09:15:33 2000 +0000 +++ b/lisp/textmodes/reftex.el Wed Jan 05 09:15:48 2000 +0000 @@ -1655,12 +1655,12 @@ ;;; ;;; View cross references -(autoload 'reftex-view-crossref "reftex-vcr" +(autoload 'reftex-view-crossref "reftex-dcr" "View cross reference of \\ref or \\cite macro at point." t) -(autoload 'reftex-mouse-view-crossref "reftex-vcr" +(autoload 'reftex-mouse-view-crossref "reftex-dcr" "View cross reference of \\ref or \\cite macro where you click." t) -(autoload 'reftex-toggle-auto-view-crossref "reftex-vcr") -(autoload 'reftex-view-crossref-from-bibtex "reftex-vcr" +(autoload 'reftex-toggle-auto-view-crossref "reftex-dcr") +(autoload 'reftex-view-crossref-from-bibtex "reftex-dcr" "View location in a LaTeX document which cites the BibTeX entry at point." t)