Skip to content

Commit

Permalink
Add support for multi-file edits
Browse files Browse the repository at this point in the history
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 tpope#2352
  • Loading branch information
Fabian Wermelinger committed Dec 2, 2024

Verified

This commit was signed with the committer’s verified signature.
0xAleksaOpacic Aleksa Opacic
1 parent 320b18f commit 28f17e5
Showing 1 changed file with 42 additions and 27 deletions.
69 changes: 42 additions & 27 deletions autoload/fugitive.vim
Original file line number Diff line number Diff line change
@@ -3443,33 +3443,37 @@ function! s:RunEdit(state, tmp, job) abort
endif
call remove(a:state, 'request')
let sentinel = a:state.file . '.edit'
let file = FugitiveVimPath(readfile(sentinel, '', 1)[0])
try
if !&equalalways && a:state.mods !~# '\<\d*tab\>' && 3 > (a:state.mods =~# '\<vert' ? winwidth(0) : winheight(0))
let noequalalways = 1
setglobal equalalways
endif
let mods = s:Mods(a:state.mods, 'SpanOrigin')
exe substitute(mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
finally
if exists('l:noequalalways')
setglobal noequalalways
endif
endtry
set bufhidden=wipe
call s:InitializeBuffer(a:state)
let bufnr = bufnr('')
let s:edit_jobs[bufnr] = [a:state, a:tmp, a:job, sentinel]
call fugitive#DidChange(a:state.git_dir)
if bufnr == bufnr('') && !exists('g:fugitive_event')
let files = readfile(sentinel, '')
call writefile([len(files)], sentinel)
for file in reverse(files)
let file = FugitiveVimPath(file)
try
let g:fugitive_event = a:state.git_dir
let g:fugitive_result = a:state
exe s:DoAutocmd('User FugitiveEditor')
if !&equalalways && a:state.mods !~# '\<\d*tab\>' && 3 > (a:state.mods =~# '\<vert' ? winwidth(0) : winheight(0))
let noequalalways = 1
setglobal equalalways
endif
let mods = s:Mods(a:state.mods, 'SpanOrigin')
exe substitute(mods, '\<tab\>', '-tab', 'g') 'keepalt split' s:fnameescape(file)
finally
unlet! g:fugitive_event g:fugitive_result
if exists('l:noequalalways')
setglobal noequalalways
endif
endtry
endif
set bufhidden=wipe
call s:InitializeBuffer(a:state)
let bufnr = bufnr('')
let s:edit_jobs[bufnr] = [a:state, a:tmp, a:job, sentinel]
call fugitive#DidChange(a:state.git_dir)
if bufnr == bufnr('') && !exists('g:fugitive_event')
try
let g:fugitive_event = a:state.git_dir
let g:fugitive_result = a:state
exe s:DoAutocmd('User FugitiveEditor')
finally
unlet! g:fugitive_event g:fugitive_result
endtry
endif
endfor
return 1
endfunction

@@ -3623,6 +3627,9 @@ if !exists('s:edit_jobs')
endif
function! s:RunWait(state, tmp, job, ...) abort
if a:0 && filereadable(a:1)
if a:0 > 1 && a:2 > 0
return ''
endif
call delete(a:1)
endif
try
@@ -3725,8 +3732,16 @@ function! s:RunBufDelete(bufnr) abort
endif
if has_key(s:edit_jobs, a:bufnr) |
call add(s:resume_queue, remove(s:edit_jobs, a:bufnr))
call feedkeys("\<C-\>\<C-N>:redraw!|call delete(" . string(s:resume_queue[-1][0].file . '.edit') .
\ ")|call fugitive#Resume()|checktime\r", 'n')
let sentinel = s:resume_queue[-1][0].file . '.edit'
let active_buffers = str2nr(readfile(sentinel, '', 1)[0]) - 1
call add(s:resume_queue[-1], active_buffers)
if active_buffers < 1
call feedkeys("\<C-\>\<C-N>:redraw!|call delete(" . string(sentinel) .
\ ")|call fugitive#Resume()|checktime\r", 'n')
else
call writefile([active_buffers], sentinel)
call fugitive#Resume()
endif
endif
endfunction

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

0 comments on commit 28f17e5

Please sign in to comment.