From 14cb4d2ea5c58469b42bbfdaaa33311667c712fa Mon Sep 17 00:00:00 2001 From: Tim Pope Date: Wed, 13 Jan 2010 22:01:43 -0500 Subject: [PATCH] Partial support for csh and cmd.exe Both csh and cmd.exe are painful to script and may never be completely supported. In both cases, you will be better suited by just overriding the shell: set shell=/bin/sh Use of cmd.exe currently requires you to set shellslash. --- plugin/fugitive.vim | 46 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/plugin/fugitive.vim b/plugin/fugitive.vim index f6dae94..c6f4c86 100644 --- a/plugin/fugitive.vim +++ b/plugin/fugitive.vim @@ -27,6 +27,8 @@ endfunction function! s:shellesc(arg) abort if a:arg =~ '^[A-Za-z0-9_/.-]\+$' return a:arg + elseif &shell =~# 'cmd' && a:arg !~# '"' + return '"'.a:arg.'"' else return shellescape(a:arg) endif @@ -616,12 +618,21 @@ function! s:Commit(args) abort let errorfile = tempname() try execute cd.'`=s:repo().tree()`' - let command = 'GIT_EDITOR=false '.s:repo().git_command('commit').' '.a:args - if a:args =~# '\%(^\| \)--interactive\>' + let command = '' + if &shell =~# 'cmd' + let old_editor = $GIT_EDITOR + let $GIT_EDITOR = 'false' + elseif &shell !~# 'csh' + let command = 'GIT_EDITOR=false ' + endif + let command .= s:repo().git_command('commit').' '.a:args + if &shell =~# 'csh' + silent execute '!setenv GIT_EDITOR false; ('.command.' > '.outfile.') >& '.errorfile + elseif a:args =~# '\%(^\| \)--interactive\>' execute '!'.command.' 2> '.errorfile else silent execute '!'.command.' > '.outfile.' 2> '.errorfile - end + endif if !v:shell_error if filereadable(outfile) for line in readfile(outfile) @@ -656,6 +667,9 @@ function! s:Commit(args) abort catch /^fugitive:/ return 'echoerr v:errmsg' finally + if exists('old_editor') + let $GIT_EDITOR = old_editor + endif call delete(outfile) call delete(errorfile) execute cd.'`=dir`' @@ -1182,15 +1196,29 @@ endfunction " }}}1 " File access {{{1 -function! s:ReplaceCmd(cmd) abort +function! s:ReplaceCmd(cmd,...) abort let fn = bufname('') let tmp = tempname() let aw = &autowrite + let prefix = '' try + if a:0 && a:1 != '' + if &shell =~# 'cmd' + let old_index = $GIT_INDEX_FILE + let $GIT_INDEX_FILE = a:1 + elseif &shell =~# 'csh' + let prefix = 'setenv GIT_INDEX_FILE '.s:shellesc(a:1).'; ' + else + let prefix = 'GIT_INDEX_FILE='.s:shellesc(a:1).' ' + endif + endif set noautowrite - silent exe '!'.escape(a:cmd,'%#') ' > '.tmp + silent exe '!'.escape(prefix.a:cmd,'%#').' > '.tmp finally let &autowrite = aw + if exists('old_index') + let $GIT_INDEX_FILE = 'old_index' + endif endtry silent exe 'keepalt file '.tmp silent edit! @@ -1209,19 +1237,19 @@ function! s:BufReadIndex() let b:git_dir = s:repo().dir() setlocal noro ma if fnamemodify($GIT_INDEX_FILE !=# '' ? $GIT_INDEX_FILE : b:git_dir . '/index', ':p') ==# expand('%:p') - let indexspec = '' + let index = '' else - let indexspec = 'GIT_INDEX_FILE='.s:shellesc(expand('%')).' ' + let index = expand('%') endif if b:fugitive_display_format - call s:ReplaceCmd(indexspec.s:repo().git_command('ls-files','--stage')) + call s:ReplaceCmd(s:repo().git_command('ls-files','--stage'),index) set ft=git nospell else let cd = exists('*haslocaldir') && haslocaldir() ? 'lcd ' : 'cd ' let dir = getcwd() try execute cd.'`=s:repo().tree()`' - call s:ReplaceCmd(indexspec.s:repo().git_command('status')) + call s:ReplaceCmd(s:repo().git_command('status'),index) finally execute cd.'`=dir`' endtry