1" Mail file type extension to pick files for attachments via vifm
2" Maintainer:  xaizek <xaizek@posteo.net>
3" Last Change: June 22, 2020
4
5" Insert attachment picked via vifm after 'Subject' header
6function! s:AddMailAttachments()
7	call vifm#globals#Init()
8
9	" XXX: similar code is in plugins/vifm.vim, but it's different in details
10	let l:listf = tempname()
11
12	if !has('nvim')
13		if has('gui_running')
14			execute 'silent !' g:vifm_term g:vifm_exec
15			                 \ '--choose-files' shellescape(l:listf, 1)
16			                 \ g:vifm_exec_args
17		else
18			execute 'silent !' g:vifm_exec
19			                 \ '--choose-files' shellescape(l:listf, 1)
20			                 \ g:vifm_exec_args
21		endif
22
23		redraw!
24
25		call s:HandleRunResults(v:shell_error, l:listf)
26	else
27		" Work around handicapped neovim...
28		let callback = { 'listf': l:listf }
29		function! callback.on_exit(id, code, event)
30			buffer #
31			silent! bdelete! #
32			call s:HandleRunResults(a:code, self.listf)
33		endfunction
34		enew
35		call termopen(g:vifm_exec . ' --choose-files ' . shellescape(l:listf, 1)
36		             \. ' ' . g:vifm_exec_args, callback)
37
38		startinsert
39	endif
40endfunction
41
42function! s:HandleRunResults(exitcode, listf)
43	if a:exitcode != 0
44		echoerr 'Got non-zero code from vifm: ' . a:exitcode
45		call delete(a:listf)
46		return
47	endif
48
49	let l:insert_pos = search('^Subject:', 'nw')
50
51	if filereadable(a:listf) && l:insert_pos != 0
52		for line in readfile(a:listf)
53			call append(l:insert_pos, 'Attach: '.escape(line, " "))
54			let l:insert_pos += 1
55		endfor
56	endif
57	call delete(a:listf)
58endfunction
59
60nnoremap <buffer> <silent> <localleader>a :call <sid>AddMailAttachments()<cr>
61
62" vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 :
63