</para>
</listitem>
+<listitem>
+<para>
+<link linkend="append-hook"><command>append-hook</command></link>
+</para>
+</listitem>
+
<listitem>
<para>
<link linkend="charset-hook"><command>charset-hook</command></link>
</para>
</listitem>
+<listitem>
+<para>
+<link linkend="close-hook"><command>close-hook</command></link>
+</para>
+</listitem>
+
<listitem>
<para>
<link linkend="crypt-hook"><command>crypt-hook</command></link>
</para>
</listitem>
+<listitem>
+<para>
+<link linkend="open-hook"><command>open-hook</command></link>
+</para>
+</listitem>
+
<listitem>
<para>
<link linkend="reply-hook"><command>reply-hook</command></link>
</sect1>
+<sect1 id="compress">
+ <title>Compressed Folders Patch</title>
+ <subtitle>Read from/write to compressed mailboxes</subtitle>
+
+ <sect2 id="compress-patch">
+ <title>Patch</title>
+
+ <para>
+ To check if Mutt supports <quote>Compress Folders</quote>, look for
+ <quote>+USE_COMPRESSED</quote> in the mutt version.
+ See: <xref linkend="compile-time-features"/>.
+ </para>
+
+ <itemizedlist>
+ <title>Dependencies:</title>
+ <listitem><para>mutt-1.6.2</para></listitem>
+ </itemizedlist>
+
+ <para>This patch is part of the <ulink url="http://www.neomutt.org/">NeoMutt Project</ulink>.</para>
+ </sect2>
+
+ <sect2 id="compress-intro">
+ <title>Introduction</title>
+
+ <para>
+ The Compressed Folder patch allows Mutt to read mailbox files that are
+ compressed. But it isn't limited to compressed files. It works well
+ with encrypted files, too. In fact, if you can create a program/script
+ to convert to and from your format, then Mutt can read it.
+ </para>
+
+ <para>
+ The patch adds three hooks to Mutt: <literal>open-hook</literal>,
+ <literal>close-hook</literal> and <literal>append-hook</literal>. They
+ define commands to: uncompress a file; compress a file; append
+ messages to an already compressed file.
+ </para>
+
+ <para>
+ There are some examples of both compressed and encrypted files,
+ later. For now, the documentation will just concentrate on
+ compressed files.
+ </para>
+
+ </sect2>
+
+<!--
+ <sect2 id="compress-variables">
+ <title>Variables</title>
+ <para>None</para>
+ </sect2>
+
+ <sect2 id="compress-functions">
+ <title>Functions</title>
+ <para>None</para>
+ </sect2>
+-->
+
+ <sect2 id="compress-commands">
+ <title>Commands</title>
+ <cmdsynopsis>
+ <command>open-hook</command>
+ <arg choice="plain">
+ <replaceable class="parameter">pattern</replaceable>
+ </arg>
+ <arg choice="plain">
+ <replaceable class="parameter">shell-command</replaceable>
+ </arg>
+ <command>close-hook</command>
+ <arg choice="plain">
+ <replaceable class="parameter">pattern</replaceable>
+ </arg>
+ <arg choice="plain">
+ <replaceable class="parameter">shell-command</replaceable>
+ </arg>
+ <command>append-hook</command>
+ <arg choice="plain">
+ <replaceable class="parameter">pattern</replaceable>
+ </arg>
+ <arg choice="plain">
+ <replaceable class="parameter">shell-command</replaceable>
+ </arg>
+ </cmdsynopsis>
+
+ <para>
+ The shell-command must contain two placeholders for filenames:
+ <literal>%f</literal> and <literal>%t</literal>. These represent
+ <quote>from</quote> and <quote>to</quote> filenames. It's a good idea to
+ put quotes around these placeholders.
+ </para>
+
+ <para>
+ If you need the exact string <quote>%f</quote> or <quote>%t</quote> in your
+ command, simply double up the <quote>%</quote> character, e.g.
+ <quote>%%f</quote> or <quote>%%t</quote>.
+ </para>
+
+ <table id="table-compress-optional">
+ <title>Not all Hooks are Required</title>
+ <tgroup cols="5">
+ <thead>
+ <row>
+ <entry>Open</entry>
+ <entry>Close</entry>
+ <entry>Append</entry>
+ <entry>Effect</entry>
+ <entry>Useful if</entry>
+ </row>
+ </thead>
+ <tbody>
+ <row>
+ <entry>Open</entry>
+ <entry>-</entry>
+ <entry>-</entry>
+ <entry>Folder is readonly</entry>
+ <entry>The folder is just a backup</entry>
+ </row>
+ <row>
+ <entry>Open</entry>
+ <entry>Close</entry>
+ <entry>-</entry>
+ <entry>Folder is read/write, but the entire folder must be
+ written if anything is changed</entry>
+ <entry>Your compression format doesn't support appending</entry>
+ </row>
+ <row>
+ <entry>Open</entry>
+ <entry>Close</entry>
+ <entry>Append</entry>
+ <entry>Folder is read/write and emails can be efficiently added
+ to the end</entry>
+ <entry>Your compression format supports appending</entry>
+ </row>
+ <row>
+ <entry>Open</entry>
+ <entry>-</entry>
+ <entry>Append</entry>
+ <entry>Folder is readonly, but can be appended to</entry>
+ <entry>You want to store emails, but never change them</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <note>
+ <para>The command:</para>
+ <itemizedlist>
+ <listitem><para>should return a non-zero exit status on failure</para></listitem>
+ <listitem><para>should not delete any files</para></listitem>
+ </itemizedlist>
+ </note>
+
+ <sect3 id="open-hook">
+ <title>Read from compressed mailbox</title>
+
+ <screen>open-hook regexp shell-command</screen>
+
+ <para>
+ If Mutt is unable to open a file, it then looks for
+ <literal>open-hook</literal> that matches the filename.
+ </para>
+
+ <para>
+ If your compression program doesn't have a well-defined extension,
+ then you can use <literal>.</literal> as the regexp.
+ </para>
+
+ <sect4 id="compress-open-hook-example">
+ <title>Example of open-hook</title>
+
+ <screen>open-hook '\.gz$' "gzip -cd '%f' > '%t'"</screen>
+
+ <itemizedlist>
+ <listitem><para>Mutt finds a file, <quote>example.gz</quote>,
+ that it can't read</para></listitem>
+ <listitem><para>Mutt has an <literal>open-hook</literal>
+ whose regexp matches the filename:
+ <literal>\.gz$</literal></para></listitem>
+ <listitem><para>Mutt uses the command <literal>gzip -cd</literal>
+ to create a temporary file that it <emphasis>can</emphasis>
+ read</para></listitem>
+ </itemizedlist>
+ </sect4>
+ </sect3>
+
+ <sect3 id="close-hook">
+ <title>Write to a compressed mailbox</title>
+
+ <screen>close-hook regexp shell-command</screen>
+
+ <para>
+ When Mutt has finished with a compressed mail folder, it will look
+ for a matching <literal>close-hook</literal> to recompress the file.
+ This hook is <link linkend="table-compress-optional">optional</link>.
+ </para>
+
+ <note>
+ <para>
+ If the folder has not been modifed, the
+ <literal>close-hook</literal> will not be called.
+ </para>
+ </note>
+
+ <sect4 id="compress-close-hook-example">
+ <title>Example of close-hook</title>
+
+ <screen>close-hook '\.gz$' "gzip -c '%t' > '%f'"</screen>
+
+ <itemizedlist>
+ <listitem><para>Mutt has finished with a folder, <quote>example.gz</quote>,
+ that it opened with <literal>open-hook</literal></para></listitem>
+ <listitem><para>The folder has been modified</para></listitem>
+ <listitem><para>Mutt has a <literal>close-hook</literal> whose regexp
+ matches the filename: <literal>\.gz$</literal></para></listitem>
+ <listitem><para>Mutt uses the command <literal>gzip -c</literal>
+ to create a new compressed file</para></listitem>
+ </itemizedlist>
+ </sect4>
+ </sect3>
+
+ <sect3 id="append-hook">
+ <title>Append to a compressed mailbox</title>
+
+ <screen>append-hook regexp shell-command</screen>
+
+ <para>
+ When Mutt wants to append an email to a compressed mail folder, it
+ will look for a matching <literal>append-hook</literal>.
+ This hook is <link linkend="table-compress-optional">optional</link>.
+ </para>
+
+ <para>
+ Using the <literal>append-hook</literal> will save time, but
+ Mutt won't be able to determine the type of the mail folder
+ inside the compressed file.
+ </para>
+
+ <para>
+ Mutt will <emphasis>assume</emphasis> the type to be that of
+ the <literal>$mbox_type</literal> variable. Mutt also uses
+ this type for temporary files.
+ </para>
+
+ <para>
+ Mutt will only use the <literal>append-hook</literal> for existing files.
+ The <literal>close-hook</literal> will be used for empty, or missing files.
+ </para>
+
+ <sect4 id="compress-append-hook-example">
+ <title>Example of append-hook</title>
+
+ <screen>append-hook '\.gz$' "gzip -c '%t' >> '%f'"</screen>
+
+ <itemizedlist>
+ <listitem><para>Mutt wants to append an email to a folder, <quote>example.gz</quote>,
+ that it opened with <literal>open-hook</literal></para></listitem>
+ <listitem><para>Mutt has an <literal>append-hook</literal> whose regexp matches
+ the filename: <literal>\.gz$</literal></para></listitem>
+ <listitem><para>Mutt knows the mailbox type from the <literal>$mbox</literal>
+ variable</para></listitem>
+ <listitem><para>Mutt uses the command <literal>gzip -c</literal>
+ to append to an existing compressed file</para></listitem>
+ </itemizedlist>
+ </sect4>
+
+ </sect3>
+
+ <sect3 id="compress-empty">
+ <title>Empty Files</title>
+
+ <para>
+ Mutt assumes that an empty file is not compressed. In this
+ situation, unset <link linkend="save-empty">$save_empty</link>, so
+ that the compressed file will be removed if you delete all of the
+ messages.
+ </para>
+ </sect3>
+
+ <sect3 id="compress-security">
+ <title>Security</title>
+
+ <para>
+ Encrypted files are decrypted into temporary files which are
+ stored in the <link linkend="tmpdir">$tmpdir</link> directory.
+ This could be a security risk.
+ </para>
+ </sect3>
+ </sect2>
+
+<!--
+ <sect2 id="compress-colors">
+ <title>Colors</title>
+ <para>None</para>
+ </sect2>
+
+ <sect2 id="compress-sort">
+ <title>Sort</title>
+ <para>None</para>
+ </sect2>
+-->
+
+ <sect2 id="compress-muttrc">
+ <title>Muttrc</title>
+<screen>
+<emphasis role="comment"># Example Mutt config file for the 'compressed folders' feature.
+
+# This feature adds three hooks to Mutt which allow it to
+# work with compressed, or encrypted, mailboxes.
+
+# The hooks are of the form:
+# open-hook regexp "shell-command"
+# close-hook regexp "shell-command"
+# append-hook regexp "shell-command"
+
+# The 'append-hook' is optional.
+
+# Hander for gzip compressed mailboxes</emphasis>
+open-hook '\.gz$' "gzip -cd '%f' > '%t'"
+close-hook '\.gz$' "gzip -c '%t' > '%f'"
+append-hook '\.gz$' "gzip -c '%t' >> '%f'"
+
+<emphasis role="comment"># Hander for bzip2 compressed mailboxes</emphasis>
+open-hook '\.bz2$' "bzip2 -cd '%f' > '%t'"
+close-hook '\.bz2$' "bzip2 -c '%t' > '%f'"
+append-hook '\.bz2$' "bzip2 -c '%t' >> '%f'"
+
+<emphasis role="comment"># Hander for xz compressed mailboxes</emphasis>
+open-hook '\.xz$' "xz -cd '%f' > '%t'"
+close-hook '\.xz$' "xz -c '%t' > '%f'"
+append-hook '\.xz$' "xz -c '%t' >> '%f'"
+
+<emphasis role="comment"># Hander for pgp encrypted mailboxes
+# PGP does not support appending to an encrypted file</emphasis>
+open-hook '\.pgp$' "pgp -f < '%f' > '%t'"
+close-hook '\.pgp$' "pgp -fe YourPgpUserIdOrKeyId < '%t' > '%f'"
+
+<emphasis role="comment"># Hander for gpg encrypted mailboxes
+# gpg does not support appending to an encrypted file</emphasis>
+open-hook '\.gpg$' "gpg --decrypt < '%f' > '%t'"
+close-hook '\.gpg$' "gpg --encrypt --recipient YourGpgUserIdOrKeyId < '%t' > '%f'"
+
+<emphasis role="comment"># vim: syntax=muttrc</emphasis>
+</screen>
+ </sect2>
+
+ <sect2 id="compress-see-also">
+ <title>See Also</title>
+
+ <itemizedlist>
+ <listitem><para><ulink url="http://www.neomutt.org/">NeoMutt Project</ulink></para></listitem>
+ <listitem><para><link linkend="compile-time-features">Compile-Time Features</link></para></listitem>
+ <listitem><para><link linkend="regexp">Regular Expressions</link></para></listitem>
+ <listitem><para><link linkend="tmpdir">$tmpdir</link></para></listitem>
+ <listitem><para><link linkend="mbox-type">$mbox_type</link></para></listitem>
+ <listitem><para><link linkend="save-empty">$save_empty</link></para></listitem>
+ <listitem><para><link linkend="folder-hook">folder-hook</link></para></listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 id="compress-known-bugs">
+ <title>Known Bugs</title>
+
+ <itemizedlist>
+ <listitem><para>The Compressed Folder hooks cannot deal with filenames that contains quotes/apostrophes.</para></listitem>
+ </itemizedlist>
+ </sect2>
+
+ <sect2 id="compress-credits">
+ <title>Credits</title>
+ <itemizedlist>
+ <listitem><para>Roland Rosenfeld <email>roland@spinnaker.de</email></para></listitem>
+ <listitem><para>Alain Penders <email>Alain@Finale-Dev.com</email></para></listitem>
+ <listitem><para>Christoph <quote>Myon</quote> Berg <email>myon@debian.org</email></para></listitem>
+ <listitem><para>Evgeni Golov <email>evgeni@debian.org</email></para></listitem>
+ <listitem><para>Richard Russon <email>rich@flatcap.org</email></para></listitem>
+ </itemizedlist>
+ </sect2>
+</sect1>
+
<sect1 id="sidebar">
<title>Sidebar</title>
<subtitle>Overview of mailboxes</subtitle>
</cmdsynopsis>
</listitem>
+<listitem>
+<cmdsynopsis>
+<command><link linkend="append-hook">append-hook</link></command>
+<arg choice="plain">
+<replaceable class="parameter">pattern</replaceable>
+</arg>
+<arg choice="plain">
+<replaceable class="parameter">shell-command</replaceable>
+</arg>
+</cmdsynopsis>
+</listitem>
+
<listitem>
<cmdsynopsis>
<command><link linkend="auto-view">auto_view</link></command>
</cmdsynopsis>
</listitem>
+<listitem>
+<cmdsynopsis>
+<command><link linkend="close-hook">close-hook</link></command>
+<arg choice="plain">
+<replaceable class="parameter">pattern</replaceable>
+</arg>
+<arg choice="plain">
+<replaceable class="parameter">shell-command</replaceable>
+</arg>
+</cmdsynopsis>
+</listitem>
+
<listitem>
<cmdsynopsis>
<command><link linkend="color">color</link></command>
</cmdsynopsis>
</listitem>
+<listitem>
+<cmdsynopsis>
+<command><link linkend="open-hook">open-hook</link></command>
+<arg choice="plain">
+<replaceable class="parameter">pattern</replaceable>
+</arg>
+<arg choice="plain">
+<replaceable class="parameter">shell-command</replaceable>
+</arg>
+</cmdsynopsis>
+</listitem>
+
<listitem>
<cmdsynopsis>
<command><link linkend="crypt-hook">crypt-hook</link></command>