[comp.emacs] visit files along your VPATH

daryl@ihlpe.UUCP (10/31/87)

The project I work on deals with many different types of machines.  Since
we attempt to share source where ever possible, we use the VPATH
mechanism found in AT&T UNIXes.  I wrote this MLISP function to find a
file anywhere along the VPATH.  Typically our VPATHes look something like:

VPATH=~/mymods:/othermachine/me/mymods.src:~testbed/obj:~testbed/src

This MLISP function replaces the visit-file function.  It was written on an
SVR3 3B2/400 running UNIPRESS emacs.  It also works correctly on the sun 3
workstations also running UNIPRESS emacs.  Since UNIPRESS emacs is the
commercial follow on to Gmacs, it should work on those emacses with little
or no change.

This was a quick 1AM hack, so please be tolerant if you come across any
errors.

Enjoy.

Daryl Monge				UUCP:	...!ihnp4!ihcae!daryl
AT&T					CIS:	72717,65
Bell Labs, Naperville, Ill		AT&T	312-979-3603

------------------------------ Cut Here ------------------------------
;  vpath-visit-file - Attempt to find the requested file along the VPATH
; 

(defun (vpath-visit-file $still-looking vpath ind path $file devnode
    ;  Make sure we have a file name either as an argument, or interactively
    (setq $file
	(if (interactive)
	    (get-tty-file "VPATH visit file: ")
	    (arg 1)
	)
    )
    ;  If the file exists as written, access it.  This retains simple
    ;  operation of the old file-exists function so you can bind vpath
    ;  visit-file to ^X^V
    (setq $still-looking 1)
    (if (!= (file-exists $file) 0)
	(progn (visit-file $file) ( setq $still-looking 0))
    (progn
	(error-occurred (setq vpath (getenv "VPATH")))
	; We must calculate the relative devnode directory of the current
	; working directory and the first node in the vpath list.  If that
	; cannot be done, we fail to find the file.
	(setq path (substr vpath 1 (- (index vpath ":") 1)))
	(if (= (substr (working-directory) 0 (length path)) path) (progn
	    (setq devnode
		   (substr (working-directory) (+ (length path) 2) 10000))

	    (setq ind 1)
	    (while (& $still-looking (!= vpath ""))
	    (progn 
		(setq ind (index vpath ":"))
		(if (= ind 0) (setq ind 10000))
		(setq path (substr vpath 1 (- ind 1)))
		(if (!= (file-exists (concat path "/" devnode "/" $file)) 0)
		      (progn (visit-file (concat path "/" devnode "/" $file))
		      (setq $still-looking 0))
		)
		; Strip off the directory we just tried.
		(setq vpath (substr vpath (+ ind 1) (length vpath)))
	    ))
	))
    ))
    (if $still-looking
	(progn
	(message "Still looking")
	(if (=
	    (substr (get-tty-string
		(concat "There is no such file: " $file "  Create? ")
	    ) 0 1)
	    "y"
	    ) (visit-file $file)
	)
	)
    )
    (novalue)
))

(bind-to-key "visit-file" "\^xV")
(bind-to-key "vpath-visit-file" "\^x\^v")