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