Show
Ignore:
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
  • mhi.py

    r6deed5d r63ca54f  
    66#                     debug, refile, show, next, prev 
    77# 
    8 # Commands to make work: sort, comp, repl, dist, forw, anno 
     8# Commands to make work: sort, comp, repl, dist, forw, anno, mr 
    99# 
    1010# * sort should just store a sort order to apply to output instead of 
     
    1212#   anything that takes a msgset as well as scan, next, prev, and pick 
    1313# 
    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` 
    1619# 
    1720# minor bits of code taken from http://www.w3.org/2000/04/maillog2rdf/imap_sort.py 
     
    2427import time 
    2528import string 
     29import os.path 
    2630import imaplib 
    2731import StringIO 
    2832from configobj import ConfigObj 
    2933 
    30 cfgdir=os.environ.get('HOME','') 
     34cfgdir = os.environ.get('HOME','') 
    3135config = ConfigObj(infile="%s/.mhirc" % cfgdir, create_empty=True) 
    3236state = ConfigObj(infile="%s/.mhistate" % cfgdir, create_empty=True) 
     
    191195    if folder is None: 
    192196        folder = default 
     197    else: 
     198        prefix = config.get('folder_prefix','') 
     199        folder = prefix + folder 
    193200    return folder, outargs 
    194201 
     
    236243def _fixupMsgset(msgset): 
    237244    # s/cur/$cur/, s/last/$last/, s/prev/$prev/, s/next/$next/ 
    238     msgset = msgset.replace('-', ':') 
    239     msgset = msgset.replace(' ', ',') 
    240245    cur = state.get(state['folder']+'.cur', None) 
    241246    if cur == 'None': cur = None 
     
    248253        msgset = msgset.replace('prev', str(int(cur)-1)) 
    249254    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(' ', ',') 
    253263    msgset = msgset.replace('last', "*") 
    254264    msgset = msgset.replace('$', "*") 
     
    359369    return data 
    360370 
     371def 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 
    361377def folder(args): 
    362378    '''Usage: folder [+<foldername>] 
     
    374390    # inbox+ has 64 messages  (1-64); cur=63; (others). 
    375391    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) 
    377393 
    378394def folders(args): 
     
    404420        messages, recent, unseen = foo[1], foo[3], foo[5] 
    405421        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) 
    407423        if folder != HEADER: 
    408424            totalmsgs += int(messages) 
     
    530546    first = data[0].split()[0] 
    531547    state[folder+'.cur'] = first 
     548 
     549def 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 
    532575 
    533576def _show(folder, msgset): 
     
    705748             'repl': repl, 
    706749             'help': help, 
     750             'mr': mr 
    707751           } 
    708752 
     
    741785 
    742786if __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') 
    743796    try: 
    744797        _dispatch(sys.argv)