| To: vim-dev@vim.org |
| Subject: Patch 7.2.143 |
| 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.143 |
| Problem: No command line completion for ":cscope" command. |
| Solution: Add the completion for ":cscope". (Dominique Pelle) |
| Files: src/ex_docmd.c, src/ex_getln.c, src/if_cscope.c, |
| src/proto/if_cscope.pro, src/vim.h |
| |
| |
| |
| |
| |
| *** 3683,3688 **** |
| --- 3683,3693 ---- |
| case CMD_highlight: |
| set_context_in_highlight_cmd(xp, arg); |
| break; |
| + #ifdef FEAT_CSCOPE |
| + case CMD_cscope: |
| + set_context_in_cscope_cmd(xp, arg); |
| + break; |
| + #endif |
| #ifdef FEAT_LISTCMDS |
| case CMD_bdelete: |
| case CMD_bwipeout: |
| |
| *** 5187,5192 **** |
| --- 5192,5200 ---- |
| {EXPAND_AUGROUP, "augroup"}, |
| {EXPAND_BUFFERS, "buffer"}, |
| {EXPAND_COMMANDS, "command"}, |
| + #if defined(FEAT_CSCOPE) |
| + {EXPAND_CSCOPE, "cscope"}, |
| + #endif |
| #if defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) |
| {EXPAND_USER_DEFINED, "custom"}, |
| {EXPAND_USER_LIST, "customlist"}, |
| |
| |
| |
| *** 4518,4523 **** |
| --- 4518,4526 ---- |
| {EXPAND_EVENTS, get_event_name, TRUE}, |
| {EXPAND_AUGROUP, get_augroup_name, TRUE}, |
| #endif |
| + #ifdef FEAT_CSCOPE |
| + {EXPAND_CSCOPE, get_cscope_name, TRUE}, |
| + #endif |
| #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \ |
| && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE)) |
| {EXPAND_LANGUAGE, get_lang_arg, TRUE}, |
| |
| |
| |
| *** 93,104 **** |
| (void)EMSG2(_("E560: Usage: cs[cope] %s"), cs_cmds[(int)x].usage); |
| } |
| |
| /* |
| * PRIVATE: do_cscope_general |
| * |
| ! * find the command, print help if invalid, and the then call the |
| ! * corresponding command function, |
| ! * called from do_cscope and do_scscope |
| */ |
| static void |
| do_cscope_general(eap, make_split) |
| --- 93,209 ---- |
| (void)EMSG2(_("E560: Usage: cs[cope] %s"), cs_cmds[(int)x].usage); |
| } |
| |
| + #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
| + |
| + static enum |
| + { |
| + EXP_CSCOPE_SUBCMD, /* expand ":cscope" sub-commands */ |
| + EXP_CSCOPE_FIND, /* expand ":cscope find" arguments */ |
| + EXP_CSCOPE_KILL /* expand ":cscope kill" arguments */ |
| + } expand_what; |
| + |
| + /* |
| + * Function given to ExpandGeneric() to obtain the cscope command |
| + * expansion. |
| + */ |
| + /*ARGSUSED*/ |
| + char_u * |
| + get_cscope_name(xp, idx) |
| + expand_T *xp; |
| + int idx; |
| + { |
| + switch (expand_what) |
| + { |
| + case EXP_CSCOPE_SUBCMD: |
| + /* Complete with sub-commands of ":cscope": |
| + * add, find, help, kill, reset, show */ |
| + return (char_u *)cs_cmds[idx].name; |
| + case EXP_CSCOPE_FIND: |
| + { |
| + const char *query_type[] = |
| + { |
| + "c", "d", "e", "f", "g", "i", "s", "t", NULL |
| + }; |
| + |
| + /* Complete with query type of ":cscope find {query_type}". |
| + * {query_type} can be letters (c, d, ... t) or numbers (0, 1, |
| + * ..., 8) but only complete with letters, since numbers are |
| + * redundant. */ |
| + return (char_u *)query_type[idx]; |
| + } |
| + case EXP_CSCOPE_KILL: |
| + { |
| + int i; |
| + int current_idx = 0; |
| + static char_u connection[2]; |
| + |
| + /* ":cscope kill" accepts connection numbers or partial names of |
| + * the pathname of the cscope database as argument. Only complete |
| + * with connection numbers. -1 can also be used to kill all |
| + * connections. */ |
| + for (i = 0; i < CSCOPE_MAX_CONNECTIONS; i++) |
| + { |
| + if (csinfo[i].fname == NULL) |
| + continue; |
| + if (current_idx++ == idx) |
| + { |
| + /* Connection number fits in one character since |
| + * CSCOPE_MAX_CONNECTIONS is < 10 */ |
| + connection[0] = i + '0'; |
| + connection[1] = NUL; |
| + return connection; |
| + } |
| + } |
| + return (current_idx == idx && idx > 0) ? (char_u *)"-1" : NULL; |
| + } |
| + default: |
| + return NULL; |
| + } |
| + } |
| + |
| + /* |
| + * Handle command line completion for :cscope command. |
| + */ |
| + void |
| + set_context_in_cscope_cmd(xp, arg) |
| + expand_T *xp; |
| + char_u *arg; |
| + { |
| + char_u *p; |
| + |
| + /* Default: expand subcommands */ |
| + xp->xp_context = EXPAND_CSCOPE; |
| + expand_what = EXP_CSCOPE_SUBCMD; |
| + xp->xp_pattern = arg; |
| + |
| + /* (part of) subcommand already typed */ |
| + if (*arg != NUL) |
| + { |
| + p = skiptowhite(arg); |
| + if (*p != NUL) /* past first word */ |
| + { |
| + xp->xp_pattern = skipwhite(p); |
| + if (*skiptowhite(xp->xp_pattern) != NUL) |
| + xp->xp_context = EXPAND_NOTHING; |
| + else if (STRNICMP(arg, "add", p - arg) == 0) |
| + xp->xp_context = EXPAND_FILES; |
| + else if (STRNICMP(arg, "kill", p - arg) == 0) |
| + expand_what = EXP_CSCOPE_KILL; |
| + else if (STRNICMP(arg, "find", p - arg) == 0) |
| + expand_what = EXP_CSCOPE_FIND; |
| + else |
| + xp->xp_context = EXPAND_NOTHING; |
| + } |
| + } |
| + } |
| + |
| + #endif /* FEAT_CMDL_COMPL */ |
| + |
| /* |
| * PRIVATE: do_cscope_general |
| * |
| ! * Find the command, print help if invalid, and then call the corresponding |
| ! * command function. |
| */ |
| static void |
| do_cscope_general(eap, make_split) |
| |
| |
| |
| *** 1,4 **** |
| --- 1,6 ---- |
| /* if_cscope.c */ |
| + char_u *get_cscope_name __ARGS((expand_T *xp, int idx)); |
| + void set_context_in_cscope_cmd __ARGS((expand_T *xp, char_u *arg)); |
| void do_cscope __ARGS((exarg_T *eap)); |
| void do_scscope __ARGS((exarg_T *eap)); |
| void do_cstag __ARGS((exarg_T *eap)); |
| |
| |
| |
| *** 708,713 **** |
| --- 708,714 ---- |
| #define EXPAND_USER_DEFINED 30 |
| #define EXPAND_USER_LIST 31 |
| #define EXPAND_SHELLCMD 32 |
| + #define EXPAND_CSCOPE 33 |
| |
| /* Values for exmode_active (0 is no exmode) */ |
| #define EXMODE_NORMAL 1 |
| |
| |
| |
| *** 678,679 **** |
| --- 678,681 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 143, |
| /**/ |
| |
| -- |
| hundred-and-one symptoms of being an internet addict: |
| 234. You started college as a chemistry major, and walk out four years |
| later as an Internet provider. |
| |
| /// 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 /// |