% -*- SLang -*- % mailmode.sl % % This file was originally written by the following people: % Ulli "Framstag" Horlacher's <[email protected]> % Thomas Roessler <[email protected]> % ftp://ftp.mutt.org/pub/mutt/contrib/ % % It was substantially modified by the following people: % Abraham vd Merwe <[email protected]> % Johann Botha <[email protected]> % http://oasis.frogfoot.net/index.php?feedme=jed % % 2001-03-21: Stripped down to a 'light' mode again.. % /Ulf % $1 = "MAIL"; !if (keymap_p ($1)) make_keymap ($1); % Do we recognize mbox style "From " lines as headers? variable mail_mode_have_mbox = 1; variable mail_maybe_header = 1; create_syntax_table ($1); define_syntax ("([{",")]}",'(',$1); % parentheses define_syntax ("-0-9a-zA-Z_",'w',$1); % words define_syntax ("-+0-9",'0',$1); % numbers define_syntax (",;:",',',$1); % delimiters define_syntax ("%-+/&*=<>|!~^",'+',$1); % operators variable color_from = "preprocess"; variable color_to = "keyword1"; variable color_subject = "number"; variable color_header = "..."; variable color_url = "keyword"; variable color_email = "keyword"; variable color_signature = "error"; variable color_reply1 = "comment"; variable color_reply2 = "string"; variable color_smiley = "operator"; variable color_bold = "delimiter"; variable color_underline = "delimiter"; variable color_italic = "delimiter"; set_color ("preprocess","magenta","black"); % from set_color ("keyword1","magenta","black"); % to set_color ("number","magenta","black"); % subject set_color ("...","magenta","black"); % headers set_color ("keyword","red","black"); % url/email set_color ("error","red","black"); % signature set_color ("comment","cyan","black"); % quote1 set_color ("string","green","black"); % quote2 set_color ("operator","white","black"); % smiley set_color ("delimiter","white","black"); % underline/bold/italic set_color ("normal", "lightgray", "black"); #ifdef HAS_DFA_SYNTAX % The highlighting copes with email addresses and url's dfa_enable_highlight_cache ("mailmode.dfa",$1); dfa_define_highlight_rule ("^To: .*",color_to,$1); dfa_define_highlight_rule ("^Cc: .*",color_header,$1); dfa_define_highlight_rule ("^Bcc: .*",color_header,$1); dfa_define_highlight_rule ("^Date: .*",color_header,$1); dfa_define_highlight_rule ("^From: .*",color_from,$1); dfa_define_highlight_rule ("^Subject: .*",color_subject,$1); dfa_define_highlight_rule ("^(Reply-To|X-Uptime): .*",color_header,$1); dfa_define_highlight_rule ("^(Message-ID|User-Agent): .*",color_header,$1); dfa_define_highlight_rule ("^In-Reply-To: .*",color_header,$1); dfa_define_highlight_rule ("^Organi[sz]ation: .*",color_header,$1); dfa_define_highlight_rule ("^X-GPG-Public-Key: .*",color_header,$1); dfa_define_highlight_rule ("^X-Operating-System: .*",color_header,$1); dfa_define_highlight_rule ("^X-Edited-With-Muttmode: .*",color_header,$1); dfa_define_highlight_rule ("^Newsgroups: .*",color_header,$1); dfa_define_highlight_rule ("^Followup-To: .*",color_header,$1); dfa_define_highlight_rule ("^Keywords: .*",color_header,$1); dfa_define_highlight_rule ("^Summary: .*",color_header,$1); dfa_define_highlight_rule ("^References: .*",color_header,$1); dfa_define_highlight_rule ("(http|ftp|file|https)://[^ \t\n>]+",color_url,$1); dfa_define_highlight_rule ("[^ \t\n<]*@[^ \t\n>]+",color_email,$1); dfa_define_highlight_rule ("^-- $",color_signature,$1); dfa_define_highlight_rule ("^> ?> ?> ?> ?> ?>.*",color_reply2,$1); dfa_define_highlight_rule ("^> ?> ?> ?> ?>.*", color_reply1,$1); dfa_define_highlight_rule ("^> ?> ?> ?>.*", color_reply2,$1); dfa_define_highlight_rule ("^> ?> ?>.*", color_reply1,$1); dfa_define_highlight_rule ("^> ?>.*", color_reply2,$1); dfa_define_highlight_rule ("^>.*", color_reply1,$1); dfa_define_highlight_rule ("[\\(\\)]+-?[:;P\\^]|[:;P\\^]-?[\\(\\)]+",color_smiley,$1); dfa_define_highlight_rule ("_[a-zA-Z]+_",color_underline,$1); dfa_define_highlight_rule ("\\*[a-zA-Z]+\\*",color_bold,$1); dfa_define_highlight_rule ("/[a-zA-Z]+/",color_italic,$1); dfa_build_highlight_table ($1); #endif % this is broken, but I wanted to move it to DFA anyway... %() = define_keywords_n ($1,"CcTo",2,0); %() = define_keywords_n ($1,"Bcc",3,0); %() = define_keywords_n ($1,"DateFrom",4,0); %() = define_keywords_n ($1,"Subject",7,0); %() = define_keywords_n ($1,"Reply-ToX-Uptime",8,0); %() = define_keywords_n ($1,"Message-IDUser-Agent",10,0); %() = define_keywords_n ($1,"In-Reply-To",11,0); %() = define_keywords_n ($1,"Organization",12,0); %() = define_keywords_n ($1,"X-GPG-Public-Key",16,0); %() = define_keywords_n ($1,"X-Operating-System",18,0); %() = define_keywords_n ($1,"X-Edited-With-Muttmode",22,0); define skip_header () { while (not (re_looking_at ("^[ \t]*$"))) !if (down_1 ()) break; } define top_view () { recenter (what_line ()); } define bol_skip_tags (ntags) { variable col = 0; variable n = 0; bol (); while (looking_at_char ('>') or looking_at_char (' ') or looking_at_char ('\t')) { if (looking_at_char ('>')) { if (n == ntags) break; n++; col = what_column (); } !if (right (1)) break; } goto_column (col); if (looking_at_char ('>')) go_right_1 (); } define count_tags () { variable n = 0; push_spot (); bol (); while (looking_at_char ('>') or looking_at_char (' ') or looking_at_char ('\t')) { if (looking_at_char ('>')) n++; !if (right (1)) break; } pop_spot (); return (n); } define bol_skip_all_tags () { bol_skip_tags (count_tags ()); } define maybe_signature () { variable a,b; push_spot (); bol_skip_all_tags (); skip_white (); !if (re_looking_at ("--[ \t]*$")) { pop_spot (); return 0; } right (2); skip_white (); eolp (); pop_spot (); } define dequote_buffer (ntags) { variable n = count_tags (); push_spot (); bob (); forever { bol (); push_mark (); bol_skip_tags (ntags); % uncomment the following line if you prefer the space if (looking_at_char (' ')) go_right_1 (); if (ntags < n) skip_white (); del_region (); !if (down_1 ()) break; } pop_spot (); } define requote_buffer (ntags) { variable i; push_spot (); bob (); forever { bol (); for(i = 0; i < ntags; i++) insert("> "); !if (down_1 ()) break; } pop_spot (); } define empty_quoted_line () { push_spot (); bol (); while (looking_at_char ('>') or looking_at_char (' ') or looking_at_char ('\t')) { if (not (right (1))) break; } skip_white (); eolp (); pop_spot (); } define mail_is_tag () { push_spot (); bol (); (mail_mode_have_mbox and bobp () and looking_at ("From ")) or (1 == re_looking_at ("^[A-Za-z][^: ]*:")); pop_spot (); } define mail_have_header () { push_spot (); bob (); mail_is_tag (); pop_spot (); } define mail_is_body () { !if (mail_maybe_header) return 1; !if (mail_have_header ()) return 1; push_spot (); re_bsearch ("^$"); pop_spot (); } define mail_is_header_tag () { if (mail_is_body ()) return 0; return (mail_is_tag ()); } define mail_parsep () { push_spot (); bol (); if (not (mail_is_body ())) { (mail_is_header_tag () or (skip_white (),eolp ())); } else { (maybe_signature () or (skip_white (),eolp ()) or empty_quoted_line ()); } pop_spot (); } define mail_backward_paragraph () { variable n; if (mail_parsep ()) return; n = count_tags (); while (not (mail_parsep ()) and (count_tags () == n)) { !if (up_1 ()) break; } bol (); } define mail_forward_paragraph () { variable n; if (mail_parsep ()) return; n = count_tags (); while (not (mail_parsep ()) and (count_tags () == n)) { !if(down_1 ()) break; } bol (); } define mail_begin_of_paragraph () { mail_backward_paragraph (); !if (bobp ()) go_down_1 (); } define mail_select_paragraph () { if (mail_parsep ()) { push_mark (); return; } mail_begin_of_paragraph (); push_mark (); mail_forward_paragraph (); eol (); !if (eobp ()) go_up_1 (); eol (); } define dequote () { push_spot (); !if (markp ()) mail_select_paragraph (); narrow (); dequote_buffer (1); widen (); pop_spot (); } define requote () { push_spot (); !if (markp ()) mail_select_paragraph (); narrow (); requote_buffer (1); widen (); pop_spot (); } define reformat_header () { push_spot (); while (not (mail_is_header_tag ())) { !if(up_1 ()) break; } if (not (mail_is_header_tag ())) { pop_spot (); return; } bol (); while (not (looking_at (":"))) go_right_1 (); go_right_1 (); push_spot (); insert ("\n"); bol_trim (); bol (); insert (" "); call ("format_paragraph"); pop_spot (); del (); pop_spot (); } define reformat_quote () { variable n,o,l1,l2; n = count_tags (); o = mail_maybe_header; l1 = 0; l2 = 0; mail_maybe_header = 0; push_spot (); !if (markp ()) { push_spot (); mail_begin_of_paragraph (); l1 = what_line (); pop_spot (); l2 = what_line (); mail_select_paragraph (); } narrow (); dequote_buffer (n); bob (); down (l2 - l1); WRAP -= 2*n; call ("format_paragraph"); WRAP += 2*n; requote_buffer (n); widen (); mail_maybe_header = o; pop_spot (); } define mail_indent_calculate () { variable col = 0; push_spot_bol (); !if (re_bsearch ("[^ \t\n]")) { pop_spot (); return col; } bol_skip_white (); col = what_column () - 1; pop_spot (); return col; } define mail_indent_line () { variable col; push_spot (); col = mail_indent_calculate (); if (not (mail_is_body ())) { if (mail_is_header_tag ()) col = 0; else { if (col == 0) col = 1; } } bol_trim (); whitespace (col); pop_spot (); } define mail_reformat () { if (mail_is_body ()) reformat_quote (); else reformat_header (); } define mail_mode () { no_mode (); set_mode ($1,1); use_keymap ($1); use_syntax_table ($1); local_setkey ("mail_reformat","\eq"); local_setkey ("dequote","^c<"); local_setkey ("requote","^c>"); set_buffer_hook ("par_sep","mail_parsep"); set_buffer_hook ("indent_hook","mail_indent_line"); runhooks ("text_mode_hook"); runhooks ("mail_mode_hook"); skip_header (); top_view (); % save_buffers (); }