diff options
Diffstat (limited to 'Build/source/texk/xdvik/xdvi-search.el')
-rw-r--r-- | Build/source/texk/xdvik/xdvi-search.el | 397 |
1 files changed, 0 insertions, 397 deletions
diff --git a/Build/source/texk/xdvik/xdvi-search.el b/Build/source/texk/xdvik/xdvi-search.el deleted file mode 100644 index 8f611149aed..00000000000 --- a/Build/source/texk/xdvik/xdvi-search.el +++ /dev/null @@ -1,397 +0,0 @@ -;;; xdvi-search.el --- (X)Emacs frontend for forward search with xdvi(k) -;;; Requires xdvi(k) >= 22.38. -;;; -;;; See http://xdvi.sourceforge.net/inverse-search.html and the section -;;; `FORWARD SEARCH' in the xdvi man page for more information on forward search. -;;; -;;; This file is available from: http://xdvi.sourceforge.net/xdvi-search.el -;;; -;;; Copyright (C) 2004 - 2006 Stefan Ulrich -;;; Copyright (C) 2006, Chris Stucchio (minor modifications) -;;; $Revision: 1.37 $, tested with Emacs 20.4 to 21.2 and Xemacs 21.1 to 21.5 -;;; -;;; This program 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 -;;; of the License, or (at your option) any later version. -;;; -;;; This program 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 this program; if not, write to the Free Software -;;; Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -;;; -;;; -;;; Commentary: -;; -;; Usage: -;; -;; - Add this file to some place where Emacs can find it -;; (e.g. put it into a directory ~/emacs/, which you add to your -;; load path by putting the following line into your .emacs file: -;; -;; (add-to-list 'load-path (expand-file-name "~/emacs/")) -;; -;; Then, add the following line to your .emacs file: -;; -;; (require 'xdvi-search) -;; -;; After compiling your .tex file with source specials activated, you should -;; be able to use -;; M-x xdvi-jump-to-line -;; to make xdvi jump to the current location of the cursor. -;; -;; You could also bind this command to a key, e.g. by adding -;; a binding to tex-mode-hook: -;; -;; (add-hook 'tex-mode-hook (lambda () -;; (local-set-key "\C-c\C-j" 'xdvi-jump-to-line))) -;; -;; -;; (without AucTeX; use LaTeX-mode-hook instead of tex-mode-hook with AucTeX. -;; Note that with AucTeX, C-c C-j is already bound to LaTeX-insert-item, so -;; you might want to use a different key combination instead.) -;; -;; - Note that with xdvik < 22.74.2, you may need to use one of the -;; functions xdvi-jump-to-line-fullpath() or xdvi-jump-to-line-relpath() -;; instead of xdvi-jump-to-line(), depending on the type of paths contained -;; in your \include{} commands. See the docstring of xdvi-jump-to-line() -;; for more information. -;; -;; Please send bug reports, improvements etc. to -;; <stefanulrich@users.sourceforge.net>. -;; - - -;;; Code: - -;;; -;;; Customizable stuff -;;; - -(defgroup xdvi-search nil - "Support for inverse search with (La)TeX and DVI previewers." - :group 'languages) - -(defcustom explicit-shell-file-name nil - "*If non-nil, file name to use for explicitly requested inferior shell." - :type '(choice (const :tag "nil" nil) file) - :group 'xdvi-search) - -(defcustom xdvi-shell-buffer-name nil - "*If non-nil, file name to use for explicitly requested inferior shell." - :type '(choice (const :tag "nil" nil) file) - :group 'xdvi-search) - - -(defcustom xdvi-bin "xdvi" - "*Name of the xdvi executable." - :type '(choice (const "xdvi") file) - :group 'xdvi-search) - -(defcustom xdvi-logfile "~/.xdvi-log" - "*Write xdvi output to this file, or throw away output if set to nil." - :type '(choice (const :tag "nil" nil) file) - :group 'xdvi-search) - - -;;; -;;; global variables/constants -;;; -(defvar xdvi-version-number 0 - "*Version of xdvi(k) you're using. -Only set this to override the built-in version recognition if that fails. -The version number is computed as: major * 1000000 + minor * 1000 + patchlevel, -where alphabetic characters are ignored; e.g. 22040000 equals version 22.40c; - 22077002 equals version 22.77.2.") - -(defvar xdvi-is-xdvik nil - "Whether we're really using xdvik instead of xdvi.") - -;;; -;;; exported functions -;;; -;;;###autoload -(defun xdvi-jump-to-line-fullpath () - "See `xdvi-jump-to-line' for documentation." - (interactive) - (xdvi-jump-to-line 3)) - -;;;###autoload -(defun xdvi-jump-to-line-relpath () - "See `xdvi-jump-to-line' for documentation." - (interactive) - (xdvi-jump-to-line 2)) - -;;;###autoload -(defun xdvi-jump-to-line (flag) - "Call xdvi to perform a `forward search' for current file and line number. -The optional argument FLAG controls the path searching behaviour; see also -'xdvi-jump-to-line-fullpath' and 'xdvi-jump-to-line-relpath'. - -Xdvi needs three pieces of information for forward search: - -- the current line number -- the name of the current input file -- the name of the master .tex file. - -The `master' .tex file (following AucTeX's terminology) is the same -as `\jobname' and determines the name of the DVI file. It is either -obtained by using AucTeX's function `TeX-master-file' or, in case -AucTeX isn't available, by calling `xdvi-master-file-name', a function -which tries to mimick AucTeX's behaviour to obtain this filename. - -For the current input file name, we need to rely on the DVI viewer to -make a smart matching of path suffixes with the file names that -actually occur in the specials, since specials inserted by TeX's -`-src' option may contain absolute or relative paths, depending on -whether TeX is called with a relative or absolute filename. (Similarly -for srcltx.sty, which can't expand paths.) - -Note to users of older versions of xdvik (< 22.74.2), or non-k xdvi: - -There are various ways of specifying an input file path for LaTeX's -\\input{} commands (which will end up in the source specials): - - (1) Filename only: \\input{chapter1} - (2) Relative path name: \\input{chapters/chapter1} - (3) Full path name: \\input{/home/user/tex/diss/chapters/chapter1} - -Versions of xdvik < 22.74.2 and plain xdvi will not match pathname suffixes. -With these versions, `xdvi-jump-to-line' will only work with variant (1); -for (2) or (3) you will need to use one of `xdvi-jump-to-line-relpath' (for 2) -or `xdvi-jump-to-line-fullpath' (for 3) instead." - (interactive "P") - (save-excursion - (save-restriction - (widen) - (beginning-of-line 1) - (if (not flag) - (setq flag 1)) - (let* (;;; Current line in file. - ;;; `count-lines' yields different results at beginning and in the - ;;; middle of a line, so we normalize by going to BOL first and - ;;; then adding 1 - (curr-line (+ 1 (count-lines (point-min) (point)))) - ;;; name of master .tex file, to be used as DVI basename: - (abspath (file-name-directory buffer-file-name)) - (master-file (if (fboundp 'TeX-master-file) - (TeX-master-file t) - (xdvi-get-masterfile (xdvi-master-file-name)))) - (xdvi-version-info (xdvi-get-version-number xdvi-version-number)) - ;;; DVI file name: - (dvi-file (concat (file-name-sans-extension master-file) ".dvi")) - ;;; Current source filename - (filename (get-source-filename (buffer-file-name) flag))) - (if (not (xdvi-has-inverse-search (car xdvi-version-info))) - (error "Your xdvi version is too old; see http://xdvi.sourceforge.net/inverse-search.html for more information")) - (if (not (file-exists-p dvi-file)) - (message "File %s does not exist; maybe you need to run latex first?" dvi-file) - (save-window-excursion - (if (xdvi-has-nofork (car xdvi-version-info) (car (cdr xdvi-version-info))) - (progn - (setq proc - (start-process "xdvi" "*xdvi output*" - xdvi-bin - "-nofork" - "-sourceposition" - (concat (int-to-string curr-line) " " filename) - dvi-file)) - (set-process-sentinel proc 'xdvi-process-sentinel)) - ;;; - ;;; More complicated if we don't have nofork: start a - ;;; subshell, since otherwise there's no way of viewing - ;;; the stderr/stdout output of the xdvi child process - ;;; without having either xdvi freezing, Emacs freezing, - ;;; or Emacs killing the xdvi child process (which is - ;;; forked when running with -sourceposition). - ;;; - ;;; Obtain the type of I/O-redirection needed for current shell: - (let* ((default-shell - (or (and (boundp 'explicit-shell-file-name) explicit-shell-file-name) - (getenv "ESHELL") - (getenv "SHELL") - "/bin/sh")) - (shell-redirection - (cond ((string-match "/bin/t?csh" default-shell) - (list ">&" "")) - ;; bash/ksh/sh - ((list ">" "2>&1"))))) - (cond ((string-match "XEmacs" emacs-version) - (xdvi-shell)) - ((< emacs-major-version 21) - (xdvi-shell)) - ((shell (or xdvi-shell-buffer-name "*xdvi-shell*")))) - (comint-send-input) - (insert (concat "cd " abspath ";") ) - (insert xdvi-bin - " -sourceposition '" (int-to-string curr-line) " " filename "' " - dvi-file - " " - ;;; we could probably do without the logfile, but it's an easy - ;;; way for toggling between /dev/null and logging. - (if xdvi-logfile - (let ((xdvi-logfile-fullname (expand-file-name xdvi-logfile))) - ;;; to avoid problems with `noclobber' - (if (file-exists-p xdvi-logfile-fullname) - (delete-file xdvi-logfile-fullname)) - (car shell-redirection) - " " - xdvi-logfile-fullname - " " - (car (cdr shell-redirection)) - ) - ) - " &") - (if xdvi-logfile - (message "Writing xdvi output to \"%s\"." xdvi-logfile)) - (comint-send-input))))))))) - -;;; -;;; internal functions -;;; -(defun shell-with-name (name) - "This function opens a shell in a buffer with name given by the argument, and switches to that buffer. If the buffer already exists, we simply switch to it." - (let ((buffer-of-name (get-buffer name)) - (tempname (generate-new-buffer-name "*tempshell*") ) ) - (cond ((bufferp buffer-of-name) ;If the buffer exists, switch to it (assume it is a shell) - (switch-to-buffer name)) - ( (bufferp (get-buffer "*shell*")) - (progn - (shell) - (rename-buffer tempname) - (shell) - (rename-buffer name) - (switch-to-buffer tempname) - (rename-buffer "*shell*") - (switch-to-buffer name))) - ( t - (progn - (shell) - (rename-buffer name) - ) - ) - ) - ) - ) - -(defun xdvi-shell () - "Behaves just like function shell, but creates the shell in buffer named *xdvi-shell* (unless of course the user chooses to modify the xdvi-shell-buffer-name variable.)" - (shell-with-name (or xdvi-shell-buffer-name "*xdvi-shell*") ) - ) - -(defun xdvi-has-inverse-search (version) - "Return True if inverse search is available for this VERSION of xdvi(k)." - (>= version 22038000)) - -(defun xdvi-has-nofork (version is-xdvik) - "Return True if the '-nofork' option is available for this VERSION of xdvi(k). -This option was implemented in version 22.74.1 of xdvik, and 22.61 of plain xdvi. -Argument IS-XDVIK controls whether we're running xdvik or plain xdvi." - (if is-xdvik - (>= version 22074001) - (>= version 22061000))) - -(defun get-source-filename (fname flag) - "Helper function to extract the file name from the file name FNAME. -FLAG controls whether to use the full path or a relative path." - (if (> flag 1) - (if (> flag 2) - ;;; full path name, for use with TeX patch and when using the - ;;; full path in \input or \include with srcltx.sty: - (expand-file-name fname) - ;;; relative path name: if current path and path of master file match partly, - ;;; use the rest of this path; else use buffer name. This can treat both the - ;;; cases when a relative path is used in \input{}, or when just the filename - ;;; is used and the file is located in the current directory (suggested by - ;;; frisk@isy.liu.se). - (if (string-match (concat "^" (regexp-quote (file-name-directory master-file))) - fname) - (substring fname (match-end 0)) - fname)) - ;;; buffer file name without path: - (file-name-nondirectory fname))) - -(defun xdvi-get-version-number (default) - "Return a tuple of (version-number xdvi-is-xdvik), or (DEFAULT nil) if DEFAULT != 0." - (if (not (= default 0)) - (list default nil) - (save-window-excursion - (switch-to-buffer "*xdvi-version*") - (erase-buffer) - (call-process xdvi-bin nil "*xdvi-version*" nil "-version") - (goto-char (point-min)) - (if (not (re-search-forward "xdvi\\((?k)?\\)? version \\([0-9]+\\)\\.\\([0-9]+\\)\\(\\.\\([0-9]+\\)\\)?" nil t)) - (error "Unable to get xdvi version number - please check value of `xdvi-bin', or set it manually via `xdvi-version-number'") - (let* ((major (string-to-int (buffer-substring (match-beginning 2) (match-end 2)))) - (minor (string-to-int (buffer-substring (match-beginning 3) (match-end 3)))) - (patchlevel (if (match-beginning 5) - (string-to-int (buffer-substring (match-beginning 5) (match-end 5))) - 0)) - (xdvi-is-xdvik (if (match-beginning 1) t nil)) - (version (+ (* 1000 minor) (* 1000000 major) patchlevel))) - (kill-buffer "*xdvi-version*") -;;; (message "Xdvi%s version: major %d, minor %d, version %d" (if xdvi-is-xdvik "k" "") major minor version) - (list version xdvi-is-xdvik) - ))))) - -(defun xdvi-process-sentinel (process signal) - "Return a readable error message for subprocess PROCESS which has terminated with SIGNAL." - (let ((retmsg (substring signal 0 -1))) - (if (string-match "abnormally" retmsg) - (progn - (message "XDvi: %s" retmsg) - (pop-to-buffer (process-buffer process))) - (message "XDvi: %s" retmsg)))) - -(defun xdvi-get-masterfile (file) - "Small helper function for AucTeX compatibility. -Converts the special value t that TeX-master might be set to (Argument FILE) -into a real file name." - (if (eq file t) - (buffer-file-name) - file)) - - -(defun xdvi-master-file-name () - "Emulate AucTeX's TeX-master-file function. -Partly copied from tex.el's TeX-master-file and TeX-add-local-master." - (if (boundp 'TeX-master) - TeX-master - (let ((master-file (read-file-name "Master file (default this file): "))) - (if (y-or-n-p "Save info as local variable? ") - (progn - (goto-char (point-max)) - (if (re-search-backward "^\\([^\n]+\\)Local Variables:" nil t) - (let* ((prefix (if (match-beginning 1) - (buffer-substring (match-beginning 1) (match-end 1)) - "")) - (start (point))) - (re-search-forward (regexp-quote (concat prefix "End:")) nil t) - (if (re-search-backward (regexp-quote (concat prefix "TeX-master")) start t) - ;;; if TeX-master line exists already, replace it - (progn - (beginning-of-line 1) - (kill-line 1)) - (beginning-of-line 1)) - (insert prefix "TeX-master: " (prin1-to-string master-file) "\n")) - (insert "\n%%% Local Variables: " -;;; mode is of little use without AucTeX ... -;;; "\n%%% mode: " (substring (symbol-name major-mode) 0 -5) - "\n%%% TeX-master: " (prin1-to-string master-file) - "\n%%% End: \n")) - (save-buffer) - (message "(local variables written.)")) - (message "(nothing written.)")) - (set (make-local-variable 'TeX-master) master-file)))) - - -(provide 'xdvi-search) - -;;; page break to avoid "Local variables entry is missing the prefix" error for previous stuff - - -;;; xdvi-search.el ends here |