vi with an 8-bit shell

Simon Brown simon at lfcs.ed.ac.uk
Sun Jul 31 06:17:23 AEST 1988


In article <575 at sbsvax.UUCP> greim at sbsvax.UUCP (Michael Greim) writes:
>In article <571 at etive.ed.ac.uk>, simon at lfcs.ed.ac.uk (Simon Brown) writes:
>< If you use '%' or '#'in a shell-escape, such as
>< 	:!diff % %.orig
>< then vi will set the high-bit on the substituted filenames. If you use a
>< shell which passes 8-bit data correctly (such as ksh-i), then you get:
>< 	diff: mumble.c:  Invalid argument
>< This doesn't happen for sh or csh, of course, since they strip 8-bit data.
>< 
>< See the unix0() function in ex_unix.c.
>< 

>Yes, it's there. Probably it's for filenames which contain shell
>meta characters like "*" or just plain spaces. By quoting vi ensures that
>the filename is "correctly" interpreted by the shell. Most people, like
>me, never notice such a thing, because they have plain sh or csh.
>I think when vi was written, there was no such thing as a "8 bit" shell.
>Can you come up with a fix ?

well, just changing the "case '%'" switch-field in unix0() so it uses
	*up++ = *fp++
in place of
	*up++ = *fp++ | QUOTE;
seems to do the trick. (i naughtily patched the binary instead of changing
the source, but that was just to quickily check it out :-).

of course, it means you have to explicitly quote it if the filename contains 
shell meta-chars, but that's not too much of a hardship...

	
	Simon.

| Simon Brown                                    | UUCP: mcvax!ukc!lfcs!simon
| Laboratory for Foundations of Computer Science | ARPA: simon%lfcs.ed
| Department of Computer Science                 |          @nss.cs.ucl.ac.uk
| University of Edinburgh, Scotland, UK.         | JANET: simon at uk.ac.ed.lfcs



More information about the Comp.bugs.4bsd.ucb-fixes mailing list