On 2009-07-14 14:41 (+0900), Byung-Hee HWANG wrote: > Hi, i use Emacs on Gnome Desktop (FreeBSD 7.2-RELEASE). In Gnome, > there is the config named "prefer application" in which we can decide > the best application for us such as mailer, webbrowser. The default > value in mailer is "Evolution". By the way i would like to switch to > Gnus from Evolution. So how can i change without any errors?
I have written a Bash script which parses mailto URLs and email headers' possible RFC2047 quotations and then launches emacsclient to compose mail. I don't know if it works in FreeBSD but it works on GNU/Linux systems. It uses Bash's printf features to decode URL's %xx codes and GNU "recode" utility to decode RFC2047-quoted headers. It also uses "sed" a lot but I have no idea know if it needs GNU sed's extensions. It's meant to be an executable script and it takes one command-line argument: a mailto URL string, like this: mailto-handler "mailto:tliko...@iki.fi&subject=This%20is%20subject" I use the script with Firefox and it's my KDE's default mail client. Works great at least in my system. Be free to edit it to suit your purposes. The program is public domain; absolutely no warranty.
#!/bin/bash # Mailto link handler script for Emacs. # # Written by Teemu Likonen <tliko...@iki.fi> # # This program is placed in the public domain. url="$1" echopf() { printf '%s' "$@" printf '\n' } unquote_url() { read -r string string=$(echopf "$string" | \ sed -re 's/%([0-9a-fA-F]{2})/\\x\1/g') printf "%b\n" "$string" } convert_url_unix_lf() { sed -e 's/%0[Dd]%0[Aa]/%0A/g;s/%0[Dd]/%0A/g' } convert_url_lf_tab_to_space() { sed -e 's/%0[Aa]%09/%20/g' } elisp_string_escape() { sed -e 's/[\"]/\\&/g' } unquote_rfc2047() { local string local new_string local mime_regexp mime_string mime_charset mime_encoding local text_string text_string_unquoted local mime_string_escaped text_string_unquoted_escaped read -r string mime_regexp='(=\?([^? ]+)\?([qQbB])\?([^? ]+)\?=)' # Remove whitespace between MIME strings. while true; do new_string=$(echopf "$string" | \ sed -re "s/(${mime_regexp})\s+(${mime_regexp})/\1\6/") if [ "$new_string" = "$string" ]; then break else string="$new_string" fi done mime_string=$(echopf "$string" | \ sed -nre "s/.*${mime_regexp}.*/\1/p") # Decode MIME strings one by one while [ "$mime_string" ]; do mime_charset=$(echopf "$mime_string" | \ sed -re "s/.*${mime_regexp}.*/\2/") mime_encoding=$(echopf "$mime_string" | \ sed -re "s/.*${mime_regexp}.*/\3/") text_string=$(echopf "$mime_string" | \ sed -re "s/.*${mime_regexp}.*/\4/") case "$mime_encoding" in q|Q) mime_encoding=Quoted-Printable text_string=$(echopf "$text_string" | \ sed -e 's/_/=20/g') ;; b|B) mime_encoding=Base64 ;; esac text_string_unquoted=$(echopf "$text_string" | \ recode -- "$mime_charset/$mime_encoding") mime_string_escaped=$(echopf "$mime_string" | \ sed -re 's,[][()|\^$.?+/*{}],\\&,g') text_string_unquoted_escaped=$(echopf \ "$text_string_unquoted" | sed -re 's,[/&\],\\&,g') string=$(echopf "$string" | sed -re \ "s/$mime_string_escaped/$text_string_unquoted_escaped/") mime_string=$(echopf "$string" | \ sed -nre "s/.*${mime_regexp}.*/\1/p") done echopf "$string" } to1_address=$(echopf "$url" | \ sed -nre 's/^mailto:([^?&]*).*$/\1/p' | \ unquote_url | unquote_rfc2047) to2_address=$(echopf "$url" | \ sed -nre 's/^mailto:.*[?&][Tt][Oo]=([^?&]*).*$/\1/p' | \ unquote_url | unquote_rfc2047) to_address=$(printf "%s, %s\n" "$to1_address" "$to2_address" | \ sed -re 's/^[, ]+|[, ]+$//g' | elisp_string_escape) cc_address=$(echopf "$url" | \ sed -nre 's/^mailto:.*[?&][Cc][Cc]=([^?&]*).*$/\1/p' | \ unquote_url | unquote_rfc2047 | elisp_string_escape) bcc_address=$(echopf "$url" | \ sed -nre 's/^mailto:.*[?&][Bb][Cc][Cc]=([^?&]*).*$/\1/p' | \ unquote_url | unquote_rfc2047 | elisp_string_escape) subject=$(echopf "$url" | \ sed -nre 's/^mailto:.*[?&][Ss]ubject=([^?&]*).*$/\1/p' | \ convert_url_unix_lf | convert_url_lf_tab_to_space | \ unquote_url | unquote_rfc2047 | elisp_string_escape) in_reply_to=$(echopf "$url" | \ sed -nre 's/^mailto:.*[?&]In-Reply-To=([^?&]*).*$/\1/p' | \ unquote_url | sed -re 's/^[< ]+|[> ]+$//g' | elisp_string_escape) elisp_expression=$(printf '(compose-mail "%s" "%s" (quote (' \ "$to_address" "$subject") [ "$cc_address" ] && elisp_expression=$(printf '%s("Cc" . "%s")' \ "$elisp_expression" "$cc_address") [ "$bcc_address" ] && elisp_expression=$(printf '%s("Bcc" . "%s")' \ "$elisp_expression" "$bcc_address") [ "$in_reply_to" ] && elisp_expression=$(printf '%s("In-Reply-To" . "<%s>")' \ "$elisp_expression" "$in_reply_to") elisp_expression=$(printf '%s)))\n' "$elisp_expression") echopf "$elisp_expression" exec emacsclient -c -n -a '' --eval "$elisp_expression"
_______________________________________________ info-gnus-english mailing list info-gnus-english@gnu.org http://lists.gnu.org/mailman/listinfo/info-gnus-english