Most of my development work is done on a Unix system (usually SunOS
but sometimes Linux or HP-UX), but some requires that I use Windows
XP. Source code is maintained under ClearCase on all these systems
except Linux. I'm trying to get my Windows environment tuned up so
that development is as easy for me using Windows as it already is
using Unix. One thing I've done is installed Cygwin. This has been
really nice, but I can't always use the Cygwin environment because
of all the tools and applications that understand only Windows.
So the environment I think I want is this: when I open gvim from a
Windows tool or application, I get a Windows gvim that executes
system(), :sh, :!, :r!, etc. in a Windows environment; but when I
start vim or gvim from the Cygwin shell, I get the same Windows vim
or gvim executable, but one which executes system(), etc., in the
Cygwin environment, i.e., pretty much as it would in a real Unix
environment.
To that end, I have done a "standard" install of Cygwin, installed
the "standard" vim for Windows from vim.sf.net, put "C:\Program
Files\Vim\vim70" in my Windows PATH, added
export SHELL
to my $HOME/.bash_profile, and added the following lines to the top
of my _vimrc (C:\Program Files\Vim\_vimrc):
if has("win32") && $SHELL == "/bin/bash" && executable("C:/cygwin/bin/bash")
" Running in Cygwin.
set shell=C:/cygwin/bin/bash
if executable('grep')
set grepprg=grep\ -n\ $*\ /dev/null
endif
if exists("+shellslash")
set shellslash
endif
else
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
let eq = ''
if $VIMRUNTIME =~ ' '
if &sh =~ '\<cmd'
let cmd = '""' . $VIMRUNTIME . '\diff"'
let eq = '"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
. eq
endfunction
endif
where the outer "else" clause encloses vim's default MyDiff() for
Windows installations.
In addition, I have found it necessary to make some changes to some
plugins (ctags.vim and ccase.vim) following this example in
$VIMRUNTIME/ftplugin/perl.vim:
if &shellxquote != '"'
let perlpath = system('perl -e "print join(q/,/,@INC)"')
else
let perlpath = system("perl -e 'print join(q/,/,@INC)'")
endif
Vim automatically sets 'shellxquote' to " when 'shell' is set to the
Cygwin shell. Without this, system() commands don't handle
temporary files properly. With this, however, you have to use
single-quotes (') instead of double-quotes (") in system() commands
as shown above.
So my questions to anyone else using Vim and Cygwin on Windows XP
are: Does what I'm doing make sense? Is there some way to fix the
'shellxquote' problem other than modifying every plugin I use as
I've done above? Is there a better way of doing any of this?
I suppose I could build a Cygwin-aware vim binary, but I have
successfully avoided having to compile anything under Windows so far
and would really like to avoid that headache.
Regards,
Gary
--
Gary Johnson | Agilent Technologies
[EMAIL PROTECTED] | Wireless Division
| Spokane, Washington, USA