components/vim/vim72-patches/7.2.166
changeset 379 c6a17bba1da3
parent 378 f0b61ed1d10d
child 380 e92b3b4a1c66
equal deleted inserted replaced
378:f0b61ed1d10d 379:c6a17bba1da3
     1 To: [email protected]
       
     2 Subject: Patch 7.2.166
       
     3 Fcc: outbox
       
     4 From: Bram Moolenaar <[email protected]>
       
     5 Mime-Version: 1.0
       
     6 Content-Type: text/plain; charset=ISO-8859-1
       
     7 Content-Transfer-Encoding: 8bit
       
     8 ------------
       
     9 
       
    10 Patch 7.2.166
       
    11 Problem:    No completion for ":sign" command.
       
    12 Solution:   Add ":sign" completion. (Dominique Pelle)
       
    13 Files:	    src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/vim.h,
       
    14 	    src/proto/ex_cmds.pro
       
    15 
       
    16 
       
    17 *** ../vim-7.2.165/src/ex_cmds.c	Tue Feb 24 04:28:40 2009
       
    18 --- src/ex_cmds.c	Wed Apr 29 17:08:27 2009
       
    19 ***************
       
    20 *** 6543,6562 ****
       
    21   static void sign_list_defined __ARGS((sign_T *sp));
       
    22   static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
       
    23   
       
    24 ! /*
       
    25 !  * ":sign" command
       
    26 !  */
       
    27 !     void
       
    28 ! ex_sign(eap)
       
    29 !     exarg_T	*eap;
       
    30 ! {
       
    31 !     char_u	*arg = eap->arg;
       
    32 !     char_u	*p;
       
    33 !     int		idx;
       
    34 !     sign_T	*sp;
       
    35 !     sign_T	*sp_prev;
       
    36 !     buf_T	*buf;
       
    37 !     static char	*cmds[] = {
       
    38   			"define",
       
    39   #define SIGNCMD_DEFINE	0
       
    40   			"undefine",
       
    41 --- 6543,6549 ----
       
    42   static void sign_list_defined __ARGS((sign_T *sp));
       
    43   static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
       
    44   
       
    45 ! static char *cmds[] = {
       
    46   			"define",
       
    47   #define SIGNCMD_DEFINE	0
       
    48   			"undefine",
       
    49 ***************
       
    50 *** 6569,6590 ****
       
    51   #define SIGNCMD_UNPLACE	4
       
    52   			"jump",
       
    53   #define SIGNCMD_JUMP	5
       
    54   #define SIGNCMD_LAST	6
       
    55 !     };
       
    56   
       
    57       /* Parse the subcommand. */
       
    58       p = skiptowhite(arg);
       
    59 !     if (*p != NUL)
       
    60 ! 	*p++ = NUL;
       
    61 !     for (idx = 0; ; ++idx)
       
    62       {
       
    63 ! 	if (idx == SIGNCMD_LAST)
       
    64 ! 	{
       
    65 ! 	    EMSG2(_("E160: Unknown sign command: %s"), arg);
       
    66 ! 	    return;
       
    67 ! 	}
       
    68 ! 	if (STRCMP(arg, cmds[idx]) == 0)
       
    69 ! 	    break;
       
    70       }
       
    71       arg = skipwhite(p);
       
    72   
       
    73 --- 6556,6606 ----
       
    74   #define SIGNCMD_UNPLACE	4
       
    75   			"jump",
       
    76   #define SIGNCMD_JUMP	5
       
    77 + 			NULL
       
    78   #define SIGNCMD_LAST	6
       
    79 ! };
       
    80 ! 
       
    81 ! /*
       
    82 !  * Find index of a ":sign" subcmd from its name.
       
    83 !  * "*end_cmd" must be writable.
       
    84 !  */
       
    85 !     static int
       
    86 ! sign_cmd_idx(begin_cmd, end_cmd)
       
    87 !     char	*begin_cmd;	/* begin of sign subcmd */
       
    88 !     char	*end_cmd;	/* just after sign subcmd */
       
    89 ! {
       
    90 !     int		idx;
       
    91 !     char	save = *end_cmd;
       
    92 ! 
       
    93 !     *end_cmd = NUL;
       
    94 !     for (idx = 0; ; ++idx)
       
    95 ! 	if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0)
       
    96 ! 	    break;
       
    97 !     *end_cmd = save;
       
    98 !     return idx;
       
    99 ! }
       
   100 ! 
       
   101 ! /*
       
   102 !  * ":sign" command
       
   103 !  */
       
   104 !     void
       
   105 ! ex_sign(eap)
       
   106 !     exarg_T	*eap;
       
   107 ! {
       
   108 !     char_u	*arg = eap->arg;
       
   109 !     char_u	*p;
       
   110 !     int		idx;
       
   111 !     sign_T	*sp;
       
   112 !     sign_T	*sp_prev;
       
   113 !     buf_T	*buf;
       
   114   
       
   115       /* Parse the subcommand. */
       
   116       p = skiptowhite(arg);
       
   117 !     idx = sign_cmd_idx(arg, p);
       
   118 !     if (idx == SIGNCMD_LAST)
       
   119       {
       
   120 ! 	EMSG2(_("E160: Unknown sign command: %s"), arg);
       
   121 ! 	return;
       
   122       }
       
   123       arg = skipwhite(p);
       
   124   
       
   125 ***************
       
   126 *** 7110,7115 ****
       
   127 --- 7126,7311 ----
       
   128   }
       
   129   #endif
       
   130   
       
   131 + #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
       
   132 + static enum
       
   133 + {
       
   134 +     EXP_SUBCMD,		/* expand :sign sub-commands */
       
   135 +     EXP_DEFINE,		/* expand :sign define {name} args */
       
   136 +     EXP_PLACE,		/* expand :sign place {id} args */
       
   137 +     EXP_UNPLACE,	/* expand :sign unplace" */
       
   138 +     EXP_SIGN_NAMES	/* expand with name of placed signs */
       
   139 + } expand_what;
       
   140 + 
       
   141 + /*
       
   142 +  * Function given to ExpandGeneric() to obtain the sign command
       
   143 +  * expansion.
       
   144 +  */
       
   145 + /*ARGSUSED*/
       
   146 +     char_u *
       
   147 + get_sign_name(xp, idx)
       
   148 +     expand_T	*xp;
       
   149 +     int		idx;
       
   150 + {
       
   151 +     sign_T	*sp;
       
   152 +     int		current_idx;
       
   153 + 
       
   154 +     switch (expand_what)
       
   155 +     {
       
   156 +     case EXP_SUBCMD:
       
   157 + 	return (char_u *)cmds[idx];
       
   158 +     case EXP_DEFINE:
       
   159 + 	{
       
   160 + 	    char *define_arg[] =
       
   161 + 	    {
       
   162 + 		"icon=", "linehl=", "text=", "texthl=", NULL
       
   163 + 	    };
       
   164 + 	    return (char_u *)define_arg[idx];
       
   165 + 	}
       
   166 +     case EXP_PLACE:
       
   167 + 	{
       
   168 + 	    char *place_arg[] =
       
   169 + 	    {
       
   170 + 		"line=", "name=", "file=", "buffer=", NULL
       
   171 + 	    };
       
   172 + 	    return (char_u *)place_arg[idx];
       
   173 + 	}
       
   174 +     case EXP_UNPLACE:
       
   175 + 	{
       
   176 + 	    char *unplace_arg[] = { "file=", "buffer=", NULL };
       
   177 + 	    return (char_u *)unplace_arg[idx];
       
   178 + 	}
       
   179 +     case EXP_SIGN_NAMES:
       
   180 + 	/* Complete with name of signs already defined */
       
   181 + 	current_idx = 0;
       
   182 + 	for (sp = first_sign; sp != NULL; sp = sp->sn_next)
       
   183 + 	    if (current_idx++ == idx)
       
   184 + 		return sp->sn_name;
       
   185 + 	return NULL;
       
   186 +     default:
       
   187 + 	return NULL;
       
   188 +     }
       
   189 + }
       
   190 + 
       
   191 + /*
       
   192 +  * Handle command line completion for :sign command.
       
   193 +  */
       
   194 +     void
       
   195 + set_context_in_sign_cmd(xp, arg)
       
   196 +     expand_T	*xp;
       
   197 +     char_u	*arg;
       
   198 + {
       
   199 +     char_u	*p;
       
   200 +     char_u	*end_subcmd;
       
   201 +     char_u	*last;
       
   202 +     int		cmd_idx;
       
   203 +     char_u	*begin_subcmd_args;
       
   204 + 
       
   205 +     /* Default: expand subcommands. */
       
   206 +     xp->xp_context = EXPAND_SIGN;
       
   207 +     expand_what = EXP_SUBCMD;
       
   208 +     xp->xp_pattern = arg;
       
   209 + 
       
   210 +     end_subcmd = skiptowhite(arg);
       
   211 +     if (*end_subcmd == NUL)
       
   212 + 	/* expand subcmd name
       
   213 + 	 * :sign {subcmd}<CTRL-D>*/
       
   214 + 	return;
       
   215 + 
       
   216 +     cmd_idx = sign_cmd_idx(arg, end_subcmd);
       
   217 + 
       
   218 +     /* :sign {subcmd} {subcmd_args}
       
   219 +      *                |
       
   220 +      *                begin_subcmd_args */
       
   221 +     begin_subcmd_args = skipwhite(end_subcmd);
       
   222 +     p = skiptowhite(begin_subcmd_args);
       
   223 +     if (*p == NUL)
       
   224 +     {
       
   225 + 	/*
       
   226 + 	 * Expand first argument of subcmd when possible.
       
   227 + 	 * For ":jump {id}" and ":unplace {id}", we could
       
   228 + 	 * possibly expand the ids of all signs already placed.
       
   229 + 	 */
       
   230 + 	xp->xp_pattern = begin_subcmd_args;
       
   231 + 	switch (cmd_idx)
       
   232 + 	{
       
   233 + 	    case SIGNCMD_LIST:
       
   234 + 	    case SIGNCMD_UNDEFINE:
       
   235 + 		/* :sign list <CTRL-D>
       
   236 + 		 * :sign undefine <CTRL-D> */
       
   237 + 		expand_what = EXP_SIGN_NAMES;
       
   238 + 		break;
       
   239 + 	    default:
       
   240 + 		xp->xp_context = EXPAND_NOTHING;
       
   241 + 	}
       
   242 + 	return;
       
   243 +     }
       
   244 + 
       
   245 +     /* expand last argument of subcmd */
       
   246 + 
       
   247 +     /* :sign define {name} {args}...
       
   248 +      *              |
       
   249 +      *              p */
       
   250 + 
       
   251 +     /* Loop until reaching last argument. */
       
   252 +     do
       
   253 +     {
       
   254 + 	p = skipwhite(p);
       
   255 + 	last = p;
       
   256 + 	p = skiptowhite(p);
       
   257 +     } while (*p != NUL);
       
   258 + 
       
   259 +     p = vim_strchr(last, '=');
       
   260 + 
       
   261 +     /* :sign define {name} {args}... {last}=
       
   262 +      *                               |     |
       
   263 +      *                            last     p */
       
   264 +     if (p == NUL)
       
   265 +     {
       
   266 + 	/* Expand last argument name (before equal sign). */
       
   267 + 	xp->xp_pattern = last;
       
   268 + 	switch (cmd_idx)
       
   269 + 	{
       
   270 + 	    case SIGNCMD_DEFINE:
       
   271 + 		expand_what = EXP_DEFINE;
       
   272 + 		break;
       
   273 + 	    case SIGNCMD_PLACE:
       
   274 + 		expand_what = EXP_PLACE;
       
   275 + 		break;
       
   276 + 	    case SIGNCMD_JUMP:
       
   277 + 	    case SIGNCMD_UNPLACE:
       
   278 + 		expand_what = EXP_UNPLACE;
       
   279 + 		break;
       
   280 + 	    default:
       
   281 + 		xp->xp_context = EXPAND_NOTHING;
       
   282 + 	}
       
   283 +     }
       
   284 +     else
       
   285 +     {
       
   286 + 	/* Expand last argument value (after equal sign). */
       
   287 + 	xp->xp_pattern = p + 1;
       
   288 + 	switch (cmd_idx)
       
   289 + 	{
       
   290 + 	    case SIGNCMD_DEFINE:
       
   291 + 		if (STRNCMP(last, "texthl", p - last) == 0 ||
       
   292 + 		    STRNCMP(last, "linehl", p - last) == 0)
       
   293 + 		    xp->xp_context = EXPAND_HIGHLIGHT;
       
   294 + 		else if (STRNCMP(last, "icon", p - last) == 0)
       
   295 + 		    xp->xp_context = EXPAND_FILES;
       
   296 + 		else
       
   297 + 		    xp->xp_context = EXPAND_NOTHING;
       
   298 + 		break;
       
   299 + 	    case SIGNCMD_PLACE:
       
   300 + 		if (STRNCMP(last, "name", p - last) == 0)
       
   301 + 		    expand_what = EXP_SIGN_NAMES;
       
   302 + 		else
       
   303 + 		    xp->xp_context = EXPAND_NOTHING;
       
   304 + 		break;
       
   305 + 	    default:
       
   306 + 		xp->xp_context = EXPAND_NOTHING;
       
   307 + 	}
       
   308 +     }
       
   309 + }
       
   310 + #endif
       
   311   #endif
       
   312   
       
   313   #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO)
       
   314 *** ../vim-7.2.165/src/ex_docmd.c	Wed Apr 22 16:22:44 2009
       
   315 --- src/ex_docmd.c	Wed Apr 29 17:05:23 2009
       
   316 ***************
       
   317 *** 3695,3700 ****
       
   318 --- 3695,3705 ----
       
   319   	    set_context_in_cscope_cmd(xp, arg, ea.cmdidx);
       
   320   	    break;
       
   321   #endif
       
   322 + #ifdef FEAT_SIGNS
       
   323 + 	case CMD_sign:
       
   324 + 	    set_context_in_sign_cmd(xp, arg);
       
   325 + 	    break;
       
   326 + #endif
       
   327   #ifdef FEAT_LISTCMDS
       
   328   	case CMD_bdelete:
       
   329   	case CMD_bwipeout:
       
   330 ***************
       
   331 *** 5218,5223 ****
       
   332 --- 5223,5231 ----
       
   333       {EXPAND_MENUS, "menu"},
       
   334       {EXPAND_SETTINGS, "option"},
       
   335       {EXPAND_SHELLCMD, "shellcmd"},
       
   336 + #if defined(FEAT_SIGNS)
       
   337 +     {EXPAND_SIGN, "sign"},
       
   338 + #endif
       
   339       {EXPAND_TAGS, "tag"},
       
   340       {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
       
   341       {EXPAND_USER_VARS, "var"},
       
   342 *** ../vim-7.2.165/src/ex_getln.c	Wed Apr 29 12:03:35 2009
       
   343 --- src/ex_getln.c	Wed Apr 29 12:51:42 2009
       
   344 ***************
       
   345 *** 325,331 ****
       
   346   #endif
       
   347   
       
   348   #ifdef FEAT_DIGRAPHS
       
   349 !     do_digraph(-1);		/* init digraph typahead */
       
   350   #endif
       
   351   
       
   352       /*
       
   353 --- 325,331 ----
       
   354   #endif
       
   355   
       
   356   #ifdef FEAT_DIGRAPHS
       
   357 !     do_digraph(-1);		/* init digraph typeahead */
       
   358   #endif
       
   359   
       
   360       /*
       
   361 ***************
       
   362 *** 4521,4526 ****
       
   363 --- 4521,4529 ----
       
   364   #ifdef FEAT_CSCOPE
       
   365   	    {EXPAND_CSCOPE, get_cscope_name, TRUE},
       
   366   #endif
       
   367 + #ifdef FEAT_SIGNS
       
   368 + 	    {EXPAND_SIGN, get_sign_name, TRUE},
       
   369 + #endif
       
   370   #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \
       
   371   	&& (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE))
       
   372   	    {EXPAND_LANGUAGE, get_lang_arg, TRUE},
       
   373 *** ../vim-7.2.165/src/vim.h	Wed Mar 18 12:50:58 2009
       
   374 --- src/vim.h	Wed Apr 29 12:51:42 2009
       
   375 ***************
       
   376 *** 709,714 ****
       
   377 --- 709,715 ----
       
   378   #define EXPAND_USER_LIST	31
       
   379   #define EXPAND_SHELLCMD		32
       
   380   #define EXPAND_CSCOPE		33
       
   381 + #define EXPAND_SIGN		34
       
   382   
       
   383   /* Values for exmode_active (0 is no exmode) */
       
   384   #define EXMODE_NORMAL		1
       
   385 *** ../vim-7.2.165/src/proto/ex_cmds.pro	Tue Feb 24 04:28:40 2009
       
   386 --- src/proto/ex_cmds.pro	Wed Apr 29 17:10:29 2009
       
   387 ***************
       
   388 *** 40,46 ****
       
   389   int read_viminfo_sub_string __ARGS((vir_T *virp, int force));
       
   390   void write_viminfo_sub_string __ARGS((FILE *fp));
       
   391   void free_old_sub __ARGS((void));
       
   392 - void free_signs __ARGS((void));
       
   393   int prepare_tagpreview __ARGS((int undo_sync));
       
   394   void ex_help __ARGS((exarg_T *eap));
       
   395   char_u *check_help_lang __ARGS((char_u *arg));
       
   396 --- 40,45 ----
       
   397 ***************
       
   398 *** 56,60 ****
       
   399 --- 55,62 ----
       
   400   char_u *sign_get_text __ARGS((int typenr));
       
   401   void *sign_get_image __ARGS((int typenr));
       
   402   char_u *sign_typenr2name __ARGS((int typenr));
       
   403 + void free_signs __ARGS((void));
       
   404 + char_u *get_sign_name __ARGS((expand_T *xp, int idx));
       
   405 + void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg));
       
   406   void ex_drop __ARGS((exarg_T *eap));
       
   407   /* vim: set ft=c : */
       
   408 *** ../vim-7.2.165/src/version.c	Wed Apr 29 18:01:23 2009
       
   409 --- src/version.c	Wed Apr 29 18:43:14 2009
       
   410 ***************
       
   411 *** 678,679 ****
       
   412 --- 678,681 ----
       
   413   {   /* Add new patch number below this line */
       
   414 + /**/
       
   415 +     166,
       
   416   /**/
       
   417 
       
   418 -- 
       
   419 Did you ever stop to think...  and forget to start again?
       
   420                                   -- Steven Wright
       
   421 
       
   422  /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
       
   423 ///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
       
   424 \\\        download, build and distribute -- http://www.A-A-P.org        ///
       
   425  \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///