vmail 0.0.5 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/NOTES +8 -5
- data/lib/vmail.rb +1 -1
- data/lib/vmail.vim +38 -12
- data/lib/vmail/imap_client.rb +22 -6
- data/lib/vmail/version.rb +1 -1
- metadata +2 -2
data/NOTES
CHANGED
@@ -480,17 +480,15 @@ DONE
|
|
480
480
|
- sending an attachment
|
481
481
|
- can specify a directory, then all the items in the directory get
|
482
482
|
attached and sent
|
483
|
+
- extract and append text of all selected messages into file (append)
|
483
484
|
|
484
485
|
next:
|
485
|
-
-
|
486
|
-
- could be "attach: [uid] attachments to signal"
|
486
|
+
- tweak contacts list script (plus instruction for how to use)
|
487
487
|
- help doc: just return readme file, or a vim version of it (vim filetype later)
|
488
488
|
- follow mysql and use -u and -p flags on startup of server?
|
489
489
|
- omitting -p flag forces prompt
|
490
|
-
- print all selected messages into file (append)
|
491
490
|
- ,s s confusion? Star vs search
|
492
|
-
-
|
493
|
-
- sort contacts by frequency, then take first 10 or so of any match
|
491
|
+
- note dependence on lynx in README
|
494
492
|
|
495
493
|
later:
|
496
494
|
- mvim - starred messages not syntax colored
|
@@ -504,8 +502,11 @@ later:
|
|
504
502
|
- need to bundle macvim
|
505
503
|
- if move to unknown mailbox, create the mailbox, then do the move
|
506
504
|
- some lingering encoding issues
|
505
|
+
- forwarding with attachments
|
506
|
+
- could be "attach: [uid] attachments to signal"
|
507
507
|
- something is wrong with cursorline sometimes
|
508
508
|
- try flashing progress in echo line
|
509
|
+
- sort contacts by frequency, then take first 10 or so of any match
|
509
510
|
- straight to switch mailbox, etc from message window
|
510
511
|
- allow deliver command from any buffer or window, as long as headers are at top
|
511
512
|
- range selection from : prompt
|
@@ -519,6 +520,8 @@ later:
|
|
519
520
|
- tempname()
|
520
521
|
- system() allows a parameters that is written to tmp file and passed
|
521
522
|
to stdin
|
523
|
+
- enhance contacts auto fix with more advanced vim script
|
524
|
+
- create contacts database on first startup
|
522
525
|
|
523
526
|
|
524
527
|
|
data/lib/vmail.rb
CHANGED
data/lib/vmail.vim
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
let s:mailbox = $VMAIL_MAILBOX
|
2
2
|
let s:query = $VMAIL_QUERY
|
3
|
+
let s:append_file = ''
|
3
4
|
|
4
5
|
let s:drb_uri = $DRB_URI
|
5
6
|
|
@@ -13,6 +14,7 @@ let s:select_mailbox_command = s:client_script . "select_mailbox "
|
|
13
14
|
let s:search_command = s:client_script . "search "
|
14
15
|
let s:more_messages_command = s:client_script . "more_messages "
|
15
16
|
let s:flag_command = s:client_script . "flag "
|
17
|
+
let s:append_to_file_command = s:client_script . "append_to_file "
|
16
18
|
let s:move_to_command = s:client_script . "move_to "
|
17
19
|
let s:new_message_template_command = s:client_script . "new_message_template "
|
18
20
|
let s:reply_template_command = s:client_script . "reply_template "
|
@@ -180,6 +182,7 @@ function! s:update()
|
|
180
182
|
let line = line('$')
|
181
183
|
$put =res
|
182
184
|
setlocal nomodifiable
|
185
|
+
write
|
183
186
|
let num = len(split(res, '\n', ''))
|
184
187
|
redraw
|
185
188
|
call cursor(line + 1, 0)
|
@@ -221,6 +224,7 @@ function! s:toggle_star() range
|
|
221
224
|
exec a:firstline . "," . a:lastline . "delete"
|
222
225
|
exec (a:firstline - 1). "put =res"
|
223
226
|
setlocal nomodifiable
|
227
|
+
write
|
224
228
|
" if more than 2 lines change, vim forces us to look at a message.
|
225
229
|
" dismiss it.
|
226
230
|
if len(split(res, "\n")) > 2
|
@@ -246,6 +250,7 @@ func! s:delete_messages(flag) range
|
|
246
250
|
setlocal modifiable
|
247
251
|
exec a:firstline . "," . a:lastline . "delete"
|
248
252
|
setlocal nomodifiable
|
253
|
+
write
|
249
254
|
" if more than 2 lines change, vim forces us to look at a message.
|
250
255
|
" dismiss it.
|
251
256
|
if len(uids) > 2
|
@@ -253,6 +258,27 @@ func! s:delete_messages(flag) range
|
|
253
258
|
endif
|
254
259
|
endfunc
|
255
260
|
|
261
|
+
" --------------------------------------------------------------------------------
|
262
|
+
" append text bodies of a set of messages to a file
|
263
|
+
func! s:append_messages_to_file() range
|
264
|
+
let lnum = a:firstline
|
265
|
+
let n = 0
|
266
|
+
let uids = []
|
267
|
+
while lnum <= a:lastline
|
268
|
+
let line = getline(lnum)
|
269
|
+
let message_uid = matchstr(line, '^\d\+')
|
270
|
+
call add(uids, message_uid)
|
271
|
+
let lnum = lnum + 1
|
272
|
+
endwhile
|
273
|
+
let uid_set = join(uids, ",")
|
274
|
+
let s:append_file = input("print messages to file: ", s:append_file)
|
275
|
+
let command = s:append_to_file_command . s:append_file . ' ' . uid_set
|
276
|
+
echo "appending " . len(uids) . " message" . (len(uids) == 1 ? '' : 's') . " to " s:append_file
|
277
|
+
let res = system(command)
|
278
|
+
echo res
|
279
|
+
redraw
|
280
|
+
endfunc
|
281
|
+
|
256
282
|
" --------------------------------------------------------------------------------
|
257
283
|
" move to another mailbox
|
258
284
|
function! s:move_to_mailbox() range
|
@@ -465,7 +491,6 @@ function! s:compose_reply(all)
|
|
465
491
|
endfunction
|
466
492
|
|
467
493
|
function! s:compose_message()
|
468
|
-
write
|
469
494
|
let command = s:new_message_template_command
|
470
495
|
call s:open_compose_window(command)
|
471
496
|
" position cursor after to:
|
@@ -475,7 +500,6 @@ function! s:compose_message()
|
|
475
500
|
endfunction
|
476
501
|
|
477
502
|
function! s:compose_forward()
|
478
|
-
write
|
479
503
|
let command = s:forward_template_command . s:current_uid
|
480
504
|
call s:open_compose_window(command)
|
481
505
|
call search("^to:")
|
@@ -487,10 +511,12 @@ func! s:open_compose_window(command)
|
|
487
511
|
redraw
|
488
512
|
echo a:command
|
489
513
|
let res = system(a:command)
|
490
|
-
split
|
491
|
-
|
492
|
-
|
514
|
+
split compose-message
|
515
|
+
setlocal buftype=nofile
|
516
|
+
setlocal noswapfile
|
493
517
|
setlocal modifiable
|
518
|
+
wincmd p
|
519
|
+
close!
|
494
520
|
1,$delete
|
495
521
|
put! =res
|
496
522
|
normal 1G
|
@@ -526,23 +552,22 @@ function! s:cancel_compose()
|
|
526
552
|
endfunction
|
527
553
|
|
528
554
|
function! s:send_message()
|
529
|
-
write
|
530
555
|
let mail = join(getline(1,'$'), "\n")
|
531
|
-
|
556
|
+
echo "sending message"
|
557
|
+
call system(s:deliver_command, mail)
|
532
558
|
redraw
|
533
|
-
|
534
|
-
wincmd p
|
535
|
-
close!
|
559
|
+
echo "sent! press q to go back to message list"
|
536
560
|
endfunction
|
537
561
|
|
538
562
|
func! s:save_draft()
|
539
|
-
write
|
540
563
|
let mail = join(getline(1,'$'), "\n")
|
541
|
-
|
564
|
+
echo "saving draft"
|
565
|
+
call system(s:save_draft_command, mail)
|
542
566
|
redraw
|
543
567
|
call s:focus_list_window()
|
544
568
|
wincmd p
|
545
569
|
close!
|
570
|
+
echo "draft saved"
|
546
571
|
endfunc
|
547
572
|
|
548
573
|
" --------------------------------------------------------------------------------
|
@@ -616,6 +641,7 @@ func! s:message_list_window_mappings()
|
|
616
641
|
noremap <silent> <buffer> <leader>! :call <SID>delete_messages("[Gmail]/Spam")<CR>
|
617
642
|
"open a link browser (os x)
|
618
643
|
"autocmd CursorMoved <buffer> call <SID>show_message()
|
644
|
+
noremap <silent> <buffer> <leader>vp :call <SID>append_messages_to_file()<CR>
|
619
645
|
noremap <silent> <buffer> u :call <SID>update()<CR>
|
620
646
|
noremap <silent> <buffer> <Leader>s :call <SID>search_query()<CR>
|
621
647
|
noremap <silent> <buffer> <Leader>m :call <SID>mailbox_window()<CR>
|
data/lib/vmail/imap_client.rb
CHANGED
@@ -224,8 +224,11 @@ module Vmail
|
|
224
224
|
|
225
225
|
def show_message(uid, raw=false, forwarded=false)
|
226
226
|
uid = uid.to_i
|
227
|
+
if forwarded
|
228
|
+
return @current_message.split(/\n-{20,}\n/, 2)[1]
|
229
|
+
end
|
227
230
|
return @current_mail.to_s if raw
|
228
|
-
return @current_message if uid == @current_uid
|
231
|
+
return @current_message if uid == @current_uid
|
229
232
|
log "fetching #{uid.inspect}"
|
230
233
|
fetch_data = reconnect_if_necessary do
|
231
234
|
@imap.uid_fetch(uid, ["FLAGS", "RFC822", "RFC822.SIZE"])[0]
|
@@ -240,8 +243,8 @@ module Vmail
|
|
240
243
|
out = formatter.process_body
|
241
244
|
size = fetch_data.attr["RFC822.SIZE"]
|
242
245
|
@current_message = <<-EOF
|
243
|
-
#{@mailbox} #{uid} #{number_to_human_size size} #{
|
244
|
-
|
246
|
+
#{@mailbox} #{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
|
247
|
+
---------------------------------------
|
245
248
|
#{format_headers(formatter.extract_headers)}
|
246
249
|
|
247
250
|
#{out}
|
@@ -295,7 +298,20 @@ EOF
|
|
295
298
|
log @imap.uid_store(uid_set, '+FLAGS', [:Deleted])
|
296
299
|
end
|
297
300
|
|
298
|
-
|
301
|
+
def append_to_file(file, uid_set)
|
302
|
+
if uid_set.is_a?(String)
|
303
|
+
uid_set = uid_set.split(",").map(&:to_i)
|
304
|
+
end
|
305
|
+
log "append messages to file: #{file}"
|
306
|
+
uid_set.each do |uid|
|
307
|
+
message = show_message(uid)
|
308
|
+
divider = "#{'=' * 39}\n"
|
309
|
+
File.open(file, 'a') {|f| f.puts(divider + message + "\n\n")}
|
310
|
+
log "appended uid #{uid}"
|
311
|
+
end
|
312
|
+
"printed #{uid_set.size} message#{uid_set.size == 1 ? '' : 's'} to #{file.strip}"
|
313
|
+
end
|
314
|
+
|
299
315
|
|
300
316
|
def new_message_template
|
301
317
|
headers = {'from' => "#{@name} <#{@username}>",
|
@@ -349,7 +365,6 @@ EOF
|
|
349
365
|
"\n\n#@signature"
|
350
366
|
end
|
351
367
|
|
352
|
-
# TODO, forward with attachments
|
353
368
|
def forward_template(uid)
|
354
369
|
original_body = show_message(uid, false, true)
|
355
370
|
new_message_template +
|
@@ -397,7 +412,7 @@ EOF
|
|
397
412
|
if (attachments = raw_body.split(/\n\s*\n/, 2)[0]) =~ /^attach(ment|ments)*:/
|
398
413
|
# TODO
|
399
414
|
files = YAML::load(attachments).values.flatten
|
400
|
-
log "
|
415
|
+
log "attach: #{files}"
|
401
416
|
files.each do |file|
|
402
417
|
if File.directory?(file)
|
403
418
|
Dir.glob("#{file}/*").each {|f| mail.add_file(f) if File.size?(f)}
|
@@ -408,6 +423,7 @@ EOF
|
|
408
423
|
mail.text_part do
|
409
424
|
body raw_body.split(/\n\s*\n/, 2)[1]
|
410
425
|
end
|
426
|
+
|
411
427
|
else
|
412
428
|
mail.text_part do
|
413
429
|
body raw_body
|
data/lib/vmail/version.rb
CHANGED