To: vim-dev@vim.org Subject: Patch 7.2.166 Fcc: outbox From: Bram Moolenaar 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}*/ + 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 + * :sign undefine */ + 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 ///