]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.c
vim: preserve the 'show everything' flag when finding next/prev buffer
[notmuch] / notmuch.c
index cb5415abc846c59ade6b2534d2302d9a0d37c010..2ac8a592bb264e23259a8d1601b0aad7451eb088 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\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,
 
 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\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"
       "\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,
       "\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"
       "\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\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"
       "\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"
       "\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"
       "\t\t--sort=(newest-first|oldest-first)\n"
       "\n"
       "\t\t\tPresent results in either chronological order\n"
@@ -164,6 +177,15 @@ command_t commands[] = {
       "\t\t(all replies to a particular message appear immediately\n"
       "\t\tafter that message in date order).\n"
       "\n"
       "\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 those messages that match the\n"
+      "\t\t\tsearch terms will be displayed. With this option,\n"
+      "\t\t\tall messages in the same thread as any matched\n"
+      "\t\t\tmessage will be displayed.\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"
       "\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 +201,19 @@ command_t commands[] = {
       "\n"
       "\t\tSee \"notmuch help search-terms\" for details of the search\n"
       "\t\tterms syntax." },
       "\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> [...]",
       "<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"
       "\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 +222,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"
       "\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"
       "\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,
       "\t\tSee \"notmuch help search-terms\" for details of the search\n"
       "\t\tterms syntax." },
     { "tag", notmuch_tag_command,
@@ -230,6 +275,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)." },
       "\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.",
     { "help", notmuch_help_command,
       "[<command>]",
       "\t\tThis message, or more detailed help for the named command.",
@@ -238,28 +292,28 @@ command_t commands[] = {
 };
 
 static void
 };
 
 static void
-usage (void)
+usage (FILE *out)
 {
     command_t *command;
     unsigned int i;
 
 {
     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)
 
     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
                     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);
     }
 
                     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");
 }
     "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 +325,8 @@ notmuch_help_command (unused (void *ctx), int argc, char *argv[])
     unsigned int i;
 
     if (argc == 0) {
     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;
     }
 
        return 0;
     }
 
@@ -280,32 +334,32 @@ notmuch_help_command (unused (void *ctx), int argc, char *argv[])
        command = &commands[i];
 
        if (strcmp (argv[0], command->name) == 0) {
        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)
            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
            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) {
            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"))
            {
        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;
     }
 
        return 0;
     }
 
@@ -400,8 +454,6 @@ main (int argc, char *argv[])
            return (command->function) (local, argc - 2, &argv[2]);
     }
 
            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]);
 
     fprintf (stderr, "Error: Unknown command '%s' (see \"notmuch help\")\n",
             argv[1]);