Changeset 63ca54f8c7e93cd7200aa325197a73ce5c76a40d
- Timestamp:
- 05/08/08 00:34:18
(8 months ago)
- Author:
- Paul Jimenez <pj@zachs.org>
- git-committer:
- Paul Jimenez <pj@zachs.org> 1210224858 -0500
- git-parent:
[6deed5dae128d1e9a541de01f356fd922dafc832]
- git-author:
- Paul Jimenez <pj@zachs.org> 1210224858 -0500
- Message:
added pager support
and mark-read support
and folder prefix support
and fixed some bugs
-
Files:
-
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
| r6deed5d |
r63ca54f |
|
| 6 | 6 | # debug, refile, show, next, prev |
|---|
| 7 | 7 | # |
|---|
| 8 | | # Commands to make work: sort, comp, repl, dist, forw, anno |
|---|
| | 8 | # Commands to make work: sort, comp, repl, dist, forw, anno, mr |
|---|
| 9 | 9 | # |
|---|
| 10 | 10 | # * sort should just store a sort order to apply to output instead of |
|---|
| … | … | |
| 12 | 12 | # anything that takes a msgset as well as scan, next, prev, and pick |
|---|
| 13 | 13 | # |
|---|
| 14 | | # * scan/show/next/prev should run their output via $PAGER iff sys.stdout.isatty() |
|---|
| 15 | | # via f = os.popen(os.environ['PAGER'], 'w'), then write to f |
|---|
| | 14 | # * mr should do a 'mark all read' on the current (or specified) folder |
|---|
| | 15 | # |
|---|
| | 16 | # handy aliases: |
|---|
| | 17 | # mailchk - folders with new messages - mhi folders |grep -v " 0$" |
|---|
| | 18 | # nn - show new messages in a folder- mhi scan `mhi pick \Unseen` |
|---|
| 16 | 19 | # |
|---|
| 17 | 20 | # minor bits of code taken from http://www.w3.org/2000/04/maillog2rdf/imap_sort.py |
|---|
| … | … | |
| 24 | 27 | import time |
|---|
| 25 | 28 | import string |
|---|
| | 29 | import os.path |
|---|
| 26 | 30 | import imaplib |
|---|
| 27 | 31 | import StringIO |
|---|
| 28 | 32 | from configobj import ConfigObj |
|---|
| 29 | 33 | |
|---|
| 30 | | cfgdir=os.environ.get('HOME','') |
|---|
| | 34 | cfgdir = os.environ.get('HOME','') |
|---|
| 31 | 35 | config = ConfigObj(infile="%s/.mhirc" % cfgdir, create_empty=True) |
|---|
| 32 | 36 | state = ConfigObj(infile="%s/.mhistate" % cfgdir, create_empty=True) |
|---|
| … | … | |
| 191 | 195 | if folder is None: |
|---|
| 192 | 196 | folder = default |
|---|
| | 197 | else: |
|---|
| | 198 | prefix = config.get('folder_prefix','') |
|---|
| | 199 | folder = prefix + folder |
|---|
| 193 | 200 | return folder, outargs |
|---|
| 194 | 201 | |
|---|
| … | … | |
| 236 | 243 | def _fixupMsgset(msgset): |
|---|
| 237 | 244 | # s/cur/$cur/, s/last/$last/, s/prev/$prev/, s/next/$next/ |
|---|
| 238 | | msgset = msgset.replace('-', ':') |
|---|
| 239 | | msgset = msgset.replace(' ', ',') |
|---|
| 240 | 245 | cur = state.get(state['folder']+'.cur', None) |
|---|
| 241 | 246 | if cur == 'None': cur = None |
|---|
| … | … | |
| 248 | 253 | msgset = msgset.replace('prev', str(int(cur)-1)) |
|---|
| 249 | 254 | else: |
|---|
| 250 | | msgset = msgset.replace('cur', '') |
|---|
| 251 | | msgset = msgset.replace('next', '') |
|---|
| 252 | | msgset = msgset.replace('prev', '') |
|---|
| | 255 | requiresCur = False |
|---|
| | 256 | for dep in ["cur", "prev", "next"]: |
|---|
| | 257 | requiresCur = requiresCur or dep in msgset |
|---|
| | 258 | if requiresCur: |
|---|
| | 259 | print "No current message, so '%s' makes no sense." % msgset |
|---|
| | 260 | sys.exit(1) |
|---|
| | 261 | msgset = msgset.replace('-', ':') |
|---|
| | 262 | msgset = msgset.replace(' ', ',') |
|---|
| 253 | 263 | msgset = msgset.replace('last', "*") |
|---|
| 254 | 264 | msgset = msgset.replace('$', "*") |
|---|
| … | … | |
| 359 | 369 | return data |
|---|
| 360 | 370 | |
|---|
| | 371 | def folder_name(folder): |
|---|
| | 372 | prefix = config.get('folder_prefix',None) |
|---|
| | 373 | if prefix and folder.startswith(prefix): |
|---|
| | 374 | return folder[len(prefix):] |
|---|
| | 375 | return folder |
|---|
| | 376 | |
|---|
| 361 | 377 | def folder(args): |
|---|
| 362 | 378 | '''Usage: folder [+<foldername>] |
|---|
| … | … | |
| 374 | 390 | # inbox+ has 64 messages (1-64); cur=63; (others). |
|---|
| 375 | 391 | cur = state.get(folder+'.cur', 'unset') |
|---|
| 376 | | print "Folder %s has %s messages, cur is %s." % (folder, data[0], cur) |
|---|
| | 392 | print "Folder %s has %s messages, cur is %s." % (folder_name(folder), data[0], cur) |
|---|
| 377 | 393 | |
|---|
| 378 | 394 | def folders(args): |
|---|
| … | … | |
| 404 | 420 | messages, recent, unseen = foo[1], foo[3], foo[5] |
|---|
| 405 | 421 | cur = state.get(folder+'.cur', ['-', 'CUR'][ folder == HEADER ]) |
|---|
| 406 | | print "%s%-20s %7s %7s %7s %7s" % (iscur, folder, cur, messages, recent, unseen) |
|---|
| | 422 | print "%s%-20s %7s %7s %7s %7s" % (iscur, folder_name(folder), cur, messages, recent, unseen) |
|---|
| 407 | 423 | if folder != HEADER: |
|---|
| 408 | 424 | totalmsgs += int(messages) |
|---|
| … | … | |
| 530 | 546 | first = data[0].split()[0] |
|---|
| 531 | 547 | state[folder+'.cur'] = first |
|---|
| | 548 | |
|---|
| | 549 | def mr(args): |
|---|
| | 550 | '''Usage: mr [+folder] <messageset> |
|---|
| | 551 | |
|---|
| | 552 | Mark the specified messages (or the current message if unspecified) |
|---|
| | 553 | from the specified folder (or the current folder if unspecified) as read. |
|---|
| | 554 | ''' |
|---|
| | 555 | folder, arglist = _argFolder(args, state['folder']) |
|---|
| | 556 | state['folder'] = folder |
|---|
| | 557 | msgset = _fixupMsgset(' '.join(arglist)) |
|---|
| | 558 | if not msgset: |
|---|
| | 559 | try: |
|---|
| | 560 | msgset = state[folder+'.cur'] |
|---|
| | 561 | except KeyError: |
|---|
| | 562 | print "Error: No current message selected." |
|---|
| | 563 | raise UsageError() |
|---|
| | 564 | _checkMsgset(msgset) |
|---|
| | 565 | S = _connect() |
|---|
| | 566 | do_or_die(S.select(folder), "Problem changing folders:") |
|---|
| | 567 | data = do_or_die(S.search(None, msgset), "Problem with search:") |
|---|
| | 568 | do_or_die(S.store(msgset, '+FLAGS', '\\Seen'), "Problem setting read flag: ") |
|---|
| | 569 | S.close() |
|---|
| | 570 | S.logout() |
|---|
| | 571 | first = data[0].split()[0] |
|---|
| | 572 | state[folder+'.cur'] = first |
|---|
| | 573 | |
|---|
| | 574 | |
|---|
| 532 | 575 | |
|---|
| 533 | 576 | def _show(folder, msgset): |
|---|
| … | … | |
| 705 | 748 | 'repl': repl, |
|---|
| 706 | 749 | 'help': help, |
|---|
| | 750 | 'mr': mr |
|---|
| 707 | 751 | } |
|---|
| 708 | 752 | |
|---|
| … | … | |
| 741 | 785 | |
|---|
| 742 | 786 | if __name__ == '__main__': |
|---|
| | 787 | if sys.stdout.isatty(): |
|---|
| | 788 | pager = os.environ.get('PAGER', None) |
|---|
| | 789 | if pager is None: |
|---|
| | 790 | for p in [ '/usr/bin/less', '/bin/more' ]: |
|---|
| | 791 | if os.path.exists(p): |
|---|
| | 792 | pager = p |
|---|
| | 793 | break |
|---|
| | 794 | if pager is not None: |
|---|
| | 795 | sys.stdout = os.popen(pager, 'w') |
|---|
| 743 | 796 | try: |
|---|
| 744 | 797 | _dispatch(sys.argv) |
|---|