comics

Updated:

Summary

Download and read comics from emacs

Commentary

QUICK INTRO:
============

This package should work for Emacs versions 21.1 and up.

comics.el provides a way to view and store comics that are available
on the web.  A list of favorite comics can be kept.

To simply read a comic:
M-x comics-read-comic
    You will be prompted for a comic to read (with tab completion).
    With a numeric argument, the comic will be from that many days ago.
    With a non-numeric argument (such as C-u M-x comics-read-comic), you will
    be prompted for a date (in the form YYYYMMDD).
    In the buffer displaying the comic, the following commands are
    available:

To get a list of all available comics:
M-x comics-list-comics
    You will be given a buffer with the categories of the available
    comics.  (Currently the categories are just the letters that the
    comics start with.)  Comics that have been chosen as favorites
    will be in bold.  The following commands will allow you to 
    sort through the categories:
    TAB     will toggle the display of the comics in the current category.
    C-cC-e  will expand all the categories (display all the comics)
    C-cC-h  will hide all the categories.

Favorite comics:
Favorite comics can be read separately, and information about them
can be kept.  comics.el will keep track of which dates the favorites
comics have been read (starting with the date they were entered as
favorites).
To get a list of comics that have been chosen as favorites:
M-x comics-favorites-list-comics
    By default, the comics will be in alphabetical order.
    If the customizable variable `comics-favorites-alphabetical' is
    nil, then they won't necessarily be in order.  The order can then
    be adjusted with the following commands:
    C-cC-a  will put the comics in alphabetical order.
    C-k     will kill the current comic from the favorite comics list.
    C-y     will yank a killed comic to the favorites comics list.

Bookmarks:
Bookmarks are a way of keeping track of particular comics.
Each comic can have a (default) bookmark, to make it easy to return 
to a particular date.  Comics can have more than one bookmark, by 
giving them names. (The default bookmark corresponds to the name "".)
There are global bookmarks, which aren't attached to any comic, but 
contain the comic information inside.  There is also a default global bookmark.

Commands:
The following commands are available (as appropriate) in all comics
related buffers (the buffers displaying the comics as well as the buffers
with the lists of comics).  The "current comic" is the comic being viewed
or the comic on the current line.
 d        View the comic from a prompted-for date
 D        Download the comic from a prompted-for date
 g        View the comic at the default bookmark
          With an argument, prompt for a bookmark name
 G        View the comic at the default global bookmark
          With an argument, prompt for a bookmark name
 C-cC-b   Delete a bookmark
 C-cC-g   Delete a global bookmark
 f        Add the current comic to the favorites list.
          With an argument, prompt for a percent to resize the comic
          when it is displayed.  (A "t" here will have the comic
          resized to fill the buffer when opened.)
 C        Tell comics that all dates of all favorite comics have been read.
 l        Switch to a buffer containing the list of favorite
          comics.  Create one if necessary.
 C-cC-f   Download all the current favorite comics.
 C-cC-u   Download all the unread favorite comics.
 L        Switch to a buffer containing the list of available
          comics.  Create one if necessary.
 q        Bury the comic related buffers.
 k        Kill all the comics buffers
 K        Kill all the comic related buffers (comics and comic lists)

When the current comic is a favorite, the following are also available:
 c        Tell comics that all dates of the current comic have been read.
 C-cC-r   Change the default resizing information for the current comic.
 C-cC-k   Remove the current comic from the favorites list.

The following commands are available in the buffer displaying a comic:
 n        View the comic from the next day
          (with argument N, view the comic from N days forward)
 N        View the comic from the next day, skipping missing days
 p        View the comic from the previous day
          (with argument N, view the comic from P days previous)
 P        View the comic from the previous day, skipping missing days
 b        Set this comic as the default bookmark
          With an argument (C-u b), prompt for a name for
          the bookmark
 B        Set this comic as the default global bookmark
          With an argument (C-u b), prompt for a name for
          the bookmark
 DEL      Delete the comic file
 SPC      Read the next unread date (if the current comic is a favorite)
 u        Copy the URL of the comic to the kill ring.
 i        Copy the information (title, author, date) of the
          comic to the kill ring.
 U        Copy the URL and info to the kill ring.
 D        Copy (Duplicate) the comic file to a prompted-for file.
 C-cC-v   View the comic in an external viewer
If the variable `comics-buffer-resize' is non-nil and "convert"
from the ImageMagick(TM) utilities is installed, then the following 
commands are also available.
 F        Fit the comic to fill the buffer
 R        Resize the comic to a percentage of its current size
          (The percentage can be given as a prefix, or it will
          be prompted for.)
 O        Restore the comic to its original size.
This has been tested with version 6.2.6 of the ImageMagick(TM) 
utilities; it may work with some older versions.
ImageMagick(TM) is free software which is available at
http://www.imagemagick.org/

The following commands are available in the buffers containing lists
of comics:
 r or RET  Read the comic on the current line.
           With a numeric argument, the comic will be from that many
           days before.
           With a non-numeric argument (such as C-u M-x comics-read-comic), 
           you will be prompted for a date (in the form YYYYMMDD).
           If the point is on a category line, toggle the display of
           the comics in the category.
 R or F    Like "r", but only downloads the comic (it doesn't display it).
 C-cC-d    Download the current comic and as many back strips as possible.
           With argument N, download N comics.


NOTE:  The list `comics-list' is used for completion and getting 
       information for downloading the comics.  It is defined
       using the initial value of `comics-categorized-list'.
       If `comics-categorized-list' is changed after "comics"
       is loaded, `comics-list' won't match `comics-categorized-list'.
       If `comics-categorized-list' is made smaller, this isn't a
       problem, but if new comics are added to `comics-categorized-list'
       after "comics" is loaded, the function `comics-update-comics-list'
       should be run.

To you these commands, it may be useful to put
 (autoload 'comics-read-comic "comics" "Read a comic." t)
 (autoload 'comics-favorites-list-comics "comics"
           "Go to a list of favorite comics." t)
in your .emacs

Customizable variables:
 Storing:
 comics-dir (default: "~/Comics/")
             This is the directory to store the comics.
 comics-favorites-file (default: "~/.comics-favorites")
             A file to keep a list of the favorite comics in.
 comics-bookmark-file (default: "~/.comics-bookmarks")
             A file to keep the comics bookmarks in.
 comics-save-urls (default: t)
             Non-nil means store the urls of the downloaded comics.
 comics-url-file (default: (concat comics-dir "/comics-urls"))
             A file to keep the comics urls in.
 comics-filename-long-date (default: t)
             If non-nil, use (e.g.) 2004_August_1 as the date in 
             the filenames, otherwise use 2004_08_01.
 comics-use-separate-comic-directories (default: nil)
             If non-nil, use separate directories for the separate 
             comics.
 comics-temp-dir (default: "/tmp/")
             The directory for temporary files.

 Viewing:
 comics-buffer-resize (default: t)
             If non-nil, enable commands to resize comics.
 comics-buffer-resize-on-open (default: nil)
             If t, open comics at a size to fill the buffer.
             If a number, open comics at that percent of the original size.
             If nil, open comics at original size.
 comics-view-comics-with-external-viewer (default: nil)
             If non-nil, use an external viewer to view comics.
 comics-external-viewer (default: "display")
             The external viewer to view the comics with.
 comics-external-viewer-args (default: nil)
             The arguments to pass to the external viewer.

 Lists:
 comics-print-list-instructions (default: nil)
             If non-nil, print the instructions at the top 
             when creating a comics list.
 comics-favorites-alphabetical (default: t)
             If non-nil, keep favorite comics in alphabetical order.

 Misc:
 comics-fetch-misses-allowed (default: 3)
             The number of times fetch back can fail to fetch a 
             comic before it gives up.
 comics-adjust-current-time (default: t)
             How to adjust today's date when computing today.
             If t, then today's date will be computed by looking at 
             the time zone of the web site.  
             If a number, it will be number of hours to adjust today's 
             day by when computing today; comics will regard today as 
             your computer time + `comics-adjust-current-time' hours.
             If nil, then today's date will the date where you are.
 comics-use-ido-completion (default: nil)
             If non-nil and `ido' is available, use `ido' for comic name 
             completions.

A list of useful commands:
M-x comics-read-comic
    Read a prompted-for comic.
    With a numeric argument, the comic will be from that many days ago.
    With a non-numeric argument (such as C-u M-x comics-read-comic), you will
    be prompted for a date (in the form YYYYMMDD).
M-x comics-fetch-comic
    Download a prompted-for comic.
    With a numeric argument, the comic will be from that many days ago.
    With a non-numeric argument (such as C-u M-x comics-read-comic), you will
    be prompted for a date (in the form YYYYMMDD).
M-x comics-add-favorite
    Prompt for a comic to add to the favorite comics list.
    With an argument, prompt for a percent to resize the comic
    when it is displayed.  (A "t" here will have the comic
    resized to fill the buffer when opened.)
    (If the customizable variable `comics-get-storage-info' is
     non-nil, then this will also prompt for information on how
     to store the comic.  Entering a "D" will put the comic
     in a separate subdirectory, otherwise it will be stored in the
     default comics directory, and "L" will save the comic with
     the date written out, otherwise the comics will be saved with
     the date in numeric form.  These can be combined.  Entering
     a "t" will use the default storage method, which is customizable.)
M-x comics-remove-favorite
    Prompt for a comic to remove from the favorite comics list.
M-x comics-kill-comics-buffers
    Kill all the buffers used for viewing comics.
M-x comics-list-comics
    You will be given a buffer with the categories of the available
    comics.
M-x comics-favorites-list-comics
    You will be given a buffer with a list of all the favorite comics.
M-x comics-fetch-favorite-comics
    This will download a copy of the comics listed in the favorite
    comics list.
M-x comics-fetch-this-comic-back
    This will prompt you for a comic, then retrieve the current strip
    and as many older strips as it can.  The variable
    `comics-fetch-misses-allowed' will determine how many days in
    a row comics can fail to fetch a comic before it decides it's done.
    With arg N, fetch comics that many days back.
M-x comics-fetch-favorite-comics-back
    This will retrieve the current favorite comics and as many older 
    strips as it can.  With arg N, fetch comics that many days back.
M-x comics-goto-bookmark
    This will prompt you for a comic and will display the comic at the
    default bookmark.  With an argument, you will also be prompted for
    a bookmark name.
M-x comics-goto-global-bookmark
    This will display the comic at the global default bookmark.
    With an argument, you will be prompted for a bookmark name.
M-x comics-delete-bookmark
    This will prompt you for a comic and a bookmark, and will
    delete the bookmark
M-x comics-delete-global-bookmark
    This will prompt you for a bookmark, and will delete the 
    global bookmark

NOTE:  If any of these comics are no longer available, or if there
       are ideas for more comics, please let me know so I can
       keep the list up-to-date.
       Please let me know of any other suggestions, bugs, comments,...
       belanger@truman.edu

ANOTHER NOTE:  With the addition of the ability to keep track of dates on which the
       favorites have been read, the format of the comics-favorites list has 
       changed slightly.  If you didn't have storage information in the 
       comics-favorites list and simply had the comic names, the difference
       won't matter, otherwise you might wish to edit .comics-favorites and
       change entries like ("Comic Name" "D") to ("Comic Name" nil nil "D").

CHANGES:

3 April 2010

Fix `run-hooks' problem.
(Patch by Wesley Dawson.)

17 January 2010

Fixed problem retrieving comics.com comics.

24 August 2009

Added a variable, `comics-show-title', which if non-nil will cause the
comic title and author to appear in the comic buffer.  By default it
is nil. (Patch by Dave Täht)

20 August 2009

Added "Girl Genius"  (Thanks to Dave Täht)

23 Feb 2009

Fixed bug in `comics-favorites-catch-up-comic'

11 Feb 2009

Fixed Piled Higher and Deeper.
(Patch by Dr. Reimar Finken)

7 Feb 2009

Fixed kingfeatures comics.

12 Jan 2009
Fixed comics.com comics, dilbert.

17 Feb 2007
Fix a problem downloading Xkcd.

Add "D" binding to comics-buffer, which will copy the file for the current 
comic.

Increase `comics-fetch-misses-allowed' to 7
If date of favorite comic being read is earlier than the earliest date,
don't add it to the dates-read list.
Add ShortPacked and Zippy.
Add "N" and "P" keybindings for comics buffers, which will read the next 
or previous comic, but skip any dates in which the comic cannot be obtained.  
(The most days skipped will be `comics-fetch-misses-allowed'.

Some keybinding changes.
Remove fetch-only buffers.

Now keeps track of which days the favorite comics have been read.
Resizing information can be kept on a per-comic basis.
(Suggested by Andy Scott.)

Added the customizable variable `comics-buffer-resize-on-open'.
If t, this will cause the comic to fill the buffer when open.
If a number, this will cause the comic to be resized by that
percentage when opened.

Add a "c" binding to calendar that will prompt for a comic 
to display.

SPC will sequence through the unread favorite comics.
(Suggested by Andy Scott.)
If your favorites list contains extra storage information, such
as ("Comic Name" "D"), then that needs to be changed to
("Comic Name" nil "D").  If you never put extra storage 
information in, then you don't need to worry about this.

Use `comics-bury-comic-related-buffers' to bury buffers.

Add bindings "k" and "K" to all comic related buffers.  These
will kill all comic/comic related buffers.

Add bindings "l" and "L" to comics buffer, to go to the list of
favorite or all comics, respectively.
Add bindings "u" and "i", to copy URL and information, respectively,
of comic to kill ring.
Suggested by Andy Scott.

Change resizing keys "f" and "r" to "F" and "R" in comics buffer.
Use "f" and "r" for adding and removing from favorites list.
Use `ido' completion when available.
Many other fixes and improvements.
Suggested by Andy Scott.

Changed `comics-select-list' to `comics-favorites-list' and changed
the format.  This is no longer customizable, instead commands
are made to add or remove comics from the list.
Also, a buffer list for the favorite comics was added.  (See the
intro above.)

More fixes and cleanups due to Detlev Zundel.

Made modes for the comics buffer and the comics list buffers.
Information on the keybindings can now be gotten with 
C-hm (describe mode).  "h" and "?" in the comics-buffer now
calls describe-mode.
(Suggested by Detlev Zundel.)

Added some interactive help in the browsing mode.
(Due to Detlev Zundel)
In the comics-buffer, "h" and "?" will give a list of available keys.

Added comics-kill-comics-buffers

Added a simple test to check if a downloaded Snoopy comic is really
a comic.

Added a simple test to make sure the downloaded file is an image.

Added Snoopy from Japan.

Added some messages for fetching comics.

Added the customizable variables 
 comics-filename-long-date
      If non-nil, use the `2004_August_01' form of the date in file
      names, otherwise use `2004_08_01'.  (The latter form will 
      the calender order the same as alphabetical order.)
 comics-use-separate-comic-directories
      If non-nil, each comic strip series will have its own 
      subdirectory of `comics-dir', otherwise all comics are
      in the same directory.

Some bug fixes.

Added the customizable variable:
 comics-adjust-current-time:
     This determines what date to use when trying to fetch a
     current comic.  If this variable is `t', then comics.el
     uses the current date at the website (based on a guess 
     of which time zone it is in).  If this variable is a number,
     that number of hours will be added to the current time 
     and that date will be used.  (So if you think the websites 
     are a couple of time zones away, you could set this to 2...)
     If this variable is nil, simply find the current date where you
     are at.
     This is an attempt to deal with the problem of looking for
     current comics when, because of time zone differences, it is
     a different day at your computer and the web site, so you wouldn't
     be able to download the "current" comic.
     It only applies when you are trying to get only a current comic,
     (comics-read-comic, comics-fetch-comic, comics-fetch-all-comics,
     comics-fetch-some-comics), and if the functions are given an 
     argument of "-" (C-u - M-x comics-read-comic), then there will be
     no attempts to adjust the time.
     I couldn't test this out very well, so if there are any problems
     with it, please let me know immediately so I can fix it.
     Thanks

Added global bookmarks.
(Note that some bookmark bindings were changed)

Added bookmarks.

Added some resizing commands

Added some new keys to the comic buffer keymap

Added a face for the comics categories.
Changed how faces were applied.

Created different faces for various parts of the buffer.
(Comic titles, dates, instructions, ...)
Added some keys to help move around in the list buffers.

Fixed a few keymap problems.
Then, created distinct keymaps for the different buffers that
are created.

Dependencies