vmail 2.6.5 → 2.6.6
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +12 -0
- data/lib/vmail.vim +51 -44
- data/lib/vmail/imap_client.rb +14 -0
- data/lib/vmail/showing_headers.rb +5 -3
- data/lib/vmail/version.rb +1 -1
- metadata +1 -1
data/README.markdown
CHANGED
@@ -71,10 +71,21 @@ The `.vmailrc` file should look something like this. Substitute your own values.
|
|
71
71
|
username: dhchoi@gmail.com
|
72
72
|
password: password
|
73
73
|
name: Daniel Choi
|
74
|
+
date_format: wordy
|
74
75
|
signature: |
|
75
76
|
--
|
76
77
|
Sent from Vmail. http://danielchoi.com/software/vmail.html
|
77
78
|
|
79
|
+
|
80
|
+
### Configuration file - optional parameters
|
81
|
+
`date_format: wordy | numerical`
|
82
|
+
|
83
|
+
`wordy`: The email arrival date is shown as for example 'Dec 15 11:59pm' or 'Dec 15 2008'.
|
84
|
+
This is the default value of the date_format parameter.
|
85
|
+
|
86
|
+
`numerical`: The email arrival date is shown as for example '15.12 23:59' or '15.12 2008'.
|
87
|
+
It saves two characters - useful on devices with really small displays.
|
88
|
+
|
78
89
|
This file should be formatted in [YAML syntax][1].
|
79
90
|
|
80
91
|
[1]:http://www.yaml.org/spec/1.2/spec.html
|
@@ -93,6 +104,7 @@ If you want to use a shell script to print the signature, use the
|
|
93
104
|
username: dhchoi@gmail.com
|
94
105
|
password: password
|
95
106
|
name: Daniel Choi
|
107
|
+
date_format: wordy
|
96
108
|
signature_script: /home/choi/bin/vmail_signature.sh
|
97
109
|
|
98
110
|
You can add a `vim_opts:` key-value pair to run arbitrary Vim commands when Vmail starts up.
|
data/lib/vmail.vim
CHANGED
@@ -69,9 +69,9 @@ function! s:create_list_window()
|
|
69
69
|
endfunction
|
70
70
|
|
71
71
|
" the message display buffer window
|
72
|
-
function! s:create_message_window()
|
72
|
+
function! s:create_message_window()
|
73
73
|
exec "split " . s:message_bufname
|
74
|
-
setlocal modifiable
|
74
|
+
setlocal modifiable
|
75
75
|
setlocal buftype=nofile
|
76
76
|
let s:message_window_bufnr = bufnr('%')
|
77
77
|
call s:message_window_mappings()
|
@@ -109,7 +109,7 @@ function! s:show_message(stay_in_message_list)
|
|
109
109
|
write
|
110
110
|
" this just clears the command line and prevents the screen from
|
111
111
|
" moving up when the next echo statement executes:
|
112
|
-
" call feedkeys(":\<cr>")
|
112
|
+
" call feedkeys(":\<cr>")
|
113
113
|
" redraw
|
114
114
|
let command = s:show_message_command . s:uid
|
115
115
|
echom "Loading message ". s:uid .". Please wait..."
|
@@ -120,7 +120,7 @@ function! s:show_message(stay_in_message_list)
|
|
120
120
|
1,$delete
|
121
121
|
put =res
|
122
122
|
" critical: don't call execute 'normal \<cr>'
|
123
|
-
" call feedkeys("<cr>")
|
123
|
+
" call feedkeys("<cr>")
|
124
124
|
1delete
|
125
125
|
normal 1Gjk
|
126
126
|
set nomodifiable
|
@@ -149,7 +149,7 @@ endfunction
|
|
149
149
|
function! s:show_previous_message()
|
150
150
|
let fullscreen = (bufwinnr(s:listbufnr) == -1) " we're in full screen message mode
|
151
151
|
if fullscreen
|
152
|
-
3split
|
152
|
+
3split
|
153
153
|
exec 'b'. s:listbufnr
|
154
154
|
else
|
155
155
|
call s:focus_list_window()
|
@@ -194,10 +194,10 @@ function! s:show_raw()
|
|
194
194
|
endfunction
|
195
195
|
|
196
196
|
function! s:focus_list_window()
|
197
|
-
if bufwinnr(s:listbufnr) == winnr()
|
197
|
+
if bufwinnr(s:listbufnr) == winnr()
|
198
198
|
return
|
199
199
|
end
|
200
|
-
let winnr = bufwinnr(s:listbufnr)
|
200
|
+
let winnr = bufwinnr(s:listbufnr)
|
201
201
|
if winnr == -1
|
202
202
|
" create window
|
203
203
|
split
|
@@ -247,7 +247,7 @@ function! s:update()
|
|
247
247
|
call cursor(num, 0)
|
248
248
|
normal z.
|
249
249
|
redraw
|
250
|
-
echom "You have " . num . " new message" . (num == 1 ? '' : 's') . "!"
|
250
|
+
echom "You have " . num . " new message" . (num == 1 ? '' : 's') . "!"
|
251
251
|
else
|
252
252
|
redraw
|
253
253
|
echom "No new messages"
|
@@ -294,9 +294,9 @@ function! s:toggle_star() range
|
|
294
294
|
if (match(getline(a:firstline), flag_symbol) != -1)
|
295
295
|
let action = " -FLAGS"
|
296
296
|
endif
|
297
|
-
let command = s:flag_command . shellescape(join(uid_set, ',')) . action . " Flagged"
|
297
|
+
let command = s:flag_command . shellescape(join(uid_set, ',')) . action . " Flagged"
|
298
298
|
if nummsgs == 1
|
299
|
-
echom "Toggling flag on message"
|
299
|
+
echom "Toggling flag on message"
|
300
300
|
else
|
301
301
|
echom "Toggling flags on " . nummsgs . " messages"
|
302
302
|
endif
|
@@ -320,7 +320,7 @@ function! s:toggle_star() range
|
|
320
320
|
write
|
321
321
|
redraw
|
322
322
|
if nummsgs == 1
|
323
|
-
echom "Toggled flag on message"
|
323
|
+
echom "Toggled flag on message"
|
324
324
|
else
|
325
325
|
echom "Toggled flags on " . nummsgs . " messages"
|
326
326
|
endif
|
@@ -332,7 +332,7 @@ func! s:delete_messages(flag) range
|
|
332
332
|
let nummsgs = len(uid_set)
|
333
333
|
let command = s:flag_command . shellescape(join(uid_set, ',')) . " +FLAGS " . a:flag
|
334
334
|
if nummsgs == 1
|
335
|
-
echom "Deleting message"
|
335
|
+
echom "Deleting message"
|
336
336
|
else
|
337
337
|
echom "Deleting " . nummsgs . " messages"
|
338
338
|
endif
|
@@ -371,7 +371,7 @@ func! s:append_messages_to_file() range
|
|
371
371
|
return
|
372
372
|
endif
|
373
373
|
let s:append_file = append_file
|
374
|
-
let command = s:append_to_file_command . shellescape(join(uid_set, ',')) . ' ' . s:append_file
|
374
|
+
let command = s:append_to_file_command . shellescape(join(uid_set, ',')) . ' ' . s:append_file
|
375
375
|
echo "Appending " . nummsgs . " message" . (nummsgs == 1 ? '' : 's') . " to " . s:append_file . ". Please wait..."
|
376
376
|
let res = s:system_with_error_handling(command)
|
377
377
|
echo res
|
@@ -397,11 +397,11 @@ function! s:move_to_mailbox(copy) range
|
|
397
397
|
let prompt = "select mailbox to " . (a:copy ? 'copy' : 'move') . " to: "
|
398
398
|
call setline(1, prompt)
|
399
399
|
normal $
|
400
|
-
inoremap <silent> <buffer> <cr> <Esc>:call <SID>complete_move_to_mailbox()<CR>
|
400
|
+
inoremap <silent> <buffer> <cr> <Esc>:call <SID>complete_move_to_mailbox()<CR>
|
401
401
|
inoremap <silent> <buffer> <esc> <Esc>:q<cr>
|
402
402
|
setlocal completefunc=CompleteMoveMailbox
|
403
403
|
" c-p clears the line
|
404
|
-
let s:firstline = a:firstline
|
404
|
+
let s:firstline = a:firstline
|
405
405
|
let s:lastline = a:lastline
|
406
406
|
call feedkeys("a\<c-x>\<c-u>\<c-p>", 't')
|
407
407
|
" save these in script scope to delete the lines when move completes
|
@@ -410,13 +410,13 @@ endfunction
|
|
410
410
|
function! s:complete_move_to_mailbox()
|
411
411
|
let mailbox = get(split(getline(line('.')), ": "), 1)
|
412
412
|
close
|
413
|
-
if s:copy_to_mailbox
|
413
|
+
if s:copy_to_mailbox
|
414
414
|
let command = s:copy_to_command . s:uid_set . ' ' . shellescape(mailbox)
|
415
415
|
else
|
416
416
|
let command = s:move_to_command . s:uid_set . ' ' . shellescape(mailbox)
|
417
417
|
endif
|
418
418
|
redraw
|
419
|
-
echo "Moving uids ". s:uid_set . " to mailbox " . mailbox
|
419
|
+
echo "Moving uids ". s:uid_set . " to mailbox " . mailbox
|
420
420
|
let res = s:system_with_error_handling(command)
|
421
421
|
setlocal modifiable
|
422
422
|
if !s:copy_to_mailbox
|
@@ -425,7 +425,7 @@ function! s:complete_move_to_mailbox()
|
|
425
425
|
setlocal nomodifiable
|
426
426
|
write
|
427
427
|
redraw
|
428
|
-
echo s:nummsgs . " message" . (s:nummsgs == 1 ? '' : 's') . ' ' . (s:copy_to_mailbox ? 'copied' : 'moved') . ' to ' . mailbox
|
428
|
+
echo s:nummsgs . " message" . (s:nummsgs == 1 ? '' : 's') . ' ' . (s:copy_to_mailbox ? 'copied' : 'moved') . ' to ' . mailbox
|
429
429
|
endfunction
|
430
430
|
|
431
431
|
function! CompleteMoveMailbox(findstart, base)
|
@@ -474,7 +474,7 @@ function! s:mailbox_window()
|
|
474
474
|
setlocal noswapfile
|
475
475
|
setlocal modifiable
|
476
476
|
resize 1
|
477
|
-
inoremap <silent> <buffer> <cr> <Esc>:call <SID>select_mailbox()<CR>
|
477
|
+
inoremap <silent> <buffer> <cr> <Esc>:call <SID>select_mailbox()<CR>
|
478
478
|
inoremap <silent> <buffer> <esc> <Esc>:q<cr>
|
479
479
|
setlocal completefunc=CompleteMailbox
|
480
480
|
" c-p clears the line
|
@@ -526,19 +526,19 @@ function! s:select_mailbox()
|
|
526
526
|
" reset window width now
|
527
527
|
call s:system_with_error_handling(s:set_window_width_command . winwidth(1))
|
528
528
|
" now get latest 100 messages
|
529
|
-
call s:focus_list_window()
|
529
|
+
call s:focus_list_window()
|
530
530
|
setlocal modifiable
|
531
531
|
let command = s:search_command . shellescape("all")
|
532
532
|
echo "Loading messages..."
|
533
533
|
let res = s:system_with_error_handling(command)
|
534
534
|
silent 1,$delete
|
535
535
|
silent! put! =res
|
536
|
-
execute "normal Gdd\<c-y>"
|
536
|
+
execute "normal Gdd\<c-y>"
|
537
537
|
setlocal nomodifiable
|
538
538
|
write
|
539
539
|
normal gg
|
540
540
|
redraw
|
541
|
-
echom "Current mailbox: ". s:mailbox
|
541
|
+
echom "Current mailbox: ". s:mailbox
|
542
542
|
endfunction
|
543
543
|
|
544
544
|
func! s:search_query()
|
@@ -559,37 +559,37 @@ function! s:do_search()
|
|
559
559
|
close
|
560
560
|
let command = s:search_command . shellescape(s:query)
|
561
561
|
redraw
|
562
|
-
call s:focus_list_window()
|
562
|
+
call s:focus_list_window()
|
563
563
|
setlocal modifiable
|
564
564
|
echo "Running query on " . s:mailbox . ": " . s:query . ". Please wait..."
|
565
565
|
let res = s:system_with_error_handling(command)
|
566
566
|
silent! 1,$delete
|
567
567
|
silent! put! =res
|
568
|
-
execute "silent normal Gdd\<c-y>"
|
568
|
+
execute "silent normal Gdd\<c-y>"
|
569
569
|
setlocal nomodifiable
|
570
570
|
write
|
571
571
|
normal gg
|
572
572
|
endfunction
|
573
573
|
|
574
574
|
function! s:more_messages()
|
575
|
-
let command = s:more_messages_command
|
575
|
+
let command = s:more_messages_command
|
576
576
|
echo "Fetching more messages. Please wait..."
|
577
577
|
let res = s:system_with_error_handling(command)
|
578
578
|
setlocal modifiable
|
579
579
|
let lines = split(res, "\n")
|
580
580
|
call append(line('$'), lines)
|
581
|
-
" execute "normal Gdd\<c-y>"
|
581
|
+
" execute "normal Gdd\<c-y>"
|
582
582
|
setlocal nomodifiable
|
583
583
|
normal j
|
584
584
|
redraw
|
585
585
|
echo "Done"
|
586
586
|
endfunction
|
587
587
|
|
588
|
-
" --------------------------------------------------------------------------------
|
588
|
+
" --------------------------------------------------------------------------------
|
589
589
|
" compose reply, compose, forward, save draft
|
590
590
|
|
591
591
|
function! s:compose_reply(all)
|
592
|
-
let command = s:reply_template_command
|
592
|
+
let command = s:reply_template_command
|
593
593
|
if a:all
|
594
594
|
let command = command . ' 1'
|
595
595
|
endif
|
@@ -602,14 +602,14 @@ function! s:compose_message()
|
|
602
602
|
let command = s:new_message_template_command
|
603
603
|
call s:open_compose_window(command)
|
604
604
|
" position cursor after to:
|
605
|
-
" call search("^to:")
|
605
|
+
" call search("^to:")
|
606
606
|
" normal A
|
607
607
|
endfunction
|
608
608
|
|
609
609
|
function! s:compose_forward()
|
610
|
-
let command = s:forward_template_command
|
610
|
+
let command = s:forward_template_command
|
611
611
|
call s:open_compose_window(command)
|
612
|
-
" call search("^to:")
|
612
|
+
" call search("^to:")
|
613
613
|
" normal A
|
614
614
|
endfunction
|
615
615
|
|
@@ -637,7 +637,7 @@ func! s:turn_into_compose_window()
|
|
637
637
|
setlocal completefunc=CompleteContact
|
638
638
|
endfunc
|
639
639
|
|
640
|
-
" contacts.txt file should be generated.
|
640
|
+
" contacts.txt file should be generated.
|
641
641
|
" grep works well, does partial matches
|
642
642
|
function! CompleteContact(findstart, base)
|
643
643
|
if !exists("s:mailboxes")
|
@@ -652,7 +652,7 @@ function! CompleteContact(findstart, base)
|
|
652
652
|
endwhile
|
653
653
|
return start
|
654
654
|
else
|
655
|
-
" find contacts
|
655
|
+
" find contacts
|
656
656
|
" model regex: match at beginning of line, or inside < > wrapping
|
657
657
|
" email addr
|
658
658
|
" '\(^ho\|<ho\)'
|
@@ -683,11 +683,11 @@ function! s:send_message()
|
|
683
683
|
redraw
|
684
684
|
endfunction
|
685
685
|
|
686
|
-
" --------------------------------------------------------------------------------
|
686
|
+
" --------------------------------------------------------------------------------
|
687
687
|
|
688
688
|
" call from inside message window with <Leader>h
|
689
689
|
func! s:open_html_part()
|
690
|
-
let command = s:open_html_part_command
|
690
|
+
let command = s:open_html_part_command
|
691
691
|
" the command saves the html part to a local file
|
692
692
|
let outfile = s:system_with_error_handling(command)
|
693
693
|
" todo: allow user to change open in browser command?
|
@@ -712,7 +712,7 @@ func! s:attach_file(file)
|
|
712
712
|
endfunc
|
713
713
|
|
714
714
|
|
715
|
-
" --------------------------------------------------------------------------------
|
715
|
+
" --------------------------------------------------------------------------------
|
716
716
|
|
717
717
|
func! s:toggle_maximize_window()
|
718
718
|
if winnr('$') > 1
|
@@ -743,7 +743,7 @@ func! s:open_href(all) range
|
|
743
743
|
endif
|
744
744
|
let lnum += 1
|
745
745
|
endwhile
|
746
|
-
echom 'opened '.n.' links'
|
746
|
+
echom 'opened '.n.' links'
|
747
747
|
return
|
748
748
|
end
|
749
749
|
let line = search(pattern, 'cw')
|
@@ -755,7 +755,7 @@ func! s:open_href(all) range
|
|
755
755
|
let n += 1
|
756
756
|
let line = search('https\?:', 'W')
|
757
757
|
endwhile
|
758
|
-
echom 'opened '.n.' links'
|
758
|
+
echom 'opened '.n.' links'
|
759
759
|
else
|
760
760
|
let href = matchstr(getline(line('.')), pattern)
|
761
761
|
let command = s:browser_command ." ".shellescape(href)." &"
|
@@ -764,7 +764,7 @@ func! s:open_href(all) range
|
|
764
764
|
endif
|
765
765
|
endfunc
|
766
766
|
|
767
|
-
" --------------------------------------------------------------------------------
|
767
|
+
" --------------------------------------------------------------------------------
|
768
768
|
" HELP
|
769
769
|
func! s:show_help()
|
770
770
|
let command = s:browser_command . ' ' . shellescape('http://danielchoi.com/software/vmail.html')
|
@@ -773,7 +773,7 @@ func! s:show_help()
|
|
773
773
|
"exec "split " . helpfile
|
774
774
|
endfunc
|
775
775
|
|
776
|
-
" --------------------------------------------------------------------------------
|
776
|
+
" --------------------------------------------------------------------------------
|
777
777
|
" CONVENIENCE FUNCS
|
778
778
|
|
779
779
|
function! s:collect_uids(startline, endline)
|
@@ -787,7 +787,7 @@ function! s:collect_uids(startline, endline)
|
|
787
787
|
return uid_set
|
788
788
|
endfunc
|
789
789
|
|
790
|
-
" --------------------------------------------------------------------------------
|
790
|
+
" --------------------------------------------------------------------------------
|
791
791
|
" MAPPINGS
|
792
792
|
|
793
793
|
func! s:message_window_mappings()
|
@@ -1071,8 +1071,8 @@ func! s:global_mappings()
|
|
1071
1071
|
" NOTE send_message is a global mapping, so user can load a saved
|
1072
1072
|
" message from a file and send it
|
1073
1073
|
nnoremap <silent> <leader>vs :call <SID>send_message()<CR>
|
1074
|
-
noremap <silent> <leader>o :call <SID>open_href(0)<cr>
|
1075
|
-
noremap <silent> <leader>O :call <SID>open_href(1)<cr>
|
1074
|
+
noremap <silent> <leader>o :call <SID>open_href(0)<cr>
|
1075
|
+
noremap <silent> <leader>O :call <SID>open_href(1)<cr>
|
1076
1076
|
noremap <silent> <leader>? :call <SID>show_help()<cr>
|
1077
1077
|
noremap <silent> <leader>qq :qal!<cr>
|
1078
1078
|
endfunc
|
@@ -1087,7 +1087,14 @@ func! s:set_list_colors()
|
|
1087
1087
|
syn match vmailFirstColAnswered /An/ contained containedin=vmailFirstCol
|
1088
1088
|
syn match vmailFirstColForward /\$F/ contained containedin=vmailFirstCol
|
1089
1089
|
syn match vmailFirstColNotJunk /No/ contained containedin=vmailFirstCol
|
1090
|
-
|
1090
|
+
|
1091
|
+
" Examples matched by vmailDateCol:
|
1092
|
+
" | Dec 15 11:59pm |
|
1093
|
+
" | Dec 15 2008 |
|
1094
|
+
" | 15.12 23:59 |
|
1095
|
+
" | 15.12 2008 |
|
1096
|
+
syn match vmailDateCol /\s\+\(... \d\d \(\(\d\d:\d\d..\)\|\(\d\{4}\)\)\)\|\(\d\d\.\d\d \(\(\d\d:\d\d\)\|\(\d\{4}\)\)\)\s\+|/ nextgroup=vmailFromCol contains=vmailSeperator
|
1097
|
+
|
1091
1098
|
syn match vmailFromCol /\s.\{-}|\@=/ contained nextgroup=vmailFromSeperator
|
1092
1099
|
syn match vmailFromColEmail /<[^ ]*/ contained containedin=vmailFromCol
|
1093
1100
|
syn match vmailFromSeperator /|/ contained nextgroup=vmailSubject
|
data/lib/vmail/imap_client.rb
CHANGED
@@ -46,6 +46,20 @@ module Vmail
|
|
46
46
|
@smtp_domain = config['smtp_domain'] || 'gmail.com'
|
47
47
|
@authentication = config['authentication'] || 'plain'
|
48
48
|
@width = 100
|
49
|
+
@date_format = config['date_format'] || 'wordy'
|
50
|
+
if @date_format == 'numerical'
|
51
|
+
@date_formatter_this_year = '%d.%m %H:%M'
|
52
|
+
@date_formatter_prev_years = '%d.%m %Y'
|
53
|
+
@formatted_date_with = 11
|
54
|
+
else
|
55
|
+
if @date_format != 'wordy'
|
56
|
+
@logger.warn "Unknown date_format: #{@date_format}; Using default value: wordy"
|
57
|
+
@date_format = 'wordy'
|
58
|
+
end
|
59
|
+
@date_formatter_this_year = '%b %d %I:%M%P'
|
60
|
+
@date_formatter_prev_years = '%b %d %Y'
|
61
|
+
@formatted_date_with = 14
|
62
|
+
end
|
49
63
|
current_message = nil
|
50
64
|
end
|
51
65
|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'iconv'
|
2
|
+
|
2
3
|
module Vmail
|
4
|
+
|
3
5
|
module ShowingHeaders
|
4
6
|
|
5
7
|
def get_message_headers(message_ids)
|
@@ -76,9 +78,9 @@ module Vmail
|
|
76
78
|
def format_header_for_list(message)
|
77
79
|
date = DateTime.parse(message.date)
|
78
80
|
formatted_date = if date.year != Time.now.year
|
79
|
-
date.strftime
|
81
|
+
date.strftime @date_formatter_prev_years
|
80
82
|
else
|
81
|
-
date.strftime
|
83
|
+
date.strftime @date_formatter_this_year
|
82
84
|
end
|
83
85
|
address = if @mailbox == mailbox_aliases['sent']
|
84
86
|
message.recipients
|
@@ -90,7 +92,7 @@ module Vmail
|
|
90
92
|
address_col_width = (mid_width * 0.3).ceil
|
91
93
|
subject_col_width = (mid_width * 0.7).floor
|
92
94
|
row_text = [ format_flags(message.flags).col(2),
|
93
|
-
(formatted_date || '').col(
|
95
|
+
(formatted_date || '').col(@formatted_date_with),
|
94
96
|
address.col(address_col_width),
|
95
97
|
message.subject.col(subject_col_width),
|
96
98
|
number_to_human_size(message.size).rcol(7),
|
data/lib/vmail/version.rb
CHANGED