To: vim-dev@vim.org
Subject: Patch 7.2.166
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
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 -- Bram@Moolenaar.net -- 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 ///