Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!sun-barr!apple!julius.cs.uiuc.edu!rpi!zaphod.mps.ohio-state.edu!sdd.hp.com!elroy.jpl.nasa.gov!peregrine!ccicpg!hobbit!ndjc From: ndjc@hobbit.UUCP (Nick Crossley) Newsgroups: comp.unix.misc Subject: Re: vi can't handle ":! cmd %" Summary: vi assumes old shell internal quoting Keywords: vi compile Message-ID: <5017@hobbit.UUCP> Date: 28 Nov 90 19:15:47 GMT References: <1990Nov27.210425.25747@cbnewsj.att.com> Distribution: na Organization: ICL North America, Irvine, CA 92718 Lines: 64 In article <1990Nov27.210425.25747@cbnewsj.att.com> btwomey@cbnewsj.att.com (william.tw0mey) writes: >I'm running System V, R3.2.3 and ksh88d. While in vi editing >foo.c, with shell=/bin/ksh, if I try >:! cc % >I get a message to the effect that cc can't access foo.c. >Now the interesting part is if I try >:!echo % | od -c >I get >0000000 f o o . c \n > 346 357 357 256 343 012 >0000006 >which is the characters for "foo.c" but with the high order bits set. >What flags have to be redefined for vi to pass the filename to >the shell with the high order bits unset? The problem is that you are using an 8-bit clean version of ksh, with a partially 7-bit version of vi/ex. Older shells (csh and sh) used to (and in many versions still do) set the top bit of characters internally as a quoting mechanism. vi, somewhat rashly, uses this knowledge to quote the expansion of % and # filenames automatically, as if you had written '%' or '#'. Of course, when 8-bit clean shells such as recent versions of ksh appear, this behaviour of vi is broken, since such shells just accept the top bit as is. A fix is to change vi so that it does not attempt to 'quote' % and # filenames. If you are editing files with funny names, you might have to use explicit quotes around % or # in shell escapes; this seems eminently more reasonable to me than the 8-bit hack. An alternative would be to make vi actually put in \ and/or ' characters, but it seems hardly worth the effort. In Unix V.4, the quoting has been removed. Below is a patch to BSD and SysV[123] vi/ex to remove the 8-bit quoting. Your line numbers may vary depending on the version of vi, and because we have some source control info at the top of the files. *** port/ex_unix.c.old --- port/ex_unix.c *************** *** 77,83 **** while (*fp) { if (up >= &uxb[UXBSIZE]) goto tunix; ! *up++ = *fp++ | QUOTE; } break; } --- 77,83 ---- while (*fp) { if (up >= &uxb[UXBSIZE]) goto tunix; ! *up++ = *fp++; } break; } -- <<< standard disclaimers >>> Nick Crossley, ICL NA, 9801 Muirlands, Irvine, CA 92718-2521, USA 714-458-7282 uunet!ccicpg!ndjc / ndjc@ccicpg.UUCP