Here you go: Quoting Patrick Colbeck ([EMAIL PROTECTED]): > Hi > > I used to have a bit of slang code that would give highlighting of headers > etc in Jed when using it as an editor called from Mutt. Unfortunately I > forgot to archive it before I reinstalled my PC and can't find it on the Net > anymore. I think it was mail_mode.sl does anyone know if its still out there > ? > > Pat > > -- > ________________________________________________________________________ > > Patrick Colbeck email: [EMAIL PROTECTED] > Senior Analyst tel: you dont seriously expect me to > Azlan Ltd give that out on the internet do you ? > ________________________________________________________________________
% -*- SLang -*- % mail_mode.sl % % This is an almost complete rewrite of % Ulli "Framstag" Horlacher's <[EMAIL PROTECTED]> % mail_mode for jed. % % Thomas Roessler <[EMAIL PROTECTED]> % Wed Aug 12 15:53:49 MEST 1998 % % 1998-10-10 Framstag % added pgp-routines and EDT-support, again % added better documentation % % This file is under the GPL copyright (open-source). % % % mail_mode.sl implements a mail mode that is useful for editing mail/news. % You should copy it into your $JED_ROOT/lib directory. % % For initializing purposes, add this line to % $JED_ROOT/lib/defaults.sl or $HOME/.jedrc : % % autoload("mail_mode","mail_mode"); % % Optionally, set your favourite quote colour by addiding this function to % $JED_ROOT/lib/jed.rc or $HOME/.jedrc : % % if (USE_ANSI_COLORS) { % if (strlen(getenv("DISPLAY"))) { % set_color("preprocess","cyan","white"); # eg color xterm % } else { % set_color("preprocess","green","black"); # eg Linux text console % } % } % % To invoke mail_mode automatically, you can add the following % in $HOME/.elm/elmrc (if you use elm): % editor = jed %s -tmp -f mail_mode % in $HOME/.muttrc (if you use mutt): % set editor="jed %s -tmp -f mail_mode" % in $HOME/.tin/tinrc (if you use tin): % default_editor_format=jed %F -g %N -tmp -f mail_mode % in $HOME/.slrnrc (if you use slrn): % set editor_command "jed --score-arrange-score %s -g %d -tmp --mail-mode" % % When mail_mode() is activated you have the following new functions: % % - mail_reformat() % This function reformates the current `>' quoted paragraph. Usefull if you % have too long lines or if you want to edit the quoted paragraph. % It is bound to the key sequences Esc q and PF1 KP8 . % % - dequote() % This function removes one level of quoting with `>' from a paragraph % or a marked block. % It is bound to the key sequences Ctrl-C < and PF1 < . % % - requote() % This function quotes the current paragraph with `>' % or a marked block. % It is bound to the key sequences Ctrl-C > and PF1 > . % % - dequote_buffer(number) % Removes number of quotelevels for the whole buffer. % % - requote_buffer(number) % Adds number of quotelevels for the whole buffer. % % - pgpe() % This function encrypts the current buffer with pgp. % It is bound to the key sequence Ctrl-C p e . % % - pgps() % This function signs the current buffer with pgp. % It is bound to the key sequence Ctrl-C p s . % % - pgpse() and pgpes() % These functions both encrypt and sign the current buffer with pgp. % It is bound to the key sequence Ctrl-C p b . % % - nsign() % This function signs a news article with the external program "nsign" % (De-Facto pgp signing standard in Usenet). % It is bound to the key sequence Ctrl-C p n . % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Do we recognize mbox style "From " lines as headers? variable mail_mode_have_mbox = 1; variable mail_maybe_header = 1; create_syntax_table("Mail"); define_syntax('>' ,'#', "Mail"); 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('>')) 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 dequote_buffer(ntags) { variable n = count_tags(); push_spot(); bob(); while(1) { bol(); push_mark(); bol_skip_tags(ntags); if(ntags < n) skip_white(); del_region(); !if(down(1)) break; } pop_spot(); } define requote_buffer(ntags) { variable i; push_spot(); bob(); while(1) { 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 maybe_signature() { variable a, b; push_spot(); bol_skip_all_tags(); skip_white(); !if(looking_at("--")) { pop_spot(); return 0; } right(2); skip_white(); eolp(); pop_spot(); } 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_select_paragraph() { if(mail_parsep()) { push_mark(); return; } mail_backward_paragraph(); !if(bobp()) down(1); push_mark(); mail_forward_paragraph(); eol(); !if(eobp()) 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 mail_fix_quotes() { variable l, m; push_spot(); bob(); while(not(mail_is_body())) { if(not(down(1))) break; } if(not(mail_is_body())) { pop_spot(); return; } push_spot(); %% pass 1: pull quote tags together. while(1) { bol(); if(empty_quoted_line()) { while(not(eolp())) del(); } while(looking_at(">>")) { if(not(right(1))) break; } if(looking_at("> >")) { del(); del(); del(); insert(">>"); } else { if(not(down(1))) break; } } pop_spot(); % pass 2: insert correct paragraph separators. m = -1; while(1) { l = m; if(mail_parsep()) m = -1; else m = count_tags(); !if(mail_parsep()) { if((m != -1) and (l != -1) and (m != l)) { bol(); push_spot(); insert("\n"); pop_spot(); down(1); } } !if(down(1)) break; } 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; variable o; n = count_tags(); o = mail_maybe_header; mail_maybe_header = 0; push_spot(); !if(markp()) mail_select_paragraph(); narrow(); dequote_buffer(n); up(1); call("format_paragraph"); 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(); } %!%S-Lang user function (0 args) %!%This function actives the mail mode for the current buffer, which is: %!% - text mode %!% - highlight quotes %!% - enable quote paragraph reformating define mail_mode() { variable km = "mail_map"; variable buf = "*mail*"; no_mode(); set_mode("Mail", 1); use_syntax_table("Mail"); !if (strcmp(buf,whatbuf)) { if (keymap_p(km)) use_keymap(km); } local_setkey("mail_reformat", "\eq"); if (is_defined("Edt_Keypad")) local_setkey("mail_reformat", "\eOP\eOx"); % somewhat meaningful bindings local_setkey("dequote","^C<"); local_setkey("requote","^C>"); if (is_defined("Edt_Keypad")) { local_setkey("dequote","\eOP<"); local_setkey("requote","\eOP>"); } local_setkey("pgpe", "^Cpe"); % encrypt a mail message local_setkey("pgps", "^Cps"); % sign a mail message local_setkey("pgpse","^Cpb"); % encryp and sign a mail message local_setkey("nsign","^Cpn"); % sign a news article set_buffer_hook("par_sep", "mail_parsep"); set_buffer_hook("indent_hook", "mail_indent_line"); runhooks("text_mode_hook"); runhooks("mail_mode_hook"); save_buffers(); } %!%S-Lang user function (0 args) %!%Prototype: Void mark_mail_buffer (void) %!%marks the current buffer, with special treatment if this looks like a %!%JED *mail* buffer. %!%relies on the `X-Mailer:' field to indicate the end of the header define mark_mail_buffer() { bob(); !if (bol_fsearch("X-Mailer:")) { !if (bol_fsearch("Subject:")) { mark_buffer(); % must be a regular buffer return; } } go_down_1(); push_mark(); eob(); } %!%S-Lang user function (1 arg) %!%Prototype: Void pgp(String options) %!%This function calls pgp for the current buffer. define pgp(opt) { variable cmd, tmp = "/tmp/jedpgp-"; tmp = make_tmp_file(tmp); mark_mail_buffer(); write_region_to_file(tmp); cmd = Sprintf("stty opost icrnl; clear; pgp %s %s;", opt, tmp, 2); cmd = strcat(cmd, "echo press ENTER; read dummy;"); % prompt cmd = strcat(cmd, "stty -opost -icrnl"); system(cmd); mark_mail_buffer(); del_region(); delete_file(tmp); tmp = strcat(tmp, ".asc"); % pgp creates FILE.asc insert_file(tmp); delete_file(tmp); bob(); call("redraw"); } %!%S-Lang user function (0 args) %!%Prototype: Void nsign() %!%This function calls the external program nsign (news pgp sign) %!%for the current buffer. define nsign() { variable cmd, tmp = "/tmp/jedpgp-"; tmp = make_tmp_file(tmp); mark_buffer(); write_region_to_file(tmp); cmd = Sprintf("stty opost icrnl; clear; nsign %s;", tmp, 1); cmd = strcat(cmd, "echo press ENTER; read dummy;"); % prompt cmd = strcat(cmd, "stty -opost -icrnl"); system(cmd); mark_buffer(); del_region(); insert_file(tmp); delete_file(tmp); delete_file(strcat(tmp,".bak")); bob(); call("redraw"); } %!%encrypt the current buffer with pgp define pgpe() { pgp("-ea"); } %!%sign the current buffer with pgp define pgps() { pgp("-sta +clearsig=on"); } %!%encrypt and sign the current buffer with pgp define pgpes() { pgp("-sea"); } %!%encrypt and sign the current buffer with pgp define pgpse() { pgp("-sea"); } . "dequote" "requote" "reformat_quote" . "mail_mode" "mail_fix_quotes" loop (_stkdepth) add_completion(());