import re from mode import Fundamental from method import WrapParagraph from mode.text import ContinuedRule, WordRule, TextInsertSpace from lex import Grammar, PatternRule class MuttGrammar(Grammar): rules = [ PatternRule('mutt_header', '^(?:From|To|Cc|Bcc|Subject|Reply-To|In-Reply-To|Delivered-To|Date):'), PatternRule('quotec', '^ *(?:(?: *>){3})*(?: *>){3}.*$'), PatternRule('quoteb', '^ *(?:(?: *>){3})*(?: *>){2}.*$'), PatternRule('quotea', '^ *(?:(?: *>){3})*(?: *>){1}.*$'), PatternRule('email', r'(?:^|(?<=[ :]))@\n ]+@(?:[^<>@\.\n ]+\.)*[^<>@\.\n ]+>?'), PatternRule('url', r'(?:^|(?<= ))(?:http|https|ftp|sftp|file|smtp|smtps|torrent|news|jabber|irc|telnet)://(?:[^\.\n ]+\.)*[^\.\n ]+'), ContinuedRule(), WordRule(), PatternRule('punct', '[^a-zA-Z0-9_]'), PatternRule('stuff', '[a-zA-Z0-9_]+'), ] class MuttWrapParagraph(WrapParagraph): limit = 72 empty_re = re.compile('^(?: *>.*| *)$') class MuttInsertSpace(TextInsertSpace): wrapper = MuttWrapParagraph class Mutt(Fundamental): name = 'Mutt' grammar = MuttGrammar() colors = { 'mutt_header': ('green', 'default', 'bold'), 'email': ('cyan', 'default', 'bold'), 'url': ('cyan', 'default', 'bold'), 'quotea': ('yellow', 'default', 'bold'), 'quoteb': ('cyan', 'default', 'bold'), 'quotec': ('magenta', 'default', 'bold'), 'misspelled': ('red', 'default', 'bold'), 'cont.start': ('default', 'default', 'bold'), 'cont.end': ('default', 'default', 'bold'), 'word': ('default', 'default', 'bold'), 'punct': ('default', 'default', 'bold'), 'stuff': ('default', 'default', 'bold'), } actions = [MuttInsertSpace, MuttWrapParagraph] config = { 'mutt.margin': 72, } _bindings = { 'learn-word': ('C-c l',), 'mutt-wrap-paragraph': ('M-q',), 'mutt-insert-space': ('SPACE',), } install = Mutt.install