annotate src/usercmd.c @ 28154:ae975c8d5438 v8.2.4601

patch 8.2.4601: Vim9: not enough test coverage for executing :def function Commit: https://github.com/vim/vim/commit/efd73ae5d2a533670f562b6df5be2ffeb091185d Author: Bram Moolenaar <Bram@vim.org> Date: Sun Mar 20 18:51:00 2022 +0000 patch 8.2.4601: Vim9: not enough test coverage for executing :def function Problem: Vim9: not enough test coverage for executing :def function. Solution: Add a few more tests.
author Bram Moolenaar <Bram@vim.org>
date Sun, 20 Mar 2022 20:00:03 +0100
parents b737bfa876c5
children 2961a18f9cbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1 /* vi:set ts=8 sts=4 sw=4 noet:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
2 *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
3 * VIM - Vi IMproved by Bram Moolenaar
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
4 *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
5 * Do ":help uganda" in Vim to read copying and usage conditions.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
6 * Do ":help credits" in Vim to see a list of people who contributed.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
7 * See README.txt for an overview of the Vim source code.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
8 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
9
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
10 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
11 * usercmd.c: User defined command support
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
12 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
13
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
14 #include "vim.h"
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
15
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
16 typedef struct ucmd
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
17 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
18 char_u *uc_name; // The command name
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
19 long_u uc_argt; // The argument type
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
20 char_u *uc_rep; // The command's replacement string
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
21 long uc_def; // The default value for a range/count
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
22 int uc_compl; // completion type
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
23 cmd_addr_T uc_addr_type; // The command's address type
23390
9a5f12b36273 patch 8.2.2238: Vim9: cannot load a Vim9 script without the +eval feature
Bram Moolenaar <Bram@vim.org>
parents: 22715
diff changeset
24 sctx_T uc_script_ctx; // SCTX where the command was defined
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
25 # ifdef FEAT_EVAL
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
26 char_u *uc_compl_arg; // completion argument if any
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
27 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
28 } ucmd_T;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
29
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
30 // List of all user commands.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
31 static garray_T ucmds = {0, 0, sizeof(ucmd_T), 4, NULL};
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
32
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
33 #define USER_CMD(i) (&((ucmd_T *)(ucmds.ga_data))[i])
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
34 #define USER_CMD_GA(gap, i) (&((ucmd_T *)((gap)->ga_data))[i])
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
35
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
36 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
37 * List of names for completion for ":command" with the EXPAND_ flag.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
38 * Must be alphabetical for completion.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
39 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
40 static struct
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
41 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
42 int expand;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
43 char *name;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
44 } command_complete[] =
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
45 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
46 {EXPAND_ARGLIST, "arglist"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
47 {EXPAND_AUGROUP, "augroup"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
48 {EXPAND_BEHAVE, "behave"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
49 {EXPAND_BUFFERS, "buffer"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
50 {EXPAND_COLORS, "color"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
51 {EXPAND_COMMANDS, "command"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
52 {EXPAND_COMPILER, "compiler"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
53 #if defined(FEAT_CSCOPE)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
54 {EXPAND_CSCOPE, "cscope"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
55 #endif
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
56 #if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
57 {EXPAND_USER_DEFINED, "custom"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
58 {EXPAND_USER_LIST, "customlist"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
59 #endif
18987
e378907d79bf patch 8.2.0054: :diffget and :diffput don't have good completion
Bram Moolenaar <Bram@vim.org>
parents: 18816
diff changeset
60 {EXPAND_DIFF_BUFFERS, "diff_buffer"},
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
61 {EXPAND_DIRECTORIES, "dir"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
62 {EXPAND_ENV_VARS, "environment"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
63 {EXPAND_EVENTS, "event"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
64 {EXPAND_EXPRESSION, "expression"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
65 {EXPAND_FILES, "file"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
66 {EXPAND_FILES_IN_PATH, "file_in_path"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
67 {EXPAND_FILETYPE, "filetype"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
68 {EXPAND_FUNCTIONS, "function"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
69 {EXPAND_HELP, "help"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
70 {EXPAND_HIGHLIGHT, "highlight"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
71 {EXPAND_HISTORY, "history"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
72 #if defined(HAVE_LOCALE_H) || defined(X_LOCALE)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
73 {EXPAND_LOCALES, "locale"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
74 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
75 {EXPAND_MAPCLEAR, "mapclear"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
76 {EXPAND_MAPPINGS, "mapping"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
77 {EXPAND_MENUS, "menu"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
78 {EXPAND_MESSAGES, "messages"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
79 {EXPAND_OWNSYNTAX, "syntax"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
80 #if defined(FEAT_PROFILE)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
81 {EXPAND_SYNTIME, "syntime"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
82 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
83 {EXPAND_SETTINGS, "option"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
84 {EXPAND_PACKADD, "packadd"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
85 {EXPAND_SHELLCMD, "shellcmd"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
86 #if defined(FEAT_SIGNS)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
87 {EXPAND_SIGN, "sign"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
88 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
89 {EXPAND_TAGS, "tag"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
90 {EXPAND_TAGS_LISTFILES, "tag_listfiles"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
91 {EXPAND_USER, "user"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
92 {EXPAND_USER_VARS, "var"},
28081
b737bfa876c5 patch 8.2.4565: no command line completion for :breakadd and :breakdel
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
93 #if defined(FEAT_EVAL)
b737bfa876c5 patch 8.2.4565: no command line completion for :breakadd and :breakdel
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
94 {EXPAND_BREAKPOINT, "breakpoint"},
b737bfa876c5 patch 8.2.4565: no command line completion for :breakadd and :breakdel
Bram Moolenaar <Bram@vim.org>
parents: 27805
diff changeset
95 #endif
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
96 {0, NULL}
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
97 };
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
98
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
99 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
100 * List of names of address types. Must be alphabetical for completion.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
101 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
102 static struct
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
103 {
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
104 cmd_addr_T expand;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
105 char *name;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
106 char *shortname;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
107 } addr_type_complete[] =
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
108 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
109 {ADDR_ARGUMENTS, "arguments", "arg"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
110 {ADDR_LINES, "lines", "line"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
111 {ADDR_LOADED_BUFFERS, "loaded_buffers", "load"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
112 {ADDR_TABS, "tabs", "tab"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
113 {ADDR_BUFFERS, "buffers", "buf"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
114 {ADDR_WINDOWS, "windows", "win"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
115 {ADDR_QUICKFIX, "quickfix", "qf"},
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
116 {ADDR_OTHER, "other", "?"},
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
117 {ADDR_NONE, NULL, NULL}
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
118 };
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
119
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
120 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
121 * Search for a user command that matches "eap->cmd".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
122 * Return cmdidx in "eap->cmdidx", flags in "eap->argt", idx in "eap->useridx".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
123 * Return a pointer to just after the command.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
124 * Return NULL if there is no matching command.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
125 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
126 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
127 find_ucmd(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
128 exarg_T *eap,
27179
c4b94533559e patch 8.2.4118: using UNUSED for argument that is used
Bram Moolenaar <Bram@vim.org>
parents: 27028
diff changeset
129 char_u *p, // end of the command (possibly including count)
c4b94533559e patch 8.2.4118: using UNUSED for argument that is used
Bram Moolenaar <Bram@vim.org>
parents: 27028
diff changeset
130 int *full, // set to TRUE for a full match
c4b94533559e patch 8.2.4118: using UNUSED for argument that is used
Bram Moolenaar <Bram@vim.org>
parents: 27028
diff changeset
131 expand_T *xp, // used for completion, NULL otherwise
c4b94533559e patch 8.2.4118: using UNUSED for argument that is used
Bram Moolenaar <Bram@vim.org>
parents: 27028
diff changeset
132 int *complp) // completion flags or NULL
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
133 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
134 int len = (int)(p - eap->cmd);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
135 int j, k, matchlen = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
136 ucmd_T *uc;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
137 int found = FALSE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
138 int possible = FALSE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
139 char_u *cp, *np; // Point into typed cmd and test name
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
140 garray_T *gap;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
141 int amb_local = FALSE; // Found ambiguous buffer-local command,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
142 // only full match global is accepted.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
143
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
144 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
145 * Look for buffer-local user commands first, then global ones.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
146 */
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27778
diff changeset
147 gap = &prevwin_curwin()->w_buffer->b_ucmds;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
148 for (;;)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
149 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
150 for (j = 0; j < gap->ga_len; ++j)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
151 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
152 uc = USER_CMD_GA(gap, j);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
153 cp = eap->cmd;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
154 np = uc->uc_name;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
155 k = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
156 while (k < len && *np != NUL && *cp++ == *np++)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
157 k++;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
158 if (k == len || (*np == NUL && vim_isdigit(eap->cmd[k])))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
159 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
160 // If finding a second match, the command is ambiguous. But
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
161 // not if a buffer-local command wasn't a full match and a
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
162 // global command is a full match.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
163 if (k == len && found && *np != NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
164 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
165 if (gap == &ucmds)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
166 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
167 amb_local = TRUE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
168 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
169
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
170 if (!found || (k == len && *np == NUL))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
171 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
172 // If we matched up to a digit, then there could
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
173 // be another command including the digit that we
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
174 // should use instead.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
175 if (k == len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
176 found = TRUE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
177 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
178 possible = TRUE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
179
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
180 if (gap == &ucmds)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
181 eap->cmdidx = CMD_USER;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
182 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
183 eap->cmdidx = CMD_USER_BUF;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
184 eap->argt = (long)uc->uc_argt;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
185 eap->useridx = j;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
186 eap->addr_type = uc->uc_addr_type;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
187
16466
a2befc9b3729 patch 8.1.1237: error for using "compl", reserved word in C++
Bram Moolenaar <Bram@vim.org>
parents: 16411
diff changeset
188 if (complp != NULL)
a2befc9b3729 patch 8.1.1237: error for using "compl", reserved word in C++
Bram Moolenaar <Bram@vim.org>
parents: 16411
diff changeset
189 *complp = uc->uc_compl;
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
190 # ifdef FEAT_EVAL
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
191 if (xp != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
192 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
193 xp->xp_arg = uc->uc_compl_arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
194 xp->xp_script_ctx = uc->uc_script_ctx;
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18987
diff changeset
195 xp->xp_script_ctx.sc_lnum += SOURCING_LNUM;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
196 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
197 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
198 // Do not search for further abbreviations
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
199 // if this is an exact match.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
200 matchlen = k;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
201 if (k == len && *np == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
202 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
203 if (full != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
204 *full = TRUE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
205 amb_local = FALSE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
206 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
207 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
208 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
209 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
210 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
211
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
212 // Stop if we found a full match or searched all.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
213 if (j < gap->ga_len || gap == &ucmds)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
214 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
215 gap = &ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
216 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
217
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
218 // Only found ambiguous matches.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
219 if (amb_local)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
220 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
221 if (xp != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
222 xp->xp_context = EXPAND_UNSUCCESSFUL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
223 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
224 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
225
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
226 // The match we found may be followed immediately by a number. Move "p"
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
227 // back to point to it.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
228 if (found || possible)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
229 return p + (matchlen - len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
230 return p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
231 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
232
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
233 /*
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
234 * Set completion context for :command
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
235 */
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
236 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
237 set_context_in_user_cmd(expand_T *xp, char_u *arg_in)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
238 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
239 char_u *arg = arg_in;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
240 char_u *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
241
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
242 // Check for attributes
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
243 while (*arg == '-')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
244 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
245 arg++; // Skip "-"
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
246 p = skiptowhite(arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
247 if (*p == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
248 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
249 // Cursor is still in the attribute
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
250 p = vim_strchr(arg, '=');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
251 if (p == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
252 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
253 // No "=", so complete attribute names
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
254 xp->xp_context = EXPAND_USER_CMD_FLAGS;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
255 xp->xp_pattern = arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
256 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
257 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
258
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
259 // For the -complete, -nargs and -addr attributes, we complete
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
260 // their arguments as well.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
261 if (STRNICMP(arg, "complete", p - arg) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
262 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
263 xp->xp_context = EXPAND_USER_COMPLETE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
264 xp->xp_pattern = p + 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
265 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
266 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
267 else if (STRNICMP(arg, "nargs", p - arg) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
268 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
269 xp->xp_context = EXPAND_USER_NARGS;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
270 xp->xp_pattern = p + 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
271 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
272 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
273 else if (STRNICMP(arg, "addr", p - arg) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
274 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
275 xp->xp_context = EXPAND_USER_ADDR_TYPE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
276 xp->xp_pattern = p + 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
277 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
278 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
279 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
280 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
281 arg = skipwhite(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
282 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
283
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
284 // After the attributes comes the new command name
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
285 p = skiptowhite(arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
286 if (*p == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
287 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
288 xp->xp_context = EXPAND_USER_COMMANDS;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
289 xp->xp_pattern = arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
290 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
291 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
292
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
293 // And finally comes a normal command
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
294 return skipwhite(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
295 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
296
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
297 /*
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
298 * Set the completion context for the argument of a user defined command.
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
299 */
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
300 char_u *
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
301 set_context_in_user_cmdarg(
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
302 char_u *cmd UNUSED,
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
303 char_u *arg,
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
304 long argt,
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
305 int context,
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
306 expand_T *xp,
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
307 int forceit)
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
308 {
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
309 char_u *p;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
310
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
311 if (context == EXPAND_NOTHING)
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
312 return NULL;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
313
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
314 if (argt & EX_XFILE)
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
315 {
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
316 // EX_XFILE: file names are handled before this call
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
317 xp->xp_context = context;
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
318 return NULL;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
319 }
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
320
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
321 #ifdef FEAT_MENU
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
322 if (context == EXPAND_MENUS)
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
323 return set_context_in_menu_cmd(xp, cmd, arg, forceit);
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
324 #endif
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
325 if (context == EXPAND_COMMANDS)
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
326 return arg;
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
327 if (context == EXPAND_MAPPINGS)
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
328 return set_context_in_map_cmd(xp, (char_u *)"map", arg, forceit, FALSE,
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
329 FALSE, CMD_map);
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
330 // Find start of last argument.
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
331 p = arg;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
332 while (*p)
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
333 {
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
334 if (*p == ' ')
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
335 // argument starts after a space
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
336 arg = p + 1;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
337 else if (*p == '\\' && *(p + 1) != NUL)
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
338 ++p; // skip over escaped character
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
339 MB_PTR_ADV(p);
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
340 }
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
341 xp->xp_pattern = arg;
27778
858002fef4b7 patch 8.2.4415: function argument name conflicts with C++ keyword
Bram Moolenaar <Bram@vim.org>
parents: 27744
diff changeset
342 xp->xp_context = context;
27744
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
343
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
344 return NULL;
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
345 }
515ce8e07bf2 patch 8.2.4398: some command completion functions are too long
Bram Moolenaar <Bram@vim.org>
parents: 27197
diff changeset
346
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
347 char_u *
25757
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
348 expand_user_command_name(int idx)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
349 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
350 return get_user_commands(NULL, idx - (int)CMD_SIZE);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
351 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
352
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
353 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
354 * Function given to ExpandGeneric() to obtain the list of user command names.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
355 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
356 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
357 get_user_commands(expand_T *xp UNUSED, int idx)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
358 {
17468
fa6c9047ec70 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands
Bram Moolenaar <Bram@vim.org>
parents: 17336
diff changeset
359 // In cmdwin, the alternative buffer should be used.
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27778
diff changeset
360 buf_T *buf = prevwin_curwin()->w_buffer;
17468
fa6c9047ec70 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands
Bram Moolenaar <Bram@vim.org>
parents: 17336
diff changeset
361
fa6c9047ec70 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands
Bram Moolenaar <Bram@vim.org>
parents: 17336
diff changeset
362 if (idx < buf->b_ucmds.ga_len)
fa6c9047ec70 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands
Bram Moolenaar <Bram@vim.org>
parents: 17336
diff changeset
363 return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name;
fa6c9047ec70 patch 8.1.1732: completion in cmdwin does not work for buffer-local commands
Bram Moolenaar <Bram@vim.org>
parents: 17336
diff changeset
364 idx -= buf->b_ucmds.ga_len;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
365 if (idx < ucmds.ga_len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
366 return USER_CMD(idx)->uc_name;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
367 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
368 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
369
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26986
diff changeset
370 #ifdef FEAT_EVAL
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
371 /*
25757
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
372 * Get the name of user command "idx". "cmdidx" can be CMD_USER or
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
373 * CMD_USER_BUF.
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
374 * Returns NULL if the command is not found.
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
375 */
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
376 char_u *
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
377 get_user_command_name(int idx, int cmdidx)
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
378 {
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
379 if (cmdidx == CMD_USER && idx < ucmds.ga_len)
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
380 return USER_CMD(idx)->uc_name;
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
381 if (cmdidx == CMD_USER_BUF)
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
382 {
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
383 // In cmdwin, the alternative buffer should be used.
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27778
diff changeset
384 buf_T *buf = prevwin_curwin()->w_buffer;
25757
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
385
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
386 if (idx < buf->b_ucmds.ga_len)
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
387 return USER_CMD_GA(&buf->b_ucmds, idx)->uc_name;
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
388 }
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
389 return NULL;
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
390 }
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26986
diff changeset
391 #endif
25757
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
392
589226a5f317 patch 8.2.3414: fullcommand() gives wrong name with buffer-local user command
Bram Moolenaar <Bram@vim.org>
parents: 25491
diff changeset
393 /*
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
394 * Function given to ExpandGeneric() to obtain the list of user address type
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
395 * names.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
396 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
397 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
398 get_user_cmd_addr_type(expand_T *xp UNUSED, int idx)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
399 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
400 return (char_u *)addr_type_complete[idx].name;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
401 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
402
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
403 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
404 * Function given to ExpandGeneric() to obtain the list of user command
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
405 * attributes.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
406 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
407 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
408 get_user_cmd_flags(expand_T *xp UNUSED, int idx)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
409 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
410 static char *user_cmd_flags[] = {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
411 "addr", "bang", "bar", "buffer", "complete",
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
412 "count", "nargs", "range", "register", "keepscript"
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
413 };
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
414
24768
7334bf933510 patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents: 23390
diff changeset
415 if (idx >= (int)ARRAY_LENGTH(user_cmd_flags))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
416 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
417 return (char_u *)user_cmd_flags[idx];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
418 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
419
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
420 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
421 * Function given to ExpandGeneric() to obtain the list of values for -nargs.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
422 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
423 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
424 get_user_cmd_nargs(expand_T *xp UNUSED, int idx)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
425 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
426 static char *user_cmd_nargs[] = {"0", "1", "*", "?", "+"};
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
427
24768
7334bf933510 patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents: 23390
diff changeset
428 if (idx >= (int)ARRAY_LENGTH(user_cmd_nargs))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
429 return NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
430 return (char_u *)user_cmd_nargs[idx];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
431 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
432
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
433 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
434 * Function given to ExpandGeneric() to obtain the list of values for
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
435 * -complete.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
436 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
437 char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
438 get_user_cmd_complete(expand_T *xp UNUSED, int idx)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
439 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
440 return (char_u *)command_complete[idx].name;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
441 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
442
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26986
diff changeset
443 #ifdef FEAT_EVAL
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
444 int
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
445 cmdcomplete_str_to_type(char_u *complete_str)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
446 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
447 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
448
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
449 for (i = 0; command_complete[i].expand != 0; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
450 if (STRCMP(complete_str, command_complete[i].name) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
451 return command_complete[i].expand;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
452
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
453 return EXPAND_NOTHING;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
454 }
27018
268f6a3511df patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents: 26986
diff changeset
455 #endif
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
456
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
457 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
458 * List user commands starting with "name[name_len]".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
459 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
460 static void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
461 uc_list(char_u *name, size_t name_len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
462 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
463 int i, j;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
464 int found = FALSE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
465 ucmd_T *cmd;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
466 int len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
467 int over;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
468 long a;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
469 garray_T *gap;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
470
18816
15539899a112 patch 8.1.2396: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents: 18301
diff changeset
471 // In cmdwin, the alternative buffer should be used.
27805
afbe86e8b24a patch 8.2.4428: crash when switching tabpage while in the cmdline window
Bram Moolenaar <Bram@vim.org>
parents: 27778
diff changeset
472 gap = &prevwin_curwin()->w_buffer->b_ucmds;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
473 for (;;)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
474 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
475 for (i = 0; i < gap->ga_len; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
476 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
477 cmd = USER_CMD_GA(gap, i);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
478 a = (long)cmd->uc_argt;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
479
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
480 // Skip commands which don't match the requested prefix and
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
481 // commands filtered out.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
482 if (STRNCMP(name, cmd->uc_name, name_len) != 0
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
483 || message_filtered(cmd->uc_name))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
484 continue;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
485
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
486 // Put out the title first time
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
487 if (!found)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
488 msg_puts_title(_("\n Name Args Address Complete Definition"));
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
489 found = TRUE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
490 msg_putchar('\n');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
491 if (got_int)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
492 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
493
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
494 // Special cases
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
495 len = 4;
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
496 if (a & EX_BANG)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
497 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
498 msg_putchar('!');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
499 --len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
500 }
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
501 if (a & EX_REGSTR)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
502 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
503 msg_putchar('"');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
504 --len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
505 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
506 if (gap != &ucmds)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
507 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
508 msg_putchar('b');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
509 --len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
510 }
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
511 if (a & EX_TRLBAR)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
512 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
513 msg_putchar('|');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
514 --len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
515 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
516 while (len-- > 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
517 msg_putchar(' ');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
518
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
519 msg_outtrans_attr(cmd->uc_name, HL_ATTR(HLF_D));
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
520 len = (int)STRLEN(cmd->uc_name) + 4;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
521
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
522 do {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
523 msg_putchar(' ');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
524 ++len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
525 } while (len < 22);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
526
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
527 // "over" is how much longer the name is than the column width for
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
528 // the name, we'll try to align what comes after.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
529 over = len - 22;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
530 len = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
531
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
532 // Arguments
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
533 switch ((int)(a & (EX_EXTRA|EX_NOSPC|EX_NEEDARG)))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
534 {
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
535 case 0: IObuff[len++] = '0'; break;
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
536 case (EX_EXTRA): IObuff[len++] = '*'; break;
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
537 case (EX_EXTRA|EX_NOSPC): IObuff[len++] = '?'; break;
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
538 case (EX_EXTRA|EX_NEEDARG): IObuff[len++] = '+'; break;
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
539 case (EX_EXTRA|EX_NOSPC|EX_NEEDARG): IObuff[len++] = '1'; break;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
540 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
541
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
542 do {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
543 IObuff[len++] = ' ';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
544 } while (len < 5 - over);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
545
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
546 // Address / Range
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
547 if (a & (EX_RANGE|EX_COUNT))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
548 {
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
549 if (a & EX_COUNT)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
550 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
551 // -count=N
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
552 sprintf((char *)IObuff + len, "%ldc", cmd->uc_def);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
553 len += (int)STRLEN(IObuff + len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
554 }
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
555 else if (a & EX_DFLALL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
556 IObuff[len++] = '%';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
557 else if (cmd->uc_def >= 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
558 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
559 // -range=N
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
560 sprintf((char *)IObuff + len, "%ld", cmd->uc_def);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
561 len += (int)STRLEN(IObuff + len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
562 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
563 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
564 IObuff[len++] = '.';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
565 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
566
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
567 do {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
568 IObuff[len++] = ' ';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
569 } while (len < 8 - over);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
570
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
571 // Address Type
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
572 for (j = 0; addr_type_complete[j].expand != ADDR_NONE; ++j)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
573 if (addr_type_complete[j].expand != ADDR_LINES
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
574 && addr_type_complete[j].expand == cmd->uc_addr_type)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
575 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
576 STRCPY(IObuff + len, addr_type_complete[j].shortname);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
577 len += (int)STRLEN(IObuff + len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
578 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
579 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
580
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
581 do {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
582 IObuff[len++] = ' ';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
583 } while (len < 13 - over);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
584
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
585 // Completion
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
586 for (j = 0; command_complete[j].expand != 0; ++j)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
587 if (command_complete[j].expand == cmd->uc_compl)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
588 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
589 STRCPY(IObuff + len, command_complete[j].name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
590 len += (int)STRLEN(IObuff + len);
27197
80f2c282ef9c patch 8.2.4127: build failure without the +eval feature
Bram Moolenaar <Bram@vim.org>
parents: 27187
diff changeset
591 #ifdef FEAT_EVAL
27187
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
592 if (p_verbose > 0 && cmd->uc_compl_arg != NULL
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
593 && STRLEN(cmd->uc_compl_arg) < 200)
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
594 {
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
595 IObuff[len] = ',';
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
596 STRCPY(IObuff + len + 1, cmd->uc_compl_arg);
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
597 len += (int)STRLEN(IObuff + len);
8950a7b6cc89 patch 8.2.4122: ":command Cmd" does not show custom completion argument
Bram Moolenaar <Bram@vim.org>
parents: 27179
diff changeset
598 }
27197
80f2c282ef9c patch 8.2.4127: build failure without the +eval feature
Bram Moolenaar <Bram@vim.org>
parents: 27187
diff changeset
599 #endif
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
600 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
601 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
602
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
603 do {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
604 IObuff[len++] = ' ';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
605 } while (len < 25 - over);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
606
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
607 IObuff[len] = '\0';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
608 msg_outtrans(IObuff);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
609
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
610 msg_outtrans_special(cmd->uc_rep, FALSE,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
611 name_len == 0 ? Columns - 47 : 0);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
612 #ifdef FEAT_EVAL
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
613 if (p_verbose > 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
614 last_set_msg(cmd->uc_script_ctx);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
615 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
616 out_flush();
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
617 ui_breakcheck();
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
618 if (got_int)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
619 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
620 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
621 if (gap == &ucmds || i < gap->ga_len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
622 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
623 gap = &ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
624 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
625
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
626 if (!found)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
627 msg(_("No user-defined commands found"));
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
628 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
629
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
630 char *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
631 uc_fun_cmd(void)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
632 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
633 static char_u fcmd[] = {0x84, 0xaf, 0x60, 0xb9, 0xaf, 0xb5, 0x60, 0xa4,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
634 0xa5, 0xad, 0xa1, 0xae, 0xa4, 0x60, 0xa1, 0x60,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
635 0xb3, 0xa8, 0xb2, 0xb5, 0xa2, 0xa2, 0xa5, 0xb2,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
636 0xb9, 0x7f, 0};
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
637 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
638
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
639 for (i = 0; fcmd[i]; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
640 IObuff[i] = fcmd[i] - 0x40;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
641 IObuff[i] = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
642 return (char *)IObuff;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
643 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
644
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
645 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
646 * Parse address type argument
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
647 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
648 static int
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
649 parse_addr_type_arg(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
650 char_u *value,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
651 int vallen,
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
652 cmd_addr_T *addr_type_arg)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
653 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
654 int i, a, b;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
655
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
656 for (i = 0; addr_type_complete[i].expand != ADDR_NONE; ++i)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
657 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
658 a = (int)STRLEN(addr_type_complete[i].name) == vallen;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
659 b = STRNCMP(value, addr_type_complete[i].name, vallen) == 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
660 if (a && b)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
661 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
662 *addr_type_arg = addr_type_complete[i].expand;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
663 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
664 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
665 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
666
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
667 if (addr_type_complete[i].expand == ADDR_NONE)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
668 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
669 char_u *err = value;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
670
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
671 for (i = 0; err[i] != NUL && !VIM_ISWHITE(err[i]); i++)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
672 ;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
673 err[i] = NUL;
26986
79ea140936e9 patch 8.2.4022: two error messages in the wrong file
Bram Moolenaar <Bram@vim.org>
parents: 26962
diff changeset
674 semsg(_(e_invalid_address_type_value_str), err);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
675 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
676 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
677
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
678 return OK;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
679 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
680
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
681 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
682 * Parse a completion argument "value[vallen]".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
683 * The detected completion goes in "*complp", argument type in "*argt".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
684 * When there is an argument, for function and user defined completion, it's
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
685 * copied to allocated memory and stored in "*compl_arg".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
686 * Returns FAIL if something is wrong.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
687 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
688 int
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
689 parse_compl_arg(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
690 char_u *value,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
691 int vallen,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
692 int *complp,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
693 long *argt,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
694 char_u **compl_arg UNUSED)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
695 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
696 char_u *arg = NULL;
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
697 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
698 size_t arglen = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
699 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
700 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
701 int valend = vallen;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
702
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
703 // Look for any argument part - which is the part after any ','
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
704 for (i = 0; i < vallen; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
705 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
706 if (value[i] == ',')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
707 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
708 arg = &value[i + 1];
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
709 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
710 arglen = vallen - i - 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
711 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
712 valend = i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
713 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
714 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
715 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
716
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
717 for (i = 0; command_complete[i].expand != 0; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
718 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
719 if ((int)STRLEN(command_complete[i].name) == valend
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
720 && STRNCMP(value, command_complete[i].name, valend) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
721 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
722 *complp = command_complete[i].expand;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
723 if (command_complete[i].expand == EXPAND_BUFFERS)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
724 *argt |= EX_BUFNAME;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
725 else if (command_complete[i].expand == EXPAND_DIRECTORIES
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
726 || command_complete[i].expand == EXPAND_FILES)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
727 *argt |= EX_XFILE;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
728 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
729 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
730 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
731
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
732 if (command_complete[i].expand == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
733 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
734 semsg(_(e_invalid_complete_value_str), value);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
735 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
736 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
737
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
738 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
739 if (*complp != EXPAND_USER_DEFINED && *complp != EXPAND_USER_LIST
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
740 && arg != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
741 # else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
742 if (arg != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
743 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
744 {
26915
3631d2deb36c patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26857
diff changeset
745 emsg(_(e_completion_argument_only_allowed_for_custom_completion));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
746 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
747 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
748
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
749 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
750 if ((*complp == EXPAND_USER_DEFINED || *complp == EXPAND_USER_LIST)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
751 && arg == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
752 {
26915
3631d2deb36c patch 8.2.3986: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26857
diff changeset
753 emsg(_(e_custom_completion_requires_function_argument));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
754 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
755 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
756
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
757 if (arg != NULL)
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20138
diff changeset
758 *compl_arg = vim_strnsave(arg, arglen);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
759 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
760 return OK;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
761 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
762
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
763 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
764 * Scan attributes in the ":command" command.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
765 * Return FAIL when something is wrong.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
766 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
767 static int
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
768 uc_scan_attr(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
769 char_u *attr,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
770 size_t len,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
771 long *argt,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
772 long *def,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
773 int *flags,
16466
a2befc9b3729 patch 8.1.1237: error for using "compl", reserved word in C++
Bram Moolenaar <Bram@vim.org>
parents: 16411
diff changeset
774 int *complp,
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
775 char_u **compl_arg,
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
776 cmd_addr_T *addr_type_arg)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
777 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
778 char_u *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
779
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
780 if (len == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
781 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
782 emsg(_(e_no_attribute_specified));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
783 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
784 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
785
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
786 // First, try the simple attributes (no arguments)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
787 if (STRNICMP(attr, "bang", len) == 0)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
788 *argt |= EX_BANG;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
789 else if (STRNICMP(attr, "buffer", len) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
790 *flags |= UC_BUFFER;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
791 else if (STRNICMP(attr, "register", len) == 0)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
792 *argt |= EX_REGSTR;
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
793 else if (STRNICMP(attr, "keepscript", len) == 0)
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
794 *argt |= EX_KEEPSCRIPT;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
795 else if (STRNICMP(attr, "bar", len) == 0)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
796 *argt |= EX_TRLBAR;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
797 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
798 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
799 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
800 char_u *val = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
801 size_t vallen = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
802 size_t attrlen = len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
803
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
804 // Look for the attribute name - which is the part before any '='
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
805 for (i = 0; i < (int)len; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
806 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
807 if (attr[i] == '=')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
808 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
809 val = &attr[i + 1];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
810 vallen = len - i - 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
811 attrlen = i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
812 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
813 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
814 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
815
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
816 if (STRNICMP(attr, "nargs", attrlen) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
817 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
818 if (vallen == 1)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
819 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
820 if (*val == '0')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
821 // Do nothing - this is the default
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
822 ;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
823 else if (*val == '1')
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
824 *argt |= (EX_EXTRA | EX_NOSPC | EX_NEEDARG);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
825 else if (*val == '*')
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
826 *argt |= EX_EXTRA;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
827 else if (*val == '?')
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
828 *argt |= (EX_EXTRA | EX_NOSPC);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
829 else if (*val == '+')
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
830 *argt |= (EX_EXTRA | EX_NEEDARG);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
831 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
832 goto wrong_nargs;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
833 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
834 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
835 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
836 wrong_nargs:
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
837 emsg(_(e_invalid_number_of_arguments));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
838 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
839 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
840 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
841 else if (STRNICMP(attr, "range", attrlen) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
842 {
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
843 *argt |= EX_RANGE;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
844 if (vallen == 1 && *val == '%')
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
845 *argt |= EX_DFLALL;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
846 else if (val != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
847 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
848 p = val;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
849 if (*def >= 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
850 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
851 two_count:
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
852 emsg(_(e_count_cannot_be_specified_twice));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
853 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
854 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
855
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
856 *def = getdigits(&p);
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
857 *argt |= EX_ZEROR;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
858
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
859 if (p != val + vallen || vallen == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
860 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
861 invalid_count:
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
862 emsg(_(e_invalid_default_value_for_count));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
863 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
864 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
865 }
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
866 // default for -range is using buffer lines
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
867 if (*addr_type_arg == ADDR_NONE)
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
868 *addr_type_arg = ADDR_LINES;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
869 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
870 else if (STRNICMP(attr, "count", attrlen) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
871 {
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
872 *argt |= (EX_COUNT | EX_ZEROR | EX_RANGE);
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
873 // default for -count is using any number
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
874 if (*addr_type_arg == ADDR_NONE)
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
875 *addr_type_arg = ADDR_OTHER;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
876
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
877 if (val != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
878 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
879 p = val;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
880 if (*def >= 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
881 goto two_count;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
882
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
883 *def = getdigits(&p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
884
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
885 if (p != val + vallen)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
886 goto invalid_count;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
887 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
888
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
889 if (*def < 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
890 *def = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
891 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
892 else if (STRNICMP(attr, "complete", attrlen) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
893 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
894 if (val == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
895 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
896 semsg(_(e_argument_required_for_str), "-complete");
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
897 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
898 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
899
16466
a2befc9b3729 patch 8.1.1237: error for using "compl", reserved word in C++
Bram Moolenaar <Bram@vim.org>
parents: 16411
diff changeset
900 if (parse_compl_arg(val, (int)vallen, complp, argt, compl_arg)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
901 == FAIL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
902 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
903 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
904 else if (STRNICMP(attr, "addr", attrlen) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
905 {
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
906 *argt |= EX_RANGE;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
907 if (val == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
908 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
909 semsg(_(e_argument_required_for_str), "-addr");
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
910 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
911 }
16513
81a9d0fad357 patch 8.1.1260: comparing with pointer instead of value
Bram Moolenaar <Bram@vim.org>
parents: 16511
diff changeset
912 if (parse_addr_type_arg(val, (int)vallen, addr_type_arg) == FAIL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
913 return FAIL;
16513
81a9d0fad357 patch 8.1.1260: comparing with pointer instead of value
Bram Moolenaar <Bram@vim.org>
parents: 16511
diff changeset
914 if (*addr_type_arg != ADDR_LINES)
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
915 *argt |= EX_ZEROR;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
916 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
917 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
918 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
919 char_u ch = attr[len];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
920 attr[len] = '\0';
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
921 semsg(_(e_invalid_attribute_str), attr);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
922 attr[len] = ch;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
923 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
924 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
925 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
926
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
927 return OK;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
928 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
929
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
930 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
931 * Add a user command to the list or replace an existing one.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
932 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
933 static int
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
934 uc_add_command(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
935 char_u *name,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
936 size_t name_len,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
937 char_u *rep,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
938 long argt,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
939 long def,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
940 int flags,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
941 int compl,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
942 char_u *compl_arg UNUSED,
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
943 cmd_addr_T addr_type,
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
944 int force)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
945 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
946 ucmd_T *cmd = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
947 char_u *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
948 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
949 int cmp = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
950 char_u *rep_buf = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
951 garray_T *gap;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
952
18301
506bf60a30a0 patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents: 17781
diff changeset
953 replace_termcodes(rep, &rep_buf, 0, NULL);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
954 if (rep_buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
955 {
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
956 // can't replace termcodes - try using the string as is
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
957 rep_buf = vim_strsave(rep);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
958
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
959 // give up if out of memory
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
960 if (rep_buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
961 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
962 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
963
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
964 // get address of growarray: global or in curbuf
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
965 if (flags & UC_BUFFER)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
966 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
967 gap = &curbuf->b_ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
968 if (gap->ga_itemsize == 0)
27028
c9474ae175f4 patch 8.2.4043: using int for second argument of ga_init2()
Bram Moolenaar <Bram@vim.org>
parents: 27022
diff changeset
969 ga_init2(gap, sizeof(ucmd_T), 4);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
970 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
971 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
972 gap = &ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
973
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
974 // Search for the command in the already defined commands.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
975 for (i = 0; i < gap->ga_len; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
976 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
977 size_t len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
978
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
979 cmd = USER_CMD_GA(gap, i);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
980 len = STRLEN(cmd->uc_name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
981 cmp = STRNCMP(name, cmd->uc_name, name_len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
982 if (cmp == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
983 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
984 if (name_len < len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
985 cmp = -1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
986 else if (name_len > len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
987 cmp = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
988 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
989
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
990 if (cmp == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
991 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
992 // Command can be replaced with "command!" and when sourcing the
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
993 // same script again, but only once.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
994 if (!force
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
995 #ifdef FEAT_EVAL
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
996 && (cmd->uc_script_ctx.sc_sid != current_sctx.sc_sid
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
997 || cmd->uc_script_ctx.sc_seq == current_sctx.sc_seq)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
998 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
999 )
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1000 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
1001 semsg(_(e_command_already_exists_add_bang_to_replace_it_str),
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1002 name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1003 goto fail;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1004 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1005
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1006 VIM_CLEAR(cmd->uc_rep);
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
1007 #if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1008 VIM_CLEAR(cmd->uc_compl_arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1009 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1010 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1011 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1012
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1013 // Stop as soon as we pass the name to add
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1014 if (cmp < 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1015 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1016 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1017
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1018 // Extend the array unless we're replacing an existing command
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1019 if (cmp != 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1020 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1021 if (ga_grow(gap, 1) != OK)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1022 goto fail;
20830
9064044fd4f6 patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents: 20138
diff changeset
1023 if ((p = vim_strnsave(name, name_len)) == NULL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1024 goto fail;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1025
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1026 cmd = USER_CMD_GA(gap, i);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1027 mch_memmove(cmd + 1, cmd, (gap->ga_len - i) * sizeof(ucmd_T));
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1028
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1029 ++gap->ga_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1030
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1031 cmd->uc_name = p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1032 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1033
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1034 cmd->uc_rep = rep_buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1035 cmd->uc_argt = argt;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1036 cmd->uc_def = def;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1037 cmd->uc_compl = compl;
23390
9a5f12b36273 patch 8.2.2238: Vim9: cannot load a Vim9 script without the +eval feature
Bram Moolenaar <Bram@vim.org>
parents: 22715
diff changeset
1038 cmd->uc_script_ctx = current_sctx;
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1039 if (flags & UC_VIM9)
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1040 cmd->uc_script_ctx.sc_version = SCRIPT_VERSION_VIM9;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1041 #ifdef FEAT_EVAL
18991
847cc7932c42 patch 8.2.0056: execution stack is incomplete and inefficient
Bram Moolenaar <Bram@vim.org>
parents: 18987
diff changeset
1042 cmd->uc_script_ctx.sc_lnum += SOURCING_LNUM;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1043 cmd->uc_compl_arg = compl_arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1044 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1045 cmd->uc_addr_type = addr_type;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1046
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1047 return OK;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1048
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1049 fail:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1050 vim_free(rep_buf);
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
1051 #if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1052 vim_free(compl_arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1053 #endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1054 return FAIL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1055 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1056
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1057 /*
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1058 * If "p" starts with "{" then read a block of commands until "}".
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1059 * Used for ":command" and ":autocmd".
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1060 */
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1061 char_u *
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1062 may_get_cmd_block(exarg_T *eap, char_u *p, char_u **tofree, int *flags)
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1063 {
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1064 char_u *retp = p;
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1065
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1066 if (*p == '{' && ends_excmd2(eap->arg, skipwhite(p + 1))
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1067 && eap->getline != NULL)
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1068 {
25469
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1069 garray_T ga;
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1070 char_u *line = NULL;
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1071
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1072 ga_init2(&ga, sizeof(char_u *), 10);
27022
eebbcc83fb75 patch 8.2.4040: keeping track of allocated lines is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
1073 if (ga_copy_string(&ga, p) == FAIL)
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1074 return retp;
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1075
25469
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1076 // If the argument ends in "}" it must have been concatenated already
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1077 // for ISN_EXEC.
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1078 if (p[STRLEN(p) - 1] != '}')
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1079 // Read lines between '{' and '}'. Does not support nesting or
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1080 // here-doc constructs.
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1081 for (;;)
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1082 {
25469
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1083 vim_free(line);
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1084 if ((line = eap->getline(':', eap->cookie,
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1085 0, GETLINE_CONCAT_CONTBAR)) == NULL)
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1086 {
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1087 emsg(_(e_missing_rcurly));
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1088 break;
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1089 }
27022
eebbcc83fb75 patch 8.2.4040: keeping track of allocated lines is too complicated
Bram Moolenaar <Bram@vim.org>
parents: 27018
diff changeset
1090 if (ga_copy_string(&ga, line) == FAIL)
25469
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1091 break;
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1092 if (*skipwhite(line) == '}')
dcd45fe7fe2e patch 8.2.3271: Vim9: cannot use :command or :au with block in :def function
Bram Moolenaar <Bram@vim.org>
parents: 25463
diff changeset
1093 break;
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1094 }
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1095 vim_free(line);
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1096 retp = *tofree = ga_concat_strings(&ga, "\n");
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1097 ga_clear_strings(&ga);
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1098 *flags |= UC_VIM9;
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1099 }
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1100 return retp;
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1101 }
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1102
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1103 /*
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1104 * ":command ..." implementation
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1105 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1106 void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1107 ex_command(exarg_T *eap)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1108 {
16475
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1109 char_u *name;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1110 char_u *end;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1111 char_u *p;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1112 long argt = 0;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1113 long def = -1;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1114 int flags = 0;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1115 int compl = EXPAND_NOTHING;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1116 char_u *compl_arg = NULL;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1117 cmd_addr_T addr_type_arg = ADDR_NONE;
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1118 int has_attr = (eap->arg[0] == '-');
854fb0ad4be6 patch 8.1.1241: Ex command info contains confusing information
Bram Moolenaar <Bram@vim.org>
parents: 16466
diff changeset
1119 int name_len;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1120
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1121 p = eap->arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1122
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1123 // Check for attributes
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1124 while (*p == '-')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1125 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1126 ++p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1127 end = skiptowhite(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1128 if (uc_scan_attr(p, end - p, &argt, &def, &flags, &compl,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1129 &compl_arg, &addr_type_arg) == FAIL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1130 return;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1131 p = skipwhite(end);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1132 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1133
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1134 // Get the name (if any) and skip to the following argument
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1135 name = p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1136 if (ASCII_ISALPHA(*p))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1137 while (ASCII_ISALNUM(*p))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1138 ++p;
20138
d0a9766167ab patch 8.2.0624: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 20079
diff changeset
1139 if (!ends_excmd2(eap->arg, p) && !VIM_ISWHITE(*p))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1140 {
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
1141 emsg(_(e_invalid_command_name));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1142 return;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1143 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1144 end = p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1145 name_len = (int)(end - name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1146
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1147 // If there is nothing after the name, and no attributes were specified,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1148 // we are listing commands
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1149 p = skipwhite(end);
20138
d0a9766167ab patch 8.2.0624: Vim9: no check for space before #comment
Bram Moolenaar <Bram@vim.org>
parents: 20079
diff changeset
1150 if (!has_attr && ends_excmd2(eap->arg, p))
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1151 uc_list(name, end - name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1152 else if (!ASCII_ISUPPER(*name))
26857
2aeea8611342 patch 8.2.3957: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26498
diff changeset
1153 emsg(_(e_user_defined_commands_must_start_with_an_uppercase_letter));
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1154 else if ((name_len == 1 && *name == 'X')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1155 || (name_len <= 4
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1156 && STRNCMP(name, "Next", name_len > 4 ? 4 : name_len) == 0))
26962
85866e069c24 patch 8.2.4010: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents: 26915
diff changeset
1157 emsg(_(e_reserved_name_cannot_be_used_for_user_defined_command));
25210
8d816c266ceb patch 8.2.3141: no error when using :complete for :command without -nargs
Bram Moolenaar <Bram@vim.org>
parents: 24768
diff changeset
1158 else if (compl > 0 && (argt & EX_EXTRA) == 0)
25226
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1159 {
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1160 // Some plugins rely on silently ignoring the mistake, only make this
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1161 // an error in Vim9 script.
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1162 if (in_vim9script())
25491
b9419c9d3da6 patch 8.2.3282: Vim9: error about using -complete without -nargs is confusing
Bram Moolenaar <Bram@vim.org>
parents: 25469
diff changeset
1163 emsg(_(e_complete_used_without_allowing_arguments));
25226
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1164 else
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1165 give_warning_with_source(
25491
b9419c9d3da6 patch 8.2.3282: Vim9: error about using -complete without -nargs is confusing
Bram Moolenaar <Bram@vim.org>
parents: 25469
diff changeset
1166 (char_u *)_(e_complete_used_without_allowing_arguments),
b9419c9d3da6 patch 8.2.3282: Vim9: error about using -complete without -nargs is confusing
Bram Moolenaar <Bram@vim.org>
parents: 25469
diff changeset
1167 TRUE, TRUE);
25226
a9ea83a3659a patch 8.2.3149: some plugins have a problem with the error check
Bram Moolenaar <Bram@vim.org>
parents: 25210
diff changeset
1168 }
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1169 else
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1170 {
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1171 char_u *tofree = NULL;
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1172
25463
05f9e8f2016c patch 8.2.3268: cannot use a block with :autocmd like with :command
Bram Moolenaar <Bram@vim.org>
parents: 25382
diff changeset
1173 p = may_get_cmd_block(eap, p, &tofree, &flags);
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1174
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1175 uc_add_command(name, end - name, p, argt, def, flags, compl, compl_arg,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1176 addr_type_arg, eap->forceit);
25382
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1177 vim_free(tofree);
b80e4e9c4988 patch 8.2.3228: cannot use a simple block for the :command argument
Bram Moolenaar <Bram@vim.org>
parents: 25226
diff changeset
1178 }
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1179 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1180
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1181 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1182 * ":comclear" implementation
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1183 * Clear all user commands, global and for current buffer.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1184 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1185 void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1186 ex_comclear(exarg_T *eap UNUSED)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1187 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1188 uc_clear(&ucmds);
16511
4182f74e2965 patch 8.1.1259: crash when exiting early
Bram Moolenaar <Bram@vim.org>
parents: 16475
diff changeset
1189 if (curbuf != NULL)
4182f74e2965 patch 8.1.1259: crash when exiting early
Bram Moolenaar <Bram@vim.org>
parents: 16475
diff changeset
1190 uc_clear(&curbuf->b_ucmds);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1191 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1192
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1193 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1194 * Clear all user commands for "gap".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1195 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1196 void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1197 uc_clear(garray_T *gap)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1198 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1199 int i;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1200 ucmd_T *cmd;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1201
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1202 for (i = 0; i < gap->ga_len; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1203 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1204 cmd = USER_CMD_GA(gap, i);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1205 vim_free(cmd->uc_name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1206 vim_free(cmd->uc_rep);
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
1207 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1208 vim_free(cmd->uc_compl_arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1209 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1210 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1211 ga_clear(gap);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1212 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1213
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1214 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1215 * ":delcommand" implementation
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1216 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1217 void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1218 ex_delcommand(exarg_T *eap)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1219 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1220 int i = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1221 ucmd_T *cmd = NULL;
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1222 int res = -1;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1223 garray_T *gap;
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1224 char_u *arg = eap->arg;
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1225 int buffer_only = FALSE;
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1226
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1227 if (STRNCMP(arg, "-buffer", 7) == 0 && VIM_ISWHITE(arg[7]))
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1228 {
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1229 buffer_only = TRUE;
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1230 arg = skipwhite(arg + 7);
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1231 }
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1232
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1233 gap = &curbuf->b_ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1234 for (;;)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1235 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1236 for (i = 0; i < gap->ga_len; ++i)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1237 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1238 cmd = USER_CMD_GA(gap, i);
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1239 res = STRCMP(arg, cmd->uc_name);
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1240 if (res <= 0)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1241 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1242 }
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1243 if (gap == &ucmds || res == 0 || buffer_only)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1244 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1245 gap = &ucmds;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1246 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1247
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1248 if (res != 0)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1249 {
25796
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1250 semsg(_(buffer_only
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1251 ? e_no_such_user_defined_command_in_current_buffer_str
60e4892dfa45 patch 8.2.3433: :delcommand does not take a -buffer option
Bram Moolenaar <Bram@vim.org>
parents: 25757
diff changeset
1252 : e_no_such_user_defined_command_str), arg);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1253 return;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1254 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1255
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1256 vim_free(cmd->uc_name);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1257 vim_free(cmd->uc_rep);
17781
04245f071792 patch 8.1.1887: the +cmdline_compl feature is not in the tiny version
Bram Moolenaar <Bram@vim.org>
parents: 17652
diff changeset
1258 # if defined(FEAT_EVAL)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1259 vim_free(cmd->uc_compl_arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1260 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1261
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1262 --gap->ga_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1263
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1264 if (i < gap->ga_len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1265 mch_memmove(cmd, cmd + 1, (gap->ga_len - i) * sizeof(ucmd_T));
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1266 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1267
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1268 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1269 * Split and quote args for <f-args>.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1270 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1271 static char_u *
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1272 uc_split_args(char_u *arg, size_t *lenp)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1273 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1274 char_u *buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1275 char_u *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1276 char_u *q;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1277 int len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1278
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1279 // Precalculate length
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1280 p = arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1281 len = 2; // Initial and final quotes
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1282
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1283 while (*p)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1284 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1285 if (p[0] == '\\' && p[1] == '\\')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1286 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1287 len += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1288 p += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1289 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1290 else if (p[0] == '\\' && VIM_ISWHITE(p[1]))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1291 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1292 len += 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1293 p += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1294 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1295 else if (*p == '\\' || *p == '"')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1296 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1297 len += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1298 p += 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1299 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1300 else if (VIM_ISWHITE(*p))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1301 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1302 p = skipwhite(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1303 if (*p == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1304 break;
22649
6e965b3587a4 patch 8.2.1873: Vim9: missing white space when using <f-args>
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
1305 len += 4; // ", "
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1306 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1307 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1308 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1309 int charlen = (*mb_ptr2len)(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1310
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1311 len += charlen;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1312 p += charlen;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1313 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1314 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1315
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1316 buf = alloc(len + 1);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1317 if (buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1318 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1319 *lenp = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1320 return buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1321 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1322
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1323 p = arg;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1324 q = buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1325 *q++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1326 while (*p)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1327 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1328 if (p[0] == '\\' && p[1] == '\\')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1329 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1330 *q++ = '\\';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1331 *q++ = '\\';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1332 p += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1333 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1334 else if (p[0] == '\\' && VIM_ISWHITE(p[1]))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1335 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1336 *q++ = p[1];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1337 p += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1338 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1339 else if (*p == '\\' || *p == '"')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1340 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1341 *q++ = '\\';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1342 *q++ = *p++;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1343 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1344 else if (VIM_ISWHITE(*p))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1345 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1346 p = skipwhite(p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1347 if (*p == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1348 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1349 *q++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1350 *q++ = ',';
22649
6e965b3587a4 patch 8.2.1873: Vim9: missing white space when using <f-args>
Bram Moolenaar <Bram@vim.org>
parents: 20830
diff changeset
1351 *q++ = ' ';
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1352 *q++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1353 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1354 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1355 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1356 MB_COPY_CHAR(p, q);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1357 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1358 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1359 *q++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1360 *q = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1361
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1362 *lenp = len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1363 return buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1364 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1365
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1366 static size_t
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1367 add_cmd_modifier(char_u *buf, char *mod_str, int *multi_mods)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1368 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1369 size_t result;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1370
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1371 result = STRLEN(mod_str);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1372 if (*multi_mods)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1373 result += 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1374 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1375 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1376 if (*multi_mods)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1377 STRCAT(buf, " ");
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1378 STRCAT(buf, mod_str);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1379 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1380
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1381 *multi_mods = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1382
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1383 return result;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1384 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1385
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1386 /*
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1387 * Add modifiers from "cmod->cmod_split" to "buf". Set "multi_mods" when one
22699
e82579016863 patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents: 22649
diff changeset
1388 * was added. Return the number of bytes added.
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1389 */
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1390 size_t
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1391 add_win_cmd_modifers(char_u *buf, cmdmod_T *cmod, int *multi_mods)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1392 {
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1393 size_t result = 0;
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1394
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1395 // :aboveleft and :leftabove
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1396 if (cmod->cmod_split & WSP_ABOVE)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1397 result += add_cmd_modifier(buf, "aboveleft", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1398 // :belowright and :rightbelow
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1399 if (cmod->cmod_split & WSP_BELOW)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1400 result += add_cmd_modifier(buf, "belowright", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1401 // :botright
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1402 if (cmod->cmod_split & WSP_BOT)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1403 result += add_cmd_modifier(buf, "botright", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1404
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1405 // :tab
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1406 if (cmod->cmod_tab > 0)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1407 result += add_cmd_modifier(buf, "tab", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1408 // :topleft
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1409 if (cmod->cmod_split & WSP_TOP)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1410 result += add_cmd_modifier(buf, "topleft", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1411 // :vertical
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1412 if (cmod->cmod_split & WSP_VERT)
20043
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1413 result += add_cmd_modifier(buf, "vertical", multi_mods);
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1414 return result;
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1415 }
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1416
d13f8ae3b1de patch 8.2.0577: not all modifiers supported for :options
Bram Moolenaar <Bram@vim.org>
parents: 18991
diff changeset
1417 /*
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1418 * Generate text for the "cmod" command modifiers.
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1419 * If "buf" is NULL just return the length.
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1420 */
22715
8968ed4ba4ba patch 8.2.1906: warning for signed/unsigned
Bram Moolenaar <Bram@vim.org>
parents: 22703
diff changeset
1421 size_t
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1422 produce_cmdmods(char_u *buf, cmdmod_T *cmod, int quote)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1423 {
22715
8968ed4ba4ba patch 8.2.1906: warning for signed/unsigned
Bram Moolenaar <Bram@vim.org>
parents: 22703
diff changeset
1424 size_t result = 0;
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1425 int multi_mods = 0;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1426 int i;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1427 typedef struct {
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1428 int flag;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1429 char *name;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1430 } mod_entry_T;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1431 static mod_entry_T mod_entries[] = {
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1432 #ifdef FEAT_BROWSE_CMD
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1433 {CMOD_BROWSE, "browse"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1434 #endif
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1435 #if defined(FEAT_GUI_DIALOG) || defined(FEAT_CON_DIALOG)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1436 {CMOD_CONFIRM, "confirm"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1437 #endif
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1438 {CMOD_HIDE, "hide"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1439 {CMOD_KEEPALT, "keepalt"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1440 {CMOD_KEEPJUMPS, "keepjumps"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1441 {CMOD_KEEPMARKS, "keepmarks"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1442 {CMOD_KEEPPATTERNS, "keeppatterns"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1443 {CMOD_LOCKMARKS, "lockmarks"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1444 {CMOD_NOSWAPFILE, "noswapfile"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1445 {CMOD_UNSILENT, "unsilent"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1446 {CMOD_NOAUTOCMD, "noautocmd"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1447 #ifdef HAVE_SANDBOX
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1448 {CMOD_SANDBOX, "sandbox"},
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1449 #endif
26404
1bbb884c8561 patch 8.2.3733: Vim9: using "legacy" before range does not work
Bram Moolenaar <Bram@vim.org>
parents: 26195
diff changeset
1450 {CMOD_LEGACY, "legacy"},
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1451 {0, NULL}
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1452 };
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1453
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1454 result = quote ? 2 : 0;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1455 if (buf != NULL)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1456 {
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1457 if (quote)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1458 *buf++ = '"';
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1459 *buf = '\0';
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1460 }
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1461
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1462 // the modifiers that are simple flags
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1463 for (i = 0; mod_entries[i].name != NULL; ++i)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1464 if (cmod->cmod_flags & mod_entries[i].flag)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1465 result += add_cmd_modifier(buf, mod_entries[i].name, &multi_mods);
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1466
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1467 // :silent
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1468 if (cmod->cmod_flags & CMOD_SILENT)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1469 result += add_cmd_modifier(buf,
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1470 (cmod->cmod_flags & CMOD_ERRSILENT) ? "silent!"
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1471 : "silent", &multi_mods);
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1472 // :verbose
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1473 if (p_verbose > 0)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1474 result += add_cmd_modifier(buf, "verbose", &multi_mods);
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1475 // flags from cmod->cmod_split
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1476 result += add_win_cmd_modifers(buf, cmod, &multi_mods);
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1477 if (quote && buf != NULL)
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1478 {
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1479 buf += result - 2;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1480 *buf = '"';
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1481 }
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1482 return result;
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1483 }
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1484
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1485 /*
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1486 * Check for a <> code in a user command.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1487 * "code" points to the '<'. "len" the length of the <> (inclusive).
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1488 * "buf" is where the result is to be added.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1489 * "split_buf" points to a buffer used for splitting, caller should free it.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1490 * "split_len" is the length of what "split_buf" contains.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1491 * Returns the length of the replacement, which has been added to "buf".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1492 * Returns -1 if there was no match, and only the "<" has been copied.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1493 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1494 static size_t
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1495 uc_check_code(
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1496 char_u *code,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1497 size_t len,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1498 char_u *buf,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1499 ucmd_T *cmd, // the user command we're expanding
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1500 exarg_T *eap, // ex arguments
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1501 char_u **split_buf,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1502 size_t *split_len)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1503 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1504 size_t result = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1505 char_u *p = code + 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1506 size_t l = len - 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1507 int quote = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1508 enum {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1509 ct_ARGS,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1510 ct_BANG,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1511 ct_COUNT,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1512 ct_LINE1,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1513 ct_LINE2,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1514 ct_RANGE,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1515 ct_MODS,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1516 ct_REGISTER,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1517 ct_LT,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1518 ct_NONE
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1519 } type = ct_NONE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1520
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1521 if ((vim_strchr((char_u *)"qQfF", *p) != NULL) && p[1] == '-')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1522 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1523 quote = (*p == 'q' || *p == 'Q') ? 1 : 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1524 p += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1525 l -= 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1526 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1527
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1528 ++l;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1529 if (l <= 1)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1530 type = ct_NONE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1531 else if (STRNICMP(p, "args>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1532 type = ct_ARGS;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1533 else if (STRNICMP(p, "bang>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1534 type = ct_BANG;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1535 else if (STRNICMP(p, "count>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1536 type = ct_COUNT;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1537 else if (STRNICMP(p, "line1>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1538 type = ct_LINE1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1539 else if (STRNICMP(p, "line2>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1540 type = ct_LINE2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1541 else if (STRNICMP(p, "range>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1542 type = ct_RANGE;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1543 else if (STRNICMP(p, "lt>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1544 type = ct_LT;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1545 else if (STRNICMP(p, "reg>", l) == 0 || STRNICMP(p, "register>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1546 type = ct_REGISTER;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1547 else if (STRNICMP(p, "mods>", l) == 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1548 type = ct_MODS;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1549
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1550 switch (type)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1551 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1552 case ct_ARGS:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1553 // Simple case first
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1554 if (*eap->arg == NUL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1555 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1556 if (quote == 1)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1557 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1558 result = 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1559 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1560 STRCPY(buf, "''");
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1561 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1562 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1563 result = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1564 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1565 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1566
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1567 // When specified there is a single argument don't split it.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1568 // Works for ":Cmd %" when % is "a b c".
17336
81705f4d9e03 patch 8.1.1667: flags for Ex commands may clash with other symbols
Bram Moolenaar <Bram@vim.org>
parents: 16764
diff changeset
1569 if ((eap->argt & EX_NOSPC) && quote == 2)
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1570 quote = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1571
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1572 switch (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1573 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1574 case 0: // No quoting, no splitting
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1575 result = STRLEN(eap->arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1576 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1577 STRCPY(buf, eap->arg);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1578 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1579 case 1: // Quote, but don't split
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1580 result = STRLEN(eap->arg) + 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1581 for (p = eap->arg; *p; ++p)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1582 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1583 if (enc_dbcs != 0 && (*mb_ptr2len)(p) == 2)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1584 // DBCS can contain \ in a trail byte, skip the
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1585 // double-byte character.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1586 ++p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1587 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1588 if (*p == '\\' || *p == '"')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1589 ++result;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1590 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1591
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1592 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1593 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1594 *buf++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1595 for (p = eap->arg; *p; ++p)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1596 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1597 if (enc_dbcs != 0 && (*mb_ptr2len)(p) == 2)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1598 // DBCS can contain \ in a trail byte, copy the
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1599 // double-byte character to avoid escaping.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1600 *buf++ = *p++;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1601 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1602 if (*p == '\\' || *p == '"')
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1603 *buf++ = '\\';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1604 *buf++ = *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1605 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1606 *buf = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1607 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1608
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1609 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1610 case 2: // Quote and split (<f-args>)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1611 // This is hard, so only do it once, and cache the result
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1612 if (*split_buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1613 *split_buf = uc_split_args(eap->arg, split_len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1614
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1615 result = *split_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1616 if (buf != NULL && result != 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1617 STRCPY(buf, *split_buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1618
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1619 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1620 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1621 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1622
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1623 case ct_BANG:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1624 result = eap->forceit ? 1 : 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1625 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1626 result += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1627 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1628 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1629 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1630 *buf++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1631 if (eap->forceit)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1632 *buf++ = '!';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1633 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1634 *buf = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1635 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1636 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1637
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1638 case ct_LINE1:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1639 case ct_LINE2:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1640 case ct_RANGE:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1641 case ct_COUNT:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1642 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1643 char num_buf[20];
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1644 long num = (type == ct_LINE1) ? eap->line1 :
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1645 (type == ct_LINE2) ? eap->line2 :
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1646 (type == ct_RANGE) ? eap->addr_count :
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1647 (eap->addr_count > 0) ? eap->line2 : cmd->uc_def;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1648 size_t num_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1649
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1650 sprintf(num_buf, "%ld", num);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1651 num_len = STRLEN(num_buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1652 result = num_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1653
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1654 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1655 result += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1656
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1657 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1658 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1659 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1660 *buf++ = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1661 STRCPY(buf, num_buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1662 buf += num_len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1663 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1664 *buf = '"';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1665 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1666
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1667 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1668 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1669
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1670 case ct_MODS:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1671 {
22703
f2bfee4ac356 patch 8.2.1900: Vim9: command modifiers do not work
Bram Moolenaar <Bram@vim.org>
parents: 22699
diff changeset
1672 result = produce_cmdmods(buf, &cmdmod, quote);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1673 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1674 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1675
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1676 case ct_REGISTER:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1677 result = eap->regname ? 1 : 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1678 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1679 result += 2;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1680 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1681 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1682 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1683 *buf++ = '\'';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1684 if (eap->regname)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1685 *buf++ = eap->regname;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1686 if (quote)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1687 *buf = '\'';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1688 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1689 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1690
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1691 case ct_LT:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1692 result = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1693 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1694 *buf = '<';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1695 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1696
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1697 default:
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1698 // Not recognized: just copy the '<' and return -1.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1699 result = (size_t)-1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1700 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1701 *buf = '<';
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1702 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1703 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1704
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1705 return result;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1706 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1707
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1708 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1709 * Execute a user defined command.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1710 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1711 void
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1712 do_ucmd(exarg_T *eap)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1713 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1714 char_u *buf;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1715 char_u *p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1716 char_u *q;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1717
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1718 char_u *start;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1719 char_u *end = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1720 char_u *ksp;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1721 size_t len, totlen;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1722
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1723 size_t split_len = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1724 char_u *split_buf = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1725 ucmd_T *cmd;
26498
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1726 sctx_T save_current_sctx;
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1727 int restore_current_sctx = FALSE;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1728
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1729 if (eap->cmdidx == CMD_USER)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1730 cmd = USER_CMD(eap->useridx);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1731 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1732 cmd = USER_CMD_GA(&curbuf->b_ucmds, eap->useridx);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1733
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1734 /*
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1735 * Replace <> in the command by the arguments.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1736 * First round: "buf" is NULL, compute length, allocate "buf".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1737 * Second round: copy result into "buf".
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1738 */
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1739 buf = NULL;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1740 for (;;)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1741 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1742 p = cmd->uc_rep; // source
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1743 q = buf; // destination
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1744 totlen = 0;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1745
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1746 for (;;)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1747 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1748 start = vim_strchr(p, '<');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1749 if (start != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1750 end = vim_strchr(start + 1, '>');
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1751 if (buf != NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1752 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1753 for (ksp = p; *ksp != NUL && *ksp != K_SPECIAL; ++ksp)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1754 ;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1755 if (*ksp == K_SPECIAL
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1756 && (start == NULL || ksp < start || end == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1757 && ((ksp[1] == KS_SPECIAL && ksp[2] == KE_FILLER)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1758 # ifdef FEAT_GUI
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1759 || (ksp[1] == KS_EXTRA && ksp[2] == (int)KE_CSI)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1760 # endif
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1761 ))
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1762 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1763 // K_SPECIAL has been put in the buffer as K_SPECIAL
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1764 // KS_SPECIAL KE_FILLER, like for mappings, but
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1765 // do_cmdline() doesn't handle that, so convert it back.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1766 // Also change K_SPECIAL KS_EXTRA KE_CSI into CSI.
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1767 len = ksp - p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1768 if (len > 0)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1769 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1770 mch_memmove(q, p, len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1771 q += len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1772 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1773 *q++ = ksp[1] == KS_SPECIAL ? K_SPECIAL : CSI;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1774 p = ksp + 3;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1775 continue;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1776 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1777 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1778
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1779 // break if no <item> is found
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1780 if (start == NULL || end == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1781 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1782
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1783 // Include the '>'
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1784 ++end;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1785
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1786 // Take everything up to the '<'
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1787 len = start - p;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1788 if (buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1789 totlen += len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1790 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1791 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1792 mch_memmove(q, p, len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1793 q += len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1794 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1795
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1796 len = uc_check_code(start, end - start, q, cmd, eap,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1797 &split_buf, &split_len);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1798 if (len == (size_t)-1)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1799 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1800 // no match, continue after '<'
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1801 p = start + 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1802 len = 1;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1803 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1804 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1805 p = end;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1806 if (buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1807 totlen += len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1808 else
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1809 q += len;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1810 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1811 if (buf != NULL) // second time here, finished
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1812 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1813 STRCPY(q, p);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1814 break;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1815 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1816
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1817 totlen += STRLEN(p); // Add on the trailing characters
16764
ef00b6bc186b patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents: 16513
diff changeset
1818 buf = alloc(totlen + 1);
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1819 if (buf == NULL)
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1820 {
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1821 vim_free(split_buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1822 return;
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1823 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1824 }
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1825
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1826 if ((cmd->uc_argt & EX_KEEPSCRIPT) == 0)
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1827 {
26498
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1828 restore_current_sctx = TRUE;
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1829 save_current_sctx = current_sctx;
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1830 current_sctx.sc_version = cmd->uc_script_ctx.sc_version;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1831 #ifdef FEAT_EVAL
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1832 current_sctx.sc_sid = cmd->uc_script_ctx.sc_sid;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1833 #endif
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1834 }
26498
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1835
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1836 (void)do_cmdline(buf, eap->getline, eap->cookie,
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1837 DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_KEYTYPED);
26498
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1838
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1839 // Careful: Do not use "cmd" here, it may have become invalid if a user
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1840 // command was added.
e36aefc588c2 patch 8.2.3779: using freed memory when defining a user command recursively
Bram Moolenaar <Bram@vim.org>
parents: 26404
diff changeset
1841 if (restore_current_sctx)
26103
d079ab2ba260 patch 8.2.3584: "verbose set efm" reports location of the :compiler command
Bram Moolenaar <Bram@vim.org>
parents: 25796
diff changeset
1842 current_sctx = save_current_sctx;
16411
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1843 vim_free(buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1844 vim_free(split_buf);
5b5c5daf57de patch 8.1.1210: support for user commands is spread out
Bram Moolenaar <Bram@vim.org>
parents:
diff changeset
1845 }