]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
vim: use notmuch show --entire-thread
[notmuch] / notmuch.c
index cb5415abc846c59ade6b2534d2302d9a0d37c010..06b55f9d0ae6229332c74cb238d8a590b54a90f9 100644 (file)
--- a/notmuch.c
+++ b/notmuch.c
@@ -89,7 +89,22 @@ static const char search_terms_help[] =
     "\t\tParentheses can also be used to control the combination of\n"
     "\t\tthe Boolean operators, but will have to be protected from\n"
     "\t\tinterpretation by the shell, (such as by putting quotation\n"
-    "\t\tmarks around any parenthesized expression).\n\n";
+    "\t\tmarks around any parenthesized expression).\n"
+    "\n"
+    "\t\tFinally, results can be restricted to only messages within a\n"
+    "\t\tparticular time range, (based on the Date: header) with:\n"
+    "\n"
+    "\t\t\t<intial-timestamp>..<final-timestamp>\n"
+    "\n"
+    "\t\tEach timestamp is a number representing the number of seconds\n"
+    "\t\tsince 1970-01-01 00:00:00 UTC. This is not the most convenient\n"
+    "\t\tmeans of expressing date ranges, but until notmuch is fixed to\n"
+    "\t\taccept a more convenient form, one can use the date program to\n"
+    "\t\tconstruct timestamps. For example, with the bash shell the\n"
+    "\t\tfollowing syntax would specify a date range to return messages\n"
+    "\t\tfrom 2009-10-01 until the current time:\n"
+    "\n"
+    "\t\t\t$(date +%%s -d 2009-10-01)..$(date +%%s)\n\n";
 
 command_t commands[] = {
     { "setup", notmuch_setup_command,
@@ -98,7 +113,8 @@ command_t commands[] = {
       "\t\tThe setup command will prompt for your full name, your primary\n"
       "\t\temail address, any alternate email addresses you use, and the\n"
       "\t\tdirectory containing your email archives. Your answers will be\n"
-      "\t\twritten to a configuration file in ${HOME}/.notmuch-config .\n"
+      "\t\twritten to a configuration file in ${NOTMUCH_CONFIG} (if set)\n"
+      "\t\tor ${HOME}/.notmuch-config.\n"
       "\n"
       "\t\tThis configuration file will be created with descriptive\n"
       "\t\tcomments, making it easy to edit by hand later to change the\n"
@@ -107,8 +123,8 @@ command_t commands[] = {
       "\t\tInvoking notmuch with no command argument will run setup if\n"
       "\t\tthe setup command has not previously been completed." },
     { "new", notmuch_new_command,
-      NULL,
-      "Find and import new messages to the notmuch database.",
+      "[--verbose]",
+      "\t\tFind and import new messages to the notmuch database.",
       "\t\tScans all sub-directories of the mail directory, performing\n"
       "\t\tfull-text indexing on new messages that are found. Each new\n"
       "\t\tmessage will be tagged as both \"inbox\" and \"unread\".\n"
@@ -122,6 +138,13 @@ command_t commands[] = {
       "\t\tis delivered and you wish to incorporate it into the database.\n"
       "\t\tThese subsequent runs will be much quicker than the initial run.\n"
       "\n"
+      "\t\tSupported options for new include:\n"
+      "\n"
+      "\t\t--verbose\n"
+      "\n"
+      "\t\t\tVerbose operation. Shows paths of message files as\n"
+      "\t\t\tthey are being indexed.\n"
+      "\n"
       "\t\tNote: \"notmuch new\" runs (other than the first run) will\n"
       "\t\tskip any read-only directories, so you can use that to mark\n"
       "\t\tdirectories that will not receive any new mail (and make\n"
@@ -139,16 +162,6 @@ command_t commands[] = {
       "\n"
       "\t\tSupported options for search include:\n"
       "\n"
-      "\t\t--max-threads=<value>\n"
-      "\n"
-      "\t\t\tRestricts displayed search results to a subset\n"
-      "\t\t\tof the results that would match the terms.\n"
-      "\n"
-      "\t\t--first=<value>\n"
-      "\n"
-      "\t\t\tOmits the first <value> threads from the search\n"
-      "\t\t\tresults that would otherwise be displayed.\n"
-      "\n"
       "\t\t--sort=(newest-first|oldest-first)\n"
       "\n"
       "\t\t\tPresent results in either chronological order\n"
@@ -164,6 +177,14 @@ command_t commands[] = {
       "\t\t(all replies to a particular message appear immediately\n"
       "\t\tafter that message in date order).\n"
       "\n"
+      "\t\tSupported options for show include:\n"
+      "\n"
+      "\t\t--entire-thread\n"
+      "\n"
+      "\t\t\tBy default only messages strictly matching the\n"
+      "\t\t\tsearch expression will be displayed.  With this\n"
+      "\t\t\toption all messages in matching threads are shown.\n"
+      "\n"
       "\t\tThe output format is plain-text, with all text-content\n"
       "\t\tMIME parts decoded. Various components in the output,\n"
       "\t\t('message', 'header', 'body', 'attachment', and MIME 'part')\n"
@@ -179,8 +200,19 @@ command_t commands[] = {
       "\n"
       "\t\tSee \"notmuch help search-terms\" for details of the search\n"
       "\t\tterms syntax." },
-    { "reply", notmuch_reply_command,
+    { "count", notmuch_count_command,
       "<search-terms> [...]",
+      "\t\tCount messages matching the search terms.",
+      "\t\tThe number of matching messages is output to stdout.\n"
+      "\n"
+      "\t\tA common use of \"notmuch count\" is to display the count\n"
+      "\t\tof messages matching both a specific tag and either inbox\n"
+      "\t\tor unread\n"
+      "\n"
+      "\t\tSee \"notmuch help search-terms\" for details of the search\n"
+      "\t\tterms syntax." },
+    { "reply", notmuch_reply_command,
+      "[options...] <search-terms> [...]",
       "\t\tConstruct a reply template for a set of messages.",
       "\t\tConstructs a new message as a reply to a set of existing\n"
       "\t\tmessages. The Reply-To: header (if any, otherwise From:) is\n"
@@ -189,10 +221,22 @@ command_t commands[] = {
       "\n"
       "\t\tA suitable subject is constructed. The In-Reply-to: and\n"
       "\t\tReferences: headers are set appropriately, and the content\n"
-      "\t\tof the original messages is quoted and included in the body.\n"
+      "\t\tof the original messages is quoted and included in the body\n"
+      "\t\t(unless --format=headers-only is given).\n"
       "\n"
       "\t\tThe resulting message template is output to stdout.\n"
       "\n"
+      "\t\tSupported options for reply include:\n"
+      "\n"
+      "\t\t--format=(default|headers-only)\n"
+      "\n"
+      "\t\t\tdefault:\n"
+      "\t\t\t\tIncludes subject and quoted message body.\n"
+      "\n"
+      "\t\t\theaders-only:\n"
+      "\t\t\t\tOnly produces In-Reply-To, References, To\n"
+      "\t\t\t\tCc, and Bcc headers.\n"
+      "\n"
       "\t\tSee \"notmuch help search-terms\" for details of the search\n"
       "\t\tterms syntax." },
     { "tag", notmuch_tag_command,
@@ -230,6 +274,15 @@ command_t commands[] = {
       "\t\tSo if you've previously been using sup for mail, then the\n"
       "\t\t\"notmuch restore\" command provides you a way to import\n"
       "\t\tall of your tags (or labels as sup calls them)." },
+    { "search-tags", notmuch_search_tags_command,
+      "[<search-terms> [...] ]",
+      "\t\tList all tags found in the database or matching messages.",
+      "\t\tRun this command without any search-term(s) to obtain a list\n"
+      "\t\tof all tags found in the database. If you provide one or more\n"
+      "\t\tsearch-terms as argument(s) then the resulting list will\n"
+      "\t\tcontain tags only from messages that match the search-term(s).\n"
+      "\n"
+      "\t\tIn both cases the list will be alphabetically sorted." },
     { "help", notmuch_help_command,
       "[<command>]",
       "\t\tThis message, or more detailed help for the named command.",
@@ -238,28 +291,28 @@ command_t commands[] = {
 };
 
 static void
-usage (void)
+usage (FILE *out)
 {
     command_t *command;
     unsigned int i;
 
-    fprintf (stderr, "Usage: notmuch <command> [args...]\n");
-    fprintf (stderr, "\n");
-    fprintf (stderr, "Where <command> and [args...] are as follows:\n");
-    fprintf (stderr, "\n");
+    fprintf (out, "Usage: notmuch <command> [args...]\n");
+    fprintf (out, "\n");
+    fprintf (out, "Where <command> and [args...] are as follows:\n");
+    fprintf (out, "\n");
 
     for (i = 0; i < ARRAY_SIZE (commands); i++) {
        command = &commands[i];
 
        if (command->arguments)
-           fprintf (stderr, "\t%s\t%s\n\n%s\n\n",
+           fprintf (out, "\t%s\t%s\n\n%s\n\n",
                     command->name, command->arguments, command->summary);
        else
-           fprintf (stderr, "\t%s\t%s\n\n",
+           fprintf (out, "\t%s\t%s\n\n",
                     command->name, command->summary);
     }
 
-    fprintf (stderr,
+    fprintf (out,
     "Use \"notmuch help <command>\" for more details on each command.\n"
     "And \"notmuch help search-terms\" for the common search-terms syntax.\n\n");
 }
@@ -271,8 +324,8 @@ notmuch_help_command (unused (void *ctx), int argc, char *argv[])
     unsigned int i;
 
     if (argc == 0) {
-       fprintf (stderr, "The notmuch mail system.\n\n");
-       usage ();
+       printf ("The notmuch mail system.\n\n");
+       usage (stdout);
        return 0;
     }
 
@@ -280,32 +333,32 @@ notmuch_help_command (unused (void *ctx), int argc, char *argv[])
        command = &commands[i];
 
        if (strcmp (argv[0], command->name) == 0) {
-           fprintf (stderr, "Help for \"notmuch %s\":\n\n", argv[0]);
+           printf ("Help for \"notmuch %s\":\n\n", argv[0]);
            if (command->arguments)
-               fprintf (stderr, "\t%s\t%s\n\n%s\n\n%s\n\n",
-                        command->name, command->arguments,
-                        command->summary, command->documentation);
+               printf ("\t%s\t%s\n\n%s\n\n%s\n\n",
+                       command->name, command->arguments,
+                       command->summary, command->documentation);
            else
-               fprintf (stderr, "\t%s\t%s\n\n%s\n\n", command->name,
-                        command->summary, command->documentation);
+               printf ("\t%s\t%s\n\n%s\n\n", command->name,
+                       command->summary, command->documentation);
            return 0;
        }
     }
 
     if (strcmp (argv[0], "search-terms") == 0) {
-       fprintf (stderr, "Help for <%s>\n\n", argv[0]);
+       printf ("Help for <%s>\n\n", argv[0]);
        for (i = 0; i < ARRAY_SIZE (commands); i++) {
            command = &commands[i];
 
            if (command->arguments &&
                strstr (command->arguments, "search-terms"))
            {
-               fprintf (stderr, "\t%s\t%s\n",
-                        command->name, command->arguments);
+               printf ("\t%s\t%s\n",
+                       command->name, command->arguments);
            }
        }
-       fprintf (stderr, "\n");
-       fprintf (stderr, search_terms_help);
+       printf ("\n");
+       printf (search_terms_help);
        return 0;
     }
 
@@ -400,8 +453,6 @@ main (int argc, char *argv[])
            return (command->function) (local, argc - 2, &argv[2]);
     }
 
-    /* Don't complain about "help" being an unknown command when we're
-       about to provide exactly what's wanted anyway. */
     fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n",
             argv[1]);