Using saved parent location: http://bzr.savannah.gnu.org/r/emacs/trunk/ Now on revision 104237. ------------------------------------------------------------ revno: 104237 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 16:58:25 -0700 message: add-log font-lock fix for mutilple authors (bug#8644) * lisp/vc/add-log.el (change-log-font-lock-keywords): Also handle multiple author lines with leading tabs. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-14 23:27:09 +0000 +++ lisp/ChangeLog 2011-05-14 23:58:25 +0000 @@ -2,6 +2,8 @@ * vc/add-log.el (add-change-log-entry): Don't start adding a new entry in the middle of an existing one with multiple authors. (Bug#8645) + (change-log-font-lock-keywords): Also handle multiple author lines + with leading tabs. (Bug#8644) * calendar/appt.el (appt-check): Rename some local variables. Some simplification/reordering. === modified file 'lisp/vc/add-log.el' --- lisp/vc/add-log.el 2011-05-14 23:27:09 +0000 +++ lisp/vc/add-log.el 2011-05-14 23:58:25 +0000 @@ -241,7 +241,7 @@ ;; wrongly with a non-date line existing as a random note. In ;; addition, using any kind of fixed setting like this doesn't ;; work if a user customizes add-log-time-format. - ("^[0-9-]+ +\\|^ \\{11,\\}\\|^\\(Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\) [A-z][a-z][a-z] [0-9:+ ]+" + ("^[0-9-]+ +\\|^ \\{11,\\}\\|^\t \\{3,\\}\\|^\\(Sun\\|Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\) [A-z][a-z][a-z] [0-9:+ ]+" (0 'change-log-date-face) ;; Name and e-mail; some people put e-mail in parens, not angles. ("\\([^<(]+?\\)[ \t]*[(<]\\([A-Za-z0-9_.+-]+@[A-Za-z0-9_.-]+\\)[>)]" nil nil ------------------------------------------------------------ revno: 104236 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 16:27:09 -0700 message: add-log.el fix for multiple author entries (bug#8645) * lisp/vc/add-log.el (add-change-log-entry): Don't start adding a new entry in the middle of an existing one with multiple authors. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-14 19:13:40 +0000 +++ lisp/ChangeLog 2011-05-14 23:27:09 +0000 @@ -1,5 +1,8 @@ 2011-05-14 Glenn Morris + * vc/add-log.el (add-change-log-entry): Don't start adding a new entry + in the middle of an existing one with multiple authors. (Bug#8645) + * calendar/appt.el (appt-check): Rename some local variables. Some simplification/reordering. === modified file 'lisp/vc/add-log.el' --- lisp/vc/add-log.el 2011-04-18 20:35:18 +0000 +++ lisp/vc/add-log.el 2011-05-14 23:27:09 +0000 @@ -237,7 +237,7 @@ (defvar change-log-font-lock-keywords `(;; ;; Date lines, new (2000-01-01) and old (Sat Jan 1 00:00:00 2000) styles. - ;; Fixme: this regepx is just an approximate one and may match + ;; Fixme: this regexp is just an approximate one and may match ;; wrongly with a non-date line existing as a random note. In ;; addition, using any kind of fixed setting like this doesn't ;; work if a user customizes add-log-time-format. @@ -865,8 +865,12 @@ (if (and (not add-log-always-start-new-record) (let ((hit nil)) (dolist (entry new-entries hit) - (when (looking-at (regexp-quote entry)) - (setq hit t))))) + (and (looking-at (regexp-quote entry)) + ;; Reject multiple author entries. (Bug#8645) + (save-excursion + (forward-line 1) + (not (looking-at "[ \t]+.*<.*>$"))) + (setq hit t))))) (forward-line 1) (insert (nth (random (length new-entries)) new-entries) ------------------------------------------------------------ revno: 104235 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 13:14:25 -0700 message: Remove obsolete comment. diff: === modified file 'lisp/type-break.el' --- lisp/type-break.el 2011-04-19 13:44:55 +0000 +++ lisp/type-break.el 2011-05-14 20:14:25 +0000 @@ -5,7 +5,6 @@ ;; Author: Noah Friedman ;; Maintainer: Noah Friedman ;; Keywords: extensions, timers -;; Status: Works in GNU Emacs 19.25 or later, some versions of XEmacs ;; Created: 1994-07-13 ;; This file is part of GNU Emacs. ------------------------------------------------------------ revno: 104234 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 13:13:30 -0700 message: Use a single Author: header. diff: === modified file 'test/automated/ert-x-tests.el' --- test/automated/ert-x-tests.el 2011-01-25 04:08:28 +0000 +++ test/automated/ert-x-tests.el 2011-05-14 20:13:30 +0000 @@ -3,7 +3,7 @@ ;; Copyright (C) 2008, 2010-2011 Free Software Foundation, Inc. ;; Author: Phil Hagelberg -;; Author: Christian Ohler +;; Christian Ohler ;; This file is part of GNU Emacs. ------------------------------------------------------------ revno: 104233 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 13:11:34 -0700 message: * lisp/allout.el: Comment fix. diff: === modified file 'lisp/allout.el' --- lisp/allout.el 2011-03-29 18:26:01 +0000 +++ lisp/allout.el 2011-05-14 20:11:34 +0000 @@ -6507,7 +6507,7 @@ (defun allout-mark-marker (&optional force buffer) "Accommodate the different signature for `mark-marker' across Emacsen. -XEmacs takes two optional args, while mainline GNU Emacs does not, +XEmacs takes two optional args, while Emacs does not, so pass them along when appropriate." (if (featurep 'xemacs) (apply 'mark-marker force buffer) ------------------------------------------------------------ revno: 104232 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 13:04:07 -0700 message: * doc/misc/dired-x.texi (Omitting Examples): Minor addition. diff: === modified file 'doc/misc/ChangeLog' --- doc/misc/ChangeLog 2011-05-12 16:30:17 +0000 +++ doc/misc/ChangeLog 2011-05-14 20:04:07 +0000 @@ -1,3 +1,7 @@ +2011-05-14 Glenn Morris + + * dired-x.texi (Omitting Examples): Minor addition. + 2011-05-10 Jim Meyering * ede.texi: Fix typo "or or -> or". === modified file 'doc/misc/dired-x.texi' --- doc/misc/dired-x.texi 2011-03-02 07:59:02 +0000 +++ doc/misc/dired-x.texi 2011-05-14 20:04:07 +0000 @@ -452,7 +452,9 @@ @end example @noindent -in the @code{dired-load-hook} (@pxref{Installation}). +in the @code{dired-load-hook} (@pxref{Installation}). (Of course, a +better way to achieve this particular goal is simply to omit @samp{-a} from +@code{dired-listing-switches}.) @end itemize ------------------------------------------------------------ revno: 104231 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 12:52:13 -0700 message: Make configure.in give an error if no X-toolkit was detected. * configure.in: Treat failure to find an X toolkit the same way we treat failure to find X and image support. diff: === modified file 'ChangeLog' --- ChangeLog 2011-05-12 16:30:17 +0000 +++ ChangeLog 2011-05-14 19:52:13 +0000 @@ -1,3 +1,8 @@ +2011-05-14 Glenn Morris + + * configure.in: Treat failure to find an X toolkit the same way we treat + failure to find X and image support. + 2011-05-12 Glenn Morris * Makefile.in (src, install-arch-indep, bootstrap-clean) === modified file 'configure.in' --- configure.in 2011-05-09 10:40:26 +0000 +++ configure.in 2011-05-14 19:52:13 +0000 @@ -2036,8 +2036,11 @@ elif test x"${USE_X_TOOLKIT}" = xLUCID; then AC_MSG_ERROR([Lucid toolkit requires X11/Xaw include files]) else - AC_MSG_RESULT([no; do not use toolkit by default]) - USE_X_TOOLKIT=none + AC_MSG_ERROR([No X toolkit could be found. +If you are sure you want Emacs compiled without an X toolkit, pass + --with-x-toolkit=no +to configure. Otherwise, install the development libraries for the toolkit +that you want to use (e.g. Gtk+) and re-run configure.]) fi fi fi ------------------------------------------------------------ revno: 104230 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 12:13:40 -0700 message: appt.el trivia. * lisp/calendar/appt.el (appt-check): Rename some local variables. Some simplification/reordering. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-14 18:47:29 +0000 +++ lisp/ChangeLog 2011-05-14 19:13:40 +0000 @@ -1,5 +1,8 @@ 2011-05-14 Glenn Morris + * calendar/appt.el (appt-check): Rename some local variables. + Some simplification/reordering. + * mail/feedmail.el (feedmail-confirm-outgoing-timeout) (feedmail-sendmail-f-doesnt-sell-me-out) (feedmail-queue-slug-suspect-regexp, feedmail-debug) === modified file 'lisp/calendar/appt.el' --- lisp/calendar/appt.el 2011-05-13 01:38:31 +0000 +++ lisp/calendar/appt.el 2011-05-14 19:13:40 +0000 @@ -282,15 +282,15 @@ (let* ((min-to-app -1) (prev-appt-mode-string appt-mode-string) (prev-appt-display-count (or appt-display-count 0)) - now cur-comp-time appt-comp-time appt-warn-time) + now now-mins appt-mins appt-warn-time) (save-excursion ; FIXME ? ;; Convert current time to minutes after midnight (12.01am = 1). (setq now (decode-time) - cur-comp-time (+ (* 60 (nth 2 now)) (nth 1 now))) + now-mins (+ (* 60 (nth 2 now)) (nth 1 now))) ;; At first check in any day, update appointments to today's list. (if (or force ; eg initialize, diary save (null appt-prev-comp-time) ; first check - (< cur-comp-time appt-prev-comp-time)) ; new day + (< now-mins appt-prev-comp-time)) ; new day (ignore-errors (let ((diary-hook (if (assoc 'appt-make-list diary-hook) diary-hook @@ -301,22 +301,24 @@ ;; diary-number-of-entries. Since appt.el only ;; works on a daily basis, no need for more entries. (diary-list-entries (calendar-current-date) 1 t))))) - (setq appt-prev-comp-time cur-comp-time + (setq appt-prev-comp-time now-mins appt-mode-string nil appt-display-count nil) + ;; Remove any entries that are in the past. + ;; FIXME how can there be any such entries, given that this + ;; function removes entries when they hit zero minutes, + ;; and appt-make-list doesn't add any in the past in the first place? + (while (and appt-time-msg-list + (< (setq appt-mins (caar (car appt-time-msg-list))) + now-mins)) + (setq appt-time-msg-list (cdr appt-time-msg-list))) ;; If there are entries in the list, and the user wants a ;; message issued, get the first time off of the list and ;; calculate the number of minutes until the appointment. (when appt-time-msg-list - (setq appt-comp-time (caar (car appt-time-msg-list)) - appt-warn-time (or (nth 3 (car appt-time-msg-list)) + (setq appt-warn-time (or (nth 3 (car appt-time-msg-list)) appt-message-warning-time) - min-to-app (- appt-comp-time cur-comp-time)) - (while (and appt-time-msg-list - (< appt-comp-time cur-comp-time)) - (setq appt-time-msg-list (cdr appt-time-msg-list)) - (if appt-time-msg-list - (setq appt-comp-time (caar (car appt-time-msg-list))))) + min-to-app (- appt-mins now-mins)) ;; If we have an appointment between midnight and ;; `appt-warn-time' minutes after midnight, we ;; must begin to issue a message before midnight. Midnight @@ -325,16 +327,17 @@ ;; appointment variable. It is equal to the number of ;; minutes before midnight plus the number of minutes after ;; midnight our appointment is. - (if (and (< appt-comp-time appt-warn-time) - (> (+ cur-comp-time appt-warn-time) - appt-max-time)) - (setq min-to-app (+ (- (1+ appt-max-time) cur-comp-time) - appt-comp-time))) + ;; FIXME but appt-make-list constructs appt-time-msg-list to only + ;; contain entries with today's date, so this cannot work? + ;; Also above we just removed anything with appt-mins < now-mins. + (if (and (< appt-mins appt-warn-time) + (> (+ now-mins appt-warn-time) appt-max-time)) + (setq min-to-app (+ (- (1+ appt-max-time) now-mins) + appt-mins))) ;; Issue warning if the appointment time is within ;; appt-message-warning time. (when (and (<= min-to-app appt-warn-time) (>= min-to-app 0)) - (setq appt-display-count (1+ prev-appt-display-count)) ;; This is true every appt-display-interval minutes. (and (zerop (mod prev-appt-display-count appt-display-interval)) (appt-display-message (cadr (car appt-time-msg-list)) @@ -351,11 +354,11 @@ ;; appointment on the next cycle. (if (zerop min-to-app) (setq appt-time-msg-list (cdr appt-time-msg-list) - appt-display-count nil)))) + appt-display-count nil) + (setq appt-display-count (1+ prev-appt-display-count))))) ;; If we have changed the mode line string, redisplay all mode lines. (and appt-display-mode-line - (not (string-equal appt-mode-string - prev-appt-mode-string)) + (not (string-equal appt-mode-string prev-appt-mode-string)) (progn (force-mode-line-update t) ;; If the string now has a notification, redisplay right now. ------------------------------------------------------------ revno: 104229 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 12:11:47 -0700 message: * admin/notes/bugtracker: Small updates. diff: === modified file 'admin/notes/bugtracker' --- admin/notes/bugtracker 2011-02-23 04:19:28 +0000 +++ admin/notes/bugtracker 2011-05-14 19:11:47 +0000 @@ -63,13 +63,16 @@ ** How do I reply to an existing bug report? Reply to 123@debbugs.gnu.org, replacing 123 with the number of the bug you are interested in. NB this only sends mail to the -bug-list, it does NOT (?) send a CC to the original bug submitter. +bug-list, it does NOT send a CC to the original bug submitter. So you need to explicitly CC him/her (and anyone else you like). +(This works the same way as all the Emacs mailing lists. We generally +don't assume anyone who posts to a list is subscribed to it, so we +cc everyone on replies.) (Many people think the submitter SHOULD be automatically subscribed to subsequent discussion, but this does not seem to be implemented. -See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=37078) -See also http://debbugs.gnu.org/5439 +See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=37078 +See also http://debbugs.gnu.org/5439 ) Do NOT send a separate copy to the bug list address, since this may generate a new report. The only time to send mail to the bug list @@ -85,9 +88,9 @@ "Resent-To" header. For a long time Rmail erroneously included such headers in replies. If you correspond with an Rmail user on a bug, these addresses may end up in the Cc. Mailing to them does nothing -but create duplicates and errors. (It is possible you might want to -have a dialog with the owner address, outside of normal bug -reporting.) +but create duplicates and errors. (It is possible, but unlikely, that +you might want to have a dialog with the owner address, outside of +normal bug reporting.) ** When reporting a bug, to send a Cc to another address (e.g. bug-cc-mode@gnu.org), do NOT just use a Cc: header. ------------------------------------------------------------ revno: 104228 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 12:09:37 -0700 message: * admin/notes/bzr: Update changelog_merge branch details. diff: === modified file 'admin/notes/bzr' --- admin/notes/bzr 2011-04-26 04:50:33 +0000 +++ admin/notes/bzr 2011-05-14 19:09:37 +0000 @@ -76,9 +76,8 @@ (this will be included by default in bzr 2.4 onwards): cd ~/.bazaar/plugins -# The following is an improved version of: lp:bzr-changelog-merge -bzr branch lp:~spiv/bzr-changelog-merge/non-head-edits-723968 -mv bzr-changelog-merge changelog_merge +bzr branch http://bazaar.launchpad.net/~spiv/bzr-changelog-merge/trunk +mv trunk changelog_merge This should make merging ChangeLogs smoother. It merges new entries to the top of the file, rather than trying to fit them in mid-way ------------------------------------------------------------ revno: 104227 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 11:47:29 -0700 message: * lisp/mail/feedmail.el (bbdb-dwim-net-address, vm-mail): Declare. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-14 18:43:43 +0000 +++ lisp/ChangeLog 2011-05-14 18:47:29 +0000 @@ -5,7 +5,8 @@ (feedmail-queue-slug-suspect-regexp, feedmail-debug) (feedmail-debug-sit-for, feedmail-queue-express-hook) (feedmail-queue-runner-message-sender): Set :version. - (bbdb-search, bbdb-records, smtp-via-smtp, smtp-server): Declare. + (bbdb-search, bbdb-records, smtp-via-smtp, smtp-server) + (bbdb-dwim-net-address, vm-mail): Declare. (feedmail-binmail-gnulinuxish-template): Rename from feedmail-binmail-linuxish-template. (feedmail-buffer-to-smtp, feedmail-vm-mail-mode): === modified file 'lisp/mail/feedmail.el' --- lisp/mail/feedmail.el 2011-05-14 18:43:43 +0000 +++ lisp/mail/feedmail.el 2011-05-14 18:47:29 +0000 @@ -914,9 +914,9 @@ ;; FIXME this is a macro? (declare-function bbdb-search "ext:bbdb-com" (records &optional name company net notes phone)) - (declare-function bbdb-records "ext:bbdb" (&optional dont-check-disk already-in-db-buffer)) +(declare-function bbdb-dwim-net-address "ext:bbdb-com" (record &optional net)) (defun feedmail-spray-via-bbdb () "Example function for use with feedmail spray mode. @@ -1733,6 +1733,8 @@ non-nil, feedmail \"smart filling\" is done on VALUE just before insertion.") +(declare-function vm-mail "ext:vm" (&optional to subject)) + (defun feedmail-vm-mail-mode (&optional arg) "Make something like a buffer that has been created via `vm-mail'. The optional argument is ignored and is just for argument compatibility with ------------------------------------------------------------ revno: 104226 committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 11:43:43 -0700 message: Clean-up previous feedmail.el merge. * lisp/mail/feedmail.el (feedmail-confirm-outgoing-timeout) (feedmail-sendmail-f-doesnt-sell-me-out) (feedmail-queue-slug-suspect-regexp, feedmail-debug) (feedmail-debug-sit-for, feedmail-queue-express-hook) (feedmail-queue-runner-message-sender): Set :version. (bbdb-search, bbdb-records, smtp-via-smtp, smtp-server): Declare. (feedmail-binmail-gnulinuxish-template): Rename from feedmail-binmail-linuxish-template. (feedmail-buffer-to-smtp, feedmail-vm-mail-mode): Use insert-buffer-substring. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-14 18:30:21 +0000 +++ lisp/ChangeLog 2011-05-14 18:43:43 +0000 @@ -1,3 +1,16 @@ +2011-05-14 Glenn Morris + + * mail/feedmail.el (feedmail-confirm-outgoing-timeout) + (feedmail-sendmail-f-doesnt-sell-me-out) + (feedmail-queue-slug-suspect-regexp, feedmail-debug) + (feedmail-debug-sit-for, feedmail-queue-express-hook) + (feedmail-queue-runner-message-sender): Set :version. + (bbdb-search, bbdb-records, smtp-via-smtp, smtp-server): Declare. + (feedmail-binmail-gnulinuxish-template): + Rename from feedmail-binmail-linuxish-template. + (feedmail-buffer-to-smtp, feedmail-vm-mail-mode): + Use insert-buffer-substring. + 2011-05-14 Bill Carpenter * mail/feedmail.el (feedmail-patch-level): Increase. === modified file 'lisp/mail/feedmail.el' --- lisp/mail/feedmail.el 2011-05-14 18:30:21 +0000 +++ lisp/mail/feedmail.el 2011-05-14 18:43:43 +0000 @@ -348,8 +348,8 @@ ;; feedmail-queue-express-hook ;; added example function feedmail-spray-via-bbdb ;; use expand-file-name for setting default directory names -;; define feedmail-binmail-linuxish-template as a suggestion for -;; the value of feedmail-binmail-template on Linux and maybe other +;; define feedmail-binmail-gnulinuxish-template as a suggestion for +;; the value of feedmail-binmail-template on GNU/Linux and maybe other ;; systems with non-classic /bin/[r]mail behavior ;; guard against nil user-mail-address in generating MESSAGE-ID: ;; feedmail-queue-slug-suspect-regexp is now a variable to @@ -441,6 +441,7 @@ number, it's a timeout before not sending. This will not work if your version of Emacs doesn't include the function `y-or-n-p-with-timeout' \(e.g., some versions of XEmacs\)." + :version "24.1" :group 'feedmail-misc :type '(choice (const nil) integer) ) @@ -648,6 +649,7 @@ it will use the \"-f\" \(since it is a handy feature\). You control what feedmail thinks with this variable. The default is nil, meaning that feedmail will believe that sendmail will sell you out." + :version "24.1" :group 'feedmail-headers :type 'boolean ) @@ -909,6 +911,12 @@ :type 'sexp ; too complex to be described accurately ) +;; FIXME this is a macro? +(declare-function bbdb-search "ext:bbdb-com" + (records &optional name company net notes phone)) + +(declare-function bbdb-records "ext:bbdb" + (&optional dont-check-disk already-in-db-buffer)) (defun feedmail-spray-via-bbdb () "Example function for use with feedmail spray mode. @@ -1204,6 +1212,7 @@ conventions. Substitutions are done repeatedly until the regular expression no longer matches to transformed string. Used by function feedmail-tidy-up-slug and indirectly by feedmail-queue-subject-slug-maker." + :version "24.1" :group 'feedmail-queue :type 'string ) @@ -1273,6 +1282,7 @@ "If non-nil, blat a debug messages and such in the mini-buffer. This is intended as an aid to tracing what's going on but is probably of casual real use only to the feedmail developer." + :version "24.1" :group 'feedmail-debug :type 'boolean ) @@ -1285,6 +1295,7 @@ the pause. If the value is nil or 0, the sit-for is not done, which has the effect of not pausing at all. Debug messages can be seen after the fact in the messages buffer." + :version "24.1" :group 'feedmail-debug :type 'integer ) @@ -1406,6 +1417,7 @@ For example, you might want to run vm-mime-encode-composition to take care of attachments. If you subsequently edit the message buffer, you can undo the encoding." + :version "24.1" :group 'feedmail-queue :type 'hook ) @@ -1474,6 +1486,7 @@ wrapper function which discards the optional argument and calls mail-send. If you are a VM user, you might like vm-mail-send, though you really don't need that. Called with funcall, not call-interactively." + :version "24.1" ; changed default :group 'feedmail-queue :type 'function ) @@ -1523,12 +1536,12 @@ :type 'function ) -(defconst feedmail-binmail-linuxish-template +(defconst feedmail-binmail-gnulinuxish-template (concat "(echo From " (if (boundp 'user-login-name) user-login-name "feedmail") " ; cat -) | /usr/bin/rmail %s") - "Good candidate for Linux systems and maybe others. + "Good candidate for GNU/Linux systems and maybe others. You may need to modify this if your \"rmail\" is in a different place. For example, I hear that in some Debian systems, it's /usr/sbin/rmail. See feedmail-binmail-template documentation." @@ -1558,17 +1571,18 @@ functions. The above description applies to \"classic\" UNIX /bin/mail and /bin/rmail. -On most Linux systems and perhaps other places, /bin/mail behaves +On most GNU/Linux systems and perhaps other places, /bin/mail behaves completely differently and shouldn't be used at all in this template. Instead of /bin/rmail, there is a /usr/bin/rmail, and it can be used with a wrapper. The wrapper is necessary because /usr/bin/rmail on such systems requires that the first line of the message appearing on standard input have a UNIX-style From_ postmark. If you have such a system, the wrapping can be accomplished by setting the value of `feedmail-binmail-template' -to `feedmail-binmail-linuxish-template'. You should then send some test +to `feedmail-binmail-gnulinuxish-template'. You should then send some test messages to make sure it works as expected." - :group 'feedmail-misc - :type 'string + :version "24.1" ; changed default + :group 'feedmail-misc + :type 'string ) @@ -1638,6 +1652,9 @@ (insert "\n\n")))) (buffer-list)))))) +(declare-function smtp-via-smtp "ext:smtp" (sender recipients smtp-text-buffer)) +(defvar smtp-server) + ;; FLIM's smtp.el pointed out to me by Kenichi Handa (defun feedmail-buffer-to-smtp (prepped errors-to addr-listoid) "Function which actually calls smtp-via-smtp to send buffer as e-mail." @@ -1656,7 +1673,7 @@ (if (string-match tracer (buffer-name buffy)) (progn (insert "SMTP Trace from " (buffer-name buffy) "\n---------------") - (insert-buffer buffy) + (insert-buffer-substring buffy) (insert "\n\n")))) (buffer-list)))))) @@ -1730,7 +1747,7 @@ (let ((the-buf (current-buffer))) (vm-mail) (delete-region (point-min) (point-max)) - (insert-buffer the-buf) + (insert-buffer-substring the-buf) (setq buffer-file-name (buffer-file-name the-buf)) (set-buffer-modified-p (buffer-modified-p the-buf)) ;; For some versions of emacs, saving the message to a queue ------------------------------------------------------------ revno: 104225 [merge] committer: Ulf Jasper branch nick: trunk timestamp: Sat 2011-05-14 20:40:14 +0200 message: newsticker: Added README to etc/newsticker/images etc/ChangeLog: 2011-05-14 Ulf Jasper * images/newsticker/README: Added. diff: === modified file 'etc/ChangeLog' --- etc/ChangeLog 2011-05-13 19:06:36 +0000 +++ etc/ChangeLog 2011-05-14 18:39:26 +0000 @@ -1,3 +1,7 @@ +2011-05-14 Ulf Jasper + + * images/newsticker/README: Added. + 2011-05-13 Ulf Jasper * images/newsticker: Added. === added file 'etc/images/newsticker/README' --- etc/images/newsticker/README 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/README 2011-05-14 18:39:26 +0000 @@ -0,0 +1,8 @@ +COPYRIGHT AND LICENSE INFORMATION FOR IMAGE FILES + +Files: browse-url.xpm get-all.xpm mark-immortal.xpm mark-read.xpm + narrow.xpm next-feed.xpm next-item.xpm prev-feed.xpm + prev-item.xpm update.xpm +Author: Ulf Jasper +Copyright (C) 2011 Free Software Foundation, Inc. +License: GNU General Public License version 3 or later (see COPYING) ------------------------------------------------------------ revno: 104224 author: Bill Carpenter committer: Glenn Morris branch nick: trunk timestamp: Sat 2011-05-14 11:30:21 -0700 message: Update from version on author's website. * lisp/mail/feedmail.el (feedmail-patch-level): Increase. (feedmail-debug): New custom group. (feedmail-confirm-outgoing-timeout) (feedmail-sendmail-f-doesnt-sell-me-out) (feedmail-queue-slug-suspect-regexp, feedmail-debug) (feedmail-debug-sit-for, feedmail-queue-express-hook): New options. (feedmail-sender-line, feedmail-from-line) (feedmail-fiddle-headers-upwardly, feedmail-enable-spray) (feedmail-spray-this-address, ) (feedmail-spray-address-fiddle-plex-list) (feedmail-queue-use-send-time-for-date) (feedmail-queue-use-send-time-for-message-id) (feedmail-last-chance-hook, feedmail-queue-runner-mode-setter) (feedmail-buffer-eating-function): Doc fixes. (feedmail-spray-via-bbdb, feedmail-buffer-to-smtp) (feedmail-vm-mail-mode, feedmail-message-action-scroll-up) (feedmail-message-action-scroll-down): New functions. (feedmail-queue-directory, feedmail-queue-draft-directory): Use expand-file-name. (feedmail-prompt-before-queue-standard-alist): Add scroll entries. Remove C-v help entry. (feedmail-queue-buffer-file-name): New variable. (feedmail-mail-send-hook-splitter, feedmail-buffer-to-binmail) (feedmail-buffer-to-smtpmail, feedmail-queue-express-to-draft) (feedmail-message-action-send-strong, feedmail-message-action-edit) (feedmail-message-action-draft, feedmail-message-action-draft-strong) (feedmail-message-action-queue, feedmail-message-action-queue-strong) (feedmail-message-action-toggle-spray) (feedmail-run-the-queue-no-prompts) (feedmail-run-the-queue-global-prompt, feedmail-queue-reminder) (feedmail-look-at-queue-directory, feedmail-queue-subject-slug-maker) (feedmail-create-queue-filename, feedmail-rfc822-time-zone): (feedmail-fiddle-header, feedmail-give-it-to-buffer-eater) (feedmail-envelope-deducer, feedmail-fiddle-from) (feedmail-fiddle-sender, feedmail-default-date-generator) (feedmail-fiddle-date, feedmail-fiddle-message-id) (feedmail-fiddle-spray-address) (feedmail-fiddle-list-of-spray-fiddle-plexes) (feedmail-fiddle-list-of-fiddle-plexes) (feedmail-fill-to-cc-function, feedmail-fill-this-one) (feedmail-one-last-look, feedmail-fqm-p): Add debug calls. (feedmail-queue-runner-message-sender, feedmail-binmail-template): Change default. Doc fix. (feedmail-queue-runner-cleaner-upper): Use feedmail-say-chatter. (feedmail-binmail-linuxish-template): New constant. (feedmail-buffer-to-sendmail): Doc fix. Add debug call. Respect feedmail-sendmail-f-doesnt-sell-me-out. (feedmail-send-it): Add debug call. Use feedmail-queue-buffer-file-name, and feedmail-send-it-immediately-wrapper. (feedmail-message-action-send): Add debug call. Use feedmail-send-it-immediately-wrapper. (feedmail-queue-express-to-queue): Add debug call. Run feedmail-queue-express-hook. (feedmail-message-action-help): Add debug call. Use feedmail-p-h-b-n. (feedmail-message-action-help-blat): Rename from feedmail-queue-send-edit-prompt-help-first. (feedmail-run-the-queue): Add debug call. Set buffer-file-type. Check line-endings. Handle errors better. (feedmail-queue-reminder-brief, feedmail-queue-reminder-medium): Doc fix. Add debug call. (feedmail-queue-send-edit-prompt): Doc fix. Add debug call. Use feedmail-queue-send-edit-prompt-inner. (feedmail-queue-runner-prompt, feedmail-scroll-buffer): New functions. (feedmail-queue-send-edit-prompt-inner): New function, extracted from feedmail-queue-send-edit-prompt. (feedmail-queue-send-edit-prompt-help) (feedmail-queue-send-edit-prompt-help-later): Remove functions. (feedmail-tidy-up-slug): Add debug call. Respect feedmail-queue-slug-suspect-regexp. (feedmail-queue-subject-slug-maker): Use buffer-substring-no-properties. (feedmail-dump-message-to-queue): Add debug call. Expand queue-directory. (feedmail-dump-message-to-queue): Change message slightly. Use feedmail-say-chatter. (feedmail-rfc822-date): Add debug call. Bind system-time-locale. (feedmail-send-it-immediately-wrapper): New function. (feedmail-send-it-immediately): Add debug calls. Use let not let*. Insert empty string rather than newline. Handle full-frame case. Use catch/throw. Use feedmail-say-chatter. (feedmail-fiddle-from): Try mail-host-address. (feedmail-default-message-id-generator): Doc fix. Bind system-time-locale. Handle missing end. (feedmail-fiddle-x-mailer): Add debug call. Handle feedmail-x-mailer-line being nil. (feedmail-accume-n-nuke-header, feedmail-deduce-address-list): Add debug call. Use buffer-substring-no-properties. (feedmail-say-debug, feedmail-say-chatter): New functions. (feedmail-find-eoh): Give an explicit error. diff: === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-13 19:35:36 +0000 +++ lisp/ChangeLog 2011-05-14 18:30:21 +0000 @@ -1,3 +1,96 @@ +2011-05-14 Bill Carpenter + + * mail/feedmail.el (feedmail-patch-level): Increase. + (feedmail-debug): New custom group. + (feedmail-confirm-outgoing-timeout) + (feedmail-sendmail-f-doesnt-sell-me-out) + (feedmail-queue-slug-suspect-regexp, feedmail-debug) + (feedmail-debug-sit-for, feedmail-queue-express-hook): New options. + (feedmail-sender-line, feedmail-from-line) + (feedmail-fiddle-headers-upwardly, feedmail-enable-spray) + (feedmail-spray-this-address, ) + (feedmail-spray-address-fiddle-plex-list) + (feedmail-queue-use-send-time-for-date) + (feedmail-queue-use-send-time-for-message-id) + (feedmail-last-chance-hook, feedmail-queue-runner-mode-setter) + (feedmail-buffer-eating-function): + Doc fixes. + (feedmail-spray-via-bbdb, feedmail-buffer-to-smtp) + (feedmail-vm-mail-mode, feedmail-message-action-scroll-up) + (feedmail-message-action-scroll-down): New functions. + (feedmail-queue-directory, feedmail-queue-draft-directory): + Use expand-file-name. + (feedmail-prompt-before-queue-standard-alist): Add scroll entries. + Remove C-v help entry. + (feedmail-queue-buffer-file-name): New variable. + (feedmail-mail-send-hook-splitter, feedmail-buffer-to-binmail) + (feedmail-buffer-to-smtpmail, feedmail-queue-express-to-draft) + (feedmail-message-action-send-strong, feedmail-message-action-edit) + (feedmail-message-action-draft, feedmail-message-action-draft-strong) + (feedmail-message-action-queue, feedmail-message-action-queue-strong) + (feedmail-message-action-toggle-spray) + (feedmail-run-the-queue-no-prompts) + (feedmail-run-the-queue-global-prompt, feedmail-queue-reminder) + (feedmail-look-at-queue-directory, feedmail-queue-subject-slug-maker) + (feedmail-create-queue-filename, feedmail-rfc822-time-zone): + (feedmail-fiddle-header, feedmail-give-it-to-buffer-eater) + (feedmail-envelope-deducer, feedmail-fiddle-from) + (feedmail-fiddle-sender, feedmail-default-date-generator) + (feedmail-fiddle-date, feedmail-fiddle-message-id) + (feedmail-fiddle-spray-address) + (feedmail-fiddle-list-of-spray-fiddle-plexes) + (feedmail-fiddle-list-of-fiddle-plexes) + (feedmail-fill-to-cc-function, feedmail-fill-this-one) + (feedmail-one-last-look, feedmail-fqm-p): Add debug calls. + (feedmail-queue-runner-message-sender, feedmail-binmail-template): + Change default. Doc fix. + (feedmail-queue-runner-cleaner-upper): Use feedmail-say-chatter. + (feedmail-binmail-linuxish-template): New constant. + (feedmail-buffer-to-sendmail): Doc fix. Add debug call. + Respect feedmail-sendmail-f-doesnt-sell-me-out. + (feedmail-send-it): Add debug call. + Use feedmail-queue-buffer-file-name, and + feedmail-send-it-immediately-wrapper. + (feedmail-message-action-send): Add debug call. + Use feedmail-send-it-immediately-wrapper. + (feedmail-queue-express-to-queue): Add debug call. + Run feedmail-queue-express-hook. + (feedmail-message-action-help): Add debug call. Use feedmail-p-h-b-n. + (feedmail-message-action-help-blat): + Rename from feedmail-queue-send-edit-prompt-help-first. + (feedmail-run-the-queue): Add debug call. Set buffer-file-type. + Check line-endings. Handle errors better. + (feedmail-queue-reminder-brief, feedmail-queue-reminder-medium): + Doc fix. Add debug call. + (feedmail-queue-send-edit-prompt): Doc fix. Add debug call. + Use feedmail-queue-send-edit-prompt-inner. + (feedmail-queue-runner-prompt, feedmail-scroll-buffer): New functions. + (feedmail-queue-send-edit-prompt-inner): New function, extracted + from feedmail-queue-send-edit-prompt. + (feedmail-queue-send-edit-prompt-help) + (feedmail-queue-send-edit-prompt-help-later): Remove functions. + (feedmail-tidy-up-slug): Add debug call. + Respect feedmail-queue-slug-suspect-regexp. + (feedmail-queue-subject-slug-maker): Use buffer-substring-no-properties. + (feedmail-dump-message-to-queue): Add debug call. + Expand queue-directory. + (feedmail-dump-message-to-queue): Change message slightly. + Use feedmail-say-chatter. + (feedmail-rfc822-date): Add debug call. Bind system-time-locale. + (feedmail-send-it-immediately-wrapper): New function. + (feedmail-send-it-immediately): Add debug calls. Use let not let*. + Insert empty string rather than newline. Handle full-frame case. + Use catch/throw. Use feedmail-say-chatter. + (feedmail-fiddle-from): Try mail-host-address. + (feedmail-default-message-id-generator): Doc fix. + Bind system-time-locale. Handle missing end. + (feedmail-fiddle-x-mailer): Add debug call. + Handle feedmail-x-mailer-line being nil. + (feedmail-accume-n-nuke-header, feedmail-deduce-address-list): + Add debug call. Use buffer-substring-no-properties. + (feedmail-say-debug, feedmail-say-chatter): New functions. + (feedmail-find-eoh): Give an explicit error. + 2011-05-13 Ulf Jasper * net/newst-treeview.el (newsticker-treeview-face): Changed default === modified file 'lisp/mail/feedmail.el' --- lisp/mail/feedmail.el 2011-05-13 02:06:35 +0000 +++ lisp/mail/feedmail.el 2011-05-14 18:30:21 +0000 @@ -4,7 +4,7 @@ ;; This file is part of GNU Emacs. ;; Author: Bill Carpenter -;; Version: 8 +;; Version: 11 ;; Keywords: email, queue, mail, sendmail, message, spray, smtp, draft ;; X-URL: @@ -15,12 +15,19 @@ ;; mode). See below for a list of additional features, including the ;; ability to queue messages for later sending. If you are using ;; fakemail as a subprocess, you can switch to feedmail and eliminate -;; the use of fakemail. feedmail works with recent versions of -;; Emacs (mostly, but not exclusively, tested against 19.34 on -;; Win95; some testing on 20.x) and XEmacs (tested with 20.4 and -;; later betas). It probably no longer works with Emacs 18, -;; though I haven't tried that in a long time. Sorry, no manual yet -;; in this release. Look for one with the next release. +;; the use of fakemail. + +;; feedmail works with recent versions of Emacs (20.x series) and +;; XEmacs (tested with 20.4 and later betas). It probably no longer +;; works with Emacs v18, though I haven't tried that in a long +;; time. Makoto.Nakagawa@jp.compaq.com reports: "I have a report +;; that with a help of APEL library, feedmail works fine under emacs +;; 19.28. You can get APEL from ftp://ftp.m17n.org/pub/mule/apel/. +;; you need apel-10.2 or later to make feedmail work under emacs +;; 19.28." + +;; Sorry, no manual yet in this release. Look for one with the next +;; release. Or the one after that. Or maybe later. ;; As far as I'm concerned, anyone can do anything they want with ;; this specific piece of code. No warranty or promise of support is @@ -68,7 +75,8 @@ ;; This file requires the mail-utils library. ;; ;; This file requires the smtpmail library if you use -;; feedmail-buffer-to-smtpmail. +;; feedmail-buffer-to-smtpmail. It requires the smtp library if +;; you use feedmail-buffer-smtp. ;; ;; This file requires the custom library. Unfortunately, there are ;; two incompatible versions of the custom library. If you don't have @@ -147,6 +155,32 @@ ;; (autoload 'feedmail-run-the-queue-no-prompts "feedmail") ;; (setq auto-mode-alist (cons '("\\.fqm$" . mail-mode) auto-mode-alist)) ;; +;; though VM users might find it more comfortable to use this instead of +;; the above example's last line: +;; +;; (setq auto-mode-alist (cons '("\\.fqm$" . feedmail-vm-mail-mode) auto-mode-alist)) +;; +;; If you end up getting asked about killing modified buffers all the time +;; you are probably being prompted from outside feedmail. You can probably +;; get cured by doing the defadvice stuff described in the documentation +;; for the variable feedmail-queue-buffer-file-name below. +;; +;; If you are wondering how to send your messages to some SMTP server +;; (which is not really a feedmail-specific issue), you are probably +;; looking for smtpmail.el, and it is probably already present in your +;; emacs installation. Look at smtpmail.el for how to set that up, and +;; then do this to hook it into feedmail: +;; +;; (autoload 'feedmail-buffer-to-smtpmail "feedmail" nil t) +;; (setq feedmail-buffer-eating-function 'feedmail-buffer-to-smtpmail) +;; +;; Alternatively, the FLIM project +;; provides a library called smtp.el. If you want to use that, the above lines +;; would be: +;; +;; (autoload 'feedmail-buffer-to-smtp "feedmail" nil t) +;; (setq feedmail-buffer-eating-function 'feedmail-buffer-to-smtp) +;; ;; If you are using the desktop.el library to restore your sessions, you might ;; like to add the suffix ".fqm" to the list of non-saved things via the variable ;; desktop-files-not-to-save. @@ -174,13 +208,27 @@ ;; (setq message-send-mail-function 'feedmail-send-it) ;; (add-hook 'message-mail-send-hook 'feedmail-mail-send-hook-splitter) ;; +;; If you use message-mode and you make use of feedmail's queueing +;; stuff, you might also like to adjust these variables to appropriate +;; values for message-mode: +;; +;; feedmail-queue-runner-mode-setter +;; feedmail-queue-runner-message-sender +;; +;; If you are using the "cmail" email package, there is some built-in +;; support for feedmail in recent versions. To enable it, you should: +;; +;; (setq cmail-use-feedmail t) +;; +;;;;;;;; +;; ;; I think the LCD is no longer being updated, but if it were, this ;; would be a proper LCD record. There is an old version of ;; feedmail.el in the LCD archive. It works but is missing a lot of ;; features. ;; ;; LCD record: -;; feedmail|Bill Carpenter|bill@bubblegum.net,bill@carpenter.ORG|Outbound mail queue handling|98-06-15|8|feedmail.el +;; feedmail|WJCarpenter|bill-feedmail@carpenter.ORG|Outbound mail queue handling|01-??-??|11-beta-??|feedmail.el ;; ;; Change log: ;; original, 31 March 1991 @@ -277,14 +325,51 @@ ;; feedmail-queue-auto-file-nuke ;; feedmail-queue-express-to-queue and feedmail-queue-express-to-draft ;; strong versions of "q"ueue and "d"raft answers (always make a new file) +;; patchlevel 9, 23 March 2001 +;; feedmail-queue-buffer-file-name to work around undesirable mail-send prompt +;; at message action prompt, can scroll message buffer with "<" and ">"; +;; C-v no longer scrolls help buffer +;; conditionalize (discard-input) in message action prompt to avoid killing +;; define-kbd-macro +;; fixed error if feedmail-x-mailer-line was nil +;; feedmail-binmail-template only uses /bin/rmail if it exists +;; relocate feedmail-queue-alternative-mail-header-separator stuff +;; added feedmail-vm-mail-mode, which make a good auto-mode-alist entry +;; for FQM files if you're a VM user +;; change buffer-substring calls to buffer-substring-no-properties for +;; speed-up (suggested by Howard Melman ) +;; feedmail-sendmail-f-doesnt-sell-me-out to contol "-f" in call to sendmail +;; in feedmail-buffer-to-sendmail +;; better trapping of odd conditions during the running of the queue; +;; thanks to Yigal Hochberg for helping me test much of this by remote +;; control +;; feedmail-debug and feedmail-debug-sit-for +;; feedmail-display-full-frame +;; feedmail-queue-express-hook +;; added example function feedmail-spray-via-bbdb +;; use expand-file-name for setting default directory names +;; define feedmail-binmail-linuxish-template as a suggestion for +;; the value of feedmail-binmail-template on Linux and maybe other +;; systems with non-classic /bin/[r]mail behavior +;; guard against nil user-mail-address in generating MESSAGE-ID: +;; feedmail-queue-slug-suspect-regexp is now a variable to +;; accomodate non-ASCII environments (thanks to +;; Makoto.Nakagawa@jp.compaq.com for this suggestion) +;; feedmail-buffer-to-smtp, to parallel feedmail-buffer-to-smtpmail +;; patchlevel 10, 22 April 2001 +;; DATE: and MESSAGE-ID stuff now forces system-time-locale to "C" +;; (brought to my attention by Makoto.Nakagawa@jp.compaq.com) +;; patchlevel 11 +;; tweak default FROM: calculation to look at mail-host-address +;; (suggested by "Jason Eisner" ) ;; -;; todo (probably in patchlevel 9): +;; todo: ;; write texinfo manual ;; maybe partition into multiple files, including files of examples ;; ;;; Code: -(defconst feedmail-patch-level "8") +(defconst feedmail-patch-level "11-beta-1") (require 'mail-utils) ; pick up mail-strip-quoted-names @@ -312,6 +397,10 @@ "Options related to queuing messages for later sending." :group 'feedmail) +(defgroup feedmail-debug nil + "Options related to debug messages for later sending." + :group 'feedmail) + (defcustom feedmail-confirm-outgoing nil "If non-nil, give a y-or-n confirmation prompt before sending mail. @@ -329,6 +418,23 @@ ) +(defcustom feedmail-display-full-frame 'queued + "If non-nil, show prepped messages in a full frame. +If nil, the prepped message will be shown, for confirmation or +otherwise, in some window in the current frame without resizing +anything. That may or may not display enough of the message to +distinguish it from others. If set to the symbol 'queued, take +this action only when running the queue. If set to the symbol +'immediate, take this action only when sending immediately. For +any other non-nil value, take the action in both cases. Even if +you're not confirming the sending of immediate or queued messages, +it can still be interesting to see a lot about them as they are +shuttled robotically onward." + :group 'feedmail-misc + :type 'boolean + ) + + (defcustom feedmail-confirm-outgoing-timeout nil "If non-nil, a timeout in seconds at the send confirmation prompt. If a positive number, it's a timeout before sending. If a negative @@ -472,11 +578,11 @@ with no arguments. For an explanation of fiddle-plexes, see the documentation for the variable `feedmail-fiddle-plex-blurb'. In all cases the name element of the fiddle-plex is ignored and is hardwired -by feedmail to either \"X-Sender\" or \"X-Resent-Sender\". +by feedmail to either \"Sender\" or \"Resent-Sender\". You can probably leave this nil, but if you feel like using it, a good value would be a string of a fully-qualified domain name form of your -address. For example, \"bill@bubblegum.net (WJCarpenter)\". The Sender: +address. For example, \"bill@example.net (WJCarpenter)\". The Sender: header is fiddled after the From: header is fiddled." :group 'feedmail-headers :type '(choice (const nil) string) @@ -511,10 +617,10 @@ with no arguments. For an explanation of fiddle-plexes, see the documentation for the variable `feedmail-fiddle-plex-blurb'. In all cases the name element of the fiddle-plex is ignored and is hardwired -by feedmail to either \"X-From\" or \"X-Resent-From\". +by feedmail to either \"From\" or \"Resent-From\". A good value would be a string fully-qualified domain name form of -your address. For example, \"bill@bubblegum.net (WJCarpenter)\". The +your address. For example, \"bill@example.net (WJCarpenter)\". The default value of this variable uses the standard elisp variable `user-mail-address' which should be set on every system but has a decent chance of being wrong. It also honors `mail-from-style'. Better to set @@ -525,6 +631,28 @@ ) +(defcustom feedmail-sendmail-f-doesnt-sell-me-out nil + "Says whether the sendmail program issues a warning header if called with \"-f\". +The sendmail program has a useful feature to let you set the envelope FROM +address via a command line option, \"-f\". Unfortunately, it also has a widely +disliked default behavior of selling you out if you do that by inserting +an unattractive warning in the headers. It looks something like this: + + X-Authentication-Warning: u1.example.com: niceguy set sender to niceguy@example.com using -f + +It is possible to configure sendmail to not do this, but such a reconfiguration +is not an option for many users. As this is the default behavior of most +sendmail installations, one can mostly only wish it were otherwise. If feedmail +believes the sendmail program will sell you out this way, it won't use the \"-f\" +option when calling sendmail. If it doesn't think sendmail will sell you out, +it will use the \"-f\" \(since it is a handy feature\). You control what +feedmail thinks with this variable. The default is nil, meaning that feedmail +will believe that sendmail will sell you out." + :group 'feedmail-headers + :type 'boolean +) + + (defcustom feedmail-deduce-envelope-from t "If non-nil, deduce message envelope \"from\" from header From: or Sender:. In other words, if there is a Sender: header in the message, temporarily @@ -674,7 +802,7 @@ "Non-nil means fiddled header fields should go at the top of the header. nil means insert them at the bottom. This is mostly a novelty issue since the standards define the ordering of header fields to be immaterial and it's -fairly likely that some MTA along the way will have its own idea of what the +fairly likely that some MTA/MUA along the way will have its own idea of what the order should be, regardless of what you specify." :group 'feedmail-headers :type 'boolean @@ -718,19 +846,21 @@ which see `feedmail-spray-address-fiddle-plex-list'. If one of the calls to the buffer-eating function results in an error, -what happens next is carelessly defined, so beware." +what happens next is carelessly defined, so beware. This should get ironed +out in some future release, and there could be other API changes for spraying +as well." :group 'feedmail-spray :type 'boolean ) (defvar feedmail-spray-this-address nil - "Do not set or change this variable. See `feedmail-spray-address-fiddle-plex-list'.") + "Do not set this variable, except via `feedmail-spray-address-fiddle-plex-list'.") (defcustom feedmail-spray-address-fiddle-plex-list nil "User-supplied specification for a crude form of mailmerge capability. When spraying is enabled, feedmail composes a list of envelope addresses. In turn, `feedmail-spray-this-address' is temporarily set to each address -\(stripped of any comments and angle brackets\) and calls a function which +\(stripped of any comments and angle brackets\) and a function is called which fiddles message headers according to this variable. See the documentation for `feedmail-fiddle-plex-blurb', for an overview of fiddle-plex data structures. @@ -747,16 +877,20 @@ May be a function, in which case it is called with no arguments and is expected to return nil, t, a string, another function, or a fiddle-plex. -The result is used recursively. +The result is used recursively. The function may alter the value of the +variable feedmail-spray-this-address, perhaps to embellish it with a +human name. It would be logical in such a case to return as a value a +string naming a message header like \"TO\" or an appropriately constructed +fiddle-plex. For an example, see feedmail-spray-via-bbdb. -May be a list of any combination of the foregoing and fiddle-plexes. (A -value for this variable which consists of a single fiddle-plex must be -nested inside another list to avoid ambiguity.) If a list, each item -is acted on in turn as described above. +May be a list of any combination of the foregoing and/or +fiddle-plexes. (A value for this variable which consists of a single +fiddle-plex must be nested inside another list to avoid ambiguity.) +If a list, each item is acted on in turn as described above. For example, - (setq feedmail-spray-address-fiddle-plex-list 'my-address-embellisher) + (setq feedmail-spray-address-fiddle-plex-list 'feedmail-spray-via-bbdb) The idea of the example is that, during spray mode, as each message is about to be transmitted to an individual address, the function will be @@ -776,6 +910,22 @@ ) +(defun feedmail-spray-via-bbdb () + "Example function for use with feedmail spray mode. +NB: it's up to the user to have the BBDB environment already set up properly +before using this." + (let (net-rec q-net-addy embellish) + (setq q-net-addy (concat "^" (regexp-quote feedmail-spray-this-address) "$")) + (setq net-rec (bbdb-search (bbdb-records) nil nil q-net-addy)) + (if (and (car net-rec) (not (cdr net-rec))) + (setq net-rec (car net-rec)) + (setq net-rec nil)) + (if net-rec (setq embellish (bbdb-dwim-net-address net-rec))) + (if embellish + (list "To" embellish 'supplement) + (list "To" feedmail-spray-this-address 'supplement)))) + + (defcustom feedmail-enable-queue nil "If non-nil, provide for stashing outgoing messages in a queue. This is the master on/off switch for feedmail message queuing. @@ -813,20 +963,20 @@ (defcustom feedmail-queue-directory - (concat (getenv "HOME") "/mail/q") + (expand-file-name "~/mail/q") "Name of a directory where messages will be queued. Directory will be created if necessary. Should be a string that -doesn't end with a slash. Default is \"$HOME/mail/q\"." +doesn't end with a slash. Default is \"~/mail/q\"." :group 'feedmail-queue :type 'string ) (defcustom feedmail-queue-draft-directory - (concat (getenv "HOME") "/mail/draft") + (expand-file-name "~/mail/draft") "Name of a directory where draft messages will be queued. Directory will be created if necessary. Should be a string that -doesn't end with a slash. Default is \"$HOME/mail/draft\"." +doesn't end with a slash. Default is \"~/mail/draft\"." :group 'feedmail-queue :type 'string ) @@ -894,7 +1044,10 @@ (?* . feedmail-message-action-toggle-spray) - (?\C-v . feedmail-message-action-help) + (?> . feedmail-message-action-scroll-up) + (?< . feedmail-message-action-scroll-down) + (? . feedmail-message-action-scroll-up) + ;; (?\C-v . feedmail-message-action-help) (?? . feedmail-message-action-help)) "An alist of choices for the message action prompt. All of the values are function names, except help, which is a special @@ -987,7 +1140,10 @@ feedmail-default-date-generator. If nil, the default, the last-modified timestamp of the queue file is used to create the message Date: header; if there is no queue file, the current time is -used." +used. If you are using VM, it might be supplying this header for +you. To suppress VM's version + + (setq vm-mail-header-insert-date nil)" :group 'feedmail-queue :type 'boolean ) @@ -999,7 +1155,10 @@ `feedmail-default-message-id-generator'. If nil, the default, the last-modified timestamp of the queue file is used to create the message Message-Id: header; if there is no queue file, the current time is -used." +used. If you are using VM, it might be supplying this header for +you. To suppress VM's version + + (setq vm-mail-header-insert-date nil)" :group 'feedmail-queue :type 'boolean ) @@ -1035,6 +1194,21 @@ ) +(defcustom feedmail-queue-slug-suspect-regexp "[^a-z0-9-]+" + "Regular expression for characters/substrings to be replaced. +When feedmail creates a filename from a subject string, it puts hyphens +in place of strings which may cause problems in filenames. By default, +only alphanumeric and hyphen characters are kept, and all others are +converted. In non-ASCII environments, it may be more helpful to +tweak this regular expression to reflect local or personal language +conventions. Substitutions are done repeatedly until the regular expression +no longer matches to transformed string. Used by function +feedmail-tidy-up-slug and indirectly by feedmail-queue-subject-slug-maker." + :group 'feedmail-queue + :type 'string +) + + (defcustom feedmail-queue-default-file-slug t "Indicates what to use for subject-less messages when forming a file name. When feedmail queues a message, it creates a unique file name. By default, @@ -1095,6 +1269,59 @@ ) +(defcustom feedmail-debug nil + "If non-nil, blat a debug messages and such in the mini-buffer. +This is intended as an aid to tracing what's going on but is probably +of casual real use only to the feedmail developer." + :group 'feedmail-debug + :type 'boolean +) + + +(defcustom feedmail-debug-sit-for 0 + "Duration of pause after feedmail-debug messages. +After some messages are divulged, it may be helpful to pause before +something else obliterates them. This value controls the duration of +the pause. If the value is nil or 0, the sit-for is not done, which +has the effect of not pausing at all. Debug messages can be seen after +the fact in the messages buffer." + :group 'feedmail-debug + :type 'integer +) + + +(defvar feedmail-queue-buffer-file-name nil + "If non-nil, has the value normally expected of 'buffer-file-name'. +You are not intended to set this to something in your configuration. Rather, +you might programmatically set it to something via a hook or function +advice or whatever. You might like to do this if you are using a mail +composition program that eventually uses sendmail.el's 'mail-send' +function to process the message. If there is a filename associated +with the message buffer, 'mail-send' will ask you for confirmation. +There's no trivial way to avoid it. It's unwise to just set the value +of 'buffer-file-name' to nil because that will defeat feedmail's file +management features. Instead, arrange for this variable to be set to +the value of 'buffer-file-name' before setting that to nil. An easy way +to do that would be with defadvice on 'mail-send' \(undoing the +assignments in a later advice\). + +feedmail will pretend that 'buffer-file-name', if nil, has the value +assigned of 'feedmail-queue-buffer-file-name' and carry out its normal +activities. feedmail does not restore the non-nil value of +'buffer-file-name'. For safe bookkeeping, the user should insure that +feedmail-queue-buffer-file-name is restored to nil. + +Example 'defadvice' for mail-send: + + (defadvice mail-send (before feedmail-mail-send-before-advice activate) + (setq feedmail-queue-buffer-file-name buffer-file-name) + (setq buffer-file-name nil)) + + (defadvice mail-send (after feedmail-mail-send-after-advice activate) + (if feedmail-queue-buffer-file-name (setq buffer-file-name feedmail-queue-buffer-file-name)) + (setq feedmail-queue-buffer-file-name nil)) +") + ;; defvars to make byte-compiler happy(er) (defvar feedmail-error-buffer nil) (defvar feedmail-prepped-text-buffer nil) @@ -1126,6 +1353,7 @@ or placed in the queue or drafts directory. `feedmail-mail-send-hook-queued' is called when messages are being sent from the queue directory, typically via a call to `feedmail-run-the-queue'." + (feedmail-say-debug ">in-> feedmail-mail-send-hook-splitter %s" feedmail-queue-runner-is-active) (if feedmail-queue-runner-is-active (run-hooks 'feedmail-mail-send-hook-queued) (run-hooks 'feedmail-mail-send-hook)) @@ -1155,21 +1383,32 @@ (defcustom feedmail-last-chance-hook nil "User's last opportunity to modify the message on its way out. -It has already had all the header prepping from the standard package. -The next step after running the hook will be to push the buffer into a -subprocess that mails the mail. The hook might be interested in -these: (1) `feedmail-prepped-text-buffer' contains the header and body -of the message, ready to go; (2) `feedmail-address-list' contains a list +When this hook runs, the current buffer is already the appropriate +buffer. It has already had all the header prepping from the standard +package. The next step after running the hook will be to save the +message via FCC: processing. The hook might be interested in these: +\(1) `feedmail-prepped-text-buffer' contains the header and body of the +message, ready to go; (2) `feedmail-address-list' contains a list of simplified recipients of addresses which are to be given to the subprocess (the hook may change the list); (3) `feedmail-error-buffer' is an empty buffer intended to soak up errors for display to the user. If the hook allows interactive activity, the user should not send more mail while in the hook since some of the internal buffers will be -reused and things will get confused." +reused and things will get confused. It's not necessary to +arrange for the undoing of any changes you make to the buffer." :group 'feedmail-misc :type 'hook ) +(defcustom feedmail-queue-express-hook nil + "Chance to modify a message being sent directly to a queue. +Run by feedmail-queue-express-to-queue and feedmail-queue-express-to-draft. +For example, you might want to run vm-mime-encode-composition to take +care of attachments. If you subsequently edit the message buffer, you +can undo the encoding." + :group 'feedmail-queue + :type 'hook +) (defcustom feedmail-before-fcc-hook nil "User's last opportunity to modify the message before Fcc action. @@ -1197,6 +1436,9 @@ Most people want `mail-mode', so the default value is an anonymous function which is just a wrapper to ignore the supplied argument when calling it, but here's your chance to have something different. +If you are a VM user, you might like feedmail-vm-mail-mode, though you +really don't need that (and it's not particularly well-tested). + Called with funcall, not `call-interactively'." :group 'feedmail-queue :type 'function @@ -1220,15 +1462,18 @@ ) -(defcustom feedmail-queue-runner-message-sender 'mail-send-and-exit +(defcustom feedmail-queue-runner-message-sender + '(lambda (&optional arg) (mail-send)) "Function to initiate sending a message file. Called for each message read back out of the queue directory with a single argument, the optional argument used in the call to `feedmail-run-the-queue' or `feedmail-run-the-queue-no-prompts'. -Interactively, that argument will be the prefix argument. Most people -want `mail-send-and-exit' (bound to C-c C-c in mail-mode), but here's -your chance to have something different. Called with `funcall', not -`call-interactively'." +Interactively, that argument will be the prefix argument. +Most people want `mail-send' (bound to C-c C-s in mail-mode), but here's +your chance to have something different. The default value is just a +wrapper function which discards the optional argument and calls +mail-send. If you are a VM user, you might like vm-mail-send, though +you really don't need that. Called with funcall, not call-interactively." :group 'feedmail-queue :type 'function ) @@ -1237,7 +1482,7 @@ (defcustom feedmail-queue-runner-cleaner-upper '(lambda (fqm-file &optional arg) (delete-file fqm-file) - (if (and arg feedmail-queue-chatty) (message "FQM: Nuked %s" fqm-file))) + (if arg (feedmail-say-chatter "Nuked %s" fqm-file))) "Function that will be called after a message has been sent. Not called in the case of errors. This function is called with two arguments: the name of the message queue file for the message just sent, @@ -1269,31 +1514,61 @@ The function's three (mandatory) arguments are: (1) the buffer containing the prepped message; (2) a buffer where errors should be directed; and (3) a list containing the addresses individually as -strings. Three popular choices for this are -`feedmail-buffer-to-binmail', `feedmail-buffer-to-smtpmail', and -`feedmail-buffer-to-sendmail'. If you use the sendmail form, you -probably want to set `feedmail-nuke-bcc' and/or `feedmail-nuke-resent-bcc' -to nil. If you use the binmail form, check the value of -`feedmail-binmail-template'." +strings. Popular choices for this are `feedmail-buffer-to-binmail', +`feedmail-buffer-to-smtpmail', `feedmail-buffer-to-sendmail', and +`feedmail-buffer-to-smtp'. If you use the sendmail form, you probably +want to set `feedmail-nuke-bcc' and/or `feedmail-nuke-resent-bcc to nil'. +If you use the binmail form, check the value of `feedmail-binmail-template'." :group 'feedmail-misc :type 'function ) +(defconst feedmail-binmail-linuxish-template + (concat + "(echo From " + (if (boundp 'user-login-name) user-login-name "feedmail") + " ; cat -) | /usr/bin/rmail %s") + "Good candidate for Linux systems and maybe others. +You may need to modify this if your \"rmail\" is in a different place. +For example, I hear that in some Debian systems, it's /usr/sbin/rmail. +See feedmail-binmail-template documentation." + ) -(defcustom feedmail-binmail-template (if mail-interactive "/bin/mail %s" "/bin/rmail %s") +(defcustom feedmail-binmail-template (if mail-interactive "/bin/mail %s" + (if (file-exists-p "/bin/rmail") + "/bin/rmail %s" "/bin/mail %s")) "Command template for the subprocess which will get rid of the mail. It can result in any command understandable by /bin/sh. Might not -work at all in non-Unix environments. The single '%s', if present, +work at all in non-UNIX environments. The single '%s', if present, gets replaced by the space-separated, simplified list of addressees. Used in `feedmail-buffer-to-binmail' to form the shell command which -will receive the contents of the prepped buffer as stdin. If you'd -like your errors to come back as mail instead of immediately in a -buffer, try /bin/rmail instead of /bin/mail (this can be accomplished -by keeping the default nil setting of `mail-interactive'). You might -also like to consult local mail experts for any other interesting -command line possibilities." - :group 'feedmail-misc - :type 'string +will receive the contents of the prepped buffer as stdin. The default +value uses /bin/rmail (if it exists) unless `mail-interactive' has been +set non-nil. + +If you'd like your errors to come back as mail instead of immediately +in a buffer, try /bin/rmail instead of /bin/mail. If /bin/rmail +exists, this can be accomplished by keeping the default nil setting of +`mail-interactive'. You might also like to consult local mail experts +for any other interesting command line possibilities. Some versions +of UNIX have an rmail program which behaves differently than +/bin/rmail and complains if feedmail gives it a message on stdin. If +you don't know about such things and if there is no local expert to +consult, stick with /bin/mail or use one of the other buffer eating +functions. + +The above description applies to \"classic\" UNIX /bin/mail and /bin/rmail. +On most Linux systems and perhaps other places, /bin/mail behaves +completely differently and shouldn't be used at all in this template. +Instead of /bin/rmail, there is a /usr/bin/rmail, and it can be used +with a wrapper. The wrapper is necessary because /usr/bin/rmail on such +systems requires that the first line of the message appearing on standard +input have a UNIX-style From_ postmark. If you have such a system, the +wrapping can be accomplished by setting the value of `feedmail-binmail-template' +to `feedmail-binmail-linuxish-template'. You should then send some test +messages to make sure it works as expected." + :group 'feedmail-misc + :type 'string ) @@ -1304,6 +1579,7 @@ (defun feedmail-buffer-to-binmail (prepped errors-to addr-listoid) "Function which actually calls /bin/mail as a subprocess. Feeds the buffer to it." + (feedmail-say-debug ">in-> feedmail-buffer-to-binmail %s" addr-listoid) (set-buffer prepped) (apply 'call-process-region @@ -1317,14 +1593,18 @@ (defun feedmail-buffer-to-sendmail (prepped errors-to addr-listoid) "Function which actually calls sendmail as a subprocess. Feeds the buffer to it. Probably has some flaws for Resent-* and other -complicated cases." +complicated cases. Takes addresses from message headers and +might disappoint you with BCC: handling. In case of odd results, consult +local gurus." (require 'sendmail) + (feedmail-say-debug ">in-> feedmail-buffer-to-sendmail %s" addr-listoid) (set-buffer prepped) (apply 'call-process-region (append (list (point-min) (point-max) sendmail-program nil errors-to nil "-oi" "-t") ;; provide envelope "from" to sendmail; results will vary - (list "-f" user-mail-address) + (if feedmail-sendmail-f-doesnt-sell-me-out + (list "-f" user-mail-address)) ;; These mean "report errors by mail" and "deliver in background". (if (null mail-interactive) '("-oem" "-odb"))))) @@ -1339,6 +1619,7 @@ ;; I'm not sure smtpmail.el is careful about the following ;; return value, but it also uses it internally, so I will fear ;; no evil. + (feedmail-say-debug ">in-> feedmail-buffer-to-smtpmail %s" addr-listoid) (require 'smtpmail) (if (not (smtpmail-via-smtp addr-listoid prepped)) (progn @@ -1357,6 +1638,27 @@ (insert "\n\n")))) (buffer-list)))))) +;; FLIM's smtp.el pointed out to me by Kenichi Handa +(defun feedmail-buffer-to-smtp (prepped errors-to addr-listoid) + "Function which actually calls smtp-via-smtp to send buffer as e-mail." + (feedmail-say-debug ">in-> feedmail-buffer-to-smtp %s" addr-listoid) + (require 'smtp) + (if (not (smtp-via-smtp user-mail-address addr-listoid prepped)) + (progn + (set-buffer errors-to) + (insert "Send via smtp failed. Probable SMTP protocol error.\n") + (insert "Look for details below or in the *Messages* buffer.\n\n") + (let ((case-fold-search t) + ;; don't be overconfident about the name of the trace buffer + (tracer (concat "trace.*smtp.*" (regexp-quote smtp-server)))) + (mapcar + '(lambda (buffy) + (if (string-match tracer (buffer-name buffy)) + (progn + (insert "SMTP Trace from " (buffer-name buffy) "\n---------------") + (insert-buffer buffy) + (insert "\n\n")))) + (buffer-list)))))) ;; just a place to park a docstring (defconst feedmail-fiddle-plex-blurb nil @@ -1414,34 +1716,78 @@ non-nil, feedmail \"smart filling\" is done on VALUE just before insertion.") +(defun feedmail-vm-mail-mode (&optional arg) + "Make something like a buffer that has been created via `vm-mail'. +The optional argument is ignored and is just for argument compatibility with +`feedmail-queue-runner-mode-setter'. This function is suitable for being +applied to a file after you've just read it from disk: for example, a +feedmail FQM message file from a queue. You could use something like +this: + +\(setq auto-mode-alist \(cons \'\(\"\\\\.fqm$\" . feedmail-vm-mail-mode\) auto-mode-alist\)\) +" + (feedmail-say-debug ">in-> feedmail-vm-mail-mode") + (let ((the-buf (current-buffer))) + (vm-mail) + (delete-region (point-min) (point-max)) + (insert-buffer the-buf) + (setq buffer-file-name (buffer-file-name the-buf)) + (set-buffer-modified-p (buffer-modified-p the-buf)) + ;; For some versions of emacs, saving the message to a queue + ;; triggers running the mode function on the buffer, and that + ;; leads (through a series of events I don't really understand) + ;; to this function being called while the buffer is still + ;; marked modified even though it is in the process of being + ;; saved. I guess the function gets called during the renaming + ;; that takes place en route to the save. + ;; + ;; This clearing of the marker probably wastes a buffer copy + ;; but it's easy to do and more reliable than figuring out what + ;; each variant of emacs does in this strange case. + (with-current-buffer the-buf + (set-buffer-modified-p nil)) + (kill-buffer the-buf) + )) + ;;;###autoload (defun feedmail-send-it () "Send the current mail buffer using the Feedmail package. This is a suitable value for `send-mail-function'. It can be used with various lower-level mechanisms to provide features such as queueing." - + (feedmail-say-debug ">in-> feedmail-send-it") + (save-excursion + (let ((bfn-jiggle nil)) + ;; if buffer-file-name is nil, temporarily use the stashed value + (if (and (not buffer-file-name) feedmail-queue-buffer-file-name) + (setq buffer-file-name feedmail-queue-buffer-file-name + bfn-jiggle t)) ;; avoid matching trouble over slash vs backslash by getting canonical (if feedmail-queue-directory (setq feedmail-queue-directory (expand-file-name feedmail-queue-directory))) (if feedmail-queue-draft-directory (setq feedmail-queue-draft-directory (expand-file-name feedmail-queue-draft-directory))) - (if (not feedmail-enable-queue) (feedmail-send-it-immediately) + (if (not feedmail-enable-queue) (feedmail-send-it-immediately-wrapper) ;; else, queuing is enabled, should we ask about it or just do it? (if feedmail-ask-before-queue (funcall (feedmail-queue-send-edit-prompt)) - (feedmail-dump-message-to-queue feedmail-queue-directory 'after-queue)))) - + (feedmail-dump-message-to-queue feedmail-queue-directory 'after-queue))) + ;; put this back + (if bfn-jiggle (setq feedmail-queue-buffer-file-name buffer-file-name)) + ))) (defun feedmail-message-action-send () ;; hooks can make this take a while so clear the prompt + (feedmail-say-debug ">in-> feedmail-message-action-send") (message "FQM: Immediate send...") - (feedmail-send-it-immediately)) + (feedmail-send-it-immediately-wrapper)) ;; From a VM mailing list discussion and some suggestions from Samuel Mikes (defun feedmail-queue-express-to-queue () "Send message directly to the queue, with a minimum of fuss and bother." (interactive) + (feedmail-say-debug ">in-> feedmail-queue-express-to-queue") + (run-hooks 'feedmail-queue-express-hook) (let ((feedmail-enable-queue t) (feedmail-ask-before-queue nil) (feedmail-queue-reminder-alist nil) @@ -1454,6 +1800,7 @@ (defun feedmail-queue-express-to-draft () "Send message directly to the draft queue, with a minimum of fuss and bother." (interactive) + (feedmail-say-debug ">in-> feedmail-queue-express-to-draft") (let ((feedmail-queue-directory feedmail-queue-draft-directory)) (feedmail-queue-express-to-queue) ) @@ -1461,32 +1808,39 @@ (defun feedmail-message-action-send-strong () + (feedmail-say-debug ">in-> feedmail-message-action-send-strong") (let ((feedmail-confirm-outgoing nil)) (feedmail-message-action-send))) (defun feedmail-message-action-edit () + (feedmail-say-debug ">in-> feedmail-message-action-edit") (error "FQM: Message not queued; returning to edit")) (defun feedmail-message-action-draft () + (feedmail-say-debug ">in-> feedmail-message-action-draft") (feedmail-dump-message-to-queue feedmail-queue-draft-directory 'after-draft)) (defun feedmail-message-action-draft-strong () + (feedmail-say-debug ">in-> feedmail-message-action-draft-strong") (let ((buffer-file-name nil)) (feedmail-message-action-draft))) (defun feedmail-message-action-queue () + (feedmail-say-debug ">in-> feedmail-message-action-queue") (feedmail-dump-message-to-queue feedmail-queue-directory 'after-queue)) (defun feedmail-message-action-queue-strong () + (feedmail-say-debug ">in-> feedmail-message-action-queue-strong") (let ((buffer-file-name nil)) (feedmail-message-action-queue))) (defun feedmail-message-action-toggle-spray () + (feedmail-say-debug ">in-> feedmail-message-action-toggle-spray") (let ((feedmail-enable-spray (not feedmail-enable-spray))) (if feedmail-enable-spray (message "FQM: For this message, spray toggled ON") @@ -1496,20 +1850,79 @@ (feedmail-send-it))) +(defconst feedmail-p-h-b-n "*FQM Help*") + (defun feedmail-message-action-help () - (let ((d-string " ")) + (feedmail-say-debug ">in-> feedmail-message-action-help") + (let ((d-string " ") + (fqm-help (get-buffer feedmail-p-h-b-n))) (if (stringp feedmail-ask-before-queue-default) (setq d-string feedmail-ask-before-queue-default) (setq d-string (char-to-string feedmail-ask-before-queue-default))) - (feedmail-queue-send-edit-prompt-help d-string) + (if (and fqm-help (get-buffer-window fqm-help)) + (feedmail-scroll-buffer 'up fqm-help) + (feedmail-message-action-help-blat d-string)) ;; recursive, but no worries (it goes deeper on user action) (feedmail-send-it))) +(defun feedmail-message-action-help-blat (d-string) + (feedmail-say-debug ">in-> feedmail-message-action-help-blat") + (with-output-to-temp-buffer feedmail-p-h-b-n + (princ "You're dispatching a message and feedmail queuing is enabled. +Typing ? again will normally scroll this help buffer. + +Choices: + q QUEUE for later sending \(via feedmail-run-the-queue\) + Q QUEUE! like \"q\", but always make a new file + i IMMEDIATELY send this \(but not the other queued messages\) + I IMMEDIATELY! like \"i\", but skip following confirmation prompt + d DRAFT queue in the draft directory + D DRAFT! like \"d\", but always make a new file + e EDIT return to the message edit buffer \(don't send or queue\) + * SPRAY toggle spray mode \(individual message transmissions\) + > SCROLL UP scroll message up \(toward end of message\) + < SCROLL DOWN scroll message down \(toward beginning of message\) + ? HELP show or scroll this help buffer + +Synonyms: + s SEND immediately \(same as \"i\"\) + S SEND! immediately \(same as \"I\"\) + r ROUGH draft \(same as \"d\"\) + R ROUGH! draft \(same as \"D\"\) + n NOPE didn't mean it \(same as \"e\"\) + y YUP do the default behavior \(same as \"C-m\"\) + SPC SCROLL UP \(same as \">\"\) + +The user-configurable default is currently \"") + (princ d-string) + (princ "\". For other possibilities, +see the variable feedmail-prompt-before-queue-user-alist. +") + (and (stringp feedmail-prompt-before-queue-help-supplement) + (princ feedmail-prompt-before-queue-help-supplement)) + (with-current-buffer standard-output + (if (fboundp 'help-mode) (help-mode))))) + + +(defun feedmail-message-action-scroll-up () + (feedmail-say-debug ">in-> feedmail-message-action-scroll-up") + (feedmail-scroll-buffer 'up) + ;; recursive, but no worries (it goes deeper on user action) + (feedmail-send-it)) + + +(defun feedmail-message-action-scroll-down () + (feedmail-say-debug ">in-> feedmail-message-action-scroll-down") + (feedmail-scroll-buffer 'down) + ;; recursive, but no worries (it goes deeper on user action) + (feedmail-send-it)) + ;;;###autoload (defun feedmail-run-the-queue-no-prompts (&optional arg) "Like `feedmail-run-the-queue', but suppress confirmation prompts." (interactive "p") + (feedmail-say-debug ">in-> feedmail-run-the-queue-no-prompts") (let ((feedmail-confirm-outgoing nil)) (feedmail-run-the-queue arg))) ;;;###autoload @@ -1518,6 +1931,7 @@ This is generally most useful if run non-interactively, since you can bail out with an appropriate answer to the global confirmation prompt." (interactive "p") + (feedmail-say-debug ">in-> feedmail-run-the-queue-global-prompts") (let ((feedmail-queue-runner-confirm-global t)) (feedmail-run-the-queue arg))) ;; letf fools the byte-compiler. @@ -1530,6 +1944,7 @@ messages skipped, and number of non-message things in the queue (commonly backup file names and the like)." (interactive "p") + (feedmail-say-debug ">in-> feedmail-run-the-queue") ;; avoid matching trouble over slash vs backslash by getting canonical (if feedmail-queue-directory (setq feedmail-queue-directory (expand-file-name feedmail-queue-directory))) @@ -1546,7 +1961,6 @@ (messages-skipped 0) (blobby-buffer) (already-buffer) - (this-mhsep) (do-the-run t) (list-of-possible-fqms)) (if (and (> q-cnt 0) feedmail-queue-runner-confirm-global) @@ -1590,38 +2004,34 @@ (setq buffer-offer-save nil) (buffer-disable-undo blobby-buffer) (insert-file-contents-literally maybe-file) - ;; work around text-vs-binary weirdness and also around rmail-resend's creative - ;; manipulation of mail-header-separator - ;; - ;; if we don't find the normal M-H-S, and the alternative is defined but also - ;; not found, try reading the file a different way - ;; - ;; if M-H-S not found and (a-M-H-S is nil or not found) - (if (and (not (feedmail-find-eoh t)) - (or (not feedmail-queue-alternative-mail-header-separator) - (not - (let ((mail-header-separator feedmail-queue-alternative-mail-header-separator)) - (feedmail-find-eoh t))))) - (letf ((file-name-buffer-file-type-alist nil) - ((default-value 'buffer-file-type) nil)) - (erase-buffer) (insert-file-contents maybe-file))) - ;; if M-H-S not found and (a-M-H-S is non-nil and is found) - ;; temporarily set M-H-S to the value of a-M-H-S - (if (and (not (feedmail-find-eoh t)) - feedmail-queue-alternative-mail-header-separator - (let ((mail-header-separator feedmail-queue-alternative-mail-header-separator)) - (feedmail-find-eoh t))) - (setq this-mhsep feedmail-queue-alternative-mail-header-separator) - (setq this-mhsep mail-header-separator)) + (setq buffer-file-type t) ; binary + (goto-char (point-min)) + ;; if at least two line-endings with CRLF, translate the file + (if (looking-at ".*\r\n.*\r\n") + (while (search-forward "\r\n" nil t) + (replace-match "\n" nil t))) +;; ;; work around text-vs-binary wierdness +;; ;; if we don't find the normal M-H-S, try reading the file a different way +;; (if (not (feedmail-find-eoh t)) +;; (let ((file-name-buffer-file-type-alist nil) (default-buffer-file-type nil)) +;; (erase-buffer) +;; (insert-file-contents maybe-file))) (funcall feedmail-queue-runner-mode-setter arg) - (condition-case nil ; don't give up the loop if user skips some + (condition-case signal-stuff ; don't give up the loop if user skips some (let ((feedmail-enable-queue nil) - (mail-header-separator this-mhsep) (feedmail-queue-runner-is-active maybe-file)) - (funcall feedmail-queue-runner-message-sender arg) + ;; if can't find EOH, this is no message! + (unless (feedmail-find-eoh t) + (feedmail-say-chatter "Skipping %s; no mail-header-separator" maybe-file) + (error "FQM: you should never see this message")) + (feedmail-say-debug "Prepping %s" maybe-file) + ;; the catch is a way out for users to voluntarily skip sending a message + (catch 'skip-me-q (funcall feedmail-queue-runner-message-sender arg)) (set-buffer blobby-buffer) (if (buffer-modified-p) ; still modified, means wasn't sent - (setq messages-skipped (1+ messages-skipped)) + (progn + (setq messages-skipped (1+ messages-skipped)) + (feedmail-say-chatter "%s wasn't sent by %s" maybe-file feedmail-buffer-eating-function)) (setq messages-sent (1+ messages-sent)) (funcall feedmail-queue-runner-cleaner-upper maybe-file arg) (if (and already-buffer (not (file-exists-p maybe-file))) @@ -1629,20 +2039,25 @@ ;; buffer, so update the buffer's notion of that (with-current-buffer already-buffer (setq buffer-file-name nil))))) - (error (setq messages-skipped (1+ messages-skipped)))) + ;; the handler for the condition-case + (error (setq messages-skipped (1+ messages-skipped)) + (ding t) + (message "FQM: Trapped '%s', message left in queue." (car signal-stuff)) + (sit-for 3) + (message "FQM: Trap details: \"%s\"" + (mapconcat 'identity (cdr signal-stuff) "\" \"")) + (sit-for 3))) (kill-buffer blobby-buffer) - (if feedmail-queue-chatty - (progn - (message "FQM: %d to go, %d sent, %d skipped (%d other files ignored)" - (- q-cnt messages-sent messages-skipped) - messages-sent messages-skipped q-oth) - (sit-for feedmail-queue-chatty-sit-for)))))) + (feedmail-say-chatter + "%d to go, %d sent, %d skipped (%d other files ignored)" + (- q-cnt messages-sent messages-skipped) + messages-sent messages-skipped q-oth) + ))) list-of-possible-fqms))) (if feedmail-queue-chatty (progn - (message "FQM: %d sent, %d skipped (%d other files ignored)" - messages-sent messages-skipped q-oth) - (sit-for feedmail-queue-chatty-sit-for) + (feedmail-say-chatter "%d sent, %d skipped (%d other files ignored)" + messages-sent messages-skipped q-oth) (feedmail-queue-reminder 'after-run) (sit-for feedmail-queue-chatty-sit-for))) (list messages-sent messages-skipped q-oth))) @@ -1668,6 +2083,7 @@ by redefining `feedmail-queue-reminder-alist'. If you don't want any reminders, you can set `feedmail-queue-reminder-alist' to nil." (interactive "p") + (feedmail-say-debug ">in-> feedmail-queue-reminder %s" what-event) (let ((key (if (and what-event (symbolp what-event)) what-event 'on-demand)) entry reminder) (setq entry (assoc key feedmail-queue-reminder-alist)) (setq reminder (cdr entry)) @@ -1676,8 +2092,9 @@ (defun feedmail-queue-reminder-brief () - "Brief display of draft and queued message counts in modeline." + "Brief display of draft and queued message counts in minibuffer." (interactive) + (feedmail-say-debug ">in-> feedmail-queue-reminder-brief") (let (q-cnt d-cnt q-lis d-lis) (setq q-lis (feedmail-look-at-queue-directory feedmail-queue-directory)) (setq d-lis (feedmail-look-at-queue-directory feedmail-queue-draft-directory)) @@ -1690,8 +2107,9 @@ (defun feedmail-queue-reminder-medium () - "Verbose display of draft and queued message counts in modeline." + "Verbose display of draft and queued message counts in minibuffer." (interactive) + (feedmail-say-debug ">in-> feedmail-queue-reminder-medium") (let (q-cnt d-cnt q-oth d-oth q-lis d-lis) (setq q-lis (feedmail-look-at-queue-directory feedmail-queue-directory)) (setq d-lis (feedmail-look-at-queue-directory feedmail-queue-draft-directory)) @@ -1708,25 +2126,49 @@ (defun feedmail-queue-send-edit-prompt () - "Ask whether to queue, send immediately, or return to editing a message." + "Ask whether to queue, send immediately, or return to editing a message, etc." + (feedmail-say-debug ">in-> feedmail-queue-send-edit-prompt") + (feedmail-queue-send-edit-prompt-inner + feedmail-ask-before-queue-default + feedmail-ask-before-queue-prompt + feedmail-ask-before-queue-reprompt + 'feedmail-message-action-help + feedmail-prompt-before-queue-standard-alist + feedmail-prompt-before-queue-user-alist + )) + +(defun feedmail-queue-runner-prompt () + "Ask whether to queue, send immediately, or return to editing a message, etc." + (feedmail-say-debug ">in-> feedmail-queue-runner-prompt") + (feedmail-queue-send-edit-prompt-inner + feedmail-ask-before-queue-default + feedmail-ask-before-queue-prompt + feedmail-ask-before-queue-reprompt + 'feedmail-message-action-help + feedmail-prompt-before-queue-standard-alist + feedmail-prompt-before-queue-user-alist + )) +(defun feedmail-queue-send-edit-prompt-inner (default prompt reprompt helper + standard-alist user-alist) + (feedmail-say-debug ">in-> feedmail-queue-send-edit-prompt-inner") ;; Some implementation ideas here came from the userlock.el code - (discard-input) + (or defining-kbd-macro (discard-input)) (save-window-excursion (let ((answer) (d-char) (d-string " ")) - (if (stringp feedmail-ask-before-queue-default) + (if (stringp default) (progn - (setq d-char (string-to-char feedmail-ask-before-queue-default)) - (setq d-string feedmail-ask-before-queue-default)) - (setq d-string (char-to-string feedmail-ask-before-queue-default)) - (setq d-char feedmail-ask-before-queue-default) + (setq d-char (string-to-char default) + d-string default)) + (setq d-string (char-to-string default)) + (setq d-char default) ) (while (null answer) - (message feedmail-ask-before-queue-prompt d-string) + (message prompt d-string) (let ((user-sez (let ((inhibit-quit t) (cursor-in-echo-area t) (echo-keystrokes 0)) (read-char-exclusive)))) (if (= user-sez help-char) - (setq answer '(^ . feedmail-message-action-help)) + (setq answer '(^ . helper)) (if (or (eq user-sez ?\C-m) (eq user-sez ?\C-j) (eq user-sez ?y)) (setq user-sez d-char)) ;; these char-to-int things are because of some @@ -1734,73 +2176,39 @@ ;; byte-compiled stuff between Emacs and XEmacs ;; (well, I'm sure someone could comprehend it, ;; but I say 'uncle') - (setq answer (or (assoc user-sez feedmail-prompt-before-queue-user-alist) - (and (fboundp 'char-to-int) - (assoc (char-to-int user-sez) feedmail-prompt-before-queue-user-alist)) - (assoc user-sez feedmail-prompt-before-queue-standard-alist) - (and (fboundp 'char-to-int) - (assoc (char-to-int user-sez) feedmail-prompt-before-queue-standard-alist)))) + (setq answer (or (assoc user-sez user-alist) + (and (fboundp 'char-to-int) + (assoc (char-to-int user-sez) user-alist)) + (assoc user-sez standard-alist) + (and (fboundp 'char-to-int) + (assoc (char-to-int user-sez) standard-alist)))) (if (or (null answer) (null (cdr answer))) (progn (beep) - (message feedmail-ask-before-queue-reprompt d-string) + (message reprompt d-string) (sit-for 3))) ))) (cdr answer) ))) -(defconst feedmail-p-h-b-n "*FQM Help*") - -(defun feedmail-queue-send-edit-prompt-help (d-string) - (let ((fqm-help (get-buffer feedmail-p-h-b-n))) - (if (and fqm-help (get-buffer-window fqm-help 'visible)) - (feedmail-queue-send-edit-prompt-help-later fqm-help d-string) - (feedmail-queue-send-edit-prompt-help-first d-string)))) - -(defun feedmail-queue-send-edit-prompt-help-later (fqm-help d-string) +(defun feedmail-scroll-buffer (direction &optional buffy) ;; scrolling fun + ;; emacs convention is that scroll-up moves text up, window down + (feedmail-say-debug ">in-> feedmail-scroll-buffer %s" direction) (save-selected-window (let ((signal-error-on-buffer-boundary nil) - (fqm-window (display-buffer fqm-help))) + (fqm-window (display-buffer (if buffy buffy (current-buffer))))) (select-window fqm-window) + (if (eq direction 'up) (if (pos-visible-in-window-p (point-max) fqm-window) - (feedmail-queue-send-edit-prompt-help-first d-string) - ;;(goto-char (point-min)) - (scroll-up nil) - )))) - -(defun feedmail-queue-send-edit-prompt-help-first (d-string) - (with-output-to-temp-buffer feedmail-p-h-b-n - (princ "You're dispatching a message and feedmail queuing is enabled. -Typing ? or C-v will normally scroll this help buffer. - -Choices: - q QUEUE for later sending (via feedmail-run-the-queue) - Q QUEUE! like \"q\", but always make a new file - i IMMEDIATELY send this (but not the other queued messages) - I IMMEDIATELY! like \"i\", but skip following confirmation prompt - d DRAFT queue in the draft directory - D DRAFT! like \"d\", but always make a new file - e EDIT return to the message edit buffer (don't send or queue) - * SPRAY toggle spray mode (individual message transmissions) - -Synonyms: - s SEND immediately (same as \"i\") - S SEND! immediately (same as \"I\") - r ROUGH draft (same as \"d\") - R ROUGH! draft (same as \"D\") - n NOPE didn't mean it (same as \"e\") - y YUP do the default behavior (same as \"C-m\") - -The user-configurable default is currently \"") - (princ d-string) - (princ "\". For other possibilities, -see the variable feedmail-prompt-before-queue-user-alist. -") - (and (stringp feedmail-prompt-before-queue-help-supplement) - (princ feedmail-prompt-before-queue-help-supplement)) - (with-current-buffer standard-output - (if (fboundp 'help-mode) (help-mode))))) + ;; originally just (goto-char (point-min)), but + ;; pos-visible-in-window-p seems oblivious to that + (scroll-down 999999) + (scroll-up)) + (if (pos-visible-in-window-p (point-min) fqm-window) + (scroll-up 999999) + (scroll-down)))))) + (defun feedmail-look-at-queue-directory (queue-directory) "Find out some things about a queue directory. @@ -1808,6 +2216,7 @@ directory, a count of other files in the directory, and a high water mark for prefix sequence numbers. Subdirectories are not included in the counts." + (feedmail-say-debug ">in-> feedmail-look-at-queue-directory %s" queue-directory) (let ((q-cnt 0) (q-oth 0) (high-water 0) (blobbet)) ;; iterate, counting things we find along the way in the directory (if (file-directory-p queue-directory) @@ -1829,10 +2238,11 @@ (defun feedmail-tidy-up-slug (slug) "Utility for mapping out suspect characters in a potential filename." + (feedmail-say-debug ">in-> feedmail-tidy-up-slug %s" slug) ;; even programmers deserve a break sometimes, so cover nil for them (if (null slug) (setq slug "")) ;; replace all non-alphanumerics with hyphen for safety - (while (string-match "[^a-z0-9-]+" slug) (setq slug (replace-match "-" nil nil slug))) + (while (string-match feedmail-queue-slug-suspect-regexp slug) (setq slug (replace-match "-" nil nil slug))) ;; collapse multiple hyphens to one (while (string-match "--+" slug) (setq slug (replace-match "-" nil nil slug))) ;; for tidyness, peel off leading hyphens @@ -1849,6 +2259,7 @@ there is one). If there is no subject, `feedmail-queue-default-file-slug' is consulted. Special characters are mapped to mostly alphanumerics for safety." + (feedmail-say-debug ">in-> feedmail-queue-subject-slug-maker %s" queue-directory) (let ((eoh-marker) (case-fold-search t) (subject "") (s-point)) (setq eoh-marker (feedmail-find-eoh)) (goto-char (point-min)) @@ -1856,7 +2267,7 @@ (if (re-search-forward "^Subject:" eoh-marker t) (progn (setq s-point (point)) (end-of-line) - (setq subject (buffer-substring s-point (point))))) + (setq subject (buffer-substring-no-properties s-point (point))))) (setq subject (feedmail-tidy-up-slug subject)) (if (zerop (length subject)) (setq subject @@ -1876,6 +2287,7 @@ (defun feedmail-create-queue-filename (queue-directory) + (feedmail-say-debug ">in-> feedmail-create-queue-filename %s" queue-directory) (let ((slug "wjc")) (cond (feedmail-queue-slug-maker @@ -1894,6 +2306,7 @@ (defun feedmail-dump-message-to-queue (queue-directory what-event) + (feedmail-say-debug ">in-> feedmail-dump-message-to-queue %s %s" queue-directory what-event) (or (file-accessible-directory-p queue-directory) ;; progn to get nil result no matter what (progn (make-directory queue-directory t) nil) @@ -1907,7 +2320,8 @@ (progn (setq is-fqm (feedmail-fqm-p buffer-file-name)) (setq is-in-this-dir (string-equal - (directory-file-name queue-directory) + (directory-file-name + (expand-file-name queue-directory)) (directory-file-name (expand-file-name (file-name-directory buffer-file-name))))))) ;; if visiting a queued message, just save (if (and is-fqm is-in-this-dir) @@ -1918,7 +2332,14 @@ (write-file filename)) ;; convenient for moving from draft to q, for example (if (and previous-buffer-file-name (or (not is-fqm) (not is-in-this-dir)) - (y-or-n-p (format "FQM: Was previously %s; delete that? " previous-buffer-file-name))) + (let (d b s) + (setq b (file-name-nondirectory previous-buffer-file-name)) + (setq d (file-name-directory previous-buffer-file-name)) + (setq s (substring d (1- (length d)))) + (setq d (substring d 0 (1- (length d)))) + (setq d (file-name-nondirectory d)) + (y-or-n-p (format "FQM: Was previously %s%s%s; delete that? " + d s b)))) (delete-file previous-buffer-file-name)) (if feedmail-nuke-buffer-after-queue (let ((a-s-file-name buffer-auto-save-file-name)) @@ -1927,9 +2348,7 @@ delete-auto-save-files (file-exists-p a-s-file-name) (delete-file a-s-file-name)))) - (if feedmail-queue-chatty - (progn (message "%s" (concat "FQM: Queued in " filename)) - (sit-for feedmail-queue-chatty-sit-for))) + (feedmail-say-chatter "Queued in %s" filename) (if feedmail-queue-chatty (progn (feedmail-queue-reminder what-event) @@ -1938,37 +2357,46 @@ ;; from a similar function in mail-utils.el (defun feedmail-rfc822-time-zone (time) + (feedmail-say-debug ">in-> feedmail-rfc822-time-zone %s" time) (let* ((sec (or (car (current-time-zone time)) 0)) (absmin (/ (abs sec) 60))) (format "%c%02d%02d" (if (< sec 0) ?- ?+) (/ absmin 60) (% absmin 60)))) (defun feedmail-rfc822-date (arg-time) - (let ((time (if arg-time arg-time (current-time)))) + (feedmail-say-debug ">in-> feedmail-rfc822-date %s" arg-time) + (let ((time (if arg-time arg-time (current-time))) + (system-time-locale "C")) (concat (format-time-string "%a, %e %b %Y %T " time) (feedmail-rfc822-time-zone time) ))) +(defun feedmail-send-it-immediately-wrapper () + "Wrapper to catch skip-me-i" + (if (eq 'skip-me-i (catch 'skip-me-i (feedmail-send-it-immediately))) + (error "FQM: Sending...abandoned!"))) + (declare-function expand-mail-aliases "mailalias" (beg end &optional exclude)) (defun feedmail-send-it-immediately () "Handle immediate sending, including during a queue run." - (let* ((feedmail-error-buffer (get-buffer-create " *FQM Outgoing Email Errors*")) - (feedmail-prepped-text-buffer (get-buffer-create " *FQM Outgoing Email Text*")) - (feedmail-raw-text-buffer (current-buffer)) - (feedmail-address-list) - (eoh-marker) - (bcc-holder) - (resent-bcc-holder) - (a-re-rtcb "^Resent-\\(To\\|Cc\\|Bcc\\):") - (a-re-rtc "^Resent-\\(To\\|Cc\\):") - (a-re-rb "^Resent-Bcc:") - (a-re-dtcb "^\\(To\\|Cc\\|Bcc\\):") - (a-re-dtc "^\\(To\\|Cc\\):") - (a-re-db "^Bcc:") - ;; to get a temporary changable copy - (mail-header-separator mail-header-separator) - ) + (feedmail-say-debug ">in-> feedmail-send-it-immediately") + (let ((feedmail-error-buffer (get-buffer-create " *FQM Outgoing Email Errors*")) + (feedmail-prepped-text-buffer (get-buffer-create " *FQM Outgoing Email Text*")) + (feedmail-raw-text-buffer (current-buffer)) + (feedmail-address-list) + (eoh-marker) + (bcc-holder) + (resent-bcc-holder) + (a-re-rtcb "^Resent-\\(To\\|Cc\\|Bcc\\):") + (a-re-rtc "^Resent-\\(To\\|Cc\\):") + (a-re-rb "^Resent-Bcc:") + (a-re-dtcb "^\\(To\\|Cc\\|Bcc\\):") + (a-re-dtc "^\\(To\\|Cc\\):") + (a-re-db "^Bcc:") + ;; to get a temporary changable copy + (mail-header-separator mail-header-separator) + ) (unwind-protect (save-current-buffer (set-buffer feedmail-error-buffer) (erase-buffer) @@ -1984,11 +2412,16 @@ (let ((case-fold-search nil)) ;; Change header-delimiter to be what mailers expect (empty line). ;; leaves match data in place or signals error + (feedmail-say-debug "looking for m-h-s \"%s\"" + mail-header-separator) (setq eoh-marker (feedmail-find-eoh)) - (replace-match "\n") - (setq mail-header-separator "")) + (feedmail-say-debug "found m-h-s %s" eoh-marker) + (setq mail-header-separator "") + (replace-match "")) +;; (replace-match "\\1")) ;; might be empty or "\r" ;; mail-aliases nil = mail-abbrevs.el + (feedmail-say-debug "expanding mail aliases") (if (or feedmail-force-expand-mail-aliases (and (fboundp 'expand-mail-aliases) mail-aliases)) (expand-mail-aliases (point-min) eoh-marker)) @@ -2060,18 +2493,31 @@ (while (re-search-forward "^[A-Za-z0-9-]+:[ \t]*\n" eoh-marker t) (replace-match "")))) + (feedmail-say-debug "last chance hook: %s" feedmail-last-chance-hook) (run-hooks 'feedmail-last-chance-hook) + (save-window-excursion (let ((fcc (feedmail-accume-n-nuke-header eoh-marker "^Fcc:")) (also-file) (confirm (cond ((eq feedmail-confirm-outgoing 'immediate) (not feedmail-queue-runner-is-active)) ((eq feedmail-confirm-outgoing 'queued) feedmail-queue-runner-is-active) - (t feedmail-confirm-outgoing)))) + (t feedmail-confirm-outgoing))) + (fullframe (cond + ((eq feedmail-display-full-frame 'immediate) + (not feedmail-queue-runner-is-active)) + ((eq feedmail-display-full-frame 'queued) feedmail-queue-runner-is-active) + (t feedmail-display-full-frame)))) + (if fullframe + (progn + (switch-to-buffer feedmail-prepped-text-buffer t) + (delete-other-windows))) (if (or (not confirm) (feedmail-one-last-look feedmail-prepped-text-buffer)) (let ((user-mail-address (feedmail-envelope-deducer eoh-marker))) + (feedmail-say-debug "give it to buffer-eater") (feedmail-give-it-to-buffer-eater) + (feedmail-say-debug "gave it to buffer-eater") (if (and (not feedmail-queue-runner-is-active) (setq also-file (buffer-file-name feedmail-raw-text-buffer))) (progn ; if a file but not running the queue, offer to delete it (setq also-file (expand-file-name also-file)) @@ -2105,8 +2551,11 @@ )) (mail-do-fcc eoh-marker) ))) - (error "FQM: Sending...abandoned") ; user bailed out of one-last-look - ))) ; unwind-protect body (save-excursion) + ;; user bailed out of one-last-look + (if feedmail-queue-runner-is-active + (throw 'skip-me-q 'skip-me-q) + (throw 'skip-me-i 'skip-me-i)) + )))) ; unwind-protect body (save-excursion) ;; unwind-protect cleanup forms (kill-buffer feedmail-prepped-text-buffer) @@ -2114,8 +2563,10 @@ (if (zerop (buffer-size)) (kill-buffer feedmail-error-buffer) (progn (display-buffer feedmail-error-buffer) ;; read fast ... the meter is running - (if (and feedmail-queue-runner-is-active feedmail-queue-chatty) - (progn (message "FQM: Sending...failed") (ding t) (sit-for 3))) + (if feedmail-queue-runner-is-active + (progn + (ding t) + (feedmail-say-chatter "Sending...failed"))) (error "FQM: Sending...failed"))) (set-buffer feedmail-raw-text-buffer)) ) ; let @@ -2131,6 +2582,8 @@ NAME, VALUE, ACTION, and FOLDING are the four elements of a fiddle-plex, as described in the documentation for the variable `feedmail-fiddle-plex-blurb'." + (feedmail-say-debug ">in-> feedmail-fiddle-header %s %s %s %s" + name value action folding) (let ((case-fold-search t) (header-colon (concat (regexp-quote name) ":")) header-regexp eoh-marker has-like ag-like val-like that-point) @@ -2191,6 +2644,7 @@ )) (defun feedmail-give-it-to-buffer-eater () + (feedmail-say-debug ">in-> feedmail-give-it-to-buffer-eater") (save-excursion (if feedmail-enable-spray (mapcar @@ -2221,6 +2675,8 @@ (kill-buffer spray-buffer) )) feedmail-address-list) + (feedmail-say-debug "calling buffer-eater %s" + feedmail-buffer-eating-function) (funcall feedmail-buffer-eating-function feedmail-prepped-text-buffer feedmail-error-buffer @@ -2231,6 +2687,7 @@ "If `feedmail-deduce-envelope-from' is false, simply return `user-mail-address'. Else, look for Sender: or From: (or Resent-*) and return that value." + (feedmail-say-debug ">in-> feedmail-envelope-deducer %s" eoh-marker) (if (not feedmail-deduce-envelope-from) user-mail-address (let ((from-list)) @@ -2248,6 +2705,7 @@ (defun feedmail-fiddle-from () "Fiddle From:." + (feedmail-say-debug ">in-> feedmail-fiddle-from") ;; default is to fall off the end of the list and do nothing (cond ;; nil means do nothing @@ -2256,10 +2714,14 @@ ;; user-full-name suggested by kpc@ptolemy.arc.nasa.gov (=Kimball Collins) ;; improvement using user-mail-address suggested by ;; gray@austin.apc.slb.com (Douglas Gray Stephens) + ;; improvement using mail-host-address suggested by "Jason Eisner" + ;; ((this situation really is hopeless, though) ((eq t feedmail-from-line) (let ((feedmail-from-line (let ((at-stuff - (if user-mail-address user-mail-address (concat (user-login-name) "@" (system-name))))) + (if user-mail-address user-mail-address + (concat (user-login-name) "@" + (or mail-host-address (system-name)))))) (cond ((eq mail-from-style nil) at-stuff) ((eq mail-from-style 'parens) (concat at-stuff " (" (user-full-name) ")")) @@ -2288,6 +2750,7 @@ (defun feedmail-fiddle-sender () "Fiddle Sender:." + (feedmail-say-debug ">in-> feedmail-fiddle-sender") ;; default is to fall off the end of the list and do nothing (cond ;; nil means do nothing @@ -2316,6 +2779,11 @@ (defun feedmail-default-date-generator (maybe-file) "Default function for generating Date: header contents." + (feedmail-say-debug ">in-> feedmail-default-date-generator") + (when maybe-file + (feedmail-say-debug (concat "4 cre " (feedmail-rfc822-date (nth 4 (file-attributes maybe-file))))) + (feedmail-say-debug (concat "5 mod " (feedmail-rfc822-date (nth 5 (file-attributes maybe-file))))) + (feedmail-say-debug (concat "6 sta " (feedmail-rfc822-date (nth 6 (file-attributes maybe-file)))))) (let ((date-time)) (if (and (not feedmail-queue-use-send-time-for-date) maybe-file) (setq date-time (nth 5 (file-attributes maybe-file)))) @@ -2325,6 +2793,7 @@ (defun feedmail-fiddle-date (maybe-file) "Fiddle Date:. See documentation of `feedmail-date-generator'." + (feedmail-say-debug ">in-> feedmail-fiddle-date") ;; default is to fall off the end of the list and do nothing (cond ;; nil means do nothing @@ -2357,9 +2826,14 @@ "Default function for generating Message-Id: header contents. Based on a date and a sort of random number for tie breaking. Unless `feedmail-message-id-suffix' is defined, uses `user-mail-address', so be -sure it's set." +sure it's set. If both are nil, creates a quasi-random suffix that is +probably not appropriate for you." + (feedmail-say-debug ">in-> feedmail-default-message-id-generator %s" + maybe-file) (let ((date-time) + (system-time-locale "C") (end-stuff (if feedmail-message-id-suffix feedmail-message-id-suffix user-mail-address))) + (if (not end-stuff) (setq end-stuff (format "%d.example.com" (random)))) (if (string-match "^\\(.*\\)@" end-stuff) (setq end-stuff (concat (if (equal (match-beginning 1) (match-end 1)) "" "-") end-stuff)) @@ -2375,6 +2849,7 @@ (defun feedmail-fiddle-message-id (maybe-file) "Fiddle Message-Id:. See documentation of `feedmail-message-id-generator'." + (feedmail-say-debug ">in-> feedmail-fiddle-message-id %s" maybe-file) ;; default is to fall off the end of the list and do nothing (cond ;; nil means do nothing @@ -2416,8 +2891,11 @@ (defun feedmail-fiddle-x-mailer () "Fiddle X-Mailer:. See documentation of `feedmail-x-mailer-line'." + (feedmail-say-debug ">in-> feedmail-fiddle-x-mailer") ;; default is to fall off the end of the list and do nothing (cond + ;; nil means do nothing + ((eq nil feedmail-x-mailer-line) nil) ;; t is the same a using the function feedmail-default-x-mailer-generator, so let it and recurse ((eq t feedmail-x-mailer-line) (let ((feedmail-x-mailer-line (feedmail-default-x-mailer-generator))) @@ -2444,6 +2922,7 @@ (defun feedmail-fiddle-spray-address (addy-plex) "Fiddle header for single spray address. Uses `feedmail-spray-this-address'." + (feedmail-say-debug ">in-> feedmail-fiddle-spray-address %s" addy-plex) ;; default is to fall off the end of the list and do nothing (cond ;; nil means do nothing @@ -2475,6 +2954,7 @@ (defun feedmail-fiddle-list-of-spray-fiddle-plexes (list-of-fiddle-plexes) "Fiddling based on a list of fiddle-plexes for spraying." + (feedmail-say-debug ">in-> feedmail-fiddle-list-of-spray-fiddle-plexes") ;; default is to fall off the end of the list and do nothing (let ((lofp list-of-fiddle-plexes) fp) (if (listp lofp) @@ -2487,6 +2967,7 @@ (defun feedmail-fiddle-list-of-fiddle-plexes (list-of-fiddle-plexes) "Fiddling based on a list of fiddle-plexes. Values t, nil, and string are pointless." + (feedmail-say-debug ">in-> feedmail-fiddle-list-of-fiddle-plexes") ;; default is to fall off the end of the list and do nothing (let ((lofp list-of-fiddle-plexes) fp) (while lofp @@ -2512,18 +2993,20 @@ There may be multiple such lines, and each may have arbitrarily many continuation lines. Return an accumulation of the deleted headers, including the intervening newlines." + (feedmail-say-debug ">in-> feedmail-accume-n-nuke-header %s %s" + header-end header-regexp) (let ((case-fold-search t) (dropout)) (save-excursion (goto-char (point-min)) ;; iterate over all matching lines (while (re-search-forward header-regexp header-end t) (forward-line 1) - (setq dropout (concat dropout (buffer-substring (match-beginning 0) (point)))) + (setq dropout (concat dropout (buffer-substring-no-properties (match-beginning 0) (point)))) (delete-region (match-beginning 0) (point)) ;; get rid of any continuation lines (while (and (looking-at "^[ \t].*\n") (< (point) header-end)) (forward-line 1) - (setq dropout (concat dropout (buffer-substring (match-beginning 0) (point)))) + (setq dropout (concat dropout (buffer-substring-no-properties (match-beginning 0) (point)))) (replace-match "")))) (identity dropout))) @@ -2533,6 +3016,7 @@ avoids, in particular, splitting within parenthesized comments in addresses. Headers filled include From:, Reply-To:, To:, Cc:, Bcc:, Resent-To:, Resent-Cc:, and Resent-Bcc:." + (feedmail-say-debug ">in-> feedmail-fill-to-cc-function") (let ((case-fold-search t) this-line this-line-end) @@ -2557,6 +3041,7 @@ (defun feedmail-fill-this-one (this-line this-line-end) "In-place smart filling of the region bounded by the two arguments." + (feedmail-say-debug ">in-> feedmail-fill-this-one") (let ((fill-prefix "\t") (fill-column feedmail-fill-to-cc-fill-column)) ;; The general idea is to break only on commas. Collapse @@ -2587,6 +3072,7 @@ Addresses are collected only from headers whose names match the fourth argument. Returns a list of strings. Duplicate addresses will have been weeded out." + (feedmail-say-debug ">in-> feedmail-deduce-address-list %s %s" addr-regexp address-list) (let ((simple-address) (address-blob) (this-line) @@ -2607,7 +3093,7 @@ (setq this-line-end (point-marker)) ;; only keep if we don't have it already (setq address-blob - (mail-strip-quoted-names (buffer-substring this-line this-line-end))) + (mail-strip-quoted-names (buffer-substring-no-properties this-line this-line-end))) (while (string-match "\\([, \t\n\r]*\\)\\([^, \t\n\r]+\\)" address-blob) (setq simple-address (substring address-blob (match-beginning 2) (match-end 2))) (setq address-blob (replace-match "" t t address-blob)) @@ -2620,6 +3106,7 @@ (defun feedmail-one-last-look (feedmail-prepped-text-buffer) "Offer the user one last chance to give it up." + (feedmail-say-debug ">in-> feedmail-one-last-look") (save-excursion (save-window-excursion (switch-to-buffer feedmail-prepped-text-buffer) @@ -2633,26 +3120,43 @@ (defun feedmail-fqm-p (might-be) "Internal; does filename end with FQM suffix?" + (feedmail-say-debug ">in-> feedmail-fqm-p %s" might-be) (string-match (concat (regexp-quote feedmail-queue-fqm-suffix) "$") might-be)) +(defun feedmail-say-debug (format &optional a1 a2 a3 a4 a5 a6 a7 a8 a9) + "Internal; emits debug messages in standard format." + (when feedmail-debug + (funcall 'message (concat "FQM DB: " format) a1 a2 a3 a4 a5 a6 a7 a8 a9) + (and feedmail-debug-sit-for (not (= 0 feedmail-debug-sit-for)) + (sit-for feedmail-debug-sit-for)))) + +(defun feedmail-say-chatter (format &optional a1 a2 a3 a4 a5 a6 a7 a8 a9) + "Internal; emits queue chatter messages in standard format." + (when feedmail-queue-chatty + (funcall 'message (concat "FQM: " format) a1 a2 a3 a4 a5 a6 a7 a8 a9) + (and feedmail-queue-chatty-sit-for (not (= 0 feedmail-queue-chatty-sit-for)) + (sit-for feedmail-queue-chatty-sit-for)))) (defun feedmail-find-eoh (&optional noerror) "Internal; finds the end of message header fields, returns mark just before it" + ;; all this funny business with line endings is to account for CRLF + ;; weirdness that I don't think I'll ever figure out + (feedmail-say-debug ">in-> feedmail-find-eoh %s" noerror) + (let ((mhs mail-header-separator) + (alt-mhs feedmail-queue-alternative-mail-header-separator) + r-mhs r-alt-mhs) + (setq r-mhs (concat "^" (regexp-quote mhs) "$")) + (setq r-alt-mhs (concat "^" (regexp-quote (or alt-mhs "")) "$")) (save-excursion (goto-char (point-min)) - (when (or (re-search-forward (concat "^" - (regexp-quote mail-header-separator) - "\n") - nil noerror) - (and feedmail-queue-alternative-mail-header-separator - (re-search-forward - (concat "^" - (regexp-quote - feedmail-queue-alternative-mail-header-separator) - "\n") - nil noerror))) - (forward-line -1) - (point-marker)))) + (if (or (re-search-forward r-mhs nil t) + (and alt-mhs (re-search-forward r-alt-mhs nil t))) + (progn + (beginning-of-line) + (point-marker)) + (if noerror + nil + (error "FQM: Can't find message-header-separator or alternate")))))) (provide 'feedmail) ------------------------------------------------------------ revno: 104223 committer: Eli Zaretskii branch nick: trunk timestamp: Sat 2011-05-14 17:50:46 +0300 message: Fix minor errors in ELisp manual. doc/lispref/nonascii.texi (Character Properties): Fix inconsistencies with implementation. diff: === modified file 'doc/lispref/ChangeLog' --- doc/lispref/ChangeLog 2011-05-14 08:46:11 +0000 +++ doc/lispref/ChangeLog 2011-05-14 14:50:46 +0000 @@ -1,5 +1,8 @@ 2011-05-14 Eli Zaretskii + * nonascii.texi (Character Properties): Fix inconsistencies with + implementation. + * text.texi (Special Properties): Move @defvar's out of the @table. (Bug#8652) === modified file 'doc/lispref/nonascii.texi' --- doc/lispref/nonascii.texi 2011-03-19 18:49:31 +0000 +++ doc/lispref/nonascii.texi 2011-05-14 14:50:46 +0000 @@ -410,7 +410,7 @@ characters whose @code{Numeric_Type} is @samp{Digit}. The value is an integer number. -@item digit +@item digit-value Corresponds to the Unicode @code{Numeric_Value} property for characters whose @code{Numeric_Type} is @samp{Decimal}. The value is an integer number. Examples of such characters include compatibility @@ -471,11 +471,11 @@ @end group @group (get-char-code-property ?\u2155 'numeric-value) ; one fifth - @result{} 1/5 + @result{} 0.2 @end group @group (get-char-code-property ?\u2163 'numeric-value) ; Roman IV - @result{} \4 + @result{} 4 @end group @end example @end defun ------------------------------------------------------------ revno: 104222 fixes bug(s): http://debbugs.gnu.org/8652 committer: Eli Zaretskii branch nick: trunk timestamp: Sat 2011-05-14 11:46:11 +0300 message: Fix bug #8652 with indentation of variable docs. doc/lispref/text.texi (Special Properties): Move @defvar's out of the @table. diff: === modified file 'doc/lispref/ChangeLog' --- doc/lispref/ChangeLog 2011-05-12 16:30:17 +0000 +++ doc/lispref/ChangeLog 2011-05-14 08:46:11 +0000 @@ -1,3 +1,8 @@ +2011-05-14 Eli Zaretskii + + * text.texi (Special Properties): Move @defvar's out of the + @table. (Bug#8652) + 2011-05-12 Glenn Morris * display.texi (Image Descriptors): Fix typo. (Bug#8495) === modified file 'doc/lispref/text.texi' --- doc/lispref/text.texi 2011-01-25 04:08:28 +0000 +++ doc/lispref/text.texi 2011-05-14 08:46:11 +0000 @@ -3272,15 +3272,28 @@ @code{point-left} functions are called first, followed by all the @code{point-entered} functions. -It is possible with @code{char-after} to examine characters at various +It is possible to use @code{char-after} to examine characters at various buffer positions without moving point to those positions. Only an actual change in the value of point runs these hook functions. +The variable @code{inhibit-point-motion-hooks} can inhibit running the +@code{point-left} and @code{point-entered} hooks, see @ref{Inhibit +point motion hooks}. + +@item composition +@kindex composition @r{(text property)} +This text property is used to display a sequence of characters as a +single glyph composed from components. But the value of the property +itself is completely internal to Emacs and should not be manipulated +directly by, for instance, @code{put-text-property}. + +@end table + @defvar inhibit-point-motion-hooks -When this variable is non-@code{nil}, @code{point-left} and -@code{point-entered} hooks are not run, and the @code{intangible} -property has no effect. Do not set this variable globally; bind it with -@code{let}. +@anchor{Inhibit point motion hooks} When this variable is +non-@code{nil}, @code{point-left} and @code{point-entered} hooks are +not run, and the @code{intangible} property has no effect. Do not set +this variable globally; bind it with @code{let}. @end defvar @defvar show-help-function @@ -3293,15 +3306,6 @@ Manual}) provides an example. @end defvar -@item composition -@kindex composition @r{(text property)} -This text property is used to display a sequence of characters as a -single glyph composed from components. But the value of the property -itself is completely internal to Emacs and should not be manipulated -directly by, for instance, @code{put-text-property}. - -@end table - @node Format Properties @subsection Formatted Text Properties ------------------------------------------------------------ revno: 104221 [merge] committer: Ulf Jasper branch nick: trunk timestamp: Fri 2011-05-13 21:35:36 +0200 message: newsticker: Moved icons to etc/newsticker/images lisp/ChangeLog: 2011-05-13 Ulf Jasper * net/newst-treeview.el (newsticker-treeview-face): Changed default family from helvetica to sans. (newsticker-treeview-tool-bar-map): Moved tool-bar icons to etc/images/newsticker. * net/newst-reader.el (newsticker-feed-face): Changed default family from helvetica to sans. * net/newst-plainview.el (newsticker-new-item-face) (newsticker-old-item-face, newsticker-immortal-item-face) (newsticker-obsolete-item-face, newsticker-date-face) (newsticker-statistics-face): Changed default family from helvetica to sans. (newsticker--plainview-tool-bar-map): Moved tool-bar icons to etc/images/newsticker. * net/newst-backend.el (newsticker--do-run-auto-mark-filter), (newsticker--process-auto-mark-filter-match): : Tell user about auto-marking. etc/ChangeLog: 2011-05-13 Ulf Jasper * images/newsticker: Added. * images/newsticker/browse-url.xpm: Added. * images/newsticker/get-all.xpm: Added. * images/newsticker/mark-immortal.xpm: Added. * images/newsticker/mark-read.xpm: Added. * images/newsticker/narrow.xpm: Added. * images/newsticker/next-feed.xpm: Added. * images/newsticker/next-item.xpm: Added. * images/newsticker/prev-feed.xpm: Added. * images/newsticker/prev-item.xpm: Added. * images/newsticker/update.xpm: Added. diff: === modified file 'etc/ChangeLog' --- etc/ChangeLog 2011-05-12 16:30:17 +0000 +++ etc/ChangeLog 2011-05-13 19:06:36 +0000 @@ -1,3 +1,17 @@ +2011-05-13 Ulf Jasper + + * images/newsticker: Added. + * images/newsticker/browse-url.xpm: Added. + * images/newsticker/get-all.xpm: Added. + * images/newsticker/mark-immortal.xpm: Added. + * images/newsticker/mark-read.xpm: Added. + * images/newsticker/narrow.xpm: Added. + * images/newsticker/next-feed.xpm: Added. + * images/newsticker/next-item.xpm: Added. + * images/newsticker/prev-feed.xpm: Added. + * images/newsticker/prev-item.xpm: Added. + * images/newsticker/update.xpm: Added. + 2011-05-10 Jim Meyering * MH-E-NEWS, PROBLEMS: Fix typo "the the -> the". === added directory 'etc/images/newsticker' === added file 'etc/images/newsticker/browse-url.xpm' --- etc/images/newsticker/browse-url.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/browse-url.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,66 @@ +/* XPM */ +static char * visit_xpm[] = { +"24 24 39 1", +" c None", +". c #000000", +"+ c #FFFFFF", +"@ c #00E63D", +"# c #00E83E", +"$ c #00E73D", +"% c #00E93E", +"& c #00E63C", +"* c #00E53C", +"= c #00E23B", +"- c #00E33B", +"; c #00E83D", +"> c #00E13A", +", c #00DD38", +"' c #00DE38", +") c #00E23A", +"! c #00E43C", +"~ c #00DF39", +"{ c #00DB37", +"] c #00D634", +"^ c #00D734", +"/ c #00E039", +"( c #00DC37", +"_ c #00D835", +": c #00D332", +"< c #00CD2F", +"[ c #00DB36", +"} c #00D433", +"| c #00CF30", +"1 c #00DA36", +"2 c #00D936", +"3 c #00D533", +"4 c #00D131", +"5 c #00CE2F", +"6 c #00CC2F", +"7 c #00CA2D", +"8 c #00C62B", +"9 c #00C52A", +"0 c #00BE27", +" ", +" ", +" . ", +" .+. ", +" .+++. ", +" .++.++. ", +" .++.@.++. ", +" .++.##$.++. ", +" .++.%%%#&.++. ", +" .++.$%%%#*=.++. ", +" .++.-@;##$*>,.++. ", +" .++.')!&@@*=~{].++. ", +" .++.^{~>---)/(_:<.++. ", +" .++.^[,~/~'(_}|.++. ", +" .++.]_1[12^:|.++. ", +" .++.:}33:45.++. ", +" .++.<5567.++. ", +" .++.889.++. ", +" .++.0.++. ", +" .++.++. ", +" .+++. ", +" .+. ", +" . ", +" "}; === added file 'etc/images/newsticker/get-all.xpm' --- etc/images/newsticker/get-all.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/get-all.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,97 @@ +/* XPM */ +static char * get_all_xpm[] = { +"24 24 70 1", +" c None", +". c #000000", +"+ c #F3DA00", +"@ c #F5DF00", +"# c #F7E300", +"$ c #F9E700", +"% c #FAEA00", +"& c #FBEC00", +"* c #FBED00", +"= c #FCEE00", +"- c #FAEB00", +"; c #F9E800", +"> c #F8E500", +", c #F6E000", +"' c #F4DB00", +") c #F1D500", +"! c #EFD000", +"~ c #B7CA00", +"{ c #BFD100", +"] c #C5D700", +"^ c #CBDB00", +"/ c #CFDF00", +"( c #D2E200", +"_ c #D4E400", +": c #D3E300", +"< c #D0E000", +"[ c #CCDD00", +"} c #C7D800", +"| c #C1D300", +"1 c #BACC00", +"2 c #B1C500", +"3 c #A8BC00", +"4 c #20A900", +"5 c #22AF00", +"6 c #24B500", +"7 c #26B900", +"8 c #27BC00", +"9 c #27BE00", +"0 c #28BF00", +"a c #27BD00", +"b c #26BA00", +"c c #25B600", +"d c #23B100", +"e c #21AB00", +"f c #1FA400", +"g c #1C9B00", +"h c #21AA00", +"i c #24B300", +"j c #25B800", +"k c #25B700", +"l c #24B400", +"m c #23B000", +"n c #1FA500", +"o c #1D9E00", +"p c #20A800", +"q c #21AC00", +"r c #23B200", +"s c #22AD00", +"t c #1D9F00", +"u c #20A700", +"v c #1EA100", +"w c #1C9C00", +"x c #1DA000", +"y c #1B9800", +"z c #1A9600", +"A c #1A9700", +"B c #1A9500", +"C c #199200", +"D c #189100", +"E c #178C00", +" ", +" ", +" ", +" ", +" ................... ", +" .+@#$%&*=*&-;>,')!. ", +" ................... ", +" ", +" ................... ", +" .~{]^/(___:<[}|123. ", +" ................... ", +" ", +" ................... ", +" .45678909abcdefg. ", +" .h5icj7jklmeno. ", +" .pq5drrmshft. ", +" .fu4h4pnvw. ", +" .oxvxtwy. ", +" .zAAzB. ", +" .CCD. ", +" .E. ", +" . ", +" ", +" "}; === added file 'etc/images/newsticker/mark-immortal.xpm' --- etc/images/newsticker/mark-immortal.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/mark-immortal.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,120 @@ +/* XPM */ +static char * mark_immortal_xpm[] = { +"24 24 93 2", +" c None", +". c #171717", +"+ c #030303", +"@ c #000000", +"# c #181818", +"$ c #090909", +"% c #FFC960", +"& c #FFCB61", +"* c #FFCB62", +"= c #FFC961", +"- c #FFC75F", +"; c #FFC65E", +"> c #FFCA61", +", c #FFCD63", +"' c #FFCF65", +") c #FFD065", +"! c #FFCE64", +"~ c #FFC35C", +"{ c #FFC45D", +"] c #FFD166", +"^ c #FFD267", +"/ c #FFD368", +"( c #FFD167", +"_ c #FFC05A", +": c #010101", +"< c #040404", +"[ c #FFCC62", +"} c #FFD569", +"| c #FFD56A", +"1 c #FFC860", +"2 c #FFC25B", +"3 c #FFBB56", +"4 c #020202", +"5 c #060606", +"6 c #FFC15B", +"7 c #FFC85F", +"8 c #FFD469", +"9 c #FFD66A", +"0 c #FFBC57", +"a c #1B1B1B", +"b c #070707", +"c c #FFBA55", +"d c #FFB451", +"e c #FFB954", +"f c #FFB350", +"g c #FFB652", +"h c #FFBE58", +"i c #FFCD64", +"j c #FFD066", +"k c #FFC059", +"l c #FFB14E", +"m c #0B0B0B", +"n c #FFBB55", +"o c #FFC15A", +"p c #FFB552", +"q c #FFAD4B", +"r c #080808", +"s c #FFAF4C", +"t c #FFB853", +"u c #FFA948", +"v c #050505", +"w c #FFB04E", +"x c #FFB753", +"y c #FFBC56", +"z c #FFC55D", +"A c #FFC55E", +"B c #FFC45C", +"C c #FFBD57", +"D c #FFB854", +"E c #FFB34F", +"F c #FFAB4A", +"G c #FFA545", +"H c #FFAA49", +"I c #FFB04D", +"J c #FFB551", +"K c #FFBF58", +"L c #FFB24F", +"M c #FFAC4A", +"N c #FFA646", +"O c #FFA344", +"P c #FFA848", +"Q c #FFB14F", +"R c #FFAF4D", +"S c #FFA546", +"T c #FFA243", +"U c #FFA445", +"V c #FFAE4C", +"W c #FFA444", +"X c #FFA142", +"Y c #FF9F41", +"Z c #0A0A0A", +"` c #FF9E40", +" . c #FF9F40", +" ", +" ", +" ", +" . + @ @ + # ", +" $ @ % & * * = - + + ", +" @ ; > , ' ) ' ! * - ~ @ ", +" @ { > ! ] ^ / / ( ' * ; _ : ", +" < _ ; [ ) / } | } / ] , 1 2 3 4 ", +" 5 6 7 , ] 8 9 9 9 } ^ ! = ~ 0 a ", +" b c 6 - , ] 8 9 9 9 } ^ ! % ~ 0 d 5 ", +" : e _ ; * ) / 8 } } / ] , 1 2 3 f 5 ", +" : g h { = i j ^ / ^ ] ! * ; k e l m ", +" : f n o ; > , ' ) ' ! * - 2 0 p q r ", +" : s g 0 6 ; % > * * = - ~ h t l u r ", +" v u w x y k ~ z A z B o C D E F G b ", +" 5 H I J e 0 h K h C c x L M N . ", +" 4 O P q Q d g x g J L R H S T < ", +" @ T U P F q V q M H N W X + ", +" @ Y T O W G G W O X Y @ ", +" 4 Z ` Y Y Y .` 4 4 ", +" 5 : : @ @ Z ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/mark-read.xpm' --- etc/images/newsticker/mark-read.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/mark-read.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * mark_read_xpm[] = { +"24 24 44 1", +" c None", +". c #C20000", +"+ c #BE0000", +"@ c #C70000", +"# c #CE0000", +"$ c #C90000", +"% c #BD0000", +"& c #CB0000", +"* c #D10000", +"= c #D70000", +"- c #D30000", +"; c #CD0000", +"> c #C60000", +", c #D40000", +"' c #DA0000", +") c #DE0000", +"! c #DB0000", +"~ c #D60000", +"{ c #D00000", +"] c #DC0000", +"^ c #E00000", +"/ c #E40000", +"( c #E10000", +"_ c #DD0000", +": c #D80000", +"< c #E50000", +"[ c #E70000", +"} c #E60000", +"| c #E20000", +"1 c #E90000", +"2 c #E80000", +"3 c #E30000", +"4 c #DF0000", +"5 c #D90000", +"6 c #CC0000", +"7 c #C10000", +"8 c #C30000", +"9 c #BF0000", +"0 c #B90000", +"a c #BC0000", +"b c #BB0000", +"c c #B80000", +"d c #B50000", +"e c #B70000", +" ", +" ", +" ", +" . + ", +" +@# $.% ", +" &*= -;> ", +" ,') !~{ ", +" ]^/ (_: ", +" (<[ }|) ", +" <[1 2<| ", +" }222[< ", +" }}}< ", +" 333| ", +" _4^4)] ", +" ~:' 5=- ", +" 6{- *#$ ", +" 7>$ @89 ", +" 0a+ %bc ", +" ddc edd ", +" ddd ddd ", +" d d ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/narrow.xpm' --- etc/images/newsticker/narrow.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/narrow.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,75 @@ +/* XPM */ +static char * narrow_xpm[] = { +"24 24 48 1", +" c None", +". c #000000", +"+ c #969696", +"@ c #9E9E9E", +"# c #A4A4A4", +"$ c #AAAAAA", +"% c #AEAEAE", +"& c #B1B1B1", +"* c #B3B3B3", +"= c #B4B4B4", +"- c #B2B2B2", +"; c #AFAFAF", +"> c #ABABAB", +", c #A6A6A6", +"' c #A0A0A0", +") c #989898", +"! c #909090", +"~ c #73AAD4", +"{ c #7AB2DA", +"] c #7FB8DF", +"^ c #84BDE3", +"/ c #88C2E7", +"( c #8BC5E9", +"_ c #8DC7EB", +": c #8CC6EA", +"< c #89C3E8", +"[ c #86BFE5", +"} c #81BAE1", +"| c #7BB3DC", +"1 c #75ACD6", +"2 c #6DA4CF", +"3 c #979797", +"4 c #A3A3A3", +"5 c #A8A8A8", +"6 c #ADADAD", +"7 c #ACACAC", +"8 c #A9A9A9", +"9 c #A5A5A5", +"0 c #9A9A9A", +"a c #929292", +"b c #8C8C8C", +"c c #808080", +"d c #818181", +"e c #838383", +"f c #848484", +"g c #858585", +"h c #868686", +"i c #828282", +" ", +" ", +" ", +" .................. ", +" .+@#$%&*=*-;>,')!. ", +" .................. ", +" ", +" ", +" .................. ", +" .~{]^/(___:<[}|12. ", +" .................. ", +" ", +" ", +" .................. ", +" .!3@45>666789'0ab. ", +" .................. ", +" ", +" ", +" .................. ", +" .cccdefghhgficccc. ", +" .................. ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/next-feed.xpm' --- etc/images/newsticker/next-feed.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/next-feed.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,84 @@ +/* XPM */ +static char * next_feed_xpm[] = { +"24 24 57 1", +" c None", +". c #000000", +"+ c #6CA2CE", +"@ c #75ADD6", +"# c #71A8D3", +"$ c #79B1DA", +"% c #7EB7DE", +"& c #7DB5DD", +"* c #81BAE1", +"= c #85BEE4", +"- c #78B0D9", +"; c #7FB7DE", +"> c #83BCE3", +", c #87C1E6", +"' c #8AC4E9", +") c #7BB3DB", +"! c #80B8DF", +"~ c #88C2E7", +"{ c #8BC5E9", +"] c #8DC7EB", +"^ c #7CB4DC", +"/ c #7FB8DF", +"( c #84BDE3", +"_ c #7BB3DC", +": c #83BCE2", +"< c #87C0E6", +"[ c #8AC4E8", +"} c #8BC5EA", +"| c #8CC6EA", +"1 c #88C1E6", +"2 c #89C3E8", +"3 c #8AC3E8", +"4 c #7EB6DE", +"5 c #82BBE1", +"6 c #86C0E5", +"7 c #87C0E5", +"8 c #75ACD6", +"9 c #7AB2DA", +"0 c #81B9E0", +"a c #82BBE2", +"b c #71A8D2", +"c c #70A7D1", +"d c #74ACD6", +"e c #699FCC", +"f c #6EA5D0", +"g c #72A9D4", +"h c #669CC9", +"i c #6298C5", +"j c #679DCA", +"k c #6BA1CD", +"l c #6095C3", +"m c #5C91C0", +"n c #5F94C2", +"o c #5B90C0", +"p c #588CBC", +"q c #578CBC", +"r c #5589BA", +" ", +" ", +" . ... ", +" .. .+. ", +" .@. .#. ", +" .$%. .@. ", +" .&*=. .-. ", +" .;>,'. .). ", +" .!=~{]. .^. ", +" ./(~{]]. ._. ", +" .%:<[}||. .). ", +" .&*=12'3~. .-. ", +" .$45=6<7. .@. ", +" .8940a:. .b. ", +" .cd-)&. .+. ", +" .efg8. .h. ", +" .ijk. .l. ", +" .mn. .o. ", +" .p. .q. ", +" .. .r. ", +" . ... ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/next-item.xpm' --- etc/images/newsticker/next-item.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/next-item.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,69 @@ +/* XPM */ +static char * next_xpm[] = { +"24 24 42 1", +" c None", +". c #000000", +"+ c #7EB6DE", +"@ c #82BBE2", +"# c #85BEE4", +"$ c #88C1E7", +"% c #8AC3E8", +"& c #87C1E6", +"* c #8AC4E9", +"= c #8CC6EA", +"- c #8CC6EB", +"; c #88C2E7", +"> c #8BC5E9", +", c #8DC7EB", +"' c #87C0E6", +") c #8AC4E8", +"! c #8BC5EA", +"~ c #8BC4E9", +"{ c #88C1E6", +"] c #89C3E8", +"^ c #86BFE5", +"/ c #83BBE2", +"( c #82BBE1", +"_ c #86C0E5", +": c #87C0E5", +"< c #83BCE2", +"[ c #81B9E0", +"} c #81BAE1", +"| c #78B0D9", +"1 c #7BB3DB", +"2 c #7DB5DD", +"3 c #7DB6DD", +"4 c #72A9D4", +"5 c #75ACD6", +"6 c #76AED7", +"7 c #77AFD8", +"8 c #6BA1CD", +"9 c #6EA4CF", +"0 c #6FA6D1", +"a c #6298C6", +"b c #659BC8", +"c c #5C91C0", +" ", +" ", +" . ", +" .. ", +" .+. ", +" .@#. ", +" .#$%. ", +" .&*=-. ", +" .;>,,,. ", +" .;>,,,=. ", +" .')!==~;. ", +" .#{]*%;^/. ", +" .(#_':#<. ", +" .+[@ c #88C2E7", +", c #85BEE4", +"' c #80B9E0", +") c #80B8DF", +"! c #8CC6EA", +"~ c #89C3E8", +"{ c #86BFE5", +"] c #81BAE1", +"^ c #7CB4DC", +"/ c #7FB8DF", +"( c #8DC7EB", +"_ c #7BB3DC", +": c #7EB7DE", +"< c #8BC4E9", +"[ c #8AC4E9", +"} c #8AC3E8", +"| c #87C0E6", +"1 c #87C0E5", +"2 c #83BCE2", +"3 c #75ACD6", +"4 c #7FB7DF", +"5 c #77AED8", +"6 c #71A8D2", +"7 c #70A7D1", +"8 c #76ADD7", +"9 c #6CA2CE", +"0 c #699FCC", +"a c #73AAD4", +"b c #6BA1CD", +"c c #669CC9", +"d c #6298C5", +"e c #689ECB", +"f c #6499C7", +"g c #6095C3", +"h c #5C91C0", +"i c #5E93C2", +"j c #5B90C0", +"k c #588CBC", +"l c #578CBC", +"m c #5589BA", +" ", +" ", +" ... . ", +" .+. .. ", +" .@. .#. ", +" .$. .%@. ", +" .&. .*=-. ", +" .;. .>,'%. ", +" .). .!~{]^. ", +" ./. .(!~{]_. ", +" .:. .!!<>,'%. ", +" .&. .~[}>{*=-. ", +" .$. .|1,2/%@. ", +" .3. .*]4%56. ", +" .7. .^$8#9. ", +" .0. .a7bc. ", +" .d. .efg. ", +" .h. .ij. ", +" .k. .l. ", +" .m. .. ", +" ... . ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/prev-item.xpm' --- etc/images/newsticker/prev-item.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/prev-item.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,66 @@ +/* XPM */ +static char * previous_xpm[] = { +"24 24 39 1", +" c None", +". c #000000", +"+ c #7BB3DB", +"@ c #83BCE2", +"# c #7FB8DF", +"$ c #89C2E7", +"% c #86BFE5", +"& c #83BBE2", +"* c #8CC6EA", +"= c #8BC4E9", +"- c #88C2E7", +"; c #85BEE4", +"> c #8DC7EB", +", c #89C3E8", +"' c #8AC4E8", +") c #8BC5EA", +"! c #88C1E6", +"~ c #8AC4E9", +"{ c #8AC3E8", +"] c #86C0E5", +"^ c #87C0E6", +"/ c #87C0E5", +"( c #82BBE2", +"_ c #81BAE1", +": c #7FB7DF", +"< c #7DB6DD", +"[ c #7DB5DD", +"} c #7CB4DC", +"| c #79B1DA", +"1 c #76ADD7", +"2 c #77AFD8", +"3 c #73AAD4", +"4 c #70A7D1", +"5 c #6EA5D0", +"6 c #6CA2CE", +"7 c #689ECB", +"8 c #6399C7", +"9 c #6095C4", +"0 c #5C90C0", +" ", +" ", +" . ", +" .. ", +" .+. ", +" .@#. ", +" .$%&. ", +" .*=-;. ", +" .>>*,%. ", +" .>>>*,%. ", +" .')**=-;. ", +" .;!,~{-%&. ", +" .;]^/;@#. ", +" .(@&_:+. ", +" .<[}|1. ", +" .2134. ", +" .567. ", +" .89. ", +" .0. ", +" .. ", +" . ", +" ", +" ", +" "}; === added file 'etc/images/newsticker/update.xpm' --- etc/images/newsticker/update.xpm 1970-01-01 00:00:00 +0000 +++ etc/images/newsticker/update.xpm 2011-05-13 19:06:36 +0000 @@ -0,0 +1,64 @@ +/* XPM */ +static char * update_xpm[] = { +"24 24 37 1", +" c None", +". c #076D00", +"+ c #0A8600", +"@ c #0A8800", +"# c #098400", +"$ c #087200", +"% c #087900", +"& c #098500", +"* c #098100", +"= c #087600", +"- c #097E00", +"; c #097F00", +"> c #0A8700", +", c #0A8C00", +"' c #097C00", +") c #098300", +"! c #0A8900", +"~ c #0A8E00", +"{ c #0B9200", +"] c #087700", +"^ c #076E00", +"/ c #076C00", +"( c #076B00", +"_ c #076A00", +": c #076900", +"< c #076800", +"[ c #066700", +"} c #066500", +"| c #066400", +"1 c #066300", +"2 c #066600", +"3 c #066200", +"4 c #076700", +"5 c #065E00", +"6 c #066100", +"7 c #065F00", +"8 c #066000", +" ", +" ", +" ", +" . +@@@+# ", +" $% &@ +* ", +" =-# ; ", +" %*>, ' ", +" ')!~{ = ", +" ]$ ", +" ^ ^ ", +" . . ", +" / ( ", +" _ : ", +" < [ ", +" } | ", +" [[ ", +" 1 $.:23 ", +" 3 4}35 ", +" 6 655 ", +" 76 85 55 ", +" 5555555 5 ", +" ", +" ", +" "}; === modified file 'lisp/ChangeLog' --- lisp/ChangeLog 2011-05-13 19:27:52 +0000 +++ lisp/ChangeLog 2011-05-13 19:35:36 +0000 @@ -1,3 +1,25 @@ +2011-05-13 Ulf Jasper + + * net/newst-treeview.el (newsticker-treeview-face): Changed default + family from helvetica to sans. + (newsticker-treeview-tool-bar-map): Moved tool-bar icons to + etc/images/newsticker. + + * net/newst-reader.el (newsticker-feed-face): Changed default + family from helvetica to sans. + + * net/newst-plainview.el (newsticker-new-item-face) + (newsticker-old-item-face, newsticker-immortal-item-face) + (newsticker-obsolete-item-face, newsticker-date-face) + (newsticker-statistics-face): Changed default family from + helvetica to sans. + (newsticker--plainview-tool-bar-map): Moved tool-bar icons to + etc/images/newsticker. + + * net/newst-backend.el (newsticker--do-run-auto-mark-filter), + (newsticker--process-auto-mark-filter-match): : Tell user about + auto-marking. + 2011-05-13 Didier Verna Common Lisp indentation improvements on defmethod and lambda-lists. === modified file 'lisp/net/newst-backend.el' --- lisp/net/newst-backend.el 2011-01-26 08:36:39 +0000 +++ lisp/net/newst-backend.el 2011-05-13 19:06:36 +0000 @@ -6,7 +6,7 @@ ;; Filename: newst-backend.el ;; URL: http://www.nongnu.org/newsticker ;; Keywords: News, RSS, Atom -;; Time-stamp: "6. Dezember 2009, 19:15:32 (ulf)" +;; Time-stamp: "13. Mai 2011, 20:47:05 (ulf)" ;; Package: newsticker ;; ====================================================================== @@ -2264,23 +2264,30 @@ "Actually compare ITEM against the pattern-LIST. LIST must be an element of `newsticker-auto-mark-filter-list'." (mapc (lambda (pattern) - (let ((age (nth 0 pattern)) - (place (nth 1 pattern)) + (let ((place (nth 1 pattern)) (regexp (nth 2 pattern)) (title (newsticker--title item)) (desc (newsticker--desc item))) (when (or (eq place 'title) (eq place 'all)) (when (and title (string-match regexp title)) - (newsticker--debug-msg "Auto-marking as %s: `%s'" - age (newsticker--title item)) - (setcar (nthcdr 4 item) age))) + (newsticker--process-auto-mark-filter-match item pattern))) (when (or (eq place 'description) (eq place 'all)) (when (and desc (string-match regexp desc)) - (newsticker--debug-msg "Auto-marking as %s: `%s'" - age (newsticker--title item)) - (setcar (nthcdr 4 item) age))))) + (newsticker--process-auto-mark-filter-match item pattern))))) list)) +(defun newsticker--process-auto-mark-filter-match (item pattern) + "Process ITEM that matches an auto-mark-filter PATTERN." + (let ((age (nth 0 pattern)) + (place (nth 1 pattern)) + (regexp (nth 2 pattern))) + (newsticker--debug-msg "Auto-mark-filter %s matches `%s'" + pattern (newsticker--title item)) + (setcar (nthcdr 4 item) age) + (nconc (newsticker--extra item) + (list (list 'newsticker-auto-mark nil + (format "age=%s, title/desc=%s, regexp=%s" + age place regexp)))))) ;; ====================================================================== ;;; Hook samples === modified file 'lisp/net/newst-plainview.el' --- lisp/net/newst-plainview.el 2011-02-10 16:56:00 +0000 +++ lisp/net/newst-plainview.el 2011-05-13 19:06:36 +0000 @@ -5,7 +5,7 @@ ;; Author: Ulf Jasper ;; Filename: newst-plainview.el ;; URL: http://www.nongnu.org/newsticker -;; Time-stamp: "6. Dezember 2009, 19:17:02 (ulf)" +;; Time-stamp: "13. Mai 2011, 19:28:34 (ulf)" ;; Package: newsticker ;; ====================================================================== @@ -157,49 +157,49 @@ (defface newsticker-new-item-face '((((class color) (background dark)) - (:family "helvetica" :bold t)) + (:family "sans" :bold t)) (((class color) (background light)) - (:family "helvetica" :bold t))) + (:family "sans" :bold t))) "Face for new news items." :group 'newsticker-faces) (defface newsticker-old-item-face '((((class color) (background dark)) - (:family "helvetica" :bold t :foreground "orange3")) + (:family "sans" :bold t :foreground "orange3")) (((class color) (background light)) - (:family "helvetica" :bold t :foreground "red4"))) + (:family "sans" :bold t :foreground "red4"))) "Face for old news items." :group 'newsticker-faces) (defface newsticker-immortal-item-face '((((class color) (background dark)) - (:family "helvetica" :bold t :italic t :foreground "orange")) + (:family "sans" :bold t :italic t :foreground "orange")) (((class color) (background light)) - (:family "helvetica" :bold t :italic t :foreground "blue"))) + (:family "sans" :bold t :italic t :foreground "blue"))) "Face for immortal news items." :group 'newsticker-faces) (defface newsticker-obsolete-item-face '((((class color) (background dark)) - (:family "helvetica" :bold t :strike-through t)) + (:family "sans" :bold t :strike-through t)) (((class color) (background light)) - (:family "helvetica" :bold t :strike-through t))) + (:family "sans" :bold t :strike-through t))) "Face for old news items." :group 'newsticker-faces) (defface newsticker-date-face '((((class color) (background dark)) - (:family "helvetica" :italic t :height 0.8)) + (:family "sans" :italic t :height 0.8)) (((class color) (background light)) - (:family "helvetica" :italic t :height 0.8))) + (:family "sans" :italic t :height 0.8))) "Face for newsticker dates." :group 'newsticker-faces) (defface newsticker-statistics-face '((((class color) (background dark)) - (:family "helvetica" :italic t :height 0.8)) + (:family "sans" :italic t :height 0.8)) (((class color) (background light)) - (:family "helvetica" :italic t :height 0.8))) + (:family "sans" :italic t :height 0.8))) "Face for newsticker dates." :group 'newsticker-faces) @@ -300,70 +300,56 @@ nil (if (boundp 'tool-bar-map) (let ((tool-bar-map (make-sparse-keymap))) + (tool-bar-add-item "newsticker/prev-feed" + 'newsticker-previous-feed + 'newsticker-previous-feed + :help "Go to previous feed" + :enable '(newsticker-previous-feed-available-p)) + (tool-bar-add-item "newsticker/prev-item" + 'newsticker-previous-item + 'newsticker-previous-item + :help "Go to previous item" + :enable '(newsticker-previous-item-available-p)) + (tool-bar-add-item "newsticker/next-item" + 'newsticker-next-item + 'newsticker-next-item + :help "Go to next item" + :enable '(newsticker-next-item-available-p)) + (tool-bar-add-item "newsticker/next-feed" + 'newsticker-next-feed + 'newsticker-next-feed + :help "Go to next feed" + :enable '(newsticker-next-feed-available-p)) + (tool-bar-add-item "newsticker/narrow" + 'newsticker-toggle-auto-narrow-to-feed + 'newsticker-toggle-auto-narrow-to-feed + :help "Toggle visibility of other feeds") + (tool-bar-add-item "newsticker/mark-immortal" + 'newsticker-mark-item-at-point-as-immortal + 'newsticker-mark-item-at-point-as-immortal + :help "Mark current item as immortal" + :enable '(newsticker-item-not-immortal-p)) + (tool-bar-add-item "newsticker/mark-read" + 'newsticker-mark-item-at-point-as-read + 'newsticker-mark-item-at-point-as-read + :help "Mark current item as read" + :enable '(newsticker-item-not-old-p)) + (tool-bar-add-item "newsticker/get-all-news" + 'newsticker-get-all-news + 'newsticker-get-all-news + :help "Get news for all feeds") + (tool-bar-add-item "newsticker/update" + 'newsticker-buffer-force-update + 'newsticker-buffer-force-update + :help "Update newsticker buffer" + :enable '(not newsticker--buffer-uptodate-p)) + (tool-bar-add-item "newsticker/browse-url" + 'newsticker-browse-url + 'newsticker-browse-url + :help "Browse URL for item at point") + ;; standard icons / actions (define-key tool-bar-map [newsticker-sep-1] (list 'menu-item "--double-line")) - (define-key tool-bar-map [newsticker-browse-url] - (list 'menu-item "newsticker-browse-url" 'newsticker-browse-url - :visible t - :help "Browse URL for item at point" - :image newsticker--browse-image)) - (define-key tool-bar-map [newsticker-buffer-force-update] - (list 'menu-item "newsticker-buffer-force-update" - 'newsticker-buffer-force-update - :visible t - :help "Update newsticker buffer" - :image newsticker--update-image - :enable '(not newsticker--buffer-uptodate-p))) - (define-key tool-bar-map [newsticker-get-all-news] - (list 'menu-item "newsticker-get-all-news" 'newsticker-get-all-news - :visible t - :help "Get news for all feeds" - :image newsticker--get-all-image)) - (define-key tool-bar-map [newsticker-mark-item-at-point-as-read] - (list 'menu-item "newsticker-mark-item-at-point-as-read" - 'newsticker-mark-item-at-point-as-read - :visible t - :image newsticker--mark-read-image - :help "Mark current item as read" - :enable '(newsticker-item-not-old-p))) - (define-key tool-bar-map [newsticker-mark-item-at-point-as-immortal] - (list 'menu-item "newsticker-mark-item-at-point-as-immortal" - 'newsticker-mark-item-at-point-as-immortal - :visible t - :image newsticker--mark-immortal-image - :help "Mark current item as immortal" - :enable '(newsticker-item-not-immortal-p))) - (define-key tool-bar-map [newsticker-toggle-auto-narrow-to-feed] - (list 'menu-item "newsticker-toggle-auto-narrow-to-feed" - 'newsticker-toggle-auto-narrow-to-feed - :visible t - :help "Toggle visibility of other feeds" - :image newsticker--narrow-image)) - (define-key tool-bar-map [newsticker-next-feed] - (list 'menu-item "newsticker-next-feed" 'newsticker-next-feed - :visible t - :help "Go to next feed" - :image newsticker--next-feed-image - :enable '(newsticker-next-feed-available-p))) - (define-key tool-bar-map [newsticker-next-item] - (list 'menu-item "newsticker-next-item" 'newsticker-next-item - :visible t - :help "Go to next item" - :image newsticker--next-item-image - :enable '(newsticker-next-item-available-p))) - (define-key tool-bar-map [newsticker-previous-item] - (list 'menu-item "newsticker-previous-item" 'newsticker-previous-item - :visible t - :help "Go to previous item" - :image newsticker--previous-item-image - :enable '(newsticker-previous-item-available-p))) - (define-key tool-bar-map [newsticker-previous-feed] - (list 'menu-item "newsticker-previous-feed" 'newsticker-previous-feed - :visible t - :help "Go to previous feed" - :image newsticker--previous-feed-image - :enable '(newsticker-previous-feed-available-p))) - ;; standard icons / actions (tool-bar-add-item "close" 'newsticker-close-buffer 'newsticker-close-buffer === modified file 'lisp/net/newst-reader.el' --- lisp/net/newst-reader.el 2011-01-26 08:36:39 +0000 +++ lisp/net/newst-reader.el 2011-05-13 19:06:36 +0000 @@ -5,7 +5,7 @@ ;; Author: Ulf Jasper ;; Filename: newst-reader.el ;; URL: http://www.nongnu.org/newsticker -;; Time-stamp: "6. Dezember 2009, 19:16:38 (ulf)" +;; Time-stamp: "13. Mai 2011, 20:55:24 (ulf)" ;; Package: newsticker ;; ====================================================================== @@ -147,9 +147,9 @@ (defface newsticker-feed-face '((((class color) (background dark)) - (:family "helvetica" :bold t :height 1.2 :foreground "misty rose")) + (:family "sans" :bold t :height 1.2 :foreground "white")) (((class color) (background light)) - (:family "helvetica" :bold t :height 1.2 :foreground "black"))) + (:family "sans" :bold t :height 1.2 :foreground "black"))) "Face for news feeds." :group 'newsticker-faces) @@ -291,866 +291,6 @@ ;; ====================================================================== ;;; Toolbar ;; ====================================================================== -(defconst newsticker--next-item-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * next_xpm[] = { -\"24 24 42 1\", -\" c None\", -\". c #000000\", -\"+ c #7EB6DE\", -\"@ c #82BBE2\", -\"# c #85BEE4\", -\"$ c #88C1E7\", -\"% c #8AC3E8\", -\"& c #87C1E6\", -\"* c #8AC4E9\", -\"= c #8CC6EA\", -\"- c #8CC6EB\", -\"; c #88C2E7\", -\"> c #8BC5E9\", -\", c #8DC7EB\", -\"' c #87C0E6\", -\") c #8AC4E8\", -\"! c #8BC5EA\", -\"~ c #8BC4E9\", -\"{ c #88C1E6\", -\"] c #89C3E8\", -\"^ c #86BFE5\", -\"/ c #83BBE2\", -\"( c #82BBE1\", -\"_ c #86C0E5\", -\": c #87C0E5\", -\"< c #83BCE2\", -\"[ c #81B9E0\", -\"} c #81BAE1\", -\"| c #78B0D9\", -\"1 c #7BB3DB\", -\"2 c #7DB5DD\", -\"3 c #7DB6DD\", -\"4 c #72A9D4\", -\"5 c #75ACD6\", -\"6 c #76AED7\", -\"7 c #77AFD8\", -\"8 c #6BA1CD\", -\"9 c #6EA4CF\", -\"0 c #6FA6D1\", -\"a c #6298C6\", -\"b c #659BC8\", -\"c c #5C91C0\", -\" \", -\" \", -\" . \", -\" .. \", -\" .+. \", -\" .@#. \", -\" .#$%. \", -\" .&*=-. \", -\" .;>,,,. \", -\" .;>,,,=. \", -\" .')!==~;. \", -\" .#{]*%;^/. \", -\" .(#_':#<. \", -\" .+[@ c #8DC7EB\", -\", c #89C3E8\", -\"' c #8AC4E8\", -\") c #8BC5EA\", -\"! c #88C1E6\", -\"~ c #8AC4E9\", -\"{ c #8AC3E8\", -\"] c #86C0E5\", -\"^ c #87C0E6\", -\"/ c #87C0E5\", -\"( c #82BBE2\", -\"_ c #81BAE1\", -\": c #7FB7DF\", -\"< c #7DB6DD\", -\"[ c #7DB5DD\", -\"} c #7CB4DC\", -\"| c #79B1DA\", -\"1 c #76ADD7\", -\"2 c #77AFD8\", -\"3 c #73AAD4\", -\"4 c #70A7D1\", -\"5 c #6EA5D0\", -\"6 c #6CA2CE\", -\"7 c #689ECB\", -\"8 c #6399C7\", -\"9 c #6095C4\", -\"0 c #5C90C0\", -\" \", -\" \", -\" . \", -\" .. \", -\" .+. \", -\" .@#. \", -\" .$%&. \", -\" .*=-;. \", -\" .>>*,%. \", -\" .>>>*,%. \", -\" .')**=-;. \", -\" .;!,~{-%&. \", -\" .;]^/;@#. \", -\" .(@&_:+. \", -\" .<[}|1. \", -\" .2134. \", -\" .567. \", -\" .89. \", -\" .0. \", -\" .. \", -\" . \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the previous item button.") - -(defconst newsticker--previous-feed-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * prev_feed_xpm[] = { -\"24 24 52 1\", -\" c None\", -\". c #000000\", -\"+ c #70A7D2\", -\"@ c #75ADD6\", -\"# c #71A8D3\", -\"$ c #79B1DA\", -\"% c #7BB3DB\", -\"& c #7DB5DD\", -\"* c #83BBE2\", -\"= c #7EB6DE\", -\"- c #78B0D9\", -\"; c #7FB7DE\", -\"> c #88C2E7\", -\", c #85BEE4\", -\"' c #80B9E0\", -\") c #80B8DF\", -\"! c #8CC6EA\", -\"~ c #89C3E8\", -\"{ c #86BFE5\", -\"] c #81BAE1\", -\"^ c #7CB4DC\", -\"/ c #7FB8DF\", -\"( c #8DC7EB\", -\"_ c #7BB3DC\", -\": c #7EB7DE\", -\"< c #8BC4E9\", -\"[ c #8AC4E9\", -\"} c #8AC3E8\", -\"| c #87C0E6\", -\"1 c #87C0E5\", -\"2 c #83BCE2\", -\"3 c #75ACD6\", -\"4 c #7FB7DF\", -\"5 c #77AED8\", -\"6 c #71A8D2\", -\"7 c #70A7D1\", -\"8 c #76ADD7\", -\"9 c #6CA2CE\", -\"0 c #699FCC\", -\"a c #73AAD4\", -\"b c #6BA1CD\", -\"c c #669CC9\", -\"d c #6298C5\", -\"e c #689ECB\", -\"f c #6499C7\", -\"g c #6095C3\", -\"h c #5C91C0\", -\"i c #5E93C2\", -\"j c #5B90C0\", -\"k c #588CBC\", -\"l c #578CBC\", -\"m c #5589BA\", -\" \", -\" \", -\" ... . \", -\" .+. .. \", -\" .@. .#. \", -\" .$. .%@. \", -\" .&. .*=-. \", -\" .;. .>,'%. \", -\" .). .!~{]^. \", -\" ./. .(!~{]_. \", -\" .:. .!!<>,'%. \", -\" .&. .~[}>{*=-. \", -\" .$. .|1,2/%@. \", -\" .3. .*]4%56. \", -\" .7. .^$8#9. \", -\" .0. .a7bc. \", -\" .d. .efg. \", -\" .h. .ij. \", -\" .k. .l. \", -\" .m. .. \", -\" ... . \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the previous feed button.") - -(defconst newsticker--next-feed-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * next_feed_xpm[] = { -\"24 24 57 1\", -\" c None\", -\". c #000000\", -\"+ c #6CA2CE\", -\"@ c #75ADD6\", -\"# c #71A8D3\", -\"$ c #79B1DA\", -\"% c #7EB7DE\", -\"& c #7DB5DD\", -\"* c #81BAE1\", -\"= c #85BEE4\", -\"- c #78B0D9\", -\"; c #7FB7DE\", -\"> c #83BCE3\", -\", c #87C1E6\", -\"' c #8AC4E9\", -\") c #7BB3DB\", -\"! c #80B8DF\", -\"~ c #88C2E7\", -\"{ c #8BC5E9\", -\"] c #8DC7EB\", -\"^ c #7CB4DC\", -\"/ c #7FB8DF\", -\"( c #84BDE3\", -\"_ c #7BB3DC\", -\": c #83BCE2\", -\"< c #87C0E6\", -\"[ c #8AC4E8\", -\"} c #8BC5EA\", -\"| c #8CC6EA\", -\"1 c #88C1E6\", -\"2 c #89C3E8\", -\"3 c #8AC3E8\", -\"4 c #7EB6DE\", -\"5 c #82BBE1\", -\"6 c #86C0E5\", -\"7 c #87C0E5\", -\"8 c #75ACD6\", -\"9 c #7AB2DA\", -\"0 c #81B9E0\", -\"a c #82BBE2\", -\"b c #71A8D2\", -\"c c #70A7D1\", -\"d c #74ACD6\", -\"e c #699FCC\", -\"f c #6EA5D0\", -\"g c #72A9D4\", -\"h c #669CC9\", -\"i c #6298C5\", -\"j c #679DCA\", -\"k c #6BA1CD\", -\"l c #6095C3\", -\"m c #5C91C0\", -\"n c #5F94C2\", -\"o c #5B90C0\", -\"p c #588CBC\", -\"q c #578CBC\", -\"r c #5589BA\", -\" \", -\" \", -\" . ... \", -\" .. .+. \", -\" .@. .#. \", -\" .$%. .@. \", -\" .&*=. .-. \", -\" .;>,'. .). \", -\" .!=~{]. .^. \", -\" ./(~{]]. ._. \", -\" .%:<[}||. .). \", -\" .&*=12'3~. .-. \", -\" .$45=6<7. .@. \", -\" .8940a:. .b. \", -\" .cd-)&. .+. \", -\" .efg8. .h. \", -\" .ijk. .l. \", -\" .mn. .o. \", -\" .p. .q. \", -\" .. .r. \", -\" . ... \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the next feed button.") - -(defconst newsticker--mark-read-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * mark_read_xpm[] = { -\"24 24 44 1\", -\" c None\", -\". c #C20000\", -\"+ c #BE0000\", -\"@ c #C70000\", -\"# c #CE0000\", -\"$ c #C90000\", -\"% c #BD0000\", -\"& c #CB0000\", -\"* c #D10000\", -\"= c #D70000\", -\"- c #D30000\", -\"; c #CD0000\", -\"> c #C60000\", -\", c #D40000\", -\"' c #DA0000\", -\") c #DE0000\", -\"! c #DB0000\", -\"~ c #D60000\", -\"{ c #D00000\", -\"] c #DC0000\", -\"^ c #E00000\", -\"/ c #E40000\", -\"( c #E10000\", -\"_ c #DD0000\", -\": c #D80000\", -\"< c #E50000\", -\"[ c #E70000\", -\"} c #E60000\", -\"| c #E20000\", -\"1 c #E90000\", -\"2 c #E80000\", -\"3 c #E30000\", -\"4 c #DF0000\", -\"5 c #D90000\", -\"6 c #CC0000\", -\"7 c #C10000\", -\"8 c #C30000\", -\"9 c #BF0000\", -\"0 c #B90000\", -\"a c #BC0000\", -\"b c #BB0000\", -\"c c #B80000\", -\"d c #B50000\", -\"e c #B70000\", -\" \", -\" \", -\" \", -\" . + \", -\" +@# $.% \", -\" &*= -;> \", -\" ,') !~{ \", -\" ]^/ (_: \", -\" (<[ }|) \", -\" <[1 2<| \", -\" }222[< \", -\" }}}< \", -\" 333| \", -\" _4^4)] \", -\" ~:' 5=- \", -\" 6{- *#$ \", -\" 7>$ @89 \", -\" 0a+ %bc \", -\" ddc edd \", -\" ddd ddd \", -\" d d \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the mark read button.") - -(defconst newsticker--mark-immortal-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * mark_immortal_xpm[] = { -\"24 24 93 2\", -\" c None\", -\". c #171717\", -\"+ c #030303\", -\"@ c #000000\", -\"# c #181818\", -\"$ c #090909\", -\"% c #FFC960\", -\"& c #FFCB61\", -\"* c #FFCB62\", -\"= c #FFC961\", -\"- c #FFC75F\", -\"; c #FFC65E\", -\"> c #FFCA61\", -\", c #FFCD63\", -\"' c #FFCF65\", -\") c #FFD065\", -\"! c #FFCE64\", -\"~ c #FFC35C\", -\"{ c #FFC45D\", -\"] c #FFD166\", -\"^ c #FFD267\", -\"/ c #FFD368\", -\"( c #FFD167\", -\"_ c #FFC05A\", -\": c #010101\", -\"< c #040404\", -\"[ c #FFCC62\", -\"} c #FFD569\", -\"| c #FFD56A\", -\"1 c #FFC860\", -\"2 c #FFC25B\", -\"3 c #FFBB56\", -\"4 c #020202\", -\"5 c #060606\", -\"6 c #FFC15B\", -\"7 c #FFC85F\", -\"8 c #FFD469\", -\"9 c #FFD66A\", -\"0 c #FFBC57\", -\"a c #1B1B1B\", -\"b c #070707\", -\"c c #FFBA55\", -\"d c #FFB451\", -\"e c #FFB954\", -\"f c #FFB350\", -\"g c #FFB652\", -\"h c #FFBE58\", -\"i c #FFCD64\", -\"j c #FFD066\", -\"k c #FFC059\", -\"l c #FFB14E\", -\"m c #0B0B0B\", -\"n c #FFBB55\", -\"o c #FFC15A\", -\"p c #FFB552\", -\"q c #FFAD4B\", -\"r c #080808\", -\"s c #FFAF4C\", -\"t c #FFB853\", -\"u c #FFA948\", -\"v c #050505\", -\"w c #FFB04E\", -\"x c #FFB753\", -\"y c #FFBC56\", -\"z c #FFC55D\", -\"A c #FFC55E\", -\"B c #FFC45C\", -\"C c #FFBD57\", -\"D c #FFB854\", -\"E c #FFB34F\", -\"F c #FFAB4A\", -\"G c #FFA545\", -\"H c #FFAA49\", -\"I c #FFB04D\", -\"J c #FFB551\", -\"K c #FFBF58\", -\"L c #FFB24F\", -\"M c #FFAC4A\", -\"N c #FFA646\", -\"O c #FFA344\", -\"P c #FFA848\", -\"Q c #FFB14F\", -\"R c #FFAF4D\", -\"S c #FFA546\", -\"T c #FFA243\", -\"U c #FFA445\", -\"V c #FFAE4C\", -\"W c #FFA444\", -\"X c #FFA142\", -\"Y c #FF9F41\", -\"Z c #0A0A0A\", -\"` c #FF9E40\", -\" . c #FF9F40\", -\" \", -\" \", -\" \", -\" . + @ @ + # \", -\" $ @ % & * * = - + + \", -\" @ ; > , ' ) ' ! * - ~ @ \", -\" @ { > ! ] ^ / / ( ' * ; _ : \", -\" < _ ; [ ) / } | } / ] , 1 2 3 4 \", -\" 5 6 7 , ] 8 9 9 9 } ^ ! = ~ 0 a \", -\" b c 6 - , ] 8 9 9 9 } ^ ! % ~ 0 d 5 \", -\" : e _ ; * ) / 8 } } / ] , 1 2 3 f 5 \", -\" : g h { = i j ^ / ^ ] ! * ; k e l m \", -\" : f n o ; > , ' ) ' ! * - 2 0 p q r \", -\" : s g 0 6 ; % > * * = - ~ h t l u r \", -\" v u w x y k ~ z A z B o C D E F G b \", -\" 5 H I J e 0 h K h C c x L M N . \", -\" 4 O P q Q d g x g J L R H S T < \", -\" @ T U P F q V q M H N W X + \", -\" @ Y T O W G G W O X Y @ \", -\" 4 Z ` Y Y Y .` 4 4 \", -\" 5 : : @ @ Z \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the mark immortal button.") - -(defconst newsticker--narrow-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * narrow_xpm[] = { -\"24 24 48 1\", -\" c None\", -\". c #000000\", -\"+ c #969696\", -\"@ c #9E9E9E\", -\"# c #A4A4A4\", -\"$ c #AAAAAA\", -\"% c #AEAEAE\", -\"& c #B1B1B1\", -\"* c #B3B3B3\", -\"= c #B4B4B4\", -\"- c #B2B2B2\", -\"; c #AFAFAF\", -\"> c #ABABAB\", -\", c #A6A6A6\", -\"' c #A0A0A0\", -\") c #989898\", -\"! c #909090\", -\"~ c #73AAD4\", -\"{ c #7AB2DA\", -\"] c #7FB8DF\", -\"^ c #84BDE3\", -\"/ c #88C2E7\", -\"( c #8BC5E9\", -\"_ c #8DC7EB\", -\": c #8CC6EA\", -\"< c #89C3E8\", -\"[ c #86BFE5\", -\"} c #81BAE1\", -\"| c #7BB3DC\", -\"1 c #75ACD6\", -\"2 c #6DA4CF\", -\"3 c #979797\", -\"4 c #A3A3A3\", -\"5 c #A8A8A8\", -\"6 c #ADADAD\", -\"7 c #ACACAC\", -\"8 c #A9A9A9\", -\"9 c #A5A5A5\", -\"0 c #9A9A9A\", -\"a c #929292\", -\"b c #8C8C8C\", -\"c c #808080\", -\"d c #818181\", -\"e c #838383\", -\"f c #848484\", -\"g c #858585\", -\"h c #868686\", -\"i c #828282\", -\" \", -\" \", -\" \", -\" .................. \", -\" .+@#$%&*=*-;>,')!. \", -\" .................. \", -\" \", -\" \", -\" .................. \", -\" .~{]^/(___:<[}|12. \", -\" .................. \", -\" \", -\" \", -\" .................. \", -\" .!3@45>666789'0ab. \", -\" .................. \", -\" \", -\" \", -\" .................. \", -\" .cccdefghhgficccc. \", -\" .................. \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the narrow image button.") - -(defconst newsticker--get-all-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * get_all_xpm[] = { -\"24 24 70 1\", -\" c None\", -\". c #000000\", -\"+ c #F3DA00\", -\"@ c #F5DF00\", -\"# c #F7E300\", -\"$ c #F9E700\", -\"% c #FAEA00\", -\"& c #FBEC00\", -\"* c #FBED00\", -\"= c #FCEE00\", -\"- c #FAEB00\", -\"; c #F9E800\", -\"> c #F8E500\", -\", c #F6E000\", -\"' c #F4DB00\", -\") c #F1D500\", -\"! c #EFD000\", -\"~ c #B7CA00\", -\"{ c #BFD100\", -\"] c #C5D700\", -\"^ c #CBDB00\", -\"/ c #CFDF00\", -\"( c #D2E200\", -\"_ c #D4E400\", -\": c #D3E300\", -\"< c #D0E000\", -\"[ c #CCDD00\", -\"} c #C7D800\", -\"| c #C1D300\", -\"1 c #BACC00\", -\"2 c #B1C500\", -\"3 c #A8BC00\", -\"4 c #20A900\", -\"5 c #22AF00\", -\"6 c #24B500\", -\"7 c #26B900\", -\"8 c #27BC00\", -\"9 c #27BE00\", -\"0 c #28BF00\", -\"a c #27BD00\", -\"b c #26BA00\", -\"c c #25B600\", -\"d c #23B100\", -\"e c #21AB00\", -\"f c #1FA400\", -\"g c #1C9B00\", -\"h c #21AA00\", -\"i c #24B300\", -\"j c #25B800\", -\"k c #25B700\", -\"l c #24B400\", -\"m c #23B000\", -\"n c #1FA500\", -\"o c #1D9E00\", -\"p c #20A800\", -\"q c #21AC00\", -\"r c #23B200\", -\"s c #22AD00\", -\"t c #1D9F00\", -\"u c #20A700\", -\"v c #1EA100\", -\"w c #1C9C00\", -\"x c #1DA000\", -\"y c #1B9800\", -\"z c #1A9600\", -\"A c #1A9700\", -\"B c #1A9500\", -\"C c #199200\", -\"D c #189100\", -\"E c #178C00\", -\" \", -\" \", -\" \", -\" \", -\" ................... \", -\" .+@#$%&*=*&-;>,')!. \", -\" ................... \", -\" \", -\" ................... \", -\" .~{]^/(___:<[}|123. \", -\" ................... \", -\" \", -\" ................... \", -\" .45678909abcdefg. \", -\" .h5icj7jklmeno. \", -\" .pq5drrmshft. \", -\" .fu4h4pnvw. \", -\" .oxvxtwy. \", -\" .zAAzB. \", -\" .CCD. \", -\" .E. \", -\" . \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the get all image button.") - -(defconst newsticker--update-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * update_xpm[] = { -\"24 24 37 1\", -\" c None\", -\". c #076D00\", -\"+ c #0A8600\", -\"@ c #0A8800\", -\"# c #098400\", -\"$ c #087200\", -\"% c #087900\", -\"& c #098500\", -\"* c #098100\", -\"= c #087600\", -\"- c #097E00\", -\"; c #097F00\", -\"> c #0A8700\", -\", c #0A8C00\", -\"' c #097C00\", -\") c #098300\", -\"! c #0A8900\", -\"~ c #0A8E00\", -\"{ c #0B9200\", -\"] c #087700\", -\"^ c #076E00\", -\"/ c #076C00\", -\"( c #076B00\", -\"_ c #076A00\", -\": c #076900\", -\"< c #076800\", -\"[ c #066700\", -\"} c #066500\", -\"| c #066400\", -\"1 c #066300\", -\"2 c #066600\", -\"3 c #066200\", -\"4 c #076700\", -\"5 c #065E00\", -\"6 c #066100\", -\"7 c #065F00\", -\"8 c #066000\", -\" \", -\" \", -\" \", -\" . +@@@+# \", -\" $% &@ +* \", -\" =-# ; \", -\" %*>, ' \", -\" ')!~{ = \", -\" ]$ \", -\" ^ ^ \", -\" . . \", -\" / ( \", -\" _ : \", -\" < [ \", -\" } | \", -\" [[ \", -\" 1 $.:23 \", -\" 3 4}35 \", -\" 6 655 \", -\" 76 85 55 \", -\" 5555555 5 \", -\" \", -\" \", -\" \"}; -" - 'xpm t)) - "Image for the update button.") - -(defconst newsticker--browse-image - (and (fboundp 'image-type-available-p) - (image-type-available-p 'xpm) - (create-image "/* XPM */ -static char * visit_xpm[] = { -\"24 24 39 1\", -\" c None\", -\". c #000000\", -\"+ c #FFFFFF\", -\"@ c #00E63D\", -\"# c #00E83E\", -\"$ c #00E73D\", -\"% c #00E93E\", -\"& c #00E63C\", -\"* c #00E53C\", -\"= c #00E23B\", -\"- c #00E33B\", -\"; c #00E83D\", -\"> c #00E13A\", -\", c #00DD38\", -\"' c #00DE38\", -\") c #00E23A\", -\"! c #00E43C\", -\"~ c #00DF39\", -\"{ c #00DB37\", -\"] c #00D634\", -\"^ c #00D734\", -\"/ c #00E039\", -\"( c #00DC37\", -\"_ c #00D835\", -\": c #00D332\", -\"< c #00CD2F\", -\"[ c #00DB36\", -\"} c #00D433\", -\"| c #00CF30\", -\"1 c #00DA36\", -\"2 c #00D936\", -\"3 c #00D533\", -\"4 c #00D131\", -\"5 c #00CE2F\", -\"6 c #00CC2F\", -\"7 c #00CA2D\", -\"8 c #00C62B\", -\"9 c #00C52A\", -\"0 c #00BE27\", -\" \", -\" \", -\" . \", -\" .+. \", -\" .+++. \", -\" .++.++. \", -\" .++.@.++. \", -\" .++.##$.++. \", -\" .++.%%%#&.++. \", -\" .++.$%%%#*=.++. \", -\" .++.-@;##$*>,.++. \", -\" .++.')!&@@*=~{].++. \", -\" .++.^{~>---)/(_:<.++. \", -\" .++.^[,~/~'(_}|.++. \", -\" .++.]_1[12^:|.++. \", -\" .++.:}33:45.++. \", -\" .++.<5567.++. \", -\" .++.889.++. \", -\" .++.0.++. \", -\" .++.++. \", -\" .+++. \", -\" .+. \", -\" . \", -\" \"}; -" - 'xpm t)) - "Image for the browse button.") (defun newsticker-browse-url-item (feed item) "Convert FEED ITEM to html and call `browse-url' on result." === modified file 'lisp/net/newst-treeview.el' --- lisp/net/newst-treeview.el 2011-01-25 04:08:28 +0000 +++ lisp/net/newst-treeview.el 2011-05-13 19:06:36 +0000 @@ -7,7 +7,7 @@ ;; URL: http://www.nongnu.org/newsticker ;; Created: 2007 ;; Keywords: News, RSS, Atom -;; Time-stamp: "6. Dezember 2009, 19:17:28 (ulf)" +;; Time-stamp: "13. Mai 2011, 20:56:49 (ulf)" ;; Package: newsticker ;; ====================================================================== @@ -36,7 +36,6 @@ ;;; History: ;; - ;; ====================================================================== ;;; Code: (require 'newst-reader) @@ -53,9 +52,9 @@ (defface newsticker-treeview-face '((((class color) (background dark)) - (:family "helvetica" :foreground "misty rose" :bold nil)) + (:family "sans" :foreground "white" :bold nil)) (((class color) (background light)) - (:family "helvetica" :foreground "black" :bold nil))) + (:family "sans" :foreground "black" :bold nil))) "Face for newsticker tree." :group 'newsticker-treeview) @@ -1069,86 +1068,63 @@ ;; ====================================================================== ;;; Toolbar ;; ====================================================================== -;;(makunbound 'newsticker-treeview-tool-bar-map) (defvar newsticker-treeview-tool-bar-map (if (featurep 'xemacs) nil (if (boundp 'tool-bar-map) (let ((tool-bar-map (make-sparse-keymap))) + (tool-bar-add-item "newsticker/prev-feed" + 'newsticker-treeview-prev-feed + 'newsticker-treeview-prev-feed + :help "Go to previous feed" + ;;:enable '(newsticker-previous-feed-available-p) FIXME + ) + (tool-bar-add-item "newsticker/prev-item" + 'newsticker-treeview-prev-item + 'newsticker-treeview-prev-item + :help "Go to previous item" + ;;:enable '(newsticker-previous-item-available-p) FIXME + ) + (tool-bar-add-item "newsticker/next-item" + 'newsticker-treeview-next-item + 'newsticker-treeview-next-item + :visible t + :help "Go to next item" + ;;:enable '(newsticker-next-item-available-p) FIXME + ) + (tool-bar-add-item "newsticker/next-feed" + 'newsticker-treeview-next-feed + 'newsticker-treeview-next-feed + :help "Go to next feed" + ;;:enable '(newsticker-next-feed-available-p) FIXME + ) + (tool-bar-add-item "newsticker/mark-immortal" + 'newsticker-treeview-toggle-item-immortal + 'newsticker-treeview-toggle-item-immortal + :help "Toggle current item as immortal" + ;;:enable '(newsticker-item-not-immortal-p) FIXME + ) + (tool-bar-add-item "newsticker/mark-read" + 'newsticker-treeview-mark-item-old + 'newsticker-treeview-mark-item-old + :help "Mark current item as read" + ;;:enable '(newsticker-item-not-old-p) FIXME + ) + (tool-bar-add-item "newsticker/get-all" + 'newsticker-get-all-news + 'newsticker-get-all-news + :help "Get news for all feeds") + (tool-bar-add-item "newsticker/update" + 'newsticker-treeview-update + 'newsticker-treeview-update + :help "Update newsticker buffer") + (tool-bar-add-item "newsticker/browse-url" + 'newsticker-browse-url + 'newsticker-browse-url + :help "Browse URL for item at point") + ;; standard icons / actions (define-key tool-bar-map [newsticker-sep-1] (list 'menu-item "--double-line")) - (define-key tool-bar-map [newsticker-browse-url] - (list 'menu-item "newsticker-browse-url" - 'newsticker-browse-url - :visible t - :help "Browse URL for item at point" - :image newsticker--browse-image)) - (define-key tool-bar-map [newsticker-buffer-force-update] - (list 'menu-item "newsticker-treeview-update" - 'newsticker-treeview-update - :visible t - :help "Update newsticker buffer" - :image newsticker--update-image - :enable t)) - (define-key tool-bar-map [newsticker-get-all-news] - (list 'menu-item "newsticker-get-all-news" 'newsticker-get-all-news - :visible t - :help "Get news for all feeds" - :image newsticker--get-all-image)) - (define-key tool-bar-map [newsticker-mark-item-at-point-as-read] - (list 'menu-item "newsticker-treeview-mark-item-old" - 'newsticker-treeview-mark-item-old - :visible t - :image newsticker--mark-read-image - :help "Mark current item as read" - ;;:enable '(newsticker-item-not-old-p) FIXME - )) - (define-key tool-bar-map [newsticker-mark-item-at-point-as-immortal] - (list 'menu-item "newsticker-treeview-toggle-item-immortal" - 'newsticker-treeview-toggle-item-immortal - :visible t - :image newsticker--mark-immortal-image - :help "Toggle current item as immortal" - :enable t - ;;'(newsticker-item-not-immortal-p) FIXME - )) - (define-key tool-bar-map [newsticker-next-feed] - (list 'menu-item "newsticker-treeview-next-feed" - 'newsticker-treeview-next-feed - :visible t - :help "Go to next feed" - :image newsticker--next-feed-image - :enable t - ;;'(newsticker-next-feed-available-p) FIXME - )) - (define-key tool-bar-map [newsticker-treeview-next-item] - (list 'menu-item "newsticker-treeview-next-item" - 'newsticker-treeview-next-item - :visible t - :help "Go to next item" - :image newsticker--next-item-image - :enable t - ;;'(newsticker-next-item-available-p) FIXME - )) - (define-key tool-bar-map [newsticker-treeview-prev-item] - (list 'menu-item "newsticker-treeview-prev-item" - 'newsticker-treeview-prev-item - :visible t - :help "Go to previous item" - :image newsticker--previous-item-image - :enable t - ;;'(newsticker-previous-item-available-p) FIXME - )) - (define-key tool-bar-map [newsticker-treeview-prev-feed] - (list 'menu-item "newsticker-treeview-prev-feed" - 'newsticker-treeview-prev-feed - :visible t - :help "Go to previous feed" - :image newsticker--previous-feed-image - :enable t - ;;'(newsticker-previous-feed-available-p) FIXME - )) - ;; standard icons / actions (tool-bar-add-item "close" 'newsticker-treeview-quit 'newsticker-treeview-quit ------------------------------------------------------------ Use --include-merges or -n0 to see merged revisions.