Patch 7.2.166
Problem:    No completion for ":sign" command.
Solution:   Add ":sign" completion. (Dominique Pelle)
Files:      src/ex_cmds.c, src/ex_docmd.c, src/ex_getln.c, src/vim.h,
            src/proto/ex_cmds.pro


*** ../vim-7.2.165/src/ex_cmds.c        Tue Feb 24 04:28:40 2009
--- src/ex_cmds.c       Wed Apr 29 17:08:27 2009
***************
*** 6543,6562 ****
  static void sign_list_defined __ARGS((sign_T *sp));
  static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
  
! /*
!  * ":sign" command
!  */
!     void
! ex_sign(eap)
!     exarg_T   *eap;
! {
!     char_u    *arg = eap->arg;
!     char_u    *p;
!     int               idx;
!     sign_T    *sp;
!     sign_T    *sp_prev;
!     buf_T     *buf;
!     static char       *cmds[] = {
                        "define",
  #define SIGNCMD_DEFINE        0
                        "undefine",
--- 6543,6549 ----
  static void sign_list_defined __ARGS((sign_T *sp));
  static void sign_undefine __ARGS((sign_T *sp, sign_T *sp_prev));
  
! static char *cmds[] = {
                        "define",
  #define SIGNCMD_DEFINE        0
                        "undefine",
***************
*** 6569,6590 ****
  #define SIGNCMD_UNPLACE       4
                        "jump",
  #define SIGNCMD_JUMP  5
  #define SIGNCMD_LAST  6
!     };
  
      /* Parse the subcommand. */
      p = skiptowhite(arg);
!     if (*p != NUL)
!       *p++ = NUL;
!     for (idx = 0; ; ++idx)
      {
!       if (idx == SIGNCMD_LAST)
!       {
!           EMSG2(_("E160: Unknown sign command: %s"), arg);
!           return;
!       }
!       if (STRCMP(arg, cmds[idx]) == 0)
!           break;
      }
      arg = skipwhite(p);
  
--- 6556,6606 ----
  #define SIGNCMD_UNPLACE       4
                        "jump",
  #define SIGNCMD_JUMP  5
+                       NULL
  #define SIGNCMD_LAST  6
! };
! 
! /*
!  * Find index of a ":sign" subcmd from its name.
!  * "*end_cmd" must be writable.
!  */
!     static int
! sign_cmd_idx(begin_cmd, end_cmd)
!     char      *begin_cmd;     /* begin of sign subcmd */
!     char      *end_cmd;       /* just after sign subcmd */
! {
!     int               idx;
!     char      save = *end_cmd;
! 
!     *end_cmd = NUL;
!     for (idx = 0; ; ++idx)
!       if (cmds[idx] == NULL || STRCMP(begin_cmd, cmds[idx]) == 0)
!           break;
!     *end_cmd = save;
!     return idx;
! }
! 
! /*
!  * ":sign" command
!  */
!     void
! ex_sign(eap)
!     exarg_T   *eap;
! {
!     char_u    *arg = eap->arg;
!     char_u    *p;
!     int               idx;
!     sign_T    *sp;
!     sign_T    *sp_prev;
!     buf_T     *buf;
  
      /* Parse the subcommand. */
      p = skiptowhite(arg);
!     idx = sign_cmd_idx(arg, p);
!     if (idx == SIGNCMD_LAST)
      {
!       EMSG2(_("E160: Unknown sign command: %s"), arg);
!       return;
      }
      arg = skipwhite(p);
  
***************
*** 7110,7115 ****
--- 7126,7311 ----
  }
  #endif
  
+ #if defined(FEAT_CMDL_COMPL) || defined(PROTO)
+ static enum
+ {
+     EXP_SUBCMD,               /* expand :sign sub-commands */
+     EXP_DEFINE,               /* expand :sign define {name} args */
+     EXP_PLACE,                /* expand :sign place {id} args */
+     EXP_UNPLACE,      /* expand :sign unplace" */
+     EXP_SIGN_NAMES    /* expand with name of placed signs */
+ } expand_what;
+ 
+ /*
+  * Function given to ExpandGeneric() to obtain the sign command
+  * expansion.
+  */
+ /*ARGSUSED*/
+     char_u *
+ get_sign_name(xp, idx)
+     expand_T  *xp;
+     int               idx;
+ {
+     sign_T    *sp;
+     int               current_idx;
+ 
+     switch (expand_what)
+     {
+     case EXP_SUBCMD:
+       return (char_u *)cmds[idx];
+     case EXP_DEFINE:
+       {
+           char *define_arg[] =
+           {
+               "icon=", "linehl=", "text=", "texthl=", NULL
+           };
+           return (char_u *)define_arg[idx];
+       }
+     case EXP_PLACE:
+       {
+           char *place_arg[] =
+           {
+               "line=", "name=", "file=", "buffer=", NULL
+           };
+           return (char_u *)place_arg[idx];
+       }
+     case EXP_UNPLACE:
+       {
+           char *unplace_arg[] = { "file=", "buffer=", NULL };
+           return (char_u *)unplace_arg[idx];
+       }
+     case EXP_SIGN_NAMES:
+       /* Complete with name of signs already defined */
+       current_idx = 0;
+       for (sp = first_sign; sp != NULL; sp = sp->sn_next)
+           if (current_idx++ == idx)
+               return sp->sn_name;
+       return NULL;
+     default:
+       return NULL;
+     }
+ }
+ 
+ /*
+  * Handle command line completion for :sign command.
+  */
+     void
+ set_context_in_sign_cmd(xp, arg)
+     expand_T  *xp;
+     char_u    *arg;
+ {
+     char_u    *p;
+     char_u    *end_subcmd;
+     char_u    *last;
+     int               cmd_idx;
+     char_u    *begin_subcmd_args;
+ 
+     /* Default: expand subcommands. */
+     xp->xp_context = EXPAND_SIGN;
+     expand_what = EXP_SUBCMD;
+     xp->xp_pattern = arg;
+ 
+     end_subcmd = skiptowhite(arg);
+     if (*end_subcmd == NUL)
+       /* expand subcmd name
+        * :sign {subcmd}<CTRL-D>*/
+       return;
+ 
+     cmd_idx = sign_cmd_idx(arg, end_subcmd);
+ 
+     /* :sign {subcmd} {subcmd_args}
+      *                |
+      *                begin_subcmd_args */
+     begin_subcmd_args = skipwhite(end_subcmd);
+     p = skiptowhite(begin_subcmd_args);
+     if (*p == NUL)
+     {
+       /*
+        * Expand first argument of subcmd when possible.
+        * For ":jump {id}" and ":unplace {id}", we could
+        * possibly expand the ids of all signs already placed.
+        */
+       xp->xp_pattern = begin_subcmd_args;
+       switch (cmd_idx)
+       {
+           case SIGNCMD_LIST:
+           case SIGNCMD_UNDEFINE:
+               /* :sign list <CTRL-D>
+                * :sign undefine <CTRL-D> */
+               expand_what = EXP_SIGN_NAMES;
+               break;
+           default:
+               xp->xp_context = EXPAND_NOTHING;
+       }
+       return;
+     }
+ 
+     /* expand last argument of subcmd */
+ 
+     /* :sign define {name} {args}...
+      *              |
+      *              p */
+ 
+     /* Loop until reaching last argument. */
+     do
+     {
+       p = skipwhite(p);
+       last = p;
+       p = skiptowhite(p);
+     } while (*p != NUL);
+ 
+     p = vim_strchr(last, '=');
+ 
+     /* :sign define {name} {args}... {last}=
+      *                               |     |
+      *                            last     p */
+     if (p == NUL)
+     {
+       /* Expand last argument name (before equal sign). */
+       xp->xp_pattern = last;
+       switch (cmd_idx)
+       {
+           case SIGNCMD_DEFINE:
+               expand_what = EXP_DEFINE;
+               break;
+           case SIGNCMD_PLACE:
+               expand_what = EXP_PLACE;
+               break;
+           case SIGNCMD_JUMP:
+           case SIGNCMD_UNPLACE:
+               expand_what = EXP_UNPLACE;
+               break;
+           default:
+               xp->xp_context = EXPAND_NOTHING;
+       }
+     }
+     else
+     {
+       /* Expand last argument value (after equal sign). */
+       xp->xp_pattern = p + 1;
+       switch (cmd_idx)
+       {
+           case SIGNCMD_DEFINE:
+               if (STRNCMP(last, "texthl", p - last) == 0 ||
+                   STRNCMP(last, "linehl", p - last) == 0)
+                   xp->xp_context = EXPAND_HIGHLIGHT;
+               else if (STRNCMP(last, "icon", p - last) == 0)
+                   xp->xp_context = EXPAND_FILES;
+               else
+                   xp->xp_context = EXPAND_NOTHING;
+               break;
+           case SIGNCMD_PLACE:
+               if (STRNCMP(last, "name", p - last) == 0)
+                   expand_what = EXP_SIGN_NAMES;
+               else
+                   xp->xp_context = EXPAND_NOTHING;
+               break;
+           default:
+               xp->xp_context = EXPAND_NOTHING;
+       }
+     }
+ }
+ #endif
  #endif
  
  #if defined(FEAT_GUI) || defined(FEAT_CLIENTSERVER) || defined(PROTO)
*** ../vim-7.2.165/src/ex_docmd.c       Wed Apr 22 16:22:44 2009
--- src/ex_docmd.c      Wed Apr 29 17:05:23 2009
***************
*** 3695,3700 ****
--- 3695,3705 ----
            set_context_in_cscope_cmd(xp, arg, ea.cmdidx);
            break;
  #endif
+ #ifdef FEAT_SIGNS
+       case CMD_sign:
+           set_context_in_sign_cmd(xp, arg);
+           break;
+ #endif
  #ifdef FEAT_LISTCMDS
        case CMD_bdelete:
        case CMD_bwipeout:
***************
*** 5218,5223 ****
--- 5223,5231 ----
      {EXPAND_MENUS, "menu"},
      {EXPAND_SETTINGS, "option"},
      {EXPAND_SHELLCMD, "shellcmd"},
+ #if defined(FEAT_SIGNS)
+     {EXPAND_SIGN, "sign"},
+ #endif
      {EXPAND_TAGS, "tag"},
      {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
      {EXPAND_USER_VARS, "var"},
*** ../vim-7.2.165/src/ex_getln.c       Wed Apr 29 12:03:35 2009
--- src/ex_getln.c      Wed Apr 29 12:51:42 2009
***************
*** 325,331 ****
  #endif
  
  #ifdef FEAT_DIGRAPHS
!     do_digraph(-1);           /* init digraph typahead */
  #endif
  
      /*
--- 325,331 ----
  #endif
  
  #ifdef FEAT_DIGRAPHS
!     do_digraph(-1);           /* init digraph typeahead */
  #endif
  
      /*
***************
*** 4521,4526 ****
--- 4521,4529 ----
  #ifdef FEAT_CSCOPE
            {EXPAND_CSCOPE, get_cscope_name, TRUE},
  #endif
+ #ifdef FEAT_SIGNS
+           {EXPAND_SIGN, get_sign_name, TRUE},
+ #endif
  #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \
        && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE))
            {EXPAND_LANGUAGE, get_lang_arg, TRUE},
*** ../vim-7.2.165/src/vim.h    Wed Mar 18 12:50:58 2009
--- src/vim.h   Wed Apr 29 12:51:42 2009
***************
*** 709,714 ****
--- 709,715 ----
  #define EXPAND_USER_LIST      31
  #define EXPAND_SHELLCMD               32
  #define EXPAND_CSCOPE         33
+ #define EXPAND_SIGN           34
  
  /* Values for exmode_active (0 is no exmode) */
  #define EXMODE_NORMAL         1
*** ../vim-7.2.165/src/proto/ex_cmds.pro        Tue Feb 24 04:28:40 2009
--- src/proto/ex_cmds.pro       Wed Apr 29 17:10:29 2009
***************
*** 40,46 ****
  int read_viminfo_sub_string __ARGS((vir_T *virp, int force));
  void write_viminfo_sub_string __ARGS((FILE *fp));
  void free_old_sub __ARGS((void));
- void free_signs __ARGS((void));
  int prepare_tagpreview __ARGS((int undo_sync));
  void ex_help __ARGS((exarg_T *eap));
  char_u *check_help_lang __ARGS((char_u *arg));
--- 40,45 ----
***************
*** 56,60 ****
--- 55,62 ----
  char_u *sign_get_text __ARGS((int typenr));
  void *sign_get_image __ARGS((int typenr));
  char_u *sign_typenr2name __ARGS((int typenr));
+ void free_signs __ARGS((void));
+ char_u *get_sign_name __ARGS((expand_T *xp, int idx));
+ void set_context_in_sign_cmd __ARGS((expand_T *xp, char_u *arg));
  void ex_drop __ARGS((exarg_T *eap));
  /* vim: set ft=c : */
*** ../vim-7.2.165/src/version.c        Wed Apr 29 18:01:23 2009
--- src/version.c       Wed Apr 29 18:43:14 2009
***************
*** 678,679 ****
--- 678,681 ----
  {   /* Add new patch number below this line */
+ /**/
+     166,
  /**/

-- 
Did you ever stop to think...  and forget to start again?
                                  -- Steven Wright

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui