diff src/ex_getln.c @ 531:da9142bd190a v7.0149

updated for version 7.0149
author vimboss
date Tue, 20 Sep 2005 23:22:24 +0000
parents b47114409935
children 7052f11a3dc9
line wrap: on
line diff
--- a/src/ex_getln.c
+++ b/src/ex_getln.c
@@ -31,6 +31,11 @@ struct cmdline_info
     int		cmdattr;	/* attributes for prompt */
     int		overstrike;	/* Typing mode on the command line.  Shared by
 				   getcmdline() and put_on_cmdline(). */
+    int		xp_context;	/* type of expansion */
+# ifdef FEAT_EVAL
+    char_u	*xp_arg;	/* user-defined expansion arg */
+    int		input_fn;	/* Invoked for input() function */
+# endif
 };
 
 static struct cmdline_info ccline;	/* current cmdline_info */
@@ -254,6 +259,15 @@ getcmdline(firstc, count, indent)
     xpc.xp_context = EXPAND_NOTHING;
     xpc.xp_backslash = XP_BS_NONE;
 
+#if defined(FEAT_EVAL)
+    if (ccline.input_fn)
+    {
+	xpc.xp_context = ccline.xp_context;
+	xpc.xp_pattern = ccline.cmdbuff;
+	xpc.xp_arg = ccline.xp_arg;
+    }
+#endif
+
     /*
      * Avoid scrolling when called by a recursive do_cmdline(), e.g. when
      * doing ":@0" when register 0 doesn't contain a CR.
@@ -414,6 +428,13 @@ getcmdline(firstc, count, indent)
 	    if (p_wmnu && wild_menu_showing != 0)
 	    {
 		int skt = KeyTyped;
+		int old_RedrawingDisabled;
+
+		if (ccline.input_fn)
+		{
+		    old_RedrawingDisabled = RedrawingDisabled;
+		    RedrawingDisabled = 0;
+		}
 
 		if (wild_menu_showing == WM_SCROLLED)
 		{
@@ -442,6 +463,8 @@ getcmdline(firstc, count, indent)
 # endif
 		    redraw_statuslines();
 		}
+		if (ccline.input_fn)
+		    RedrawingDisabled = old_RedrawingDisabled;
 		KeyTyped = skt;
 		wild_menu_showing = 0;
 	    }
@@ -1791,10 +1814,12 @@ returncmd:
  * Returns the command line in allocated memory, or NULL.
  */
     char_u *
-getcmdline_prompt(firstc, prompt, attr)
+getcmdline_prompt(firstc, prompt, attr, xp_context, xp_arg)
     int		firstc;
     char_u	*prompt;	/* command line prompt */
     int		attr;		/* attributes for prompt */
+    int		xp_context;	/* type of expansion */
+    char_u	*xp_arg;	/* user-defined expansion argument */
 {
     char_u		*s;
     struct cmdline_info	save_ccline;
@@ -1803,6 +1828,11 @@ getcmdline_prompt(firstc, prompt, attr)
     save_cmdline(&save_ccline);
     ccline.cmdprompt = prompt;
     ccline.cmdattr = attr;
+# ifdef FEAT_EVAL
+    ccline.xp_context = xp_context;
+    ccline.xp_arg = xp_arg;
+    ccline.input_fn = (firstc == '@');
+# endif
     s = getcmdline(firstc, 1L, 0);
     restore_cmdline(&save_ccline);
     /* Restore msg_col, the prompt from input() may have changed it. */
@@ -1830,7 +1860,7 @@ cmdline_charsize(idx)
     static void
 set_cmdspos()
 {
-    if (ccline.cmdfirstc)
+    if (ccline.cmdfirstc != NUL)
 	ccline.cmdspos = 1 + ccline.cmdindent;
     else
 	ccline.cmdspos = 0 + ccline.cmdindent;
@@ -2222,7 +2252,7 @@ redrawcmd_preedit()
 
 	old_row = msg_row;
 	old_col = msg_col;
-	cmdspos = ((ccline.cmdfirstc) ? 1 : 0) + ccline.cmdindent;
+	cmdspos = ((ccline.cmdfirstc != NUL) ? 1 : 0) + ccline.cmdindent;
 
 # ifdef FEAT_MBYTE
 	if (has_mbyte)
@@ -2813,14 +2843,14 @@ redrawcmdprompt()
 
     if (cmd_silent)
 	return;
-    if (ccline.cmdfirstc)
+    if (ccline.cmdfirstc != NUL)
 	msg_putchar(ccline.cmdfirstc);
     if (ccline.cmdprompt != NULL)
     {
 	msg_puts_attr(ccline.cmdprompt, ccline.cmdattr);
 	ccline.cmdindent = msg_col + (msg_row - cmdline_row) * Columns;
 	/* do the reverse of set_cmdspos() */
-	if (ccline.cmdfirstc)
+	if (ccline.cmdfirstc != NUL)
 	    --ccline.cmdindent;
     }
     else
@@ -3843,6 +3873,7 @@ set_expand_context(xp)
     if (ccline.cmdfirstc != ':'
 #ifdef FEAT_EVAL
 	    && ccline.cmdfirstc != '>' && ccline.cmdfirstc != '='
+	    && !ccline.input_fn
 #endif
 	    )
     {
@@ -3875,6 +3906,12 @@ set_cmd_context(xp, str, len, col)
     if (ccline.cmdfirstc == '=')
 	/* pass CMD_SIZE because there is no real command */
 	set_context_for_expression(xp, str, CMD_SIZE);
+    else if (ccline.input_fn)
+    {
+	xp->xp_context = ccline.xp_context;
+	xp->xp_pattern = ccline.cmdbuff;
+	xp->xp_arg = ccline.xp_arg;
+    }
     else
 #endif
 	while (nextcomm != NULL)
@@ -4838,6 +4875,22 @@ set_cmdline_pos(pos)
 }
 
 /*
+ * Get the current command-line type.
+ * Returns ':' or '/' or '?' or '@' or '>'
+ * Only works when the command line is being edited.
+ * Returns NUL when something is wrong.
+ */
+    int
+get_cmdline_type()
+{
+    struct cmdline_info *p = get_ccline_ptr();
+
+    if (p == NULL)
+	return NUL;
+    return p->cmdfirstc;
+}
+
+/*
  * Calculate history index from a number:
  *   num > 0: seen as identifying number of a history entry
  *   num < 0: relative position in history wrt newest entry