Skip to content

Commit 28f17e5

Browse files
author
Fabian Wermelinger
committed
Add support for multi-file edits
Git send-email by default uses multi-file edit mode (sendemail.multiEdit) when more than one patch file requires editing an associated email message and/or cover-letters. Multi edit mode spawns one editor instance with multiple files in argument list. This behavior is supported by creating multiple splits for a running vim instance when `:G send-email` is called. When the user sets sendemail.multiEdit to false in the local or global config, if multiple files need editing then they are processed sequentially in a single split at a time. Closes #2352
1 parent 320b18f commit 28f17e5

File tree

1 file changed

+42
-27
lines changed

1 file changed

+42
-27
lines changed

autoload/fugitive.vim

Lines changed: 42 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3443,33 +3443,37 @@ function! s:RunEdit(state, tmp, job) abort
34433443
endif
34443444
call remove(a:state, 'request')
34453445
let sentinel = a:state.file . '.edit'
3446-
let file = FugitiveVimPath(readfile(sentinel, '', 1)[0])
3447-
try
3448-
if !&equalalways && a:state.mods !~# '\<\d*tab\>' && 3 > (a:state.mods =~# '\<vert' ? winwidth(0) : winheight(0))
3449-
let noequalalways = 1
3450-
setglobal equalalways
3451-
endif
3452-
let mods = s:Mods(a:state.mods, 'SpanOrigin')
3453-
exe substitute(mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
3454-
finally
3455-
if exists('l:noequalalways')
3456-
setglobal noequalalways
3457-
endif
3458-
endtry
3459-
set bufhidden=wipe
3460-
call s:InitializeBuffer(a:state)
3461-
let bufnr = bufnr('')
3462-
let s:edit_jobs[bufnr] = [a:state, a:tmp, a:job, sentinel]
3463-
call fugitive#DidChange(a:state.git_dir)
3464-
if bufnr == bufnr('') && !exists('g:fugitive_event')
3446+
let files = readfile(sentinel, '')
3447+
call writefile([len(files)], sentinel)
3448+
for file in reverse(files)
3449+
let file = FugitiveVimPath(file)
34653450
try
3466-
let g:fugitive_event = a:state.git_dir
3467-
let g:fugitive_result = a:state
3468-
exe s:DoAutocmd('User FugitiveEditor')
3451+
if !&equalalways && a:state.mods !~# '\<\d*tab\>' && 3 > (a:state.mods =~# '\<vert' ? winwidth(0) : winheight(0))
3452+
let noequalalways = 1
3453+
setglobal equalalways
3454+
endif
3455+
let mods = s:Mods(a:state.mods, 'SpanOrigin')
3456+
exe substitute(mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
34693457
finally
3470-
unlet! g:fugitive_event g:fugitive_result
3458+
if exists('l:noequalalways')
3459+
setglobal noequalalways
3460+
endif
34713461
endtry
3472-
endif
3462+
set bufhidden=wipe
3463+
call s:InitializeBuffer(a:state)
3464+
let bufnr = bufnr('')
3465+
let s:edit_jobs[bufnr] = [a:state, a:tmp, a:job, sentinel]
3466+
call fugitive#DidChange(a:state.git_dir)
3467+
if bufnr == bufnr('') && !exists('g:fugitive_event')
3468+
try
3469+
let g:fugitive_event = a:state.git_dir
3470+
let g:fugitive_result = a:state
3471+
exe s:DoAutocmd('User FugitiveEditor')
3472+
finally
3473+
unlet! g:fugitive_event g:fugitive_result
3474+
endtry
3475+
endif
3476+
endfor
34733477
return 1
34743478
endfunction
34753479

@@ -3623,6 +3627,9 @@ if !exists('s:edit_jobs')
36233627
endif
36243628
function! s:RunWait(state, tmp, job, ...) abort
36253629
if a:0 && filereadable(a:1)
3630+
if a:0 > 1 && a:2 > 0
3631+
return ''
3632+
endif
36263633
call delete(a:1)
36273634
endif
36283635
try
@@ -3725,8 +3732,16 @@ function! s:RunBufDelete(bufnr) abort
37253732
endif
37263733
if has_key(s:edit_jobs, a:bufnr) |
37273734
call add(s:resume_queue, remove(s:edit_jobs, a:bufnr))
3728-
call feedkeys("\<C-\>\<C-N>:redraw!|call delete(" . string(s:resume_queue[-1][0].file . '.edit') .
3729-
\ ")|call fugitive#Resume()|checktime\r", 'n')
3735+
let sentinel = s:resume_queue[-1][0].file . '.edit'
3736+
let active_buffers = str2nr(readfile(sentinel, '', 1)[0]) - 1
3737+
call add(s:resume_queue[-1], active_buffers)
3738+
if active_buffers < 1
3739+
call feedkeys("\<C-\>\<C-N>:redraw!|call delete(" . string(sentinel) .
3740+
\ ")|call fugitive#Resume()|checktime\r", 'n')
3741+
else
3742+
call writefile([active_buffers], sentinel)
3743+
call fugitive#Resume()
3744+
endif
37303745
endif
37313746
endfunction
37323747

@@ -3940,7 +3955,7 @@ function! fugitive#Command(line1, line2, range, bang, mods, arg, ...) abort
39403955
let env.FUGITIVE = state.file
39413956
let editor = 'sh ' . s:TempScript(
39423957
\ '[ -f "$FUGITIVE.exit" ] && cat "$FUGITIVE.exit" >&2 && exit 1',
3943-
\ 'echo "$1" > "$FUGITIVE.edit"',
3958+
\ 'for arg; do echo "$arg" >> "$FUGITIVE.edit"; done',
39443959
\ 'printf "\033]51;fugitive:edit\007" >&2',
39453960
\ 'while [ -f "$FUGITIVE.edit" -a ! -f "$FUGITIVE.exit" ]; do sleep 0.05 2>/dev/null || sleep 1; done',
39463961
\ 'exit 0')

0 commit comments

Comments
 (0)