vmail 0.4.6 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +13 -2
- data/lib/vmail.vim +39 -22
- data/lib/vmail/imap_client.rb +20 -22
- data/lib/vmail/version.rb +1 -1
- metadata +2 -2
data/README.markdown
CHANGED
@@ -130,7 +130,7 @@ top of the list that looks something like this:
|
|
130
130
|
|
131
131
|
Put the cursor on this line and press ENTER to load more of these messages.
|
132
132
|
|
133
|
-
Unread messages are marked with a
|
133
|
+
Unread messages are marked with a `+` symbol.
|
134
134
|
|
135
135
|
To view the raw RFC822 version of a message, type `,R` while viewing the message.
|
136
136
|
|
@@ -138,7 +138,7 @@ To view the raw RFC822 version of a message, type `,R` while viewing the message
|
|
138
138
|
|
139
139
|
To star a message, put the cursor on it and type `,*`. (Note that the comma
|
140
140
|
before the * is part of the key sequence.) Starring a message copies it to the
|
141
|
-
`starred` mailbox. Starred messages are marked with a
|
141
|
+
`starred` mailbox. Starred messages are marked with a `*` symbol and
|
142
142
|
color-highlighted.
|
143
143
|
|
144
144
|
To delete a message, put the cursor on it and type `,#`. Deleting a message
|
@@ -419,6 +419,17 @@ Then you can create an SSH tunnel, e.g.
|
|
419
419
|
|
420
420
|
[davebolton]:https://github.com/lightningdb
|
421
421
|
|
422
|
+
|
423
|
+
## Customizing colors
|
424
|
+
|
425
|
+
By default, vmail highlights starred messages in bold green against a black
|
426
|
+
background. You can customize this setting by adding a line to your ~/.vimrc
|
427
|
+
file like so:
|
428
|
+
|
429
|
+
let g:vmail_flagged_color = "ctermfg=yellow ctermbg=black cterm=bold"
|
430
|
+
|
431
|
+
Type `:help highlight-args` in Vim for more details.
|
432
|
+
|
422
433
|
## Bug reports, feature requests
|
423
434
|
|
424
435
|
Please file bug reports and feature requests in the [vmail github issue tracker][tracker].
|
data/lib/vmail.vim
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
if !exists("g:vmail_flagged_color")
|
2
|
+
let g:vmail_flagged_color = "ctermfg=green ctermbg=black"
|
3
|
+
endif
|
1
4
|
let s:mailbox = $VMAIL_MAILBOX
|
2
5
|
let s:query = $VMAIL_QUERY
|
3
6
|
let s:browser_command = $VMAIL_BROWSER
|
@@ -67,14 +70,15 @@ endfunction
|
|
67
70
|
|
68
71
|
function! s:show_message()
|
69
72
|
let line = getline(line("."))
|
70
|
-
if match(line, '^>
|
73
|
+
if match(line, '^> Load') != -1
|
71
74
|
setlocal modifiable
|
72
75
|
delete
|
73
76
|
call s:more_messages()
|
74
77
|
return
|
75
78
|
endif
|
76
|
-
" remove the unread flag
|
77
|
-
|
79
|
+
" remove the unread flag +
|
80
|
+
" TODO!
|
81
|
+
let newline = substitute(line, '^**+', ' ', '')
|
78
82
|
setlocal modifiable
|
79
83
|
call setline(line('.'), newline)
|
80
84
|
setlocal nomodifiable
|
@@ -156,8 +160,9 @@ function! s:focus_list_window()
|
|
156
160
|
" set up syntax highlighting
|
157
161
|
if has("syntax")
|
158
162
|
syn clear
|
159
|
-
|
160
|
-
|
163
|
+
" colorize whole line
|
164
|
+
syn match VmailBufferFlagged /^*.*/hs=s
|
165
|
+
exec "hi def VmailBufferFlagged " . g:vmail_flagged_color
|
161
166
|
endif
|
162
167
|
" vertically center the cursor line
|
163
168
|
" normal z.
|
@@ -199,32 +204,46 @@ endfunction
|
|
199
204
|
|
200
205
|
function! s:toggle_star() range
|
201
206
|
let uid_set = (a:firstline - 2) . '..' . (a:lastline - 2)
|
202
|
-
let
|
207
|
+
let nummsgs = (a:lastline - a:firstline + 1)
|
208
|
+
let flag_symbol = "^*"
|
203
209
|
" check if starred already
|
204
210
|
let action = " +FLAGS"
|
205
211
|
if (match(getline(a:firstline), flag_symbol) != -1)
|
206
212
|
let action = " -FLAGS"
|
207
213
|
endif
|
208
214
|
let command = s:flag_command . uid_set . action . " Flagged"
|
209
|
-
if
|
215
|
+
if nummsgs == 1
|
210
216
|
echom "toggling flag on message"
|
211
217
|
else
|
212
|
-
echom "toggling flags on " .
|
218
|
+
echom "toggling flags on " . nummsgs . " messages"
|
213
219
|
endif
|
214
|
-
" toggle
|
215
|
-
" in a thread in imap_client
|
220
|
+
" toggle * on lines
|
216
221
|
let res = system(command)
|
217
222
|
setlocal modifiable
|
218
|
-
|
219
|
-
|
223
|
+
let lnum = a:firstline
|
224
|
+
while lnum <= a:lastline
|
225
|
+
let line = getline(lnum)
|
226
|
+
if action == " +FLAGS"
|
227
|
+
let newline = substitute(line, '^ ', '*', '')
|
228
|
+
let newline = substitute(newline, '^+ ', '*+', '')
|
229
|
+
else
|
230
|
+
let newline = substitute(line, '^*+', '+ ', '')
|
231
|
+
let newline = substitute(newline, '^* ', ' ', '')
|
232
|
+
endif
|
233
|
+
call setline(lnum, newline)
|
234
|
+
let lnum += 1
|
235
|
+
endwhile
|
220
236
|
setlocal nomodifiable
|
221
237
|
write
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
238
|
+
if nummsgs > 2
|
239
|
+
" call feedkeys("\<cr>")
|
240
|
+
endif
|
241
|
+
redraw
|
242
|
+
if nummsgs == 1
|
243
|
+
echom "toggled flag on message"
|
244
|
+
else
|
245
|
+
echom "toggled flags on " . nummsgs . " messages"
|
226
246
|
endif
|
227
|
-
echom "done"
|
228
247
|
endfunction
|
229
248
|
|
230
249
|
" flag can be Deleted or [Gmail]/Spam
|
@@ -442,6 +461,7 @@ function! s:select_mailbox()
|
|
442
461
|
setlocal nomodifiable
|
443
462
|
write
|
444
463
|
normal z.
|
464
|
+
echom "done"
|
445
465
|
endfunction
|
446
466
|
|
447
467
|
func! s:search_query()
|
@@ -478,15 +498,14 @@ function! s:do_search()
|
|
478
498
|
1,$delete
|
479
499
|
put! =res
|
480
500
|
execute "normal Gdd\<c-y>"
|
481
|
-
normal z.
|
482
501
|
setlocal nomodifiable
|
483
502
|
write
|
503
|
+
normal z.
|
484
504
|
endfunction
|
485
505
|
|
486
506
|
function! s:more_messages()
|
487
507
|
let line = getline(line('.'))
|
488
|
-
let
|
489
|
-
let command = s:more_messages_command . uid
|
508
|
+
let command = s:more_messages_command
|
490
509
|
echo "fetching more messages. please wait..."
|
491
510
|
let res = system(command)
|
492
511
|
setlocal modifiable
|
@@ -743,5 +762,3 @@ autocmd bufreadpost *.txt call <SID>turn_into_compose_window()
|
|
743
762
|
call system(s:select_mailbox_command . shellescape(s:mailbox))
|
744
763
|
call s:do_search()
|
745
764
|
|
746
|
-
|
747
|
-
|
data/lib/vmail/imap_client.rb
CHANGED
@@ -120,7 +120,6 @@ module Vmail
|
|
120
120
|
if id_set.is_a?(String)
|
121
121
|
id_set = id_set.split(',')
|
122
122
|
end
|
123
|
-
max_id = id_set.to_a[-1]
|
124
123
|
if id_set.to_a.empty?
|
125
124
|
log "empty set"
|
126
125
|
return ""
|
@@ -137,7 +136,7 @@ module Vmail
|
|
137
136
|
log(error) && raise(error)
|
138
137
|
end
|
139
138
|
log "extracting headers"
|
140
|
-
new_message_rows = results.map {|x| extract_row_data(x
|
139
|
+
new_message_rows = results.map {|x| extract_row_data(x) }
|
141
140
|
if are_uids
|
142
141
|
# replace old row_text values
|
143
142
|
new_message_rows.each {|new_row_data|
|
@@ -156,7 +155,7 @@ module Vmail
|
|
156
155
|
end
|
157
156
|
|
158
157
|
# TODO extract this to another class or module and write unit tests
|
159
|
-
def extract_row_data(fetch_data
|
158
|
+
def extract_row_data(fetch_data)
|
160
159
|
seqno = fetch_data.seqno
|
161
160
|
uid = fetch_data.attr['UID']
|
162
161
|
# log "fetched seqno #{seqno} uid #{uid}"
|
@@ -194,21 +193,18 @@ module Vmail
|
|
194
193
|
subject = envelope.subject || ''
|
195
194
|
subject = Mail::Encodings.unquote_and_convert_to(subject, 'UTF-8')
|
196
195
|
flags = format_flags(flags)
|
197
|
-
|
198
|
-
mid_width = @width - (first_col_width + 33)
|
196
|
+
mid_width = @width - 38
|
199
197
|
address_col_width = (mid_width * 0.3).ceil
|
200
198
|
subject_col_width = (mid_width * 0.7).floor
|
201
|
-
row_text = [
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
flags.rcol(7)
|
207
|
-
].join(' ')
|
199
|
+
row_text = [ flags.col(2),
|
200
|
+
(date_formatted || '').col(14),
|
201
|
+
address.col(address_col_width),
|
202
|
+
subject.col(subject_col_width),
|
203
|
+
number_to_human_size(size).rcol(6) ].join(' ')
|
208
204
|
{:uid => uid, :seqno => seqno, :row_text => row_text}
|
209
205
|
rescue
|
210
206
|
log "error extracting header for uid #{uid} seqno #{seqno}: #$!"
|
211
|
-
row_text =
|
207
|
+
row_text = "#{seqno.to_s} : error extracting this header"
|
212
208
|
{:uid => uid, :seqno => seqno, :row_text => row_text}
|
213
209
|
end
|
214
210
|
|
@@ -224,16 +220,16 @@ module Vmail
|
|
224
220
|
exponent = max_exp if exponent > max_exp # we need this to avoid overflow for the highest unit
|
225
221
|
number /= 1024 ** exponent
|
226
222
|
unit = UNITS[exponent]
|
227
|
-
"#{number}
|
223
|
+
"#{number}#{unit}"
|
228
224
|
end
|
229
225
|
end
|
230
226
|
|
231
|
-
FLAGMAP = {:Flagged => '
|
227
|
+
FLAGMAP = {:Flagged => '*'}
|
232
228
|
# flags is an array like [:Flagged, :Seen]
|
233
229
|
def format_flags(flags)
|
234
230
|
flags = flags.map {|flag| FLAGMAP[flag] || flag}
|
235
231
|
if flags.delete(:Seen).nil?
|
236
|
-
flags << '
|
232
|
+
flags << '+' # unread
|
237
233
|
end
|
238
234
|
flags.join('')
|
239
235
|
end
|
@@ -294,7 +290,8 @@ module Vmail
|
|
294
290
|
end
|
295
291
|
|
296
292
|
# gets 100 messages prior to id
|
297
|
-
def more_messages(
|
293
|
+
def more_messages(limit=100)
|
294
|
+
message_id = @message_list[0][:seqno]
|
298
295
|
log "more_messages: message_id #{message_id}"
|
299
296
|
message_id = message_id.to_i
|
300
297
|
if @all_search
|
@@ -329,7 +326,7 @@ module Vmail
|
|
329
326
|
return res
|
330
327
|
end
|
331
328
|
log "remaining messages: #{remaining}"
|
332
|
-
">
|
329
|
+
"> Load #{[100, remaining].min} more messages. #{remaining} remaining.\n" + res
|
333
330
|
end
|
334
331
|
|
335
332
|
def show_message(index, raw=false)
|
@@ -352,7 +349,7 @@ module Vmail
|
|
352
349
|
out = formatter.process_body
|
353
350
|
size = fetch_data.attr["RFC822.SIZE"]
|
354
351
|
@current_message = <<-EOF
|
355
|
-
#{@mailbox}
|
352
|
+
#{@mailbox} seqno:#{index} uid:#{uid} #{number_to_human_size size} #{format_parts_info(formatter.list_parts)}
|
356
353
|
---------------------------------------
|
357
354
|
#{format_headers(formatter.extract_headers)}
|
358
355
|
|
@@ -397,9 +394,10 @@ EOF
|
|
397
394
|
"#{id} deleted"
|
398
395
|
else
|
399
396
|
log "Flagging index_range: #{index_range.inspect}; uid_set: #{uid_set.inspect}"
|
400
|
-
|
401
|
-
|
402
|
-
|
397
|
+
Thread.new do
|
398
|
+
res = @imap.uid_store(uid_set, action, [flg.to_sym])
|
399
|
+
log res.inspect
|
400
|
+
end
|
403
401
|
end
|
404
402
|
end
|
405
403
|
|
data/lib/vmail/version.rb
CHANGED