]> granicus.if.org Git - mutt/commitdiff
When entering a 'set' command on the command-line,
authorThomas Roessler <roessler@does-not-exist.org>
Sat, 12 Sep 1998 19:41:02 +0000 (19:41 +0000)
committerThomas Roessler <roessler@does-not-exist.org>
Sat, 12 Sep 1998 19:41:02 +0000 (19:41 +0000)
pressing TAB after string_var= will insert the current
value of that variable. Note that this works only for
variables of type 'string'.

Also fixes the following buglets in command-completion:

 1. doesnt work if you started the command-line with
 whitespace

 2. Seems to think that 'Set', 'ReSeT', etc are valid
 commands (since it checks for 'strcasecmp' instead of
 'strcmp' when completing the variable names Also fixes
 the following buglets in command-completion:

(From: Vikas Agnihotri <VikasA@att.com>)

commands.c
enter.c
history.h
init.c
mutt.h
pattern.c
protos.h
recvattach.c

index 3718a2b0bf0335345013c9940a1e3cb9452ab42e..6b9958f7d0facdcd27662f1a67d29bb9809a6874 100644 (file)
@@ -293,7 +293,7 @@ int mutt_pipe_message (HEADER *h)
   pid_t thepid;
 
   buffer[0] = 0;
-  if (mutt_get_field ("Pipe to command: ", buffer, sizeof (buffer), 0) != 0 ||
+  if (mutt_get_field ("Pipe to command: ", buffer, sizeof (buffer), M_CMD) != 0 ||
       !buffer[0])
     return 0;
   mutt_expand_path (buffer, sizeof (buffer));
diff --git a/enter.c b/enter.c
index 0d0a558bc35a6ef9fa8c11f47f25d21dacc5543c..6887595e2cce028de5963275fd1db4aa331dd93d 100644 (file)
--- a/enter.c
+++ b/enter.c
@@ -65,14 +65,16 @@ int mutt_enter_string (unsigned char *buf, size_t buflen, int y, int x,
   char tempbuf[_POSIX_PATH_MAX] = "";
   history_class_t hclass;
   
-  if(flags & (M_FILE | M_EFILE))
+  if (flags & (M_FILE | M_EFILE))
     hclass = HC_FILE;
-  else if(flags & M_CMD)
+  else if (flags & M_CMD)
     hclass = HC_CMD;
-  else if(flags & M_ALIAS)
+  else if (flags & M_ALIAS)
     hclass = HC_ALIAS;
-  else if(flags & M_COMMAND)
+  else if (flags & M_COMMAND)
     hclass = HC_COMMAND;
+  else if (flags & M_PATTERN)
+    hclass = HC_PATTERN;
   else 
     hclass = HC_OTHER;
 
@@ -347,7 +349,13 @@ int mutt_enter_string (unsigned char *buf, size_t buflen, int y, int x,
          else if (flags & M_COMMAND)
          {
            buf[curpos] = 0;
-           if (mutt_command_complete ((char *) buf, buflen, curpos))
+           if (buf[lastchar - 1] == '=' && 
+               mutt_string_var_complete ((char *) buf, buflen, curpos))
+           {
+             redraw = M_REDRAW_INIT;
+             continue;
+           }
+           else if (mutt_command_complete ((char *) buf, buflen, curpos))
            {
              redraw = M_REDRAW_INIT;
              continue;
index 94af71d0a696ac234c6aeca6803e02be2bad79c6..b923fe360d77d30c95ccad389baa6f9519400388 100644 (file)
--- a/history.h
+++ b/history.h
@@ -25,6 +25,7 @@ enum history_class
   HC_ALIAS,
   HC_COMMAND,
   HC_FILE,
+  HC_PATTERN,
   HC_OTHER,
   HC_LAST
 };
diff --git a/init.c b/init.c
index 95cdee93f9f7e98858f547e1904cdac9bbca40fe..32c82b16b469bd3c347ae775ae8a8da57e5f0de7 100644 (file)
--- a/init.c
+++ b/init.c
@@ -1187,6 +1187,7 @@ int mutt_command_complete (char *buffer, size_t len, int pos)
   
   if (buffer[0] == 0)
     return 0;
+  SKIPWS (buffer);
   strncpy (cmd, buffer, pos);
   pt = cmd;
   pt[pos] = 0;
@@ -1206,10 +1207,10 @@ int mutt_command_complete (char *buffer, size_t len, int pos)
       return 0;
     strncpy (buffer, completed, len);
   }
-  else if (!strcasecmp (cmd, "set")
-          || !strcasecmp (cmd, "unset")
-          || !strcasecmp (cmd, "reset")
-          || !strcasecmp (cmd, "toggle"))
+  else if (!strcmp (cmd, "set")
+          || !strcmp (cmd, "unset")
+          || !strcmp (cmd, "reset")
+          || !strcmp (cmd, "toggle"))
   {            /* complete variables */
     char *prefixes[] = { "no", "inv", "?", "&", 0 };
     int  prefix_index;
@@ -1218,7 +1219,7 @@ int mutt_command_complete (char *buffer, size_t len, int pos)
 
     /* remember if the command is set to decide whether we want to attempt the
      * prefixes */
-    int  cmd_is_set = !strcasecmp (cmd, "set"); 
+    int  cmd_is_set = !strcmp (cmd, "set"); 
     
     pt++;
     if (*pt == 0)
@@ -1255,6 +1256,44 @@ int mutt_command_complete (char *buffer, size_t len, int pos)
   return 1;
 }
 
+int mutt_string_var_complete (char *buffer, size_t len, int pos)
+{
+  char cmd[STRING], *pt;
+  int i;
+  
+  if (buffer[0] == 0)
+    return 0;
+  SKIPWS (buffer);
+  strncpy (cmd, buffer, pos);
+  pt = cmd;
+  pt[pos] = 0;
+  while (!isspace ((unsigned char) *pt))
+    pt++;
+  *pt = 0;
+
+  pt = buffer + pos;
+  while ((pt > buffer) && !isspace ((unsigned char) *pt))
+    pt--;
+  pt++; /* move past the space */
+  if (*pt == '=') /* abort if no var before the '=' */
+    return 0;
+
+  if (strcmp (cmd, "set") == 0)
+  {
+    for (i = 0; MuttVars[i].option; i++)
+      if (DTYPE(MuttVars[i].type) == DT_STR && 
+         /* ignore the trailing '=' when comparing */
+         strncmp (MuttVars[i].option, pt, strlen (pt) - 1) == 0)
+      {
+       strncat (pt, "\"", buffer + len - pt);
+       strncat (pt, NONULL (*((char **) MuttVars[i].data)), buffer + len - pt);
+       strncat (pt, "\"", buffer + len - pt);
+       return 1;
+      }
+  }
+  return 0;
+}
+
 char *mutt_getnamebyvalue (int val, const struct mapping_t *map)
 {
   int i;
diff --git a/mutt.h b/mutt.h
index 765ef928f8901362b8c7a66f8e6772a8c5f94005..b8db968cb68b12d08878953f5bacab0475123b21 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -71,6 +71,7 @@
 #define  M_PASS    (1<<4) /* password mode (no echo) */
 #define  M_CLEAR   (1<<5) /* clear input if printable character is pressed */
 #define  M_COMMAND (1<<6) /* do command completion */
+#define  M_PATTERN (1<<7) /* pattern mode - only used for history classes */
 
 /* flags for mutt_get_token() */
 #define M_TOKEN_EQUAL          1       /* treat '=' as a special */
index 7d8c4846e6eadbe75275a913b3a7b692999493bb..b825fbb9fcbf01922199ba5c0620aeec4623937b 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -881,7 +881,7 @@ int mutt_pattern_func (int op, char *prompt)
   BUFFER err;
   int i;
 
-  if (mutt_get_field (prompt, buf, sizeof (buf), 0) != 0 || !buf[0])
+  if (mutt_get_field (prompt, buf, sizeof (buf), M_PATTERN) != 0 || !buf[0])
     return (-1);
 
   mutt_message ("Compiling search pattern...");
@@ -994,7 +994,7 @@ int mutt_search_command (int cur, int op)
   {
     strfcpy (buf, LastSearch, sizeof (buf));
     if (mutt_get_field ((op == OP_SEARCH) ? "Search for: " : "Reverse search for: ",
-                     buf, sizeof (buf), M_CLEAR) != 0 || !buf[0])
+                     buf, sizeof (buf), M_CLEAR | M_PATTERN) != 0 || !buf[0])
       return (-1);
 
     if (op == OP_SEARCH)
index b74fb3a72f92b87035b73007dd79f30929c13f4b..8f3f816654d065714273e9363d78babb4c13b175 100644 (file)
--- a/protos.h
+++ b/protos.h
@@ -212,6 +212,7 @@ int mutt_check_mime_type (const char *);
 int mutt_check_month (const char *);
 int mutt_check_overwrite (const char *, const char *, char *, size_t, int);
 int mutt_command_complete (char *, size_t, int);
+int mutt_string_var_complete (char *, size_t, int);
 int mutt_complete (char *);
 int mutt_compose_attachment (BODY *a);
 int mutt_copy_bytes (FILE *, FILE *, size_t);
index 4db824a1d89c4f862a06a5f437be2cb0d4fe5028..b5d0f2207d8eec6e87289c9800b9015d20b32e67 100644 (file)
@@ -275,7 +275,7 @@ static int mutt_query_save_attachment (FILE *fp, BODY *body, HEADER *hdr)
   else
     buf[0] = 0;
   
-  if (mutt_get_field ("Save to file: ", buf, sizeof (buf), M_FILE | M_CLEAR) != 0 
+  if (mutt_get_field ("Save to file: ", buf, sizeof (buf), M_FILE | M_CLEAR) != 0
       || !buf[0])
     return -1;
 
@@ -460,7 +460,7 @@ void mutt_pipe_attachment_list (FILE *fp, int tag, BODY *top, int filter)
   memset (&state, 0, sizeof (STATE));
 
   if (mutt_get_field ((filter ? "Filter through: " : "Pipe to: "),
-                                 buf, sizeof (buf), 0) != 0 || !buf[0])
+                                 buf, sizeof (buf), M_CMD) != 0 || !buf[0])
     return;
 
   mutt_expand_path (buf, sizeof (buf));