# HG changeset patch # User Carsten Dominik # Date 906992989 0 # Node ID 608bc56ca20e47e54fed55cdcbefda2555185664 # Parent 64a0be320dbc51c35a09f52a5265664cf37819b0 (reftex-finding-files): New customize group. (reftex-texpath-environment-variables, reftex-use-external-file-finders, reftex-external-file-finders, reftex-search-unrecursed-path-first): New options. (reftex-process-string, reftex-find-file-externally): New functions. (reftex-access-search-path): Execute shell commands to find the search path. (reftex-toggle-auto-view-crossref): When turning on, make sure `reftex-auto-view-crossref' becomes non-nil. (reftex-abbrev-regexp): Constant removed. (reftex-convert-string): Abbrev regexp calculated locally. diff -r 64a0be320dbc -r 608bc56ca20e lisp/textmodes/reftex.el --- a/lisp/textmodes/reftex.el Mon Sep 28 14:03:38 1998 +0000 +++ b/lisp/textmodes/reftex.el Mon Sep 28 14:29:49 1998 +0000 @@ -162,10 +162,10 @@ ;; developing it with their reports. In particular thanks to ;; ;; F. Burstall, Alastair Burt, Soren Dayton, Stephen Eglen, -;; Karl Eichwalder, Peter Galbraith, Dieter Kraft, Adrian Lanz, -;; Rory Molinari, Laurent Mugnier, Sudeep Kumar Palat, Daniel Polani, -;; Robin Socha, Richard Stanton, Allan Strand, Jan Vroonhof, -;; Christoph Wedler, Alan Williams. +;; Karl Eichwalder, Peter Galbraith, Dieter Kraft, Kai Grossjohann, +;; Adrian Lanz, Rory Molinari, Laurent Mugnier, Sudeep Kumar Palat, +;; Daniel Polani, Robin Socha, Richard Stanton, Allan Strand, +;; Jan Vroonhof, Christoph Wedler, Alan Williams. ;; ;; Finally thanks to Uwe Bolick who first got me (some years ago) into ;; supporting LaTeX labels and references with an Editor (which was @@ -799,14 +799,6 @@ "Support for referencing bibliographic data with BibTeX." :group 'reftex) -(defcustom reftex-bibpath-environment-variables '("BIBINPUTS" "TEXBIB") - "*List of env vars which might contain the path to BibTeX database files. -Directories ending in `//' or `!!' will be expanded recursively when necessary -to find files." - :group 'reftex-citation-support - :set 'reftex-set-dirty - :type '(repeat (string :tag "Environment variable"))) - (defvar reftex-bibfile-ignore-list nil) ; compatibility (defcustom reftex-bibfile-ignore-regexps nil "*List of regular expressions to exclude files in \\bibliography{..}. @@ -1020,6 +1012,77 @@ :group 'reftex-referencing-labels :type 'hook) +;; Finding Files -------------------------------------------------------- + +(defgroup reftex-finding-files nil + "Displaying cross references and citations." + :group 'reftex) + +(defcustom reftex-texpath-environment-variables '("TEXINPUTS") + "*List of specifications how to retrieve the search path for TeX files. +Several entries are possible. +- If an element is the name of an environment variable, its content is used. +- If an element starts with an exclamation mark, it is used as a command + to retrieve the path. A typical command with the kpathsearch library would + be `!kpsewhich -show-path=.tex'. +- Otherwise the element itself is interpreted as a path. +Multiple directories can be separated by the system dependent `path-separator'. +Directories ending in `//' or `!!' will be expanded recursively. +See also `reftex-use-external-file-finders'." + :group 'reftex-finding-files + :set 'reftex-set-dirty + :type '(repeat (string :tag "Specification"))) + +(defcustom reftex-bibpath-environment-variables '("BIBINPUTS" "TEXBIB") + "*List of specifications how to retrieve search path for .bib database files. +Several entries are possible. +- If an element is the name of an environment variable, its content is used. +- If an element starts with an exclamation mark, it is used as a command + to retrieve the path. A typical command with the kpathsearch library would + be `!kpsewhich -show-path=.bib'. +- Otherwise the element itself is interpreted as a path. +Multiple directories can be separated by the system dependent `path-separator'. +Directories ending in `//' or `!!' will be expanded recursively. +See also `reftex-use-external-file-finders'." + :group 'reftex-citation-support + :group 'reftex-finding-files + :set 'reftex-set-dirty + :type '(repeat (string :tag "Specification"))) + +(defcustom reftex-search-unrecursed-path-first t + "*Non-nil means, search all specified directories before trying recursion. +Thus, in a path \".//:/tex/\", search first \"./\", then \"/tex/\" and then +all subdirectories of \"./\". If this option is nil, the subdirectories of +\"./\" are searched before \"/tex/\". This is mainly for speed - most of the +time the recursive path is for the system files and not for the user files. +Set this to nil if the default makes RefTeX finding files with equal names +in wrong sequence." + :group 'reftex-finding-files + :type 'boolean) + +(defcustom reftex-use-external-file-finders nil + "*Non-nil means, use external programs to find files. +Normally, RefTeX searches the paths given in the environment variables +TEXINPUTS and BIBINPUTS to find TeX files and BibTeX database files. +With this option turned on, it calls an external program specified in the +option `reftex-external-file-finders' instead. As a side effect, +the variables `reftex-texpath-environment-variables' and +`reftex-bibpath-environment-variables' will be ignored." + :group 'reftex-finding-files + :type 'boolean) + +(defcustom reftex-external-file-finders '(("tex" . "kpsewhich -format=.tex %f") + ("bib" . "kpsewhich -format=.bib %f")) + "*Association list with external programs to call for finding files. +Each entry is a cons cell (TYPE . PROGRAM). +Type is either \"tex\" or \"bib\". PROGRAM is the external program to use with +any arguments. %f will be replaced by the name of the file to be found. +Note that these commands will be executed directly, not via a shell. +Only relevant when `reftex-use-external-file-finders' is non-nil." + :group 'reftex-finding-files + :type '(repeat (cons (string :tag "File type") + (string :tag "Program ")))) + ;; Tuning the parser ---------------------------------------------------- (defgroup reftex-optimizations-for-large-documents nil @@ -1295,7 +1358,7 @@ ;;; Define the formal stuff for a minor mode named RefTeX. ;;; -(defconst reftex-version "RefTeX version 3.38" +(defconst reftex-version "RefTeX version 3.41" "Version string for RefTeX.") (defvar reftex-mode nil @@ -1536,16 +1599,6 @@ (defconst reftex-no-info-message "%s: info not available, use `\\[reftex-view-crossref]' to get it.") -;; The regular expression used to abbreviate words. -(defconst reftex-abbrev-regexp - (concat - "\\`\\(" - (make-string (nth 0 reftex-abbrev-parameters) ?.) - "[" (nth 2 reftex-abbrev-parameters) "]*" - "\\)" - "[" (nth 3 reftex-abbrev-parameters) "]" - (make-string (1- (nth 1 reftex-abbrev-parameters)) ?.))) - ;; Global variables used for communication between functions. (defvar reftex-default-context-position nil) (defvar reftex-location-start nil) @@ -2657,6 +2710,13 @@ (let* ((words0 (split-string string (or split-re "[ \t\n\r]"))) (reftex-label-illegal-re (or illegal-re "\000")) + (abbrev-re (concat + "\\`\\(" + (make-string (nth 0 reftex-abbrev-parameters) ?.) + "[" (nth 2 reftex-abbrev-parameters) "]*" + "\\)" + "[" (nth 3 reftex-abbrev-parameters) "]" + (make-string (1- (nth 1 reftex-abbrev-parameters)) ?.))) words word) ;; Remove words from the ignore list or with funny characters @@ -2687,7 +2747,7 @@ (setq words (mapcar (function - (lambda (w) (if (string-match reftex-abbrev-regexp w) + (lambda (w) (if (string-match abbrev-re w) (if dot (concat (match-string 1 w) ".") (match-string 1 w)) @@ -5195,6 +5255,8 @@ nil) (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 () @@ -5315,11 +5377,17 @@ (defun reftex-find-tex-file (file master-dir &optional die) ;; Find FILE in MASTER-DIR or on reftex-tex-path. ;; FILE may be given with or without the .tex extension. - (let ((rec-values '(nil t)) path file1 old-path) - (if (file-name-absolute-p file) - (if (file-regular-p (concat file ".tex")) - (setq file1 (concat file ".tex")) - (if (file-regular-p file) (setq file1 file))) + (let ((rec-values (if reftex-search-unrecursed-path-first '(nil t) '(t))) + path file1 old-path) + (cond + ((file-name-absolute-p file) + (if (file-regular-p (concat file ".tex")) + (setq file1 (concat file ".tex")) + (if (file-regular-p file) (setq file1 file)))) + ((and reftex-use-external-file-finders + (assoc "tex" reftex-external-file-finders)) + (setq file1 (reftex-find-file-externally file "tex" master-dir))) + (t (while (and (null file1) rec-values) (setq path (reftex-access-search-path "tex" (pop rec-values) master-dir file)) @@ -5329,16 +5397,23 @@ path (cons master-dir path) file1 (or (reftex-find-file-on-path (concat file ".tex") path master-dir) - (reftex-find-file-on-path file path master-dir)))))) + (reftex-find-file-on-path file path master-dir))))))) (cond (file1 file1) (die (error "No such file: %s" file) nil) (t (message "No such file: %s (ignored)" file) nil)))) (defun reftex-find-bib-file (file master-dir &optional die) - ;; Find FILE in MASTER-DIR or on reftex-bib-path - (let ((rec-values '(nil t)) path file1 old-path) - (if (file-name-absolute-p file) - (if (file-regular-p file) (setq file1 file)) + ;; Find FILE in MASTER-DIR or on reftex-bib-path. + ;; File must be given already with the .bib extension. + (let ((rec-values (if reftex-search-unrecursed-path-first '(nil t) '(t))) + path file1 old-path) + (cond + ((file-name-absolute-p file) + (if (file-regular-p file) (setq file1 file))) + ((and reftex-use-external-file-finders + (assoc "bib" reftex-external-file-finders)) + (setq file1 (reftex-find-file-externally file "bib" master-dir))) + (t (while (and (null file1) rec-values) (setq path (reftex-access-search-path "bib" (pop rec-values) master-dir file)) @@ -5346,11 +5421,34 @@ (not (eq old-path path))) (setq old-path path path (cons master-dir path) - file1 (reftex-find-file-on-path file path master-dir))))) + file1 (reftex-find-file-on-path file path master-dir)))))) (cond (file1 file1) (die (error "No such file: %s" file) nil) (t (message "No such file: %s (ignored)" file) nil)))) +(defun reftex-find-file-externally (file type &optional master-dir) + ;; Use external program to find FILE. + ;; The program is the association of TYPE in `reftex-external-file-finders'. + ;; Interprete relative path definitions starting from MASTER-DIR. + (let ((default-directory (or master-dir default-directory)) + (prg (cdr (assoc type reftex-external-file-finders))) + out) + (if (string-match "%f" prg) + (setq prg (replace-match file t t prg))) + (setq out (apply 'reftex-process-string (split-string prg))) + (if (string-match "[ \t\n]+\\'" out) + (setq out (replace-match "" nil nil out))) + (cond ((equal out "") nil) + ((file-regular-p out) out) + (t nil)))) + +(defun reftex-process-string (program &rest args) + "Execute PROGRAM with arguments ARGS and return its STDOUT as a string." + (with-output-to-string + (with-current-buffer + standard-output + (apply 'call-process program nil '(t nil) nil args)))) + (defun reftex-access-search-path (which &optional recurse master-dir file) ;; Access path from environment variables. WHICH is either "tex" or "bib". ;; When RECURSE is t, expand path elements ending in `//' recursively. @@ -5362,11 +5460,18 @@ (let* ((pathvar (intern (concat "reftex-" which "-path")))) (when (null (get pathvar 'status)) ;; Get basic path from environment - (let ((env-vars (if (equal which "tex") (list "TEXINPUTS") + (let ((env-vars (if (equal which "tex") + reftex-texpath-environment-variables reftex-bibpath-environment-variables))) - (set pathvar (reftex-parse-colon-path - (mapconcat (lambda(x) (or (getenv x) "")) - env-vars path-separator)))) + (set pathvar + (reftex-parse-colon-path + (mapconcat + (lambda(x) + (if (string-match "^!" x) + (apply 'reftex-process-string + (split-string (substring x 1))) + (or (getenv x) x))) + env-vars path-separator)))) (put pathvar 'status 'split) ;; Check if we have recursive elements (let ((path (symbol-value pathvar)) dir rec)