From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 30462 invoked by alias); 22 Apr 2002 19:08:39 -0000 Mailing-List: contact cygwin-help@cygwin.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: cygwin-owner@cygwin.com Mail-Followup-To: cygwin@cygwin.com Received: (qmail 30453 invoked from network); 22 Apr 2002 19:08:39 -0000 Received: from unknown (HELO rd.incert.com) (208.253.144.3) by sources.redhat.com with SMTP; 22 Apr 2002 19:08:39 -0000 Received: from localhost (metcalf@localhost) by rd.incert.com (8.11.6/8.9.3) with ESMTP id g3MJ87P22010; Mon, 22 Apr 2002 15:08:07 -0400 Date: Mon, 22 Apr 2002 12:14:00 -0000 From: Chris Metcalf To: Bram Moolenaar cc: cygwin@cygwin.com, Subject: Re: small inter-operability patch for vim 6.1.2 for Cygwin In-Reply-To: <200204221835.g3MIZoU02673@moolenaar.net> Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-SW-Source: 2002-04/txt/msg01219.txt.bz2 Earlier, I wrote: > This small change fixes an interoperability problem with vim in Cygwin. > If the Cygwin vim is invoked by non-Cygwin aware tools, it may be passed > a backslash-separated path. Since vim is essentially Unix-built for > Cygwin, it doesn't realize it should recognize the backslashes as path > separators, and fails to create a valid .swp file path (error "E303"). > > For example, the Cygwin cvs.exe is substantially slower at updates than > a non-Cygwin build, presumably because of stat() overheads. Both > versions of cvs.exe will use $EDITOR to get checkin comments from the > user, but the non-Cygwin version will pass a C:\TEMP\... path to vim. > (While it is possible to set up a $CVSEDITOR .bat file that runs > "cygpath -u" on its argument, this seems more like a bandaid than a > proper fix.) > > The attached patch just modifies the vim_ispathsep() function to be > Cygwin-aware. [...] Bram Moolenaar replied: > I'm quite sure this is not a good solution. It's just waiting to fail > in another place. The Unix code just isn't prepared for backslashes in > a file name to be path separators, they are seen as escaping the special > meaning of characters. > > Why not add something at the start of main() to change backslashes to > forward slashes? Sure. How does the attached look? I'm not sure whether overloading slash_adjust() is the right thing here (or if it would be better to enable the call to slash_adjust() in alist_add() instead). I'm also not sure whether any backslash-escaping is expected to be performed on command-line arguments as well, or if in this context it's safe to assume all filename arguments are plain vanilla file names. > Or better: Isn't there a cygwin trick for this already? Well, "cygpath -u PATH" will convert a Windows path to a Unix path. However, this means you can't just set $EDITOR to a simple executable, but have to walk it through a script (or dedicated binary) first. Also, it just seems wrong that vim doesn't handle a Windows path plausibly, when almost all of the other Cygwin tools do. > Your message won't get to the vim-dev list then. And you can't read > responses from others... Sorry, I was careless. Fixed, and context added to this reply. Chris diff -u vim-6.1-2/src/main.c vim-6.1-2-build/src/main.c --- vim-6.1-2/src/main.c Sun Mar 24 06:05:17 2002 +++ vim-6.1-2-build/src/main.c Mon Apr 22 14:50:36 2002 @@ -972,6 +972,14 @@ } } #endif +#ifdef __CYGWIN__ + /* + * If vim is invoked by non-Cygwin tools, eliminate backslashes + * early on. Otherwise the OS will continue to see the + * backslashes as path separators, but vim will not. + */ + slash_adjust(p); +#endif alist_add(&global_alist, p, #if (!defined(UNIX) && !defined(__EMX__)) || defined(ARCHIE) literal ? 2 : 0 /* add buffer number after expanding */ diff -u vim-6.1-2/src/os_unix.c vim-6.1-2-build/src/os_unix.c --- vim-6.1-2/src/os_unix.c Thu Mar 14 16:05:16 2002 +++ vim-6.1-2-build/src/os_unix.c Mon Apr 22 14:49:12 2002 @@ -1911,7 +1911,7 @@ #endif } -#if defined(OS2) || defined(PROTO) +#if defined(OS2) || defined(__CYGWIN__) || defined(PROTO) /* * Replace all slashes by backslashes. * When 'shellslash' set do it the other way around. @@ -1922,8 +1922,13 @@ { while (*p) { +#ifdef __CYGWIN__ + if (*p == '\\') + *p = '/'; +#else if (*p == psepcN) *p = psepc; +#endif #ifdef FEAT_MBYTE if (has_mbyte) p += (*mb_ptr2len_check)(p); -- Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple Bug reporting: http://cygwin.com/bugs.html Documentation: http://cygwin.com/docs.html FAQ: http://cygwin.com/faq/