Mercurial > vim
annotate src/ex_getln.c @ 11416:32aed0993813 v8.0.0592
patch 8.0.0592: if a job writes to a buffer screen is not updated
commit https://github.com/vim/vim/commit/29ae377ea7039874337bc79ace9ab2b37b9056e5
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Apr 30 19:39:39 2017 +0200
patch 8.0.0592: if a job writes to a buffer screen is not updated
Problem: If a job writes to a buffer and the user is typing a command, the
screen isn't updated. When a message is displayed the changed
buffer may cause it to be cleared. (Ramel Eshed)
Solution: Update the screen and then the command line if the screen didn't
scroll. Avoid inserting screen lines, as it clears any message.
Update the status line when the buffer changed.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sun, 30 Apr 2017 19:45:03 +0200 |
parents | f57dce6b934b |
children | 578df034735d |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9990
diff
changeset
|
1 /* vi:set ts=8 sts=4 sw=4 noet: |
7 | 2 * |
3 * VIM - Vi IMproved by Bram Moolenaar | |
4 * | |
5 * Do ":help uganda" in Vim to read copying and usage conditions. | |
6 * Do ":help credits" in Vim to see a list of people who contributed. | |
7 * See README.txt for an overview of the Vim source code. | |
8 */ | |
9 | |
10 /* | |
11 * ex_getln.c: Functions for entering and editing an Ex command line. | |
12 */ | |
13 | |
14 #include "vim.h" | |
15 | |
16 /* | |
17 * Variables shared between getcmdline(), redrawcmdline() and others. | |
18 * These need to be saved when using CTRL-R |, that's why they are in a | |
19 * structure. | |
20 */ | |
21 struct cmdline_info | |
22 { | |
23 char_u *cmdbuff; /* pointer to command line buffer */ | |
24 int cmdbufflen; /* length of cmdbuff */ | |
25 int cmdlen; /* number of chars in command line */ | |
26 int cmdpos; /* current cursor position */ | |
27 int cmdspos; /* cursor column on screen */ | |
3503 | 28 int cmdfirstc; /* ':', '/', '?', '=', '>' or NUL */ |
7 | 29 int cmdindent; /* number of spaces before cmdline */ |
30 char_u *cmdprompt; /* message in front of cmdline */ | |
31 int cmdattr; /* attributes for prompt */ | |
32 int overstrike; /* Typing mode on the command line. Shared by | |
33 getcmdline() and put_on_cmdline(). */ | |
1718 | 34 expand_T *xpc; /* struct being used for expansion, xp_pattern |
35 may point into cmdbuff */ | |
531 | 36 int xp_context; /* type of expansion */ |
37 # ifdef FEAT_EVAL | |
38 char_u *xp_arg; /* user-defined expansion arg */ | |
1039 | 39 int input_fn; /* when TRUE Invoked for input() function */ |
531 | 40 # endif |
7 | 41 }; |
42 | |
1718 | 43 /* The current cmdline_info. It is initialized in getcmdline() and after that |
44 * used by other functions. When invoking getcmdline() recursively it needs | |
45 * to be saved with save_cmdline() and restored with restore_cmdline(). | |
46 * TODO: make it local to getcmdline() and pass it around. */ | |
47 static struct cmdline_info ccline; | |
7 | 48 |
49 static int cmd_showtail; /* Only show path tail in lists ? */ | |
50 | |
51 #ifdef FEAT_EVAL | |
52 static int new_cmdpos; /* position set by set_cmdline_pos() */ | |
53 #endif | |
54 | |
55 #ifdef FEAT_CMDHIST | |
56 typedef struct hist_entry | |
57 { | |
58 int hisnum; /* identifying number */ | |
4258 | 59 int viminfo; /* when TRUE hisstr comes from viminfo */ |
7 | 60 char_u *hisstr; /* actual entry, separator char after the NUL */ |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
61 time_t time_set; /* when it was typed, zero if unknown */ |
7 | 62 } histentry_T; |
63 | |
64 static histentry_T *(history[HIST_COUNT]) = {NULL, NULL, NULL, NULL, NULL}; | |
65 static int hisidx[HIST_COUNT] = {-1, -1, -1, -1, -1}; /* lastused entry */ | |
66 static int hisnum[HIST_COUNT] = {0, 0, 0, 0, 0}; | |
67 /* identifying (unique) number of newest history entry */ | |
68 static int hislen = 0; /* actual length of history tables */ | |
69 | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
70 static int hist_char2type(int c); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
71 |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
72 static int in_history(int, char_u *, int, int, int); |
7 | 73 # ifdef FEAT_EVAL |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
74 static int calc_hist_idx(int histype, int num); |
7 | 75 # endif |
76 #endif | |
77 | |
78 #ifdef FEAT_RIGHTLEFT | |
79 static int cmd_hkmap = 0; /* Hebrew mapping during command line */ | |
80 #endif | |
81 | |
82 #ifdef FEAT_FKMAP | |
83 static int cmd_fkmap = 0; /* Farsi mapping during command line */ | |
84 #endif | |
85 | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
86 static int cmdline_charsize(int idx); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
87 static void set_cmdspos(void); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
88 static void set_cmdspos_cursor(void); |
7 | 89 #ifdef FEAT_MBYTE |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
90 static void correct_cmdspos(int idx, int cells); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
91 #endif |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
92 static void alloc_cmdbuff(int len); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
93 static int realloc_cmdbuff(int len); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
94 static void draw_cmdline(int start, int len); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
95 static void save_cmdline(struct cmdline_info *ccp); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
96 static void restore_cmdline(struct cmdline_info *ccp); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
97 static int cmdline_paste(int regname, int literally, int remcr); |
7 | 98 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
99 static void redrawcmd_preedit(void); |
7 | 100 #endif |
101 #ifdef FEAT_WILDMENU | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
102 static void cmdline_del(int from); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
103 #endif |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
104 static void redrawcmdprompt(void); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
105 static void cursorcmd(void); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
106 static int ccheck_abbr(int); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
107 static int nextwild(expand_T *xp, int type, int options, int escape); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
108 static void escape_fname(char_u **pp); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
109 static int showmatches(expand_T *xp, int wildmenu); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
110 static void set_expand_context(expand_T *xp); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
111 static int ExpandFromContext(expand_T *xp, char_u *, int *, char_u ***, int); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
112 static int expand_showtail(expand_T *xp); |
7 | 113 #ifdef FEAT_CMDL_COMPL |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
114 static int expand_shellcmd(char_u *filepat, int *num_file, char_u ***file, int flagsarg); |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
115 static int ExpandRTDir(char_u *pat, int flags, int *num_file, char_u ***file, char *dirname[]); |
8402
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
116 static int ExpandPackAddDir(char_u *pat, int *num_file, char_u ***file); |
3503 | 117 # ifdef FEAT_CMDHIST |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
118 static char_u *get_history_arg(expand_T *xp, int idx); |
3503 | 119 # endif |
7 | 120 # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
121 static int ExpandUserDefined(expand_T *xp, regmatch_T *regmatch, int *num_file, char_u ***file); |
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
122 static int ExpandUserList(expand_T *xp, int *num_file, char_u ***file); |
7 | 123 # endif |
124 #endif | |
4265 | 125 #ifdef FEAT_CMDHIST |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
126 static void clear_hist_entry(histentry_T *hisptr); |
4265 | 127 #endif |
7 | 128 |
129 #ifdef FEAT_CMDWIN | |
11321
f57dce6b934b
patch 8.0.0546: swap file exists briefly when opening the command window
Christian Brabandt <cb@256bit.org>
parents:
11285
diff
changeset
|
130 static int open_cmdwin(void); |
7 | 131 #endif |
132 | |
3164 | 133 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
134 static int | |
135 #ifdef __BORLANDC__ | |
136 _RTLENTRYF | |
137 #endif | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
138 sort_func_compare(const void *s1, const void *s2); |
3164 | 139 #endif |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
140 #ifdef FEAT_SEARCH_EXTRA |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
141 static void set_search_match(pos_T *t); |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
142 #endif |
3164 | 143 |
7 | 144 /* |
145 * getcmdline() - accept a command line starting with firstc. | |
146 * | |
147 * firstc == ':' get ":" command line. | |
148 * firstc == '/' or '?' get search pattern | |
149 * firstc == '=' get expression | |
150 * firstc == '@' get text for input() function | |
151 * firstc == '>' get text for debug mode | |
152 * firstc == NUL get text for :insert command | |
153 * firstc == -1 like NUL, and break on CTRL-C | |
154 * | |
155 * The line is collected in ccline.cmdbuff, which is reallocated to fit the | |
156 * command line. | |
157 * | |
158 * Careful: getcmdline() can be called recursively! | |
159 * | |
160 * Return pointer to allocated string if there is a commandline, NULL | |
161 * otherwise. | |
162 */ | |
163 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
164 getcmdline( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
165 int firstc, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
166 long count UNUSED, /* only used for incremental search */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
167 int indent) /* indent for inside conditionals */ |
7 | 168 { |
169 int c; | |
170 int i; | |
171 int j; | |
172 int gotesc = FALSE; /* TRUE when <ESC> just typed */ | |
173 int do_abbr; /* when TRUE check for abbr. */ | |
174 #ifdef FEAT_CMDHIST | |
175 char_u *lookfor = NULL; /* string to match */ | |
176 int hiscnt; /* current history line in use */ | |
177 int histype; /* history type to be used */ | |
178 #endif | |
179 #ifdef FEAT_SEARCH_EXTRA | |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
180 pos_T search_start; /* where 'incsearch' starts searching */ |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
181 pos_T save_cursor; |
7 | 182 colnr_T old_curswant; |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
183 colnr_T init_curswant = curwin->w_curswant; |
7 | 184 colnr_T old_leftcol; |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
185 colnr_T init_leftcol = curwin->w_leftcol; |
7 | 186 linenr_T old_topline; |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
187 linenr_T init_topline = curwin->w_topline; |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
188 pos_T match_start = curwin->w_cursor; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
189 pos_T match_end; |
7 | 190 # ifdef FEAT_DIFF |
191 int old_topfill; | |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
192 int init_topfill = curwin->w_topfill; |
7 | 193 # endif |
194 linenr_T old_botline; | |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
195 linenr_T init_botline = curwin->w_botline; |
7 | 196 int did_incsearch = FALSE; |
197 int incsearch_postponed = FALSE; | |
198 #endif | |
199 int did_wild_list = FALSE; /* did wild_list() recently */ | |
200 int wim_index = 0; /* index in wim_flags[] */ | |
201 int res; | |
202 int save_msg_scroll = msg_scroll; | |
203 int save_State = State; /* remember State when called */ | |
204 int some_key_typed = FALSE; /* one of the keys was typed */ | |
205 #ifdef FEAT_MOUSE | |
206 /* mouse drag and release events are ignored, unless they are | |
207 * preceded with a mouse down event */ | |
208 int ignore_drag_release = TRUE; | |
209 #endif | |
210 #ifdef FEAT_EVAL | |
211 int break_ctrl_c = FALSE; | |
212 #endif | |
213 expand_T xpc; | |
214 long *b_im_ptr = NULL; | |
10861
7d82787b3020
patch 8.0.0320: warning for unused variable with small build
Christian Brabandt <cb@256bit.org>
parents:
10694
diff
changeset
|
215 #if defined(FEAT_WILDMENU) || defined(FEAT_EVAL) || defined(FEAT_SEARCH_EXTRA) |
195 | 216 /* Everything that may work recursively should save and restore the |
217 * current command line in save_ccline. That includes update_screen(), a | |
218 * custom status line may invoke ":normal". */ | |
219 struct cmdline_info save_ccline; | |
220 #endif | |
7 | 221 |
222 #ifdef FEAT_EVAL | |
223 if (firstc == -1) | |
224 { | |
225 firstc = NUL; | |
226 break_ctrl_c = TRUE; | |
227 } | |
228 #endif | |
229 #ifdef FEAT_RIGHTLEFT | |
230 /* start without Hebrew mapping for a command line */ | |
231 if (firstc == ':' || firstc == '=' || firstc == '>') | |
232 cmd_hkmap = 0; | |
233 #endif | |
234 | |
235 ccline.overstrike = FALSE; /* always start in insert mode */ | |
236 #ifdef FEAT_SEARCH_EXTRA | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10970
diff
changeset
|
237 CLEAR_POS(&match_end); |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
238 save_cursor = curwin->w_cursor; /* may be restored later */ |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
239 search_start = curwin->w_cursor; |
7 | 240 old_curswant = curwin->w_curswant; |
241 old_leftcol = curwin->w_leftcol; | |
242 old_topline = curwin->w_topline; | |
243 # ifdef FEAT_DIFF | |
244 old_topfill = curwin->w_topfill; | |
245 # endif | |
246 old_botline = curwin->w_botline; | |
247 #endif | |
248 | |
249 /* | |
250 * set some variables for redrawcmd() | |
251 */ | |
252 ccline.cmdfirstc = (firstc == '@' ? 0 : firstc); | |
164 | 253 ccline.cmdindent = (firstc > 0 ? indent : 0); |
254 | |
255 /* alloc initial ccline.cmdbuff */ | |
256 alloc_cmdbuff(exmode_active ? 250 : indent + 1); | |
7 | 257 if (ccline.cmdbuff == NULL) |
258 return NULL; /* out of memory */ | |
259 ccline.cmdlen = ccline.cmdpos = 0; | |
260 ccline.cmdbuff[0] = NUL; | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
261 sb_text_start_cmdline(); |
7 | 262 |
164 | 263 /* autoindent for :insert and :append */ |
264 if (firstc <= 0) | |
265 { | |
6929 | 266 vim_memset(ccline.cmdbuff, ' ', indent); |
164 | 267 ccline.cmdbuff[indent] = NUL; |
268 ccline.cmdpos = indent; | |
269 ccline.cmdspos = indent; | |
270 ccline.cmdlen = indent; | |
271 } | |
272 | |
7 | 273 ExpandInit(&xpc); |
1718 | 274 ccline.xpc = &xpc; |
7 | 275 |
276 #ifdef FEAT_RIGHTLEFT | |
277 if (curwin->w_p_rl && *curwin->w_p_rlc == 's' | |
278 && (firstc == '/' || firstc == '?')) | |
279 cmdmsg_rl = TRUE; | |
280 else | |
281 cmdmsg_rl = FALSE; | |
282 #endif | |
283 | |
284 redir_off = TRUE; /* don't redirect the typed command */ | |
285 if (!cmd_silent) | |
286 { | |
287 i = msg_scrolled; | |
288 msg_scrolled = 0; /* avoid wait_return message */ | |
289 gotocmdline(TRUE); | |
290 msg_scrolled += i; | |
291 redrawcmdprompt(); /* draw prompt or indent */ | |
292 set_cmdspos(); | |
293 } | |
294 xpc.xp_context = EXPAND_NOTHING; | |
295 xpc.xp_backslash = XP_BS_NONE; | |
632 | 296 #ifndef BACKSLASH_IN_FILENAME |
297 xpc.xp_shell = FALSE; | |
298 #endif | |
7 | 299 |
531 | 300 #if defined(FEAT_EVAL) |
301 if (ccline.input_fn) | |
302 { | |
303 xpc.xp_context = ccline.xp_context; | |
304 xpc.xp_pattern = ccline.cmdbuff; | |
1322 | 305 # if defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL) |
531 | 306 xpc.xp_arg = ccline.xp_arg; |
1322 | 307 # endif |
531 | 308 } |
309 #endif | |
310 | |
7 | 311 /* |
312 * Avoid scrolling when called by a recursive do_cmdline(), e.g. when | |
313 * doing ":@0" when register 0 doesn't contain a CR. | |
314 */ | |
315 msg_scroll = FALSE; | |
316 | |
317 State = CMDLINE; | |
318 | |
319 if (firstc == '/' || firstc == '?' || firstc == '@') | |
320 { | |
321 /* Use ":lmap" mappings for search pattern and input(). */ | |
322 if (curbuf->b_p_imsearch == B_IMODE_USE_INSERT) | |
323 b_im_ptr = &curbuf->b_p_iminsert; | |
324 else | |
325 b_im_ptr = &curbuf->b_p_imsearch; | |
326 if (*b_im_ptr == B_IMODE_LMAP) | |
327 State |= LANGMAP; | |
328 #ifdef USE_IM_CONTROL | |
329 im_set_active(*b_im_ptr == B_IMODE_IM); | |
330 #endif | |
331 } | |
332 #ifdef USE_IM_CONTROL | |
333 else if (p_imcmdline) | |
334 im_set_active(TRUE); | |
335 #endif | |
336 | |
337 #ifdef FEAT_MOUSE | |
338 setmouse(); | |
339 #endif | |
340 #ifdef CURSOR_SHAPE | |
341 ui_cursor_shape(); /* may show different cursor shape */ | |
342 #endif | |
343 | |
571 | 344 /* When inside an autocommand for writing "exiting" may be set and |
345 * terminal mode set to cooked. Need to set raw mode here then. */ | |
346 settmode(TMODE_RAW); | |
347 | |
7 | 348 #ifdef FEAT_CMDHIST |
349 init_history(); | |
350 hiscnt = hislen; /* set hiscnt to impossible history value */ | |
351 histype = hist_char2type(firstc); | |
352 #endif | |
353 | |
354 #ifdef FEAT_DIGRAPHS | |
1868 | 355 do_digraph(-1); /* init digraph typeahead */ |
7 | 356 #endif |
357 | |
5993 | 358 /* If something above caused an error, reset the flags, we do want to type |
359 * and execute commands. Display may be messed up a bit. */ | |
360 if (did_emsg) | |
361 redrawcmd(); | |
362 did_emsg = FALSE; | |
363 got_int = FALSE; | |
364 | |
7 | 365 /* |
366 * Collect the command string, handling editing keys. | |
367 */ | |
368 for (;;) | |
369 { | |
972 | 370 redir_off = TRUE; /* Don't redirect the typed command. |
371 Repeated, because a ":redir" inside | |
372 completion may switch it on. */ | |
7 | 373 #ifdef USE_ON_FLY_SCROLL |
374 dont_scroll = FALSE; /* allow scrolling here */ | |
375 #endif | |
376 quit_more = FALSE; /* reset after CTRL-D which had a more-prompt */ | |
377 | |
378 cursorcmd(); /* set the cursor on the right spot */ | |
1472 | 379 |
380 /* Get a character. Ignore K_IGNORE, it should not do anything, such | |
381 * as stop completion. */ | |
382 do | |
383 { | |
384 c = safe_vgetc(); | |
385 } while (c == K_IGNORE); | |
386 | |
7 | 387 if (KeyTyped) |
388 { | |
389 some_key_typed = TRUE; | |
390 #ifdef FEAT_RIGHTLEFT | |
391 if (cmd_hkmap) | |
392 c = hkmap(c); | |
393 # ifdef FEAT_FKMAP | |
394 if (cmd_fkmap) | |
395 c = cmdl_fkmap(c); | |
396 # endif | |
397 if (cmdmsg_rl && !KeyStuffed) | |
398 { | |
399 /* Invert horizontal movements and operations. Only when | |
400 * typed by the user directly, not when the result of a | |
401 * mapping. */ | |
402 switch (c) | |
403 { | |
404 case K_RIGHT: c = K_LEFT; break; | |
405 case K_S_RIGHT: c = K_S_LEFT; break; | |
406 case K_C_RIGHT: c = K_C_LEFT; break; | |
407 case K_LEFT: c = K_RIGHT; break; | |
408 case K_S_LEFT: c = K_S_RIGHT; break; | |
409 case K_C_LEFT: c = K_C_RIGHT; break; | |
410 } | |
411 } | |
412 #endif | |
413 } | |
414 | |
415 /* | |
416 * Ignore got_int when CTRL-C was typed here. | |
417 * Don't ignore it in :global, we really need to break then, e.g., for | |
418 * ":g/pat/normal /pat" (without the <CR>). | |
419 * Don't ignore it for the input() function. | |
420 */ | |
421 if ((c == Ctrl_C | |
422 #ifdef UNIX | |
423 || c == intr_char | |
424 #endif | |
425 ) | |
426 #if defined(FEAT_EVAL) || defined(FEAT_CRYPT) | |
427 && firstc != '@' | |
428 #endif | |
429 #ifdef FEAT_EVAL | |
430 && !break_ctrl_c | |
431 #endif | |
432 && !global_busy) | |
433 got_int = FALSE; | |
434 | |
435 #ifdef FEAT_CMDHIST | |
436 /* free old command line when finished moving around in the history | |
437 * list */ | |
438 if (lookfor != NULL | |
180 | 439 && c != K_S_DOWN && c != K_S_UP |
230 | 440 && c != K_DOWN && c != K_UP |
7 | 441 && c != K_PAGEDOWN && c != K_PAGEUP |
442 && c != K_KPAGEDOWN && c != K_KPAGEUP | |
230 | 443 && c != K_LEFT && c != K_RIGHT |
7 | 444 && (xpc.xp_numfiles > 0 || (c != Ctrl_P && c != Ctrl_N))) |
445 { | |
446 vim_free(lookfor); | |
447 lookfor = NULL; | |
448 } | |
449 #endif | |
450 | |
451 /* | |
1718 | 452 * When there are matching completions to select <S-Tab> works like |
453 * CTRL-P (unless 'wc' is <S-Tab>). | |
7 | 454 */ |
1718 | 455 if (c != p_wc && c == K_S_TAB && xpc.xp_numfiles > 0) |
7 | 456 c = Ctrl_P; |
457 | |
458 #ifdef FEAT_WILDMENU | |
459 /* Special translations for 'wildmenu' */ | |
460 if (did_wild_list && p_wmnu) | |
461 { | |
230 | 462 if (c == K_LEFT) |
7 | 463 c = Ctrl_P; |
230 | 464 else if (c == K_RIGHT) |
7 | 465 c = Ctrl_N; |
466 } | |
467 /* Hitting CR after "emenu Name.": complete submenu */ | |
468 if (xpc.xp_context == EXPAND_MENUNAMES && p_wmnu | |
469 && ccline.cmdpos > 1 | |
470 && ccline.cmdbuff[ccline.cmdpos - 1] == '.' | |
471 && ccline.cmdbuff[ccline.cmdpos - 2] != '\\' | |
472 && (c == '\n' || c == '\r' || c == K_KENTER)) | |
473 c = K_DOWN; | |
474 #endif | |
475 | |
476 /* free expanded names when finished walking through matches */ | |
477 if (xpc.xp_numfiles != -1 | |
478 && !(c == p_wc && KeyTyped) && c != p_wcm | |
479 && c != Ctrl_N && c != Ctrl_P && c != Ctrl_A | |
480 && c != Ctrl_L) | |
481 { | |
482 (void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE); | |
483 did_wild_list = FALSE; | |
484 #ifdef FEAT_WILDMENU | |
230 | 485 if (!p_wmnu || (c != K_UP && c != K_DOWN)) |
7 | 486 #endif |
487 xpc.xp_context = EXPAND_NOTHING; | |
488 wim_index = 0; | |
489 #ifdef FEAT_WILDMENU | |
490 if (p_wmnu && wild_menu_showing != 0) | |
491 { | |
492 int skt = KeyTyped; | |
532 | 493 int old_RedrawingDisabled = RedrawingDisabled; |
531 | 494 |
495 if (ccline.input_fn) | |
496 RedrawingDisabled = 0; | |
7 | 497 |
498 if (wild_menu_showing == WM_SCROLLED) | |
499 { | |
500 /* Entered command line, move it up */ | |
501 cmdline_row--; | |
502 redrawcmd(); | |
503 } | |
504 else if (save_p_ls != -1) | |
505 { | |
506 /* restore 'laststatus' and 'winminheight' */ | |
507 p_ls = save_p_ls; | |
508 p_wmh = save_p_wmh; | |
509 last_status(FALSE); | |
195 | 510 save_cmdline(&save_ccline); |
7 | 511 update_screen(VALID); /* redraw the screen NOW */ |
195 | 512 restore_cmdline(&save_ccline); |
7 | 513 redrawcmd(); |
514 save_p_ls = -1; | |
515 } | |
516 else | |
517 { | |
518 win_redraw_last_status(topframe); | |
519 redraw_statuslines(); | |
520 } | |
532 | 521 KeyTyped = skt; |
522 wild_menu_showing = 0; | |
531 | 523 if (ccline.input_fn) |
524 RedrawingDisabled = old_RedrawingDisabled; | |
7 | 525 } |
526 #endif | |
527 } | |
528 | |
529 #ifdef FEAT_WILDMENU | |
530 /* Special translations for 'wildmenu' */ | |
531 if (xpc.xp_context == EXPAND_MENUNAMES && p_wmnu) | |
532 { | |
533 /* Hitting <Down> after "emenu Name.": complete submenu */ | |
1318 | 534 if (c == K_DOWN && ccline.cmdpos > 0 |
535 && ccline.cmdbuff[ccline.cmdpos - 1] == '.') | |
7 | 536 c = p_wc; |
230 | 537 else if (c == K_UP) |
7 | 538 { |
539 /* Hitting <Up>: Remove one submenu name in front of the | |
540 * cursor */ | |
541 int found = FALSE; | |
542 | |
543 j = (int)(xpc.xp_pattern - ccline.cmdbuff); | |
544 i = 0; | |
545 while (--j > 0) | |
546 { | |
547 /* check for start of menu name */ | |
548 if (ccline.cmdbuff[j] == ' ' | |
549 && ccline.cmdbuff[j - 1] != '\\') | |
550 { | |
551 i = j + 1; | |
552 break; | |
553 } | |
554 /* check for start of submenu name */ | |
555 if (ccline.cmdbuff[j] == '.' | |
556 && ccline.cmdbuff[j - 1] != '\\') | |
557 { | |
558 if (found) | |
559 { | |
560 i = j + 1; | |
561 break; | |
562 } | |
563 else | |
564 found = TRUE; | |
565 } | |
566 } | |
567 if (i > 0) | |
568 cmdline_del(i); | |
569 c = p_wc; | |
570 xpc.xp_context = EXPAND_NOTHING; | |
571 } | |
572 } | |
714 | 573 if ((xpc.xp_context == EXPAND_FILES |
1621 | 574 || xpc.xp_context == EXPAND_DIRECTORIES |
714 | 575 || xpc.xp_context == EXPAND_SHELLCMD) && p_wmnu) |
7 | 576 { |
577 char_u upseg[5]; | |
578 | |
579 upseg[0] = PATHSEP; | |
580 upseg[1] = '.'; | |
581 upseg[2] = '.'; | |
582 upseg[3] = PATHSEP; | |
583 upseg[4] = NUL; | |
584 | |
1318 | 585 if (c == K_DOWN |
586 && ccline.cmdpos > 0 | |
587 && ccline.cmdbuff[ccline.cmdpos - 1] == PATHSEP | |
588 && (ccline.cmdpos < 3 | |
589 || ccline.cmdbuff[ccline.cmdpos - 2] != '.' | |
7 | 590 || ccline.cmdbuff[ccline.cmdpos - 3] != '.')) |
591 { | |
592 /* go down a directory */ | |
593 c = p_wc; | |
594 } | |
230 | 595 else if (STRNCMP(xpc.xp_pattern, upseg + 1, 3) == 0 && c == K_DOWN) |
7 | 596 { |
597 /* If in a direct ancestor, strip off one ../ to go down */ | |
598 int found = FALSE; | |
599 | |
600 j = ccline.cmdpos; | |
601 i = (int)(xpc.xp_pattern - ccline.cmdbuff); | |
602 while (--j > i) | |
603 { | |
39 | 604 #ifdef FEAT_MBYTE |
605 if (has_mbyte) | |
606 j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + j); | |
607 #endif | |
7 | 608 if (vim_ispathsep(ccline.cmdbuff[j])) |
609 { | |
610 found = TRUE; | |
611 break; | |
612 } | |
613 } | |
614 if (found | |
615 && ccline.cmdbuff[j - 1] == '.' | |
616 && ccline.cmdbuff[j - 2] == '.' | |
617 && (vim_ispathsep(ccline.cmdbuff[j - 3]) || j == i + 2)) | |
618 { | |
619 cmdline_del(j - 2); | |
620 c = p_wc; | |
621 } | |
622 } | |
230 | 623 else if (c == K_UP) |
7 | 624 { |
625 /* go up a directory */ | |
626 int found = FALSE; | |
627 | |
628 j = ccline.cmdpos - 1; | |
629 i = (int)(xpc.xp_pattern - ccline.cmdbuff); | |
630 while (--j > i) | |
631 { | |
632 #ifdef FEAT_MBYTE | |
633 if (has_mbyte) | |
634 j -= (*mb_head_off)(ccline.cmdbuff, ccline.cmdbuff + j); | |
635 #endif | |
636 if (vim_ispathsep(ccline.cmdbuff[j]) | |
637 #ifdef BACKSLASH_IN_FILENAME | |
8080
b6cb94ad97a4
commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents:
7856
diff
changeset
|
638 && vim_strchr((char_u *)" *?[{`$%#", |
b6cb94ad97a4
commit https://github.com/vim/vim/commit/6aa2cd4be287f35f95f35c2cec6d5a24f53c4d3c
Christian Brabandt <cb@256bit.org>
parents:
7856
diff
changeset
|
639 ccline.cmdbuff[j + 1]) == NULL |
7 | 640 #endif |
641 ) | |
642 { | |
643 if (found) | |
644 { | |
645 i = j + 1; | |
646 break; | |
647 } | |
648 else | |
649 found = TRUE; | |
650 } | |
651 } | |
652 | |
653 if (!found) | |
654 j = i; | |
655 else if (STRNCMP(ccline.cmdbuff + j, upseg, 4) == 0) | |
656 j += 4; | |
657 else if (STRNCMP(ccline.cmdbuff + j, upseg + 1, 3) == 0 | |
658 && j == i) | |
659 j += 3; | |
660 else | |
661 j = 0; | |
662 if (j > 0) | |
663 { | |
664 /* TODO this is only for DOS/UNIX systems - need to put in | |
665 * machine-specific stuff here and in upseg init */ | |
666 cmdline_del(j); | |
667 put_on_cmdline(upseg + 1, 3, FALSE); | |
668 } | |
669 else if (ccline.cmdpos > i) | |
670 cmdline_del(i); | |
3204 | 671 |
672 /* Now complete in the new directory. Set KeyTyped in case the | |
673 * Up key came from a mapping. */ | |
7 | 674 c = p_wc; |
3204 | 675 KeyTyped = TRUE; |
7 | 676 } |
677 } | |
678 | |
679 #endif /* FEAT_WILDMENU */ | |
680 | |
681 /* CTRL-\ CTRL-N goes to Normal mode, CTRL-\ CTRL-G goes to Insert | |
682 * mode when 'insertmode' is set, CTRL-\ e prompts for an expression. */ | |
683 if (c == Ctrl_BSL) | |
684 { | |
685 ++no_mapping; | |
686 ++allow_keys; | |
1389 | 687 c = plain_vgetc(); |
7 | 688 --no_mapping; |
689 --allow_keys; | |
3859 | 690 /* CTRL-\ e doesn't work when obtaining an expression, unless it |
691 * is in a mapping. */ | |
692 if (c != Ctrl_N && c != Ctrl_G && (c != 'e' | |
693 || (ccline.cmdfirstc == '=' && KeyTyped))) | |
7 | 694 { |
695 vungetc(c); | |
696 c = Ctrl_BSL; | |
697 } | |
698 #ifdef FEAT_EVAL | |
699 else if (c == 'e') | |
700 { | |
2557
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
701 char_u *p = NULL; |
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
702 int len; |
7 | 703 |
704 /* | |
705 * Replace the command line with the result of an expression. | |
625 | 706 * Need to save and restore the current command line, to be |
707 * able to enter a new one... | |
7 | 708 */ |
709 if (ccline.cmdpos == ccline.cmdlen) | |
710 new_cmdpos = 99999; /* keep it at the end */ | |
711 else | |
712 new_cmdpos = ccline.cmdpos; | |
95 | 713 |
714 save_cmdline(&save_ccline); | |
7 | 715 c = get_expr_register(); |
95 | 716 restore_cmdline(&save_ccline); |
7 | 717 if (c == '=') |
718 { | |
634 | 719 /* Need to save and restore ccline. And set "textlock" |
632 | 720 * to avoid nasty things like going to another buffer when |
721 * evaluating an expression. */ | |
95 | 722 save_cmdline(&save_ccline); |
634 | 723 ++textlock; |
7 | 724 p = get_expr_line(); |
634 | 725 --textlock; |
95 | 726 restore_cmdline(&save_ccline); |
2617 | 727 |
728 if (p != NULL) | |
7 | 729 { |
2617 | 730 len = (int)STRLEN(p); |
731 if (realloc_cmdbuff(len + 1) == OK) | |
732 { | |
733 ccline.cmdlen = len; | |
734 STRCPY(ccline.cmdbuff, p); | |
735 vim_free(p); | |
736 | |
737 /* Restore the cursor or use the position set with | |
738 * set_cmdline_pos(). */ | |
739 if (new_cmdpos > ccline.cmdlen) | |
740 ccline.cmdpos = ccline.cmdlen; | |
741 else | |
742 ccline.cmdpos = new_cmdpos; | |
743 | |
744 KeyTyped = FALSE; /* Don't do p_wc completion. */ | |
745 redrawcmd(); | |
746 goto cmdline_changed; | |
747 } | |
7 | 748 } |
749 } | |
750 beep_flush(); | |
2636 | 751 got_int = FALSE; /* don't abandon the command line */ |
752 did_emsg = FALSE; | |
753 emsg_on_display = FALSE; | |
754 redrawcmd(); | |
755 goto cmdline_not_changed; | |
7 | 756 } |
757 #endif | |
758 else | |
759 { | |
760 if (c == Ctrl_G && p_im && restart_edit == 0) | |
761 restart_edit = 'a'; | |
762 gotesc = TRUE; /* will free ccline.cmdbuff after putting it | |
763 in history */ | |
764 goto returncmd; /* back to Normal mode */ | |
765 } | |
766 } | |
767 | |
768 #ifdef FEAT_CMDWIN | |
769 if (c == cedit_key || c == K_CMDWIN) | |
770 { | |
6211 | 771 if (ex_normal_busy == 0 && got_int == FALSE) |
772 { | |
773 /* | |
774 * Open a window to edit the command line (and history). | |
775 */ | |
11321
f57dce6b934b
patch 8.0.0546: swap file exists briefly when opening the command window
Christian Brabandt <cb@256bit.org>
parents:
11285
diff
changeset
|
776 c = open_cmdwin(); |
6211 | 777 some_key_typed = TRUE; |
778 } | |
7 | 779 } |
780 # ifdef FEAT_DIGRAPHS | |
781 else | |
782 # endif | |
783 #endif | |
784 #ifdef FEAT_DIGRAPHS | |
785 c = do_digraph(c); | |
786 #endif | |
787 | |
788 if (c == '\n' || c == '\r' || c == K_KENTER || (c == ESC | |
789 && (!KeyTyped || vim_strchr(p_cpo, CPO_ESC) != NULL))) | |
790 { | |
168 | 791 /* In Ex mode a backslash escapes a newline. */ |
792 if (exmode_active | |
793 && c != ESC | |
1318 | 794 && ccline.cmdpos == ccline.cmdlen |
168 | 795 && ccline.cmdpos > 0 |
796 && ccline.cmdbuff[ccline.cmdpos - 1] == '\\') | |
797 { | |
798 if (c == K_KENTER) | |
799 c = '\n'; | |
800 } | |
801 else | |
7 | 802 { |
168 | 803 gotesc = FALSE; /* Might have typed ESC previously, don't |
804 truncate the cmdline now. */ | |
805 if (ccheck_abbr(c + ABBR_OFF)) | |
806 goto cmdline_changed; | |
807 if (!cmd_silent) | |
808 { | |
809 windgoto(msg_row, 0); | |
810 out_flush(); | |
811 } | |
812 break; | |
7 | 813 } |
814 } | |
815 | |
816 /* | |
817 * Completion for 'wildchar' or 'wildcharm' key. | |
818 * - hitting <ESC> twice means: abandon command line. | |
819 * - wildcard expansion is only done when the 'wildchar' key is really | |
820 * typed, not when it comes from a macro | |
821 */ | |
822 if ((c == p_wc && !gotesc && KeyTyped) || c == p_wcm) | |
823 { | |
824 if (xpc.xp_numfiles > 0) /* typed p_wc at least twice */ | |
825 { | |
826 /* if 'wildmode' contains "list" may still need to list */ | |
827 if (xpc.xp_numfiles > 1 | |
828 && !did_wild_list | |
829 && (wim_flags[wim_index] & WIM_LIST)) | |
830 { | |
831 (void)showmatches(&xpc, FALSE); | |
832 redrawcmd(); | |
833 did_wild_list = TRUE; | |
834 } | |
835 if (wim_flags[wim_index] & WIM_LONGEST) | |
3961 | 836 res = nextwild(&xpc, WILD_LONGEST, WILD_NO_BEEP, |
837 firstc != '@'); | |
7 | 838 else if (wim_flags[wim_index] & WIM_FULL) |
3961 | 839 res = nextwild(&xpc, WILD_NEXT, WILD_NO_BEEP, |
840 firstc != '@'); | |
7 | 841 else |
842 res = OK; /* don't insert 'wildchar' now */ | |
843 } | |
844 else /* typed p_wc first time */ | |
845 { | |
846 wim_index = 0; | |
847 j = ccline.cmdpos; | |
848 /* if 'wildmode' first contains "longest", get longest | |
849 * common part */ | |
850 if (wim_flags[0] & WIM_LONGEST) | |
3961 | 851 res = nextwild(&xpc, WILD_LONGEST, WILD_NO_BEEP, |
852 firstc != '@'); | |
7 | 853 else |
3961 | 854 res = nextwild(&xpc, WILD_EXPAND_KEEP, WILD_NO_BEEP, |
855 firstc != '@'); | |
7 | 856 |
857 /* if interrupted while completing, behave like it failed */ | |
858 if (got_int) | |
859 { | |
860 (void)vpeekc(); /* remove <C-C> from input stream */ | |
861 got_int = FALSE; /* don't abandon the command line */ | |
862 (void)ExpandOne(&xpc, NULL, NULL, 0, WILD_FREE); | |
863 #ifdef FEAT_WILDMENU | |
864 xpc.xp_context = EXPAND_NOTHING; | |
865 #endif | |
866 goto cmdline_changed; | |
867 } | |
868 | |
869 /* when more than one match, and 'wildmode' first contains | |
870 * "list", or no change and 'wildmode' contains "longest,list", | |
871 * list all matches */ | |
872 if (res == OK && xpc.xp_numfiles > 1) | |
873 { | |
874 /* a "longest" that didn't do anything is skipped (but not | |
875 * "list:longest") */ | |
876 if (wim_flags[0] == WIM_LONGEST && ccline.cmdpos == j) | |
877 wim_index = 1; | |
878 if ((wim_flags[wim_index] & WIM_LIST) | |
879 #ifdef FEAT_WILDMENU | |
880 || (p_wmnu && (wim_flags[wim_index] & WIM_FULL) != 0) | |
881 #endif | |
882 ) | |
883 { | |
884 if (!(wim_flags[0] & WIM_LONGEST)) | |
885 { | |
886 #ifdef FEAT_WILDMENU | |
887 int p_wmnu_save = p_wmnu; | |
888 p_wmnu = 0; | |
889 #endif | |
3961 | 890 /* remove match */ |
891 nextwild(&xpc, WILD_PREV, 0, firstc != '@'); | |
7 | 892 #ifdef FEAT_WILDMENU |
893 p_wmnu = p_wmnu_save; | |
894 #endif | |
895 } | |
896 #ifdef FEAT_WILDMENU | |
897 (void)showmatches(&xpc, p_wmnu | |
898 && ((wim_flags[wim_index] & WIM_LIST) == 0)); | |
899 #else | |
900 (void)showmatches(&xpc, FALSE); | |
901 #endif | |
902 redrawcmd(); | |
903 did_wild_list = TRUE; | |
904 if (wim_flags[wim_index] & WIM_LONGEST) | |
3961 | 905 nextwild(&xpc, WILD_LONGEST, WILD_NO_BEEP, |
906 firstc != '@'); | |
7 | 907 else if (wim_flags[wim_index] & WIM_FULL) |
3961 | 908 nextwild(&xpc, WILD_NEXT, WILD_NO_BEEP, |
909 firstc != '@'); | |
7 | 910 } |
911 else | |
6949 | 912 vim_beep(BO_WILD); |
7 | 913 } |
914 #ifdef FEAT_WILDMENU | |
915 else if (xpc.xp_numfiles == -1) | |
916 xpc.xp_context = EXPAND_NOTHING; | |
917 #endif | |
918 } | |
919 if (wim_index < 3) | |
920 ++wim_index; | |
921 if (c == ESC) | |
922 gotesc = TRUE; | |
923 if (res == OK) | |
924 goto cmdline_changed; | |
925 } | |
926 | |
927 gotesc = FALSE; | |
928 | |
929 /* <S-Tab> goes to last match, in a clumsy way */ | |
930 if (c == K_S_TAB && KeyTyped) | |
931 { | |
3961 | 932 if (nextwild(&xpc, WILD_EXPAND_KEEP, 0, firstc != '@') == OK |
933 && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK | |
934 && nextwild(&xpc, WILD_PREV, 0, firstc != '@') == OK) | |
7 | 935 goto cmdline_changed; |
936 } | |
937 | |
938 if (c == NUL || c == K_ZERO) /* NUL is stored as NL */ | |
939 c = NL; | |
940 | |
941 do_abbr = TRUE; /* default: check for abbreviation */ | |
942 | |
943 /* | |
944 * Big switch for a typed command line character. | |
945 */ | |
946 switch (c) | |
947 { | |
948 case K_BS: | |
949 case Ctrl_H: | |
950 case K_DEL: | |
951 case K_KDEL: | |
952 case Ctrl_W: | |
953 #ifdef FEAT_FKMAP | |
954 if (cmd_fkmap && c == K_BS) | |
955 c = K_DEL; | |
956 #endif | |
957 if (c == K_KDEL) | |
958 c = K_DEL; | |
959 | |
960 /* | |
961 * delete current character is the same as backspace on next | |
962 * character, except at end of line | |
963 */ | |
964 if (c == K_DEL && ccline.cmdpos != ccline.cmdlen) | |
965 ++ccline.cmdpos; | |
966 #ifdef FEAT_MBYTE | |
967 if (has_mbyte && c == K_DEL) | |
968 ccline.cmdpos += mb_off_next(ccline.cmdbuff, | |
969 ccline.cmdbuff + ccline.cmdpos); | |
970 #endif | |
971 if (ccline.cmdpos > 0) | |
972 { | |
973 char_u *p; | |
974 | |
975 j = ccline.cmdpos; | |
976 p = ccline.cmdbuff + j; | |
977 #ifdef FEAT_MBYTE | |
978 if (has_mbyte) | |
979 { | |
980 p = mb_prevptr(ccline.cmdbuff, p); | |
981 if (c == Ctrl_W) | |
982 { | |
983 while (p > ccline.cmdbuff && vim_isspace(*p)) | |
984 p = mb_prevptr(ccline.cmdbuff, p); | |
985 i = mb_get_class(p); | |
986 while (p > ccline.cmdbuff && mb_get_class(p) == i) | |
987 p = mb_prevptr(ccline.cmdbuff, p); | |
988 if (mb_get_class(p) != i) | |
474 | 989 p += (*mb_ptr2len)(p); |
7 | 990 } |
991 } | |
992 else | |
993 #endif | |
994 if (c == Ctrl_W) | |
995 { | |
996 while (p > ccline.cmdbuff && vim_isspace(p[-1])) | |
997 --p; | |
998 i = vim_iswordc(p[-1]); | |
999 while (p > ccline.cmdbuff && !vim_isspace(p[-1]) | |
1000 && vim_iswordc(p[-1]) == i) | |
1001 --p; | |
1002 } | |
1003 else | |
1004 --p; | |
1005 ccline.cmdpos = (int)(p - ccline.cmdbuff); | |
1006 ccline.cmdlen -= j - ccline.cmdpos; | |
1007 i = ccline.cmdpos; | |
1008 while (i < ccline.cmdlen) | |
1009 ccline.cmdbuff[i++] = ccline.cmdbuff[j++]; | |
1010 | |
1011 /* Truncate at the end, required for multi-byte chars. */ | |
1012 ccline.cmdbuff[ccline.cmdlen] = NUL; | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1013 #ifdef FEAT_SEARCH_EXTRA |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1014 if (ccline.cmdlen == 0) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1015 { |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1016 search_start = save_cursor; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1017 /* save view settings, so that the screen |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1018 * won't be restored at the wrong position */ |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1019 old_curswant = init_curswant; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1020 old_leftcol = init_leftcol; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1021 old_topline = init_topline; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1022 # ifdef FEAT_DIFF |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1023 old_topfill = init_topfill; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1024 # endif |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1025 old_botline = init_botline; |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1026 } |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1027 #endif |
7 | 1028 redrawcmd(); |
1029 } | |
1030 else if (ccline.cmdlen == 0 && c != Ctrl_W | |
1031 && ccline.cmdprompt == NULL && indent == 0) | |
1032 { | |
1033 /* In ex and debug mode it doesn't make sense to return. */ | |
1034 if (exmode_active | |
1035 #ifdef FEAT_EVAL | |
1036 || ccline.cmdfirstc == '>' | |
1037 #endif | |
1038 ) | |
1039 goto cmdline_not_changed; | |
1040 | |
1041 vim_free(ccline.cmdbuff); /* no commandline to return */ | |
1042 ccline.cmdbuff = NULL; | |
1043 if (!cmd_silent) | |
1044 { | |
1045 #ifdef FEAT_RIGHTLEFT | |
1046 if (cmdmsg_rl) | |
1047 msg_col = Columns; | |
1048 else | |
1049 #endif | |
1050 msg_col = 0; | |
1051 msg_putchar(' '); /* delete ':' */ | |
1052 } | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1053 #ifdef FEAT_SEARCH_EXTRA |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1054 if (ccline.cmdlen == 0) |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1055 search_start = save_cursor; |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1056 #endif |
7 | 1057 redraw_cmdline = TRUE; |
1058 goto returncmd; /* back to cmd mode */ | |
1059 } | |
1060 goto cmdline_changed; | |
1061 | |
1062 case K_INS: | |
1063 case K_KINS: | |
1064 #ifdef FEAT_FKMAP | |
1065 /* if Farsi mode set, we are in reverse insert mode - | |
1066 Do not change the mode */ | |
1067 if (cmd_fkmap) | |
1068 beep_flush(); | |
1069 else | |
1070 #endif | |
1071 ccline.overstrike = !ccline.overstrike; | |
1072 #ifdef CURSOR_SHAPE | |
1073 ui_cursor_shape(); /* may show different cursor shape */ | |
1074 #endif | |
1075 goto cmdline_not_changed; | |
1076 | |
1077 case Ctrl_HAT: | |
782 | 1078 if (map_to_exists_mode((char_u *)"", LANGMAP, FALSE)) |
7 | 1079 { |
1080 /* ":lmap" mappings exists, toggle use of mappings. */ | |
1081 State ^= LANGMAP; | |
1082 #ifdef USE_IM_CONTROL | |
1083 im_set_active(FALSE); /* Disable input method */ | |
1084 #endif | |
1085 if (b_im_ptr != NULL) | |
1086 { | |
1087 if (State & LANGMAP) | |
1088 *b_im_ptr = B_IMODE_LMAP; | |
1089 else | |
1090 *b_im_ptr = B_IMODE_NONE; | |
1091 } | |
1092 } | |
1093 #ifdef USE_IM_CONTROL | |
1094 else | |
1095 { | |
1096 /* There are no ":lmap" mappings, toggle IM. When | |
1097 * 'imdisable' is set don't try getting the status, it's | |
1098 * always off. */ | |
1099 if ((p_imdisable && b_im_ptr != NULL) | |
1100 ? *b_im_ptr == B_IMODE_IM : im_get_status()) | |
1101 { | |
1102 im_set_active(FALSE); /* Disable input method */ | |
1103 if (b_im_ptr != NULL) | |
1104 *b_im_ptr = B_IMODE_NONE; | |
1105 } | |
1106 else | |
1107 { | |
1108 im_set_active(TRUE); /* Enable input method */ | |
1109 if (b_im_ptr != NULL) | |
1110 *b_im_ptr = B_IMODE_IM; | |
1111 } | |
1112 } | |
1113 #endif | |
1114 if (b_im_ptr != NULL) | |
1115 { | |
1116 if (b_im_ptr == &curbuf->b_p_iminsert) | |
1117 set_iminsert_global(); | |
1118 else | |
1119 set_imsearch_global(); | |
1120 } | |
1121 #ifdef CURSOR_SHAPE | |
1122 ui_cursor_shape(); /* may show different cursor shape */ | |
1123 #endif | |
1124 #if defined(FEAT_WINDOWS) && defined(FEAT_KEYMAP) | |
1125 /* Show/unshow value of 'keymap' in status lines later. */ | |
1126 status_redraw_curbuf(); | |
1127 #endif | |
1128 goto cmdline_not_changed; | |
1129 | |
1130 /* case '@': only in very old vi */ | |
1131 case Ctrl_U: | |
1132 /* delete all characters left of the cursor */ | |
1133 j = ccline.cmdpos; | |
1134 ccline.cmdlen -= j; | |
1135 i = ccline.cmdpos = 0; | |
1136 while (i < ccline.cmdlen) | |
1137 ccline.cmdbuff[i++] = ccline.cmdbuff[j++]; | |
1138 /* Truncate at the end, required for multi-byte chars. */ | |
1139 ccline.cmdbuff[ccline.cmdlen] = NUL; | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1140 #ifdef FEAT_SEARCH_EXTRA |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1141 if (ccline.cmdlen == 0) |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1142 search_start = save_cursor; |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1143 #endif |
7 | 1144 redrawcmd(); |
1145 goto cmdline_changed; | |
1146 | |
1147 #ifdef FEAT_CLIPBOARD | |
1148 case Ctrl_Y: | |
1149 /* Copy the modeless selection, if there is one. */ | |
1150 if (clip_star.state != SELECT_CLEARED) | |
1151 { | |
1152 if (clip_star.state == SELECT_DONE) | |
1153 clip_copy_modeless_selection(TRUE); | |
1154 goto cmdline_not_changed; | |
1155 } | |
1156 break; | |
1157 #endif | |
1158 | |
1159 case ESC: /* get here if p_wc != ESC or when ESC typed twice */ | |
1160 case Ctrl_C: | |
571 | 1161 /* In exmode it doesn't make sense to return. Except when |
161 | 1162 * ":normal" runs out of characters. */ |
1163 if (exmode_active | |
7850
10f17a228661
commit https://github.com/vim/vim/commit/e2c3810c2ae290bbc2cba18eb47cc2d44e4b9797
Christian Brabandt <cb@256bit.org>
parents:
7819
diff
changeset
|
1164 && (ex_normal_busy == 0 || typebuf.tb_len > 0)) |
7 | 1165 goto cmdline_not_changed; |
1166 | |
1167 gotesc = TRUE; /* will free ccline.cmdbuff after | |
1168 putting it in history */ | |
1169 goto returncmd; /* back to cmd mode */ | |
1170 | |
1171 case Ctrl_R: /* insert register */ | |
1172 #ifdef USE_ON_FLY_SCROLL | |
1173 dont_scroll = TRUE; /* disallow scrolling here */ | |
1174 #endif | |
1175 putcmdline('"', TRUE); | |
1176 ++no_mapping; | |
1389 | 1177 i = c = plain_vgetc(); /* CTRL-R <char> */ |
7 | 1178 if (i == Ctrl_O) |
1179 i = Ctrl_R; /* CTRL-R CTRL-O == CTRL-R CTRL-R */ | |
1180 if (i == Ctrl_R) | |
1389 | 1181 c = plain_vgetc(); /* CTRL-R CTRL-R <char> */ |
7 | 1182 --no_mapping; |
1183 #ifdef FEAT_EVAL | |
1184 /* | |
1185 * Insert the result of an expression. | |
1186 * Need to save the current command line, to be able to enter | |
1187 * a new one... | |
1188 */ | |
1189 new_cmdpos = -1; | |
1190 if (c == '=') | |
1191 { | |
1192 if (ccline.cmdfirstc == '=')/* can't do this recursively */ | |
1193 { | |
1194 beep_flush(); | |
1195 c = ESC; | |
1196 } | |
1197 else | |
1198 { | |
95 | 1199 save_cmdline(&save_ccline); |
7 | 1200 c = get_expr_register(); |
95 | 1201 restore_cmdline(&save_ccline); |
7 | 1202 } |
1203 } | |
1204 #endif | |
1205 if (c != ESC) /* use ESC to cancel inserting register */ | |
1206 { | |
1015 | 1207 cmdline_paste(c, i == Ctrl_R, FALSE); |
606 | 1208 |
613 | 1209 #ifdef FEAT_EVAL |
606 | 1210 /* When there was a serious error abort getting the |
1211 * command line. */ | |
1212 if (aborting()) | |
1213 { | |
1214 gotesc = TRUE; /* will free ccline.cmdbuff after | |
1215 putting it in history */ | |
1216 goto returncmd; /* back to cmd mode */ | |
1217 } | |
613 | 1218 #endif |
7 | 1219 KeyTyped = FALSE; /* Don't do p_wc completion. */ |
1220 #ifdef FEAT_EVAL | |
1221 if (new_cmdpos >= 0) | |
1222 { | |
1223 /* set_cmdline_pos() was used */ | |
1224 if (new_cmdpos > ccline.cmdlen) | |
1225 ccline.cmdpos = ccline.cmdlen; | |
1226 else | |
1227 ccline.cmdpos = new_cmdpos; | |
1228 } | |
1229 #endif | |
1230 } | |
1231 redrawcmd(); | |
1232 goto cmdline_changed; | |
1233 | |
1234 case Ctrl_D: | |
1235 if (showmatches(&xpc, FALSE) == EXPAND_NOTHING) | |
1236 break; /* Use ^D as normal char instead */ | |
1237 | |
1238 redrawcmd(); | |
1239 continue; /* don't do incremental search now */ | |
1240 | |
1241 case K_RIGHT: | |
1242 case K_S_RIGHT: | |
1243 case K_C_RIGHT: | |
1244 do | |
1245 { | |
1246 if (ccline.cmdpos >= ccline.cmdlen) | |
1247 break; | |
1248 i = cmdline_charsize(ccline.cmdpos); | |
1249 if (KeyTyped && ccline.cmdspos + i >= Columns * Rows) | |
1250 break; | |
1251 ccline.cmdspos += i; | |
1252 #ifdef FEAT_MBYTE | |
1253 if (has_mbyte) | |
474 | 1254 ccline.cmdpos += (*mb_ptr2len)(ccline.cmdbuff |
7 | 1255 + ccline.cmdpos); |
1256 else | |
1257 #endif | |
1258 ++ccline.cmdpos; | |
1259 } | |
180 | 1260 while ((c == K_S_RIGHT || c == K_C_RIGHT |
1261 || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) | |
7 | 1262 && ccline.cmdbuff[ccline.cmdpos] != ' '); |
1263 #ifdef FEAT_MBYTE | |
1264 if (has_mbyte) | |
1265 set_cmdspos_cursor(); | |
1266 #endif | |
1267 goto cmdline_not_changed; | |
1268 | |
1269 case K_LEFT: | |
1270 case K_S_LEFT: | |
1271 case K_C_LEFT: | |
1456 | 1272 if (ccline.cmdpos == 0) |
1273 goto cmdline_not_changed; | |
7 | 1274 do |
1275 { | |
1276 --ccline.cmdpos; | |
1277 #ifdef FEAT_MBYTE | |
1278 if (has_mbyte) /* move to first byte of char */ | |
1279 ccline.cmdpos -= (*mb_head_off)(ccline.cmdbuff, | |
1280 ccline.cmdbuff + ccline.cmdpos); | |
1281 #endif | |
1282 ccline.cmdspos -= cmdline_charsize(ccline.cmdpos); | |
1283 } | |
1456 | 1284 while (ccline.cmdpos > 0 |
1285 && (c == K_S_LEFT || c == K_C_LEFT | |
180 | 1286 || (mod_mask & (MOD_MASK_SHIFT|MOD_MASK_CTRL))) |
7 | 1287 && ccline.cmdbuff[ccline.cmdpos - 1] != ' '); |
1288 #ifdef FEAT_MBYTE | |
1289 if (has_mbyte) | |
1290 set_cmdspos_cursor(); | |
1291 #endif | |
1292 goto cmdline_not_changed; | |
1293 | |
1294 case K_IGNORE: | |
11321
f57dce6b934b
patch 8.0.0546: swap file exists briefly when opening the command window
Christian Brabandt <cb@256bit.org>
parents:
11285
diff
changeset
|
1295 /* Ignore mouse event or open_cmdwin() result. */ |
1472 | 1296 goto cmdline_not_changed; |
7 | 1297 |
625 | 1298 #ifdef FEAT_GUI_W32 |
1299 /* On Win32 ignore <M-F4>, we get it when closing the window was | |
1300 * cancelled. */ | |
1301 case K_F4: | |
1302 if (mod_mask == MOD_MASK_ALT) | |
1303 { | |
1304 redrawcmd(); /* somehow the cmdline is cleared */ | |
1305 goto cmdline_not_changed; | |
1306 } | |
1307 break; | |
1308 #endif | |
1309 | |
7 | 1310 #ifdef FEAT_MOUSE |
1311 case K_MIDDLEDRAG: | |
1312 case K_MIDDLERELEASE: | |
1313 goto cmdline_not_changed; /* Ignore mouse */ | |
1314 | |
1315 case K_MIDDLEMOUSE: | |
1316 # ifdef FEAT_GUI | |
1317 /* When GUI is active, also paste when 'mouse' is empty */ | |
1318 if (!gui.in_use) | |
1319 # endif | |
1320 if (!mouse_has(MOUSE_COMMAND)) | |
1321 goto cmdline_not_changed; /* Ignore mouse */ | |
692 | 1322 # ifdef FEAT_CLIPBOARD |
7 | 1323 if (clip_star.available) |
1015 | 1324 cmdline_paste('*', TRUE, TRUE); |
7 | 1325 else |
692 | 1326 # endif |
1015 | 1327 cmdline_paste(0, TRUE, TRUE); |
7 | 1328 redrawcmd(); |
1329 goto cmdline_changed; | |
1330 | |
692 | 1331 # ifdef FEAT_DND |
7 | 1332 case K_DROP: |
1015 | 1333 cmdline_paste('~', TRUE, FALSE); |
7 | 1334 redrawcmd(); |
1335 goto cmdline_changed; | |
692 | 1336 # endif |
7 | 1337 |
1338 case K_LEFTDRAG: | |
1339 case K_LEFTRELEASE: | |
1340 case K_RIGHTDRAG: | |
1341 case K_RIGHTRELEASE: | |
1342 /* Ignore drag and release events when the button-down wasn't | |
1343 * seen before. */ | |
1344 if (ignore_drag_release) | |
1345 goto cmdline_not_changed; | |
1346 /* FALLTHROUGH */ | |
1347 case K_LEFTMOUSE: | |
1348 case K_RIGHTMOUSE: | |
1349 if (c == K_LEFTRELEASE || c == K_RIGHTRELEASE) | |
1350 ignore_drag_release = TRUE; | |
1351 else | |
1352 ignore_drag_release = FALSE; | |
1353 # ifdef FEAT_GUI | |
1354 /* When GUI is active, also move when 'mouse' is empty */ | |
1355 if (!gui.in_use) | |
1356 # endif | |
1357 if (!mouse_has(MOUSE_COMMAND)) | |
1358 goto cmdline_not_changed; /* Ignore mouse */ | |
1359 # ifdef FEAT_CLIPBOARD | |
1360 if (mouse_row < cmdline_row && clip_star.available) | |
1361 { | |
1362 int button, is_click, is_drag; | |
1363 | |
1364 /* | |
1365 * Handle modeless selection. | |
1366 */ | |
1367 button = get_mouse_button(KEY2TERMCAP1(c), | |
1368 &is_click, &is_drag); | |
1369 if (mouse_model_popup() && button == MOUSE_LEFT | |
1370 && (mod_mask & MOD_MASK_SHIFT)) | |
1371 { | |
1372 /* Translate shift-left to right button. */ | |
1373 button = MOUSE_RIGHT; | |
1374 mod_mask &= ~MOD_MASK_SHIFT; | |
1375 } | |
1376 clip_modeless(button, is_click, is_drag); | |
1377 goto cmdline_not_changed; | |
1378 } | |
1379 # endif | |
1380 | |
1381 set_cmdspos(); | |
1382 for (ccline.cmdpos = 0; ccline.cmdpos < ccline.cmdlen; | |
1383 ++ccline.cmdpos) | |
1384 { | |
1385 i = cmdline_charsize(ccline.cmdpos); | |
1386 if (mouse_row <= cmdline_row + ccline.cmdspos / Columns | |
1387 && mouse_col < ccline.cmdspos % Columns + i) | |
1388 break; | |
692 | 1389 # ifdef FEAT_MBYTE |
7 | 1390 if (has_mbyte) |
1391 { | |
1392 /* Count ">" for double-wide char that doesn't fit. */ | |
1393 correct_cmdspos(ccline.cmdpos, i); | |
474 | 1394 ccline.cmdpos += (*mb_ptr2len)(ccline.cmdbuff |
7 | 1395 + ccline.cmdpos) - 1; |
1396 } | |
692 | 1397 # endif |
7 | 1398 ccline.cmdspos += i; |
1399 } | |
1400 goto cmdline_not_changed; | |
1401 | |
1402 /* Mouse scroll wheel: ignored here */ | |
1403 case K_MOUSEDOWN: | |
1404 case K_MOUSEUP: | |
2409
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2311
diff
changeset
|
1405 case K_MOUSELEFT: |
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2311
diff
changeset
|
1406 case K_MOUSERIGHT: |
7 | 1407 /* Alternate buttons ignored here */ |
1408 case K_X1MOUSE: | |
1409 case K_X1DRAG: | |
1410 case K_X1RELEASE: | |
1411 case K_X2MOUSE: | |
1412 case K_X2DRAG: | |
1413 case K_X2RELEASE: | |
1414 goto cmdline_not_changed; | |
1415 | |
1416 #endif /* FEAT_MOUSE */ | |
1417 | |
1418 #ifdef FEAT_GUI | |
1419 case K_LEFTMOUSE_NM: /* mousefocus click, ignored */ | |
1420 case K_LEFTRELEASE_NM: | |
1421 goto cmdline_not_changed; | |
1422 | |
1423 case K_VER_SCROLLBAR: | |
540 | 1424 if (msg_scrolled == 0) |
7 | 1425 { |
1426 gui_do_scroll(); | |
1427 redrawcmd(); | |
1428 } | |
1429 goto cmdline_not_changed; | |
1430 | |
1431 case K_HOR_SCROLLBAR: | |
540 | 1432 if (msg_scrolled == 0) |
7 | 1433 { |
2409
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2311
diff
changeset
|
1434 gui_do_horiz_scroll(scrollbar_value, FALSE); |
7 | 1435 redrawcmd(); |
1436 } | |
1437 goto cmdline_not_changed; | |
1438 #endif | |
692 | 1439 #ifdef FEAT_GUI_TABLINE |
1440 case K_TABLINE: | |
1441 case K_TABMENU: | |
1442 /* Don't want to change any tabs here. Make sure the same tab | |
1443 * is still selected. */ | |
1444 if (gui_use_tabline()) | |
1445 gui_mch_set_curtab(tabpage_index(curtab)); | |
1446 goto cmdline_not_changed; | |
1447 #endif | |
1448 | |
7 | 1449 case K_SELECT: /* end of Select mode mapping - ignore */ |
1450 goto cmdline_not_changed; | |
1451 | |
1452 case Ctrl_B: /* begin of command line */ | |
1453 case K_HOME: | |
1454 case K_KHOME: | |
1455 case K_S_HOME: | |
1456 case K_C_HOME: | |
1457 ccline.cmdpos = 0; | |
1458 set_cmdspos(); | |
1459 goto cmdline_not_changed; | |
1460 | |
1461 case Ctrl_E: /* end of command line */ | |
1462 case K_END: | |
1463 case K_KEND: | |
1464 case K_S_END: | |
1465 case K_C_END: | |
1466 ccline.cmdpos = ccline.cmdlen; | |
1467 set_cmdspos_cursor(); | |
1468 goto cmdline_not_changed; | |
1469 | |
1470 case Ctrl_A: /* all matches */ | |
3961 | 1471 if (nextwild(&xpc, WILD_ALL, 0, firstc != '@') == FAIL) |
7 | 1472 break; |
1473 goto cmdline_changed; | |
1474 | |
772 | 1475 case Ctrl_L: |
1476 #ifdef FEAT_SEARCH_EXTRA | |
1477 if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) | |
1478 { | |
1479 /* Add a character from under the cursor for 'incsearch' */ | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1480 if (did_incsearch) |
772 | 1481 { |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1482 curwin->w_cursor = match_end; |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10970
diff
changeset
|
1483 if (!EQUAL_POS(curwin->w_cursor, search_start)) |
1039 | 1484 { |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1485 c = gchar_cursor(); |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1486 /* If 'ignorecase' and 'smartcase' are set and the |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1487 * command line has no uppercase characters, convert |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1488 * the character to lowercase */ |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1489 if (p_ic && p_scs |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1490 && !pat_has_uppercase(ccline.cmdbuff)) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1491 c = MB_TOLOWER(c); |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1492 if (c != NUL) |
1039 | 1493 { |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1494 if (c == firstc || vim_strchr((char_u *)( |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1495 p_magic ? "\\^$.*[" : "\\^$"), c) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1496 != NULL) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1497 { |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1498 /* put a backslash before special |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1499 * characters */ |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1500 stuffcharReadbuff(c); |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1501 c = '\\'; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1502 } |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1503 break; |
1039 | 1504 } |
1505 } | |
772 | 1506 } |
1507 goto cmdline_not_changed; | |
1508 } | |
1509 #endif | |
1510 | |
1511 /* completion: longest common part */ | |
3961 | 1512 if (nextwild(&xpc, WILD_LONGEST, 0, firstc != '@') == FAIL) |
7 | 1513 break; |
1514 goto cmdline_changed; | |
1515 | |
1516 case Ctrl_N: /* next match */ | |
1517 case Ctrl_P: /* previous match */ | |
9976
e448370630b2
commit https://github.com/vim/vim/commit/7df0f6313a46b80d760c9a80241922544333351c
Christian Brabandt <cb@256bit.org>
parents:
9971
diff
changeset
|
1518 if (xpc.xp_numfiles > 0) |
7 | 1519 { |
3961 | 1520 if (nextwild(&xpc, (c == Ctrl_P) ? WILD_PREV : WILD_NEXT, |
1521 0, firstc != '@') == FAIL) | |
7 | 1522 break; |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1523 goto cmdline_not_changed; |
7 | 1524 } |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1525 /* FALLTHROUGH */ |
7 | 1526 |
1527 #ifdef FEAT_CMDHIST | |
1528 case K_UP: | |
1529 case K_DOWN: | |
1530 case K_S_UP: | |
1531 case K_S_DOWN: | |
1532 case K_PAGEUP: | |
1533 case K_KPAGEUP: | |
1534 case K_PAGEDOWN: | |
1535 case K_KPAGEDOWN: | |
1536 if (hislen == 0 || firstc == NUL) /* no history */ | |
1537 goto cmdline_not_changed; | |
1538 | |
1539 i = hiscnt; | |
1540 | |
1541 /* save current command string so it can be restored later */ | |
1542 if (lookfor == NULL) | |
1543 { | |
1544 if ((lookfor = vim_strsave(ccline.cmdbuff)) == NULL) | |
1545 goto cmdline_not_changed; | |
1546 lookfor[ccline.cmdpos] = NUL; | |
1547 } | |
1548 | |
1549 j = (int)STRLEN(lookfor); | |
1550 for (;;) | |
1551 { | |
1552 /* one step backwards */ | |
230 | 1553 if (c == K_UP|| c == K_S_UP || c == Ctrl_P |
180 | 1554 || c == K_PAGEUP || c == K_KPAGEUP) |
7 | 1555 { |
1556 if (hiscnt == hislen) /* first time */ | |
1557 hiscnt = hisidx[histype]; | |
1558 else if (hiscnt == 0 && hisidx[histype] != hislen - 1) | |
1559 hiscnt = hislen - 1; | |
1560 else if (hiscnt != hisidx[histype] + 1) | |
1561 --hiscnt; | |
1562 else /* at top of list */ | |
1563 { | |
1564 hiscnt = i; | |
1565 break; | |
1566 } | |
1567 } | |
1568 else /* one step forwards */ | |
1569 { | |
1570 /* on last entry, clear the line */ | |
1571 if (hiscnt == hisidx[histype]) | |
1572 { | |
1573 hiscnt = hislen; | |
1574 break; | |
1575 } | |
1576 | |
1577 /* not on a history line, nothing to do */ | |
1578 if (hiscnt == hislen) | |
1579 break; | |
1580 if (hiscnt == hislen - 1) /* wrap around */ | |
1581 hiscnt = 0; | |
1582 else | |
1583 ++hiscnt; | |
1584 } | |
1585 if (hiscnt < 0 || history[histype][hiscnt].hisstr == NULL) | |
1586 { | |
1587 hiscnt = i; | |
1588 break; | |
1589 } | |
230 | 1590 if ((c != K_UP && c != K_DOWN) |
180 | 1591 || hiscnt == i |
7 | 1592 || STRNCMP(history[histype][hiscnt].hisstr, |
1593 lookfor, (size_t)j) == 0) | |
1594 break; | |
1595 } | |
1596 | |
1597 if (hiscnt != i) /* jumped to other entry */ | |
1598 { | |
1599 char_u *p; | |
1600 int len; | |
1601 int old_firstc; | |
1602 | |
1603 vim_free(ccline.cmdbuff); | |
1718 | 1604 xpc.xp_context = EXPAND_NOTHING; |
7 | 1605 if (hiscnt == hislen) |
1606 p = lookfor; /* back to the old one */ | |
1607 else | |
1608 p = history[histype][hiscnt].hisstr; | |
1609 | |
1610 if (histype == HIST_SEARCH | |
1611 && p != lookfor | |
1612 && (old_firstc = p[STRLEN(p) + 1]) != firstc) | |
1613 { | |
1614 /* Correct for the separator character used when | |
1615 * adding the history entry vs the one used now. | |
1616 * First loop: count length. | |
1617 * Second loop: copy the characters. */ | |
1618 for (i = 0; i <= 1; ++i) | |
1619 { | |
1620 len = 0; | |
1621 for (j = 0; p[j] != NUL; ++j) | |
1622 { | |
1623 /* Replace old sep with new sep, unless it is | |
1624 * escaped. */ | |
1625 if (p[j] == old_firstc | |
1626 && (j == 0 || p[j - 1] != '\\')) | |
1627 { | |
1628 if (i > 0) | |
1629 ccline.cmdbuff[len] = firstc; | |
1630 } | |
1631 else | |
1632 { | |
1633 /* Escape new sep, unless it is already | |
1634 * escaped. */ | |
1635 if (p[j] == firstc | |
1636 && (j == 0 || p[j - 1] != '\\')) | |
1637 { | |
1638 if (i > 0) | |
1639 ccline.cmdbuff[len] = '\\'; | |
1640 ++len; | |
1641 } | |
1642 if (i > 0) | |
1643 ccline.cmdbuff[len] = p[j]; | |
1644 } | |
1645 ++len; | |
1646 } | |
1647 if (i == 0) | |
1648 { | |
1649 alloc_cmdbuff(len); | |
1650 if (ccline.cmdbuff == NULL) | |
1651 goto returncmd; | |
1652 } | |
1653 } | |
1654 ccline.cmdbuff[len] = NUL; | |
1655 } | |
1656 else | |
1657 { | |
1658 alloc_cmdbuff((int)STRLEN(p)); | |
1659 if (ccline.cmdbuff == NULL) | |
1660 goto returncmd; | |
1661 STRCPY(ccline.cmdbuff, p); | |
1662 } | |
1663 | |
1664 ccline.cmdpos = ccline.cmdlen = (int)STRLEN(ccline.cmdbuff); | |
1665 redrawcmd(); | |
1666 goto cmdline_changed; | |
1667 } | |
1668 beep_flush(); | |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1669 #endif |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1670 goto cmdline_not_changed; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1671 |
10094
61dc69646af6
commit https://github.com/vim/vim/commit/349e7d94e6bbb253bb87adad9039f095128ab543
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
1672 #ifdef FEAT_SEARCH_EXTRA |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1673 case Ctrl_G: /* next match */ |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1674 case Ctrl_T: /* previous match */ |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1675 if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1676 { |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1677 pos_T t; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1678 int search_flags = SEARCH_KEEP + SEARCH_NOOF |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1679 + SEARCH_PEEK; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1680 |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1681 if (char_avail()) |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1682 continue; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1683 cursor_off(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1684 out_flush(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1685 if (c == Ctrl_G) |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1686 { |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1687 t = match_end; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1688 search_flags += SEARCH_COL; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1689 } |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1690 else |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1691 t = match_start; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1692 ++emsg_off; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1693 i = searchit(curwin, curbuf, &t, |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1694 c == Ctrl_G ? FORWARD : BACKWARD, |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1695 ccline.cmdbuff, count, search_flags, |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1696 RE_SEARCH, 0, NULL); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1697 --emsg_off; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1698 if (i) |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1699 { |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1700 search_start = match_start; |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1701 match_end = t; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1702 match_start = t; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1703 if (c == Ctrl_T && firstc == '/') |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1704 { |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1705 /* move just before the current match, so that |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1706 * when nv_search finishes the cursor will be |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1707 * put back on the match */ |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1708 search_start = t; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1709 (void)decl(&search_start); |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1710 } |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10970
diff
changeset
|
1711 if (LT_POS(t, search_start) && c == Ctrl_G) |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1712 { |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1713 /* wrap around */ |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1714 search_start = t; |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1715 if (firstc == '?') |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1716 (void)incl(&search_start); |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1717 else |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1718 (void)decl(&search_start); |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1719 } |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1720 |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1721 set_search_match(&match_end); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1722 curwin->w_cursor = match_start; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1723 changed_cline_bef_curs(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1724 update_topline(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1725 validate_cursor(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1726 highlight_match = TRUE; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1727 old_curswant = curwin->w_curswant; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1728 old_leftcol = curwin->w_leftcol; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1729 old_topline = curwin->w_topline; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1730 # ifdef FEAT_DIFF |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1731 old_topfill = curwin->w_topfill; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1732 # endif |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1733 old_botline = curwin->w_botline; |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1734 update_screen(NOT_VALID); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1735 redrawcmdline(); |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1736 } |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1737 else |
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1738 vim_beep(BO_ERROR); |
10094
61dc69646af6
commit https://github.com/vim/vim/commit/349e7d94e6bbb253bb87adad9039f095128ab543
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
1739 goto cmdline_not_changed; |
9990
6a1793d9c895
commit https://github.com/vim/vim/commit/1195669f9e434fa9ab8b57ee9470bf951e4990b8
Christian Brabandt <cb@256bit.org>
parents:
9976
diff
changeset
|
1740 } |
10094
61dc69646af6
commit https://github.com/vim/vim/commit/349e7d94e6bbb253bb87adad9039f095128ab543
Christian Brabandt <cb@256bit.org>
parents:
10082
diff
changeset
|
1741 break; |
7 | 1742 #endif |
1743 | |
1744 case Ctrl_V: | |
1745 case Ctrl_Q: | |
1746 #ifdef FEAT_MOUSE | |
1747 ignore_drag_release = TRUE; | |
1748 #endif | |
1749 putcmdline('^', TRUE); | |
1750 c = get_literal(); /* get next (two) character(s) */ | |
1751 do_abbr = FALSE; /* don't do abbreviation now */ | |
1752 #ifdef FEAT_MBYTE | |
1753 /* may need to remove ^ when composing char was typed */ | |
1754 if (enc_utf8 && utf_iscomposing(c) && !cmd_silent) | |
1755 { | |
1756 draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos); | |
1757 msg_putchar(' '); | |
1758 cursorcmd(); | |
1759 } | |
1760 #endif | |
1761 break; | |
1762 | |
1763 #ifdef FEAT_DIGRAPHS | |
1764 case Ctrl_K: | |
1765 #ifdef FEAT_MOUSE | |
1766 ignore_drag_release = TRUE; | |
1767 #endif | |
1768 putcmdline('?', TRUE); | |
1769 #ifdef USE_ON_FLY_SCROLL | |
1770 dont_scroll = TRUE; /* disallow scrolling here */ | |
1771 #endif | |
1772 c = get_digraph(TRUE); | |
1773 if (c != NUL) | |
1774 break; | |
1775 | |
1776 redrawcmd(); | |
1777 goto cmdline_not_changed; | |
1778 #endif /* FEAT_DIGRAPHS */ | |
1779 | |
1780 #ifdef FEAT_RIGHTLEFT | |
1781 case Ctrl__: /* CTRL-_: switch language mode */ | |
1782 if (!p_ari) | |
1783 break; | |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
1784 # ifdef FEAT_FKMAP |
7 | 1785 if (p_altkeymap) |
1786 { | |
1787 cmd_fkmap = !cmd_fkmap; | |
1788 if (cmd_fkmap) /* in Farsi always in Insert mode */ | |
1789 ccline.overstrike = FALSE; | |
1790 } | |
1791 else /* Hebrew is default */ | |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
1792 # endif |
7 | 1793 cmd_hkmap = !cmd_hkmap; |
1794 goto cmdline_not_changed; | |
1795 #endif | |
1796 | |
10676
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
1797 case K_PS: |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
1798 bracketed_paste(PASTE_CMDLINE, FALSE, NULL); |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
1799 goto cmdline_changed; |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
1800 |
7 | 1801 default: |
1802 #ifdef UNIX | |
1803 if (c == intr_char) | |
1804 { | |
1805 gotesc = TRUE; /* will free ccline.cmdbuff after | |
1806 putting it in history */ | |
1807 goto returncmd; /* back to Normal mode */ | |
1808 } | |
1809 #endif | |
1810 /* | |
1811 * Normal character with no special meaning. Just set mod_mask | |
1812 * to 0x0 so that typing Shift-Space in the GUI doesn't enter | |
1813 * the string <S-Space>. This should only happen after ^V. | |
1814 */ | |
1815 if (!IS_SPECIAL(c)) | |
1816 mod_mask = 0x0; | |
1817 break; | |
1818 } | |
1819 /* | |
1820 * End of switch on command line character. | |
1821 * We come here if we have a normal character. | |
1822 */ | |
1823 | |
4980
9ae0fe467776
updated for version 7.3.1235
Bram Moolenaar <bram@vim.org>
parents:
4903
diff
changeset
|
1824 if (do_abbr && (IS_SPECIAL(c) || !vim_iswordc(c)) && (ccheck_abbr( |
7 | 1825 #ifdef FEAT_MBYTE |
1826 /* Add ABBR_OFF for characters above 0x100, this is | |
1827 * what check_abbr() expects. */ | |
1828 (has_mbyte && c >= 0x100) ? (c + ABBR_OFF) : | |
1829 #endif | |
4980
9ae0fe467776
updated for version 7.3.1235
Bram Moolenaar <bram@vim.org>
parents:
4903
diff
changeset
|
1830 c) || c == Ctrl_RSB)) |
7 | 1831 goto cmdline_changed; |
1832 | |
1833 /* | |
1834 * put the character in the command line | |
1835 */ | |
1836 if (IS_SPECIAL(c) || mod_mask != 0) | |
1837 put_on_cmdline(get_special_key_name(c, mod_mask), -1, TRUE); | |
1838 else | |
1839 { | |
1840 #ifdef FEAT_MBYTE | |
1841 if (has_mbyte) | |
1842 { | |
1843 j = (*mb_char2bytes)(c, IObuff); | |
1844 IObuff[j] = NUL; /* exclude composing chars */ | |
1845 put_on_cmdline(IObuff, j, TRUE); | |
1846 } | |
1847 else | |
1848 #endif | |
1849 { | |
1850 IObuff[0] = c; | |
1851 put_on_cmdline(IObuff, 1, TRUE); | |
1852 } | |
1853 } | |
1854 goto cmdline_changed; | |
1855 | |
1856 /* | |
1857 * This part implements incremental searches for "/" and "?" | |
1858 * Jump to cmdline_not_changed when a character has been read but the command | |
1859 * line did not change. Then we only search and redraw if something changed in | |
1860 * the past. | |
1861 * Jump to cmdline_changed when the command line did change. | |
1862 * (Sorry for the goto's, I know it is ugly). | |
1863 */ | |
1864 cmdline_not_changed: | |
1865 #ifdef FEAT_SEARCH_EXTRA | |
1866 if (!incsearch_postponed) | |
1867 continue; | |
1868 #endif | |
1869 | |
1870 cmdline_changed: | |
1871 #ifdef FEAT_SEARCH_EXTRA | |
1872 /* | |
1873 * 'incsearch' highlighting. | |
1874 */ | |
1875 if (p_is && !cmd_silent && (firstc == '/' || firstc == '?')) | |
1876 { | |
772 | 1877 pos_T end_pos; |
1521 | 1878 #ifdef FEAT_RELTIME |
1879 proftime_T tm; | |
1880 #endif | |
772 | 1881 |
7 | 1882 /* if there is a character waiting, search and redraw later */ |
1883 if (char_avail()) | |
1884 { | |
1885 incsearch_postponed = TRUE; | |
1886 continue; | |
1887 } | |
1888 incsearch_postponed = FALSE; | |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
1889 curwin->w_cursor = search_start; /* start at old position */ |
7 | 1890 |
1891 /* If there is no command line, don't do anything */ | |
1892 if (ccline.cmdlen == 0) | |
1893 i = 0; | |
1894 else | |
1895 { | |
1896 cursor_off(); /* so the user knows we're busy */ | |
1897 out_flush(); | |
1898 ++emsg_off; /* So it doesn't beep if bad expr */ | |
1521 | 1899 #ifdef FEAT_RELTIME |
1900 /* Set the time limit to half a second. */ | |
1901 profile_setlimit(500L, &tm); | |
1902 #endif | |
7 | 1903 i = do_search(NULL, firstc, ccline.cmdbuff, count, |
1521 | 1904 SEARCH_KEEP + SEARCH_OPT + SEARCH_NOOF + SEARCH_PEEK, |
1905 #ifdef FEAT_RELTIME | |
1906 &tm | |
1907 #else | |
1908 NULL | |
1909 #endif | |
1910 ); | |
7 | 1911 --emsg_off; |
1912 /* if interrupted while searching, behave like it failed */ | |
1913 if (got_int) | |
1914 { | |
1915 (void)vpeekc(); /* remove <C-C> from input stream */ | |
1916 got_int = FALSE; /* don't abandon the command line */ | |
1917 i = 0; | |
1918 } | |
1919 else if (char_avail()) | |
1920 /* cancelled searching because a char was typed */ | |
1921 incsearch_postponed = TRUE; | |
1922 } | |
772 | 1923 if (i != 0) |
7 | 1924 highlight_match = TRUE; /* highlight position */ |
1925 else | |
1926 highlight_match = FALSE; /* remove highlight */ | |
1927 | |
1928 /* first restore the old curwin values, so the screen is | |
1929 * positioned in the same way as the actual search command */ | |
1930 curwin->w_leftcol = old_leftcol; | |
1931 curwin->w_topline = old_topline; | |
1932 # ifdef FEAT_DIFF | |
1933 curwin->w_topfill = old_topfill; | |
1934 # endif | |
1935 curwin->w_botline = old_botline; | |
1936 changed_cline_bef_curs(); | |
1937 update_topline(); | |
1938 | |
1939 if (i != 0) | |
1940 { | |
481 | 1941 pos_T save_pos = curwin->w_cursor; |
1942 | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1943 match_start = curwin->w_cursor; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1944 set_search_match(&curwin->w_cursor); |
7 | 1945 validate_cursor(); |
772 | 1946 end_pos = curwin->w_cursor; |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
1947 match_end = end_pos; |
481 | 1948 curwin->w_cursor = save_pos; |
7 | 1949 } |
798 | 1950 else |
1951 end_pos = curwin->w_cursor; /* shutup gcc 4 */ | |
772 | 1952 |
7 | 1953 validate_cursor(); |
979 | 1954 # ifdef FEAT_WINDOWS |
1955 /* May redraw the status line to show the cursor position. */ | |
1956 if (p_ru && curwin->w_status_height > 0) | |
1957 curwin->w_redr_status = TRUE; | |
1958 # endif | |
7 | 1959 |
195 | 1960 save_cmdline(&save_ccline); |
743 | 1961 update_screen(SOME_VALID); |
195 | 1962 restore_cmdline(&save_ccline); |
1963 | |
772 | 1964 /* Leave it at the end to make CTRL-R CTRL-W work. */ |
1965 if (i != 0) | |
1966 curwin->w_cursor = end_pos; | |
1967 | |
7 | 1968 msg_starthere(); |
1969 redrawcmdline(); | |
1970 did_incsearch = TRUE; | |
1971 } | |
1972 #else /* FEAT_SEARCH_EXTRA */ | |
1973 ; | |
1974 #endif | |
1975 | |
1976 #ifdef FEAT_RIGHTLEFT | |
1977 if (cmdmsg_rl | |
1978 # ifdef FEAT_ARABIC | |
534 | 1979 || (p_arshape && !p_tbidi && enc_utf8) |
7 | 1980 # endif |
1981 ) | |
1982 /* Always redraw the whole command line to fix shaping and | |
3374 | 1983 * right-left typing. Not efficient, but it works. |
1984 * Do it only when there are no characters left to read | |
1985 * to avoid useless intermediate redraws. */ | |
1986 if (vpeekc() == NUL) | |
1987 redrawcmd(); | |
7 | 1988 #endif |
1989 } | |
1990 | |
1991 returncmd: | |
1992 | |
1993 #ifdef FEAT_RIGHTLEFT | |
1994 cmdmsg_rl = FALSE; | |
1995 #endif | |
1996 | |
1997 #ifdef FEAT_FKMAP | |
1998 cmd_fkmap = 0; | |
1999 #endif | |
2000 | |
2001 ExpandCleanup(&xpc); | |
1718 | 2002 ccline.xpc = NULL; |
7 | 2003 |
2004 #ifdef FEAT_SEARCH_EXTRA | |
2005 if (did_incsearch) | |
2006 { | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
2007 if (gotesc) |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2008 curwin->w_cursor = save_cursor; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2009 else |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2010 { |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10970
diff
changeset
|
2011 if (!EQUAL_POS(save_cursor, search_start)) |
10098
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2012 { |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2013 /* put the '" mark at the original position */ |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2014 curwin->w_cursor = save_cursor; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2015 setpcmark(); |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2016 } |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2017 curwin->w_cursor = search_start; |
72e4b7f90465
commit https://github.com/vim/vim/commit/dda933d06c06c2792bd686d059f6ad19191ad30b
Christian Brabandt <cb@256bit.org>
parents:
10094
diff
changeset
|
2018 } |
7 | 2019 curwin->w_curswant = old_curswant; |
2020 curwin->w_leftcol = old_leftcol; | |
2021 curwin->w_topline = old_topline; | |
2022 # ifdef FEAT_DIFF | |
2023 curwin->w_topfill = old_topfill; | |
2024 # endif | |
2025 curwin->w_botline = old_botline; | |
2026 highlight_match = FALSE; | |
2027 validate_cursor(); /* needed for TAB */ | |
743 | 2028 redraw_later(SOME_VALID); |
7 | 2029 } |
2030 #endif | |
2031 | |
2032 if (ccline.cmdbuff != NULL) | |
2033 { | |
2034 /* | |
2035 * Put line in history buffer (":" and "=" only when it was typed). | |
2036 */ | |
2037 #ifdef FEAT_CMDHIST | |
2038 if (ccline.cmdlen && firstc != NUL | |
2039 && (some_key_typed || histype == HIST_SEARCH)) | |
2040 { | |
2041 add_to_history(histype, ccline.cmdbuff, TRUE, | |
2042 histype == HIST_SEARCH ? firstc : NUL); | |
2043 if (firstc == ':') | |
2044 { | |
2045 vim_free(new_last_cmdline); | |
2046 new_last_cmdline = vim_strsave(ccline.cmdbuff); | |
2047 } | |
2048 } | |
2049 #endif | |
2050 | |
2051 if (gotesc) /* abandon command line */ | |
2052 { | |
2053 vim_free(ccline.cmdbuff); | |
2054 ccline.cmdbuff = NULL; | |
2055 if (msg_scrolled == 0) | |
2056 compute_cmdrow(); | |
2057 MSG(""); | |
2058 redraw_cmdline = TRUE; | |
2059 } | |
2060 } | |
2061 | |
2062 /* | |
2063 * If the screen was shifted up, redraw the whole screen (later). | |
2064 * If the line is too long, clear it, so ruler and shown command do | |
2065 * not get printed in the middle of it. | |
2066 */ | |
2067 msg_check(); | |
2068 msg_scroll = save_msg_scroll; | |
2069 redir_off = FALSE; | |
2070 | |
2071 /* When the command line was typed, no need for a wait-return prompt. */ | |
2072 if (some_key_typed) | |
2073 need_wait_return = FALSE; | |
2074 | |
2075 State = save_State; | |
2076 #ifdef USE_IM_CONTROL | |
2077 if (b_im_ptr != NULL && *b_im_ptr != B_IMODE_LMAP) | |
2078 im_save_status(b_im_ptr); | |
2079 im_set_active(FALSE); | |
2080 #endif | |
2081 #ifdef FEAT_MOUSE | |
2082 setmouse(); | |
2083 #endif | |
2084 #ifdef CURSOR_SHAPE | |
2085 ui_cursor_shape(); /* may show different cursor shape */ | |
2086 #endif | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2087 sb_text_end_cmdline(); |
7 | 2088 |
95 | 2089 { |
2090 char_u *p = ccline.cmdbuff; | |
2091 | |
2092 /* Make ccline empty, getcmdline() may try to use it. */ | |
2093 ccline.cmdbuff = NULL; | |
2094 return p; | |
2095 } | |
7 | 2096 } |
2097 | |
2098 #if (defined(FEAT_CRYPT) || defined(FEAT_EVAL)) || defined(PROTO) | |
2099 /* | |
2100 * Get a command line with a prompt. | |
2101 * This is prepared to be called recursively from getcmdline() (e.g. by | |
2102 * f_input() when evaluating an expression from CTRL-R =). | |
2103 * Returns the command line in allocated memory, or NULL. | |
2104 */ | |
2105 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2106 getcmdline_prompt( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2107 int firstc, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2108 char_u *prompt, /* command line prompt */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2109 int attr, /* attributes for prompt */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2110 int xp_context, /* type of expansion */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2111 char_u *xp_arg) /* user-defined expansion argument */ |
7 | 2112 { |
2113 char_u *s; | |
2114 struct cmdline_info save_ccline; | |
2115 int msg_col_save = msg_col; | |
8694
f2e81ae5ab48
commit https://github.com/vim/vim/commit/6135d0d803084f6c2dd8672df1bef4c6e58f9e19
Christian Brabandt <cb@256bit.org>
parents:
8647
diff
changeset
|
2116 int msg_silent_save = msg_silent; |
7 | 2117 |
95 | 2118 save_cmdline(&save_ccline); |
7 | 2119 ccline.cmdprompt = prompt; |
2120 ccline.cmdattr = attr; | |
531 | 2121 # ifdef FEAT_EVAL |
2122 ccline.xp_context = xp_context; | |
2123 ccline.xp_arg = xp_arg; | |
2124 ccline.input_fn = (firstc == '@'); | |
2125 # endif | |
8694
f2e81ae5ab48
commit https://github.com/vim/vim/commit/6135d0d803084f6c2dd8672df1bef4c6e58f9e19
Christian Brabandt <cb@256bit.org>
parents:
8647
diff
changeset
|
2126 msg_silent = 0; |
7 | 2127 s = getcmdline(firstc, 1L, 0); |
95 | 2128 restore_cmdline(&save_ccline); |
8694
f2e81ae5ab48
commit https://github.com/vim/vim/commit/6135d0d803084f6c2dd8672df1bef4c6e58f9e19
Christian Brabandt <cb@256bit.org>
parents:
8647
diff
changeset
|
2129 msg_silent = msg_silent_save; |
3020 | 2130 /* Restore msg_col, the prompt from input() may have changed it. |
2131 * But only if called recursively and the commandline is therefore being | |
2132 * restored to an old one; if not, the input() prompt stays on the screen, | |
2133 * so we need its modified msg_col left intact. */ | |
2134 if (ccline.cmdbuff != NULL) | |
2135 msg_col = msg_col_save; | |
7 | 2136 |
2137 return s; | |
2138 } | |
2139 #endif | |
2140 | |
632 | 2141 /* |
634 | 2142 * Return TRUE when the text must not be changed and we can't switch to |
2143 * another window or buffer. Used when editing the command line, evaluating | |
2144 * 'balloonexpr', etc. | |
632 | 2145 */ |
2146 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2147 text_locked(void) |
632 | 2148 { |
2149 #ifdef FEAT_CMDWIN | |
2150 if (cmdwin_type != 0) | |
2151 return TRUE; | |
2152 #endif | |
634 | 2153 return textlock != 0; |
632 | 2154 } |
2155 | |
2156 /* | |
2157 * Give an error message for a command that isn't allowed while the cmdline | |
2158 * window is open or editing the cmdline in another way. | |
2159 */ | |
2160 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2161 text_locked_msg(void) |
632 | 2162 { |
10082
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2163 EMSG(_(get_text_locked_msg())); |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2164 } |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2165 |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2166 char_u * |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2167 get_text_locked_msg(void) |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2168 { |
632 | 2169 #ifdef FEAT_CMDWIN |
2170 if (cmdwin_type != 0) | |
10082
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2171 return e_cmdwin; |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2172 #endif |
7fc6103c6651
commit https://github.com/vim/vim/commit/5a49789a9b1f6447aeafbbbdd5b235dd10c471d5
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
2173 return e_secure; |
632 | 2174 } |
2175 | |
819 | 2176 #if defined(FEAT_AUTOCMD) || defined(PROTO) |
2177 /* | |
1834 | 2178 * Check if "curbuf_lock" or "allbuf_lock" is set and return TRUE when it is |
2179 * and give an error message. | |
819 | 2180 */ |
2181 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2182 curbuf_locked(void) |
819 | 2183 { |
2184 if (curbuf_lock > 0) | |
2185 { | |
2186 EMSG(_("E788: Not allowed to edit another buffer now")); | |
2187 return TRUE; | |
2188 } | |
1834 | 2189 return allbuf_locked(); |
2190 } | |
2191 | |
2192 /* | |
2193 * Check if "allbuf_lock" is set and return TRUE when it is and give an error | |
2194 * message. | |
2195 */ | |
2196 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2197 allbuf_locked(void) |
1834 | 2198 { |
2199 if (allbuf_lock > 0) | |
2200 { | |
2201 EMSG(_("E811: Not allowed to change buffer information now")); | |
2202 return TRUE; | |
2203 } | |
819 | 2204 return FALSE; |
2205 } | |
2206 #endif | |
2207 | |
7 | 2208 static int |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2209 cmdline_charsize(int idx) |
7 | 2210 { |
2211 #if defined(FEAT_CRYPT) || defined(FEAT_EVAL) | |
2212 if (cmdline_star > 0) /* showing '*', always 1 position */ | |
2213 return 1; | |
2214 #endif | |
2215 return ptr2cells(ccline.cmdbuff + idx); | |
2216 } | |
2217 | |
2218 /* | |
2219 * Compute the offset of the cursor on the command line for the prompt and | |
2220 * indent. | |
2221 */ | |
2222 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2223 set_cmdspos(void) |
7 | 2224 { |
531 | 2225 if (ccline.cmdfirstc != NUL) |
7 | 2226 ccline.cmdspos = 1 + ccline.cmdindent; |
2227 else | |
2228 ccline.cmdspos = 0 + ccline.cmdindent; | |
2229 } | |
2230 | |
2231 /* | |
2232 * Compute the screen position for the cursor on the command line. | |
2233 */ | |
2234 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2235 set_cmdspos_cursor(void) |
7 | 2236 { |
2237 int i, m, c; | |
2238 | |
2239 set_cmdspos(); | |
2240 if (KeyTyped) | |
534 | 2241 { |
7 | 2242 m = Columns * Rows; |
534 | 2243 if (m < 0) /* overflow, Columns or Rows at weird value */ |
2244 m = MAXCOL; | |
2245 } | |
7 | 2246 else |
2247 m = MAXCOL; | |
2248 for (i = 0; i < ccline.cmdlen && i < ccline.cmdpos; ++i) | |
2249 { | |
2250 c = cmdline_charsize(i); | |
2251 #ifdef FEAT_MBYTE | |
2252 /* Count ">" for double-wide multi-byte char that doesn't fit. */ | |
2253 if (has_mbyte) | |
2254 correct_cmdspos(i, c); | |
2255 #endif | |
1612 | 2256 /* If the cmdline doesn't fit, show cursor on last visible char. |
2257 * Don't move the cursor itself, so we can still append. */ | |
7 | 2258 if ((ccline.cmdspos += c) >= m) |
2259 { | |
2260 ccline.cmdspos -= c; | |
2261 break; | |
2262 } | |
2263 #ifdef FEAT_MBYTE | |
2264 if (has_mbyte) | |
474 | 2265 i += (*mb_ptr2len)(ccline.cmdbuff + i) - 1; |
7 | 2266 #endif |
2267 } | |
2268 } | |
2269 | |
2270 #ifdef FEAT_MBYTE | |
2271 /* | |
2272 * Check if the character at "idx", which is "cells" wide, is a multi-byte | |
2273 * character that doesn't fit, so that a ">" must be displayed. | |
2274 */ | |
2275 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2276 correct_cmdspos(int idx, int cells) |
7 | 2277 { |
474 | 2278 if ((*mb_ptr2len)(ccline.cmdbuff + idx) > 1 |
7 | 2279 && (*mb_ptr2cells)(ccline.cmdbuff + idx) > 1 |
2280 && ccline.cmdspos % Columns + cells > Columns) | |
2281 ccline.cmdspos++; | |
2282 } | |
2283 #endif | |
2284 | |
2285 /* | |
2286 * Get an Ex command line for the ":" command. | |
2287 */ | |
2288 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2289 getexline( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2290 int c, /* normally ':', NUL for ":append" */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2291 void *cookie UNUSED, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2292 int indent) /* indent for inside conditionals */ |
7 | 2293 { |
2294 /* When executing a register, remove ':' that's in front of each line. */ | |
2295 if (exec_from_reg && vpeekc() == ':') | |
2296 (void)vgetc(); | |
2297 return getcmdline(c, 1L, indent); | |
2298 } | |
2299 | |
2300 /* | |
2301 * Get an Ex command line for Ex mode. | |
2302 * In Ex mode we only use the OS supplied line editing features and no | |
2303 * mappings or abbreviations. | |
168 | 2304 * Returns a string in allocated memory or NULL. |
7 | 2305 */ |
2306 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2307 getexmodeline( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2308 int promptc, /* normally ':', NUL for ":append" and '?' for |
168 | 2309 :s prompt */ |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2310 void *cookie UNUSED, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2311 int indent) /* indent for inside conditionals */ |
7 | 2312 { |
168 | 2313 garray_T line_ga; |
2314 char_u *pend; | |
2315 int startcol = 0; | |
1329 | 2316 int c1 = 0; |
168 | 2317 int escaped = FALSE; /* CTRL-V typed */ |
2318 int vcol = 0; | |
2319 char_u *p; | |
1329 | 2320 int prev_char; |
5966 | 2321 int len; |
7 | 2322 |
2323 /* Switch cursor on now. This avoids that it happens after the "\n", which | |
2324 * confuses the system function that computes tabstops. */ | |
2325 cursor_on(); | |
2326 | |
2327 /* always start in column 0; write a newline if necessary */ | |
2328 compute_cmdrow(); | |
168 | 2329 if ((msg_col || msg_didout) && promptc != '?') |
7 | 2330 msg_putchar('\n'); |
168 | 2331 if (promptc == ':') |
7 | 2332 { |
164 | 2333 /* indent that is only displayed, not in the line itself */ |
168 | 2334 if (p_prompt) |
2335 msg_putchar(':'); | |
7 | 2336 while (indent-- > 0) |
2337 msg_putchar(' '); | |
2338 startcol = msg_col; | |
2339 } | |
2340 | |
2341 ga_init2(&line_ga, 1, 30); | |
2342 | |
164 | 2343 /* autoindent for :insert and :append is in the line itself */ |
168 | 2344 if (promptc <= 0) |
164 | 2345 { |
2346 vcol = indent; | |
2347 while (indent >= 8) | |
2348 { | |
2349 ga_append(&line_ga, TAB); | |
2350 msg_puts((char_u *)" "); | |
2351 indent -= 8; | |
2352 } | |
2353 while (indent-- > 0) | |
2354 { | |
2355 ga_append(&line_ga, ' '); | |
2356 msg_putchar(' '); | |
2357 } | |
2358 } | |
168 | 2359 ++no_mapping; |
2360 ++allow_keys; | |
164 | 2361 |
7 | 2362 /* |
2363 * Get the line, one character at a time. | |
2364 */ | |
2365 got_int = FALSE; | |
168 | 2366 while (!got_int) |
7 | 2367 { |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2368 long sw; |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2369 char_u *s; |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2370 |
7 | 2371 if (ga_grow(&line_ga, 40) == FAIL) |
2372 break; | |
2373 | |
10970
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2374 /* |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2375 * Get one character at a time. |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2376 */ |
1329 | 2377 prev_char = c1; |
10970
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2378 |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2379 /* Check for a ":normal" command and no more characters left. */ |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2380 if (ex_normal_busy > 0 && typebuf.tb_len == 0) |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2381 c1 = '\n'; |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2382 else |
ab9f7bbe4439
patch 8.0.0374: invalid memory access when using :sc in Ex mode
Christian Brabandt <cb@256bit.org>
parents:
10942
diff
changeset
|
2383 c1 = vgetc(); |
7 | 2384 |
2385 /* | |
168 | 2386 * Handle line editing. |
2387 * Previously this was left to the system, putting the terminal in | |
2388 * cooked mode, but then CTRL-D and CTRL-T can't be used properly. | |
7 | 2389 */ |
168 | 2390 if (got_int) |
2391 { | |
2392 msg_putchar('\n'); | |
2393 break; | |
2394 } | |
2395 | |
10676
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2396 if (c1 == K_PS) |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2397 { |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2398 bracketed_paste(PASTE_EX, FALSE, &line_ga); |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2399 goto redraw; |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2400 } |
b8c04c007d39
patch 8.0.0228: pasting in xterm on the command line has PasteStart
Christian Brabandt <cb@256bit.org>
parents:
10565
diff
changeset
|
2401 |
168 | 2402 if (!escaped) |
7 | 2403 { |
168 | 2404 /* CR typed means "enter", which is NL */ |
2405 if (c1 == '\r') | |
2406 c1 = '\n'; | |
2407 | |
2408 if (c1 == BS || c1 == K_BS | |
2409 || c1 == DEL || c1 == K_DEL || c1 == K_KDEL) | |
7 | 2410 { |
168 | 2411 if (line_ga.ga_len > 0) |
2412 { | |
5966 | 2413 #ifdef FEAT_MBYTE |
2414 if (has_mbyte) | |
2415 { | |
2416 p = (char_u *)line_ga.ga_data; | |
2417 p[line_ga.ga_len] = NUL; | |
2418 len = (*mb_head_off)(p, p + line_ga.ga_len - 1) + 1; | |
2419 line_ga.ga_len -= len; | |
2420 } | |
2421 else | |
2422 #endif | |
2423 --line_ga.ga_len; | |
168 | 2424 goto redraw; |
2425 } | |
2426 continue; | |
7 | 2427 } |
2428 | |
168 | 2429 if (c1 == Ctrl_U) |
7 | 2430 { |
168 | 2431 msg_col = startcol; |
2432 msg_clr_eos(); | |
2433 line_ga.ga_len = 0; | |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2434 goto redraw; |
168 | 2435 } |
2436 | |
2437 if (c1 == Ctrl_T) | |
2438 { | |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2439 sw = get_sw_value(curbuf); |
168 | 2440 p = (char_u *)line_ga.ga_data; |
2441 p[line_ga.ga_len] = NUL; | |
5995 | 2442 indent = get_indent_str(p, 8, FALSE); |
3740 | 2443 indent += sw - indent % sw; |
168 | 2444 add_indent: |
5995 | 2445 while (get_indent_str(p, 8, FALSE) < indent) |
7 | 2446 { |
7009 | 2447 (void)ga_grow(&line_ga, 2); /* one more for the NUL */ |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2448 p = (char_u *)line_ga.ga_data; |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2449 s = skipwhite(p); |
168 | 2450 mch_memmove(s + 1, s, line_ga.ga_len - (s - p) + 1); |
2451 *s = ' '; | |
2452 ++line_ga.ga_len; | |
7 | 2453 } |
168 | 2454 redraw: |
2455 /* redraw the line */ | |
2456 msg_col = startcol; | |
2457 vcol = 0; | |
5966 | 2458 p = (char_u *)line_ga.ga_data; |
2459 p[line_ga.ga_len] = NUL; | |
2460 while (p < (char_u *)line_ga.ga_data + line_ga.ga_len) | |
7 | 2461 { |
168 | 2462 if (*p == TAB) |
7 | 2463 { |
168 | 2464 do |
7 | 2465 { |
168 | 2466 msg_putchar(' '); |
2467 } while (++vcol % 8); | |
5966 | 2468 ++p; |
7 | 2469 } |
168 | 2470 else |
164 | 2471 { |
5966 | 2472 len = MB_PTR2LEN(p); |
2473 msg_outtrans_len(p, len); | |
2474 vcol += ptr2cells(p); | |
2475 p += len; | |
7 | 2476 } |
2477 } | |
168 | 2478 msg_clr_eos(); |
1329 | 2479 windgoto(msg_row, msg_col); |
168 | 2480 continue; |
2481 } | |
2482 | |
2483 if (c1 == Ctrl_D) | |
2484 { | |
2485 /* Delete one shiftwidth. */ | |
2486 p = (char_u *)line_ga.ga_data; | |
2487 if (prev_char == '0' || prev_char == '^') | |
7 | 2488 { |
168 | 2489 if (prev_char == '^') |
2490 ex_keep_indent = TRUE; | |
2491 indent = 0; | |
2492 p[--line_ga.ga_len] = NUL; | |
7 | 2493 } |
2494 else | |
2495 { | |
168 | 2496 p[line_ga.ga_len] = NUL; |
5995 | 2497 indent = get_indent_str(p, 8, FALSE); |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2498 if (indent > 0) |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2499 { |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2500 --indent; |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2501 indent -= indent % get_sw_value(curbuf); |
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2502 } |
168 | 2503 } |
5995 | 2504 while (get_indent_str(p, 8, FALSE) > indent) |
168 | 2505 { |
6733
5f6077b10738
patch 7.4.690 for Problem: Memory access errors when changing indent in Ex mode. Also missing
Bram Moolenaar <bram@vim.org>
parents:
6695
diff
changeset
|
2506 s = skipwhite(p); |
168 | 2507 mch_memmove(s - 1, s, line_ga.ga_len - (s - p) + 1); |
2508 --line_ga.ga_len; | |
7 | 2509 } |
168 | 2510 goto add_indent; |
2511 } | |
2512 | |
2513 if (c1 == Ctrl_V || c1 == Ctrl_Q) | |
2514 { | |
2515 escaped = TRUE; | |
2516 continue; | |
7 | 2517 } |
168 | 2518 |
2519 /* Ignore special key codes: mouse movement, K_IGNORE, etc. */ | |
2520 if (IS_SPECIAL(c1)) | |
2521 continue; | |
7 | 2522 } |
168 | 2523 |
2524 if (IS_SPECIAL(c1)) | |
2525 c1 = '?'; | |
5966 | 2526 #ifdef FEAT_MBYTE |
2527 if (has_mbyte) | |
2528 len = (*mb_char2bytes)(c1, | |
2529 (char_u *)line_ga.ga_data + line_ga.ga_len); | |
2530 else | |
2531 #endif | |
2532 { | |
2533 len = 1; | |
2534 ((char_u *)line_ga.ga_data)[line_ga.ga_len] = c1; | |
2535 } | |
168 | 2536 if (c1 == '\n') |
2537 msg_putchar('\n'); | |
2538 else if (c1 == TAB) | |
2539 { | |
2540 /* Don't use chartabsize(), 'ts' can be different */ | |
2541 do | |
2542 { | |
2543 msg_putchar(' '); | |
2544 } while (++vcol % 8); | |
2545 } | |
7 | 2546 else |
2547 { | |
168 | 2548 msg_outtrans_len( |
5966 | 2549 ((char_u *)line_ga.ga_data) + line_ga.ga_len, len); |
168 | 2550 vcol += char2cells(c1); |
7 | 2551 } |
5966 | 2552 line_ga.ga_len += len; |
168 | 2553 escaped = FALSE; |
2554 | |
2555 windgoto(msg_row, msg_col); | |
164 | 2556 pend = (char_u *)(line_ga.ga_data) + line_ga.ga_len; |
168 | 2557 |
2590 | 2558 /* We are done when a NL is entered, but not when it comes after an |
2559 * odd number of backslashes, that results in a NUL. */ | |
2560 if (line_ga.ga_len > 0 && pend[-1] == '\n') | |
7 | 2561 { |
2590 | 2562 int bcount = 0; |
2563 | |
2564 while (line_ga.ga_len - 2 >= bcount && pend[-2 - bcount] == '\\') | |
2565 ++bcount; | |
2566 | |
2567 if (bcount > 0) | |
2568 { | |
2569 /* Halve the number of backslashes: "\NL" -> "NUL", "\\NL" -> | |
2570 * "\NL", etc. */ | |
2571 line_ga.ga_len -= (bcount + 1) / 2; | |
2572 pend -= (bcount + 1) / 2; | |
2573 pend[-1] = '\n'; | |
2574 } | |
2575 | |
2576 if ((bcount & 1) == 0) | |
2577 { | |
2578 --line_ga.ga_len; | |
2579 --pend; | |
2580 *pend = NUL; | |
2581 break; | |
2582 } | |
7 | 2583 } |
2584 } | |
2585 | |
168 | 2586 --no_mapping; |
2587 --allow_keys; | |
2588 | |
7 | 2589 /* make following messages go to the next line */ |
2590 msg_didout = FALSE; | |
2591 msg_col = 0; | |
2592 if (msg_row < Rows - 1) | |
2593 ++msg_row; | |
2594 emsg_on_display = FALSE; /* don't want ui_delay() */ | |
2595 | |
2596 if (got_int) | |
2597 ga_clear(&line_ga); | |
2598 | |
2599 return (char_u *)line_ga.ga_data; | |
2600 } | |
2601 | |
502 | 2602 # if defined(MCH_CURSOR_SHAPE) || defined(FEAT_GUI) \ |
2603 || defined(FEAT_MOUSESHAPE) || defined(PROTO) | |
7 | 2604 /* |
2605 * Return TRUE if ccline.overstrike is on. | |
2606 */ | |
2607 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2608 cmdline_overstrike(void) |
7 | 2609 { |
2610 return ccline.overstrike; | |
2611 } | |
2612 | |
2613 /* | |
2614 * Return TRUE if the cursor is at the end of the cmdline. | |
2615 */ | |
2616 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2617 cmdline_at_end(void) |
7 | 2618 { |
2619 return (ccline.cmdpos >= ccline.cmdlen); | |
2620 } | |
2621 #endif | |
2622 | |
574 | 2623 #if (defined(FEAT_XIM) && (defined(FEAT_GUI_GTK))) || defined(PROTO) |
7 | 2624 /* |
2625 * Return the virtual column number at the current cursor position. | |
2626 * This is used by the IM code to obtain the start of the preedit string. | |
2627 */ | |
2628 colnr_T | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2629 cmdline_getvcol_cursor(void) |
7 | 2630 { |
2631 if (ccline.cmdbuff == NULL || ccline.cmdpos > ccline.cmdlen) | |
2632 return MAXCOL; | |
2633 | |
2634 # ifdef FEAT_MBYTE | |
2635 if (has_mbyte) | |
2636 { | |
2637 colnr_T col; | |
2638 int i = 0; | |
2639 | |
2640 for (col = 0; i < ccline.cmdpos; ++col) | |
474 | 2641 i += (*mb_ptr2len)(ccline.cmdbuff + i); |
7 | 2642 |
2643 return col; | |
2644 } | |
2645 else | |
2646 # endif | |
2647 return ccline.cmdpos; | |
2648 } | |
2649 #endif | |
2650 | |
2651 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) | |
2652 /* | |
2653 * If part of the command line is an IM preedit string, redraw it with | |
2654 * IM feedback attributes. The cursor position is restored after drawing. | |
2655 */ | |
2656 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2657 redrawcmd_preedit(void) |
7 | 2658 { |
2659 if ((State & CMDLINE) | |
2660 && xic != NULL | |
976 | 2661 /* && im_get_status() doesn't work when using SCIM */ |
7 | 2662 && !p_imdisable |
2663 && im_is_preediting()) | |
2664 { | |
2665 int cmdpos = 0; | |
2666 int cmdspos; | |
2667 int old_row; | |
2668 int old_col; | |
2669 colnr_T col; | |
2670 | |
2671 old_row = msg_row; | |
2672 old_col = msg_col; | |
531 | 2673 cmdspos = ((ccline.cmdfirstc != NUL) ? 1 : 0) + ccline.cmdindent; |
7 | 2674 |
2675 # ifdef FEAT_MBYTE | |
2676 if (has_mbyte) | |
2677 { | |
2678 for (col = 0; col < preedit_start_col | |
2679 && cmdpos < ccline.cmdlen; ++col) | |
2680 { | |
2681 cmdspos += (*mb_ptr2cells)(ccline.cmdbuff + cmdpos); | |
474 | 2682 cmdpos += (*mb_ptr2len)(ccline.cmdbuff + cmdpos); |
7 | 2683 } |
2684 } | |
2685 else | |
2686 # endif | |
2687 { | |
2688 cmdspos += preedit_start_col; | |
2689 cmdpos += preedit_start_col; | |
2690 } | |
2691 | |
2692 msg_row = cmdline_row + (cmdspos / (int)Columns); | |
2693 msg_col = cmdspos % (int)Columns; | |
2694 if (msg_row >= Rows) | |
2695 msg_row = Rows - 1; | |
2696 | |
2697 for (col = 0; cmdpos < ccline.cmdlen; ++col) | |
2698 { | |
2699 int char_len; | |
2700 int char_attr; | |
2701 | |
2702 char_attr = im_get_feedback_attr(col); | |
2703 if (char_attr < 0) | |
2704 break; /* end of preedit string */ | |
2705 | |
2706 # ifdef FEAT_MBYTE | |
2707 if (has_mbyte) | |
474 | 2708 char_len = (*mb_ptr2len)(ccline.cmdbuff + cmdpos); |
7 | 2709 else |
2710 # endif | |
2711 char_len = 1; | |
2712 | |
2713 msg_outtrans_len_attr(ccline.cmdbuff + cmdpos, char_len, char_attr); | |
2714 cmdpos += char_len; | |
2715 } | |
2716 | |
2717 msg_row = old_row; | |
2718 msg_col = old_col; | |
2719 } | |
2720 } | |
2721 #endif /* FEAT_XIM && FEAT_GUI_GTK */ | |
2722 | |
2723 /* | |
2724 * Allocate a new command line buffer. | |
2725 * Assigns the new buffer to ccline.cmdbuff and ccline.cmdbufflen. | |
2726 * Returns the new value of ccline.cmdbuff and ccline.cmdbufflen. | |
2727 */ | |
2728 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2729 alloc_cmdbuff(int len) |
7 | 2730 { |
2731 /* | |
2732 * give some extra space to avoid having to allocate all the time | |
2733 */ | |
2734 if (len < 80) | |
2735 len = 100; | |
2736 else | |
2737 len += 20; | |
2738 | |
2739 ccline.cmdbuff = alloc(len); /* caller should check for out-of-memory */ | |
2740 ccline.cmdbufflen = len; | |
2741 } | |
2742 | |
2743 /* | |
2744 * Re-allocate the command line to length len + something extra. | |
2745 * return FAIL for failure, OK otherwise | |
2746 */ | |
2747 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2748 realloc_cmdbuff(int len) |
7 | 2749 { |
2750 char_u *p; | |
2751 | |
2557
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
2752 if (len < ccline.cmdbufflen) |
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
2753 return OK; /* no need to resize */ |
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
2754 |
7 | 2755 p = ccline.cmdbuff; |
2756 alloc_cmdbuff(len); /* will get some more */ | |
2757 if (ccline.cmdbuff == NULL) /* out of memory */ | |
2758 { | |
2759 ccline.cmdbuff = p; /* keep the old one */ | |
2760 return FAIL; | |
2761 } | |
2556
e065501c703a
Fix illegal memory access when using expressions in the command line.
Bram Moolenaar <bram@vim.org>
parents:
2534
diff
changeset
|
2762 /* There isn't always a NUL after the command, but it may need to be |
e065501c703a
Fix illegal memory access when using expressions in the command line.
Bram Moolenaar <bram@vim.org>
parents:
2534
diff
changeset
|
2763 * there, thus copy up to the NUL and add a NUL. */ |
e065501c703a
Fix illegal memory access when using expressions in the command line.
Bram Moolenaar <bram@vim.org>
parents:
2534
diff
changeset
|
2764 mch_memmove(ccline.cmdbuff, p, (size_t)ccline.cmdlen); |
e065501c703a
Fix illegal memory access when using expressions in the command line.
Bram Moolenaar <bram@vim.org>
parents:
2534
diff
changeset
|
2765 ccline.cmdbuff[ccline.cmdlen] = NUL; |
7 | 2766 vim_free(p); |
1718 | 2767 |
2768 if (ccline.xpc != NULL | |
2769 && ccline.xpc->xp_pattern != NULL | |
2770 && ccline.xpc->xp_context != EXPAND_NOTHING | |
2771 && ccline.xpc->xp_context != EXPAND_UNSUCCESSFUL) | |
2772 { | |
1754 | 2773 int i = (int)(ccline.xpc->xp_pattern - p); |
1718 | 2774 |
2775 /* If xp_pattern points inside the old cmdbuff it needs to be adjusted | |
2776 * to point into the newly allocated memory. */ | |
2777 if (i >= 0 && i <= ccline.cmdlen) | |
2778 ccline.xpc->xp_pattern = ccline.cmdbuff + i; | |
2779 } | |
2780 | |
7 | 2781 return OK; |
2782 } | |
2783 | |
359 | 2784 #if defined(FEAT_ARABIC) || defined(PROTO) |
2785 static char_u *arshape_buf = NULL; | |
2786 | |
2787 # if defined(EXITFREE) || defined(PROTO) | |
2788 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2789 free_cmdline_buf(void) |
359 | 2790 { |
2791 vim_free(arshape_buf); | |
2792 } | |
2793 # endif | |
2794 #endif | |
2795 | |
7 | 2796 /* |
2797 * Draw part of the cmdline at the current cursor position. But draw stars | |
2798 * when cmdline_star is TRUE. | |
2799 */ | |
2800 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2801 draw_cmdline(int start, int len) |
7 | 2802 { |
2803 #if defined(FEAT_CRYPT) || defined(FEAT_EVAL) | |
2804 int i; | |
2805 | |
2806 if (cmdline_star > 0) | |
2807 for (i = 0; i < len; ++i) | |
2808 { | |
2809 msg_putchar('*'); | |
2810 # ifdef FEAT_MBYTE | |
2811 if (has_mbyte) | |
474 | 2812 i += (*mb_ptr2len)(ccline.cmdbuff + start + i) - 1; |
7 | 2813 # endif |
2814 } | |
2815 else | |
2816 #endif | |
2817 #ifdef FEAT_ARABIC | |
2818 if (p_arshape && !p_tbidi && enc_utf8 && len > 0) | |
2819 { | |
2820 static int buflen = 0; | |
2821 char_u *p; | |
2822 int j; | |
2823 int newlen = 0; | |
2824 int mb_l; | |
719 | 2825 int pc, pc1 = 0; |
7 | 2826 int prev_c = 0; |
2827 int prev_c1 = 0; | |
714 | 2828 int u8c; |
2829 int u8cc[MAX_MCO]; | |
7 | 2830 int nc = 0; |
2831 | |
2832 /* | |
2833 * Do arabic shaping into a temporary buffer. This is very | |
2834 * inefficient! | |
2835 */ | |
507 | 2836 if (len * 2 + 2 > buflen) |
7 | 2837 { |
2838 /* Re-allocate the buffer. We keep it around to avoid a lot of | |
2839 * alloc()/free() calls. */ | |
359 | 2840 vim_free(arshape_buf); |
507 | 2841 buflen = len * 2 + 2; |
359 | 2842 arshape_buf = alloc(buflen); |
2843 if (arshape_buf == NULL) | |
7 | 2844 return; /* out of memory */ |
2845 } | |
2846 | |
507 | 2847 if (utf_iscomposing(utf_ptr2char(ccline.cmdbuff + start))) |
2848 { | |
2849 /* Prepend a space to draw the leading composing char on. */ | |
2850 arshape_buf[0] = ' '; | |
2851 newlen = 1; | |
2852 } | |
2853 | |
7 | 2854 for (j = start; j < start + len; j += mb_l) |
2855 { | |
2856 p = ccline.cmdbuff + j; | |
714 | 2857 u8c = utfc_ptr2char_len(p, u8cc, start + len - j); |
474 | 2858 mb_l = utfc_ptr2len_len(p, start + len - j); |
7 | 2859 if (ARABIC_CHAR(u8c)) |
2860 { | |
2861 /* Do Arabic shaping. */ | |
2862 if (cmdmsg_rl) | |
2863 { | |
2864 /* displaying from right to left */ | |
2865 pc = prev_c; | |
2866 pc1 = prev_c1; | |
714 | 2867 prev_c1 = u8cc[0]; |
7 | 2868 if (j + mb_l >= start + len) |
2869 nc = NUL; | |
2870 else | |
2871 nc = utf_ptr2char(p + mb_l); | |
2872 } | |
2873 else | |
2874 { | |
2875 /* displaying from left to right */ | |
2876 if (j + mb_l >= start + len) | |
2877 pc = NUL; | |
2878 else | |
714 | 2879 { |
2880 int pcc[MAX_MCO]; | |
2881 | |
2882 pc = utfc_ptr2char_len(p + mb_l, pcc, | |
7 | 2883 start + len - j - mb_l); |
714 | 2884 pc1 = pcc[0]; |
2885 } | |
7 | 2886 nc = prev_c; |
2887 } | |
2888 prev_c = u8c; | |
2889 | |
714 | 2890 u8c = arabic_shape(u8c, NULL, &u8cc[0], pc, pc1, nc); |
7 | 2891 |
359 | 2892 newlen += (*mb_char2bytes)(u8c, arshape_buf + newlen); |
714 | 2893 if (u8cc[0] != 0) |
7 | 2894 { |
714 | 2895 newlen += (*mb_char2bytes)(u8cc[0], arshape_buf + newlen); |
2896 if (u8cc[1] != 0) | |
2897 newlen += (*mb_char2bytes)(u8cc[1], | |
359 | 2898 arshape_buf + newlen); |
7 | 2899 } |
2900 } | |
2901 else | |
2902 { | |
2903 prev_c = u8c; | |
359 | 2904 mch_memmove(arshape_buf + newlen, p, mb_l); |
7 | 2905 newlen += mb_l; |
2906 } | |
2907 } | |
2908 | |
359 | 2909 msg_outtrans_len(arshape_buf, newlen); |
7 | 2910 } |
2911 else | |
2912 #endif | |
2913 msg_outtrans_len(ccline.cmdbuff + start, len); | |
2914 } | |
2915 | |
2916 /* | |
2917 * Put a character on the command line. Shifts the following text to the | |
2918 * right when "shift" is TRUE. Used for CTRL-V, CTRL-K, etc. | |
2919 * "c" must be printable (fit in one display cell)! | |
2920 */ | |
2921 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2922 putcmdline(int c, int shift) |
7 | 2923 { |
2924 if (cmd_silent) | |
2925 return; | |
2926 msg_no_more = TRUE; | |
2927 msg_putchar(c); | |
2928 if (shift) | |
2929 draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos); | |
2930 msg_no_more = FALSE; | |
2931 cursorcmd(); | |
2932 } | |
2933 | |
2934 /* | |
2935 * Undo a putcmdline(c, FALSE). | |
2936 */ | |
2937 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2938 unputcmdline(void) |
7 | 2939 { |
2940 if (cmd_silent) | |
2941 return; | |
2942 msg_no_more = TRUE; | |
2943 if (ccline.cmdlen == ccline.cmdpos) | |
2944 msg_putchar(' '); | |
3558 | 2945 #ifdef FEAT_MBYTE |
2946 else if (has_mbyte) | |
2947 draw_cmdline(ccline.cmdpos, | |
2948 (*mb_ptr2len)(ccline.cmdbuff + ccline.cmdpos)); | |
2949 #endif | |
7 | 2950 else |
2951 draw_cmdline(ccline.cmdpos, 1); | |
2952 msg_no_more = FALSE; | |
2953 cursorcmd(); | |
2954 } | |
2955 | |
2956 /* | |
2957 * Put the given string, of the given length, onto the command line. | |
2958 * If len is -1, then STRLEN() is used to calculate the length. | |
2959 * If 'redraw' is TRUE then the new part of the command line, and the remaining | |
2960 * part will be redrawn, otherwise it will not. If this function is called | |
2961 * twice in a row, then 'redraw' should be FALSE and redrawcmd() should be | |
2962 * called afterwards. | |
2963 */ | |
2964 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
2965 put_on_cmdline(char_u *str, int len, int redraw) |
7 | 2966 { |
2967 int retval; | |
2968 int i; | |
2969 int m; | |
2970 int c; | |
2971 | |
2972 if (len < 0) | |
2973 len = (int)STRLEN(str); | |
2974 | |
2975 /* Check if ccline.cmdbuff needs to be longer */ | |
2976 if (ccline.cmdlen + len + 1 >= ccline.cmdbufflen) | |
2557
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
2977 retval = realloc_cmdbuff(ccline.cmdlen + len + 1); |
7 | 2978 else |
2979 retval = OK; | |
2980 if (retval == OK) | |
2981 { | |
2982 if (!ccline.overstrike) | |
2983 { | |
2984 mch_memmove(ccline.cmdbuff + ccline.cmdpos + len, | |
2985 ccline.cmdbuff + ccline.cmdpos, | |
2986 (size_t)(ccline.cmdlen - ccline.cmdpos)); | |
2987 ccline.cmdlen += len; | |
2988 } | |
2989 else | |
2990 { | |
2991 #ifdef FEAT_MBYTE | |
2992 if (has_mbyte) | |
2993 { | |
2994 /* Count nr of characters in the new string. */ | |
2995 m = 0; | |
474 | 2996 for (i = 0; i < len; i += (*mb_ptr2len)(str + i)) |
7 | 2997 ++m; |
2998 /* Count nr of bytes in cmdline that are overwritten by these | |
2999 * characters. */ | |
3000 for (i = ccline.cmdpos; i < ccline.cmdlen && m > 0; | |
474 | 3001 i += (*mb_ptr2len)(ccline.cmdbuff + i)) |
7 | 3002 --m; |
3003 if (i < ccline.cmdlen) | |
3004 { | |
3005 mch_memmove(ccline.cmdbuff + ccline.cmdpos + len, | |
3006 ccline.cmdbuff + i, (size_t)(ccline.cmdlen - i)); | |
3007 ccline.cmdlen += ccline.cmdpos + len - i; | |
3008 } | |
3009 else | |
3010 ccline.cmdlen = ccline.cmdpos + len; | |
3011 } | |
3012 else | |
3013 #endif | |
3014 if (ccline.cmdpos + len > ccline.cmdlen) | |
3015 ccline.cmdlen = ccline.cmdpos + len; | |
3016 } | |
3017 mch_memmove(ccline.cmdbuff + ccline.cmdpos, str, (size_t)len); | |
3018 ccline.cmdbuff[ccline.cmdlen] = NUL; | |
3019 | |
3020 #ifdef FEAT_MBYTE | |
3021 if (enc_utf8) | |
3022 { | |
3023 /* When the inserted text starts with a composing character, | |
3024 * backup to the character before it. There could be two of them. | |
3025 */ | |
3026 i = 0; | |
3027 c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos); | |
3028 while (ccline.cmdpos > 0 && utf_iscomposing(c)) | |
3029 { | |
3030 i = (*mb_head_off)(ccline.cmdbuff, | |
3031 ccline.cmdbuff + ccline.cmdpos - 1) + 1; | |
3032 ccline.cmdpos -= i; | |
3033 len += i; | |
3034 c = utf_ptr2char(ccline.cmdbuff + ccline.cmdpos); | |
3035 } | |
3036 # ifdef FEAT_ARABIC | |
3037 if (i == 0 && ccline.cmdpos > 0 && arabic_maycombine(c)) | |
3038 { | |
3039 /* Check the previous character for Arabic combining pair. */ | |
3040 i = (*mb_head_off)(ccline.cmdbuff, | |
3041 ccline.cmdbuff + ccline.cmdpos - 1) + 1; | |
3042 if (arabic_combine(utf_ptr2char(ccline.cmdbuff | |
3043 + ccline.cmdpos - i), c)) | |
3044 { | |
3045 ccline.cmdpos -= i; | |
3046 len += i; | |
3047 } | |
3048 else | |
3049 i = 0; | |
3050 } | |
3051 # endif | |
3052 if (i != 0) | |
3053 { | |
3054 /* Also backup the cursor position. */ | |
3055 i = ptr2cells(ccline.cmdbuff + ccline.cmdpos); | |
3056 ccline.cmdspos -= i; | |
3057 msg_col -= i; | |
3058 if (msg_col < 0) | |
3059 { | |
3060 msg_col += Columns; | |
3061 --msg_row; | |
3062 } | |
3063 } | |
3064 } | |
3065 #endif | |
3066 | |
3067 if (redraw && !cmd_silent) | |
3068 { | |
3069 msg_no_more = TRUE; | |
3070 i = cmdline_row; | |
3114 | 3071 cursorcmd(); |
7 | 3072 draw_cmdline(ccline.cmdpos, ccline.cmdlen - ccline.cmdpos); |
3073 /* Avoid clearing the rest of the line too often. */ | |
3074 if (cmdline_row != i || ccline.overstrike) | |
3075 msg_clr_eos(); | |
3076 msg_no_more = FALSE; | |
3077 } | |
3078 #ifdef FEAT_FKMAP | |
3079 /* | |
3080 * If we are in Farsi command mode, the character input must be in | |
3081 * Insert mode. So do not advance the cmdpos. | |
3082 */ | |
3083 if (!cmd_fkmap) | |
3084 #endif | |
3085 { | |
3086 if (KeyTyped) | |
534 | 3087 { |
7 | 3088 m = Columns * Rows; |
534 | 3089 if (m < 0) /* overflow, Columns or Rows at weird value */ |
3090 m = MAXCOL; | |
3091 } | |
7 | 3092 else |
3093 m = MAXCOL; | |
3094 for (i = 0; i < len; ++i) | |
3095 { | |
3096 c = cmdline_charsize(ccline.cmdpos); | |
3097 #ifdef FEAT_MBYTE | |
3098 /* count ">" for a double-wide char that doesn't fit. */ | |
3099 if (has_mbyte) | |
3100 correct_cmdspos(ccline.cmdpos, c); | |
3101 #endif | |
1612 | 3102 /* Stop cursor at the end of the screen, but do increment the |
3103 * insert position, so that entering a very long command | |
3104 * works, even though you can't see it. */ | |
3105 if (ccline.cmdspos + c < m) | |
3106 ccline.cmdspos += c; | |
7 | 3107 #ifdef FEAT_MBYTE |
3108 if (has_mbyte) | |
3109 { | |
474 | 3110 c = (*mb_ptr2len)(ccline.cmdbuff + ccline.cmdpos) - 1; |
7 | 3111 if (c > len - i - 1) |
3112 c = len - i - 1; | |
3113 ccline.cmdpos += c; | |
3114 i += c; | |
3115 } | |
3116 #endif | |
3117 ++ccline.cmdpos; | |
3118 } | |
3119 } | |
3120 } | |
3121 if (redraw) | |
3122 msg_check(); | |
3123 return retval; | |
3124 } | |
3125 | |
95 | 3126 static struct cmdline_info prev_ccline; |
3127 static int prev_ccline_used = FALSE; | |
3128 | |
3129 /* | |
3130 * Save ccline, because obtaining the "=" register may execute "normal :cmd" | |
3131 * and overwrite it. But get_cmdline_str() may need it, thus make it | |
3132 * available globally in prev_ccline. | |
3133 */ | |
3134 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3135 save_cmdline(struct cmdline_info *ccp) |
95 | 3136 { |
3137 if (!prev_ccline_used) | |
3138 { | |
3139 vim_memset(&prev_ccline, 0, sizeof(struct cmdline_info)); | |
3140 prev_ccline_used = TRUE; | |
3141 } | |
3142 *ccp = prev_ccline; | |
3143 prev_ccline = ccline; | |
3144 ccline.cmdbuff = NULL; | |
3145 ccline.cmdprompt = NULL; | |
1718 | 3146 ccline.xpc = NULL; |
95 | 3147 } |
3148 | |
3149 /* | |
1214 | 3150 * Restore ccline after it has been saved with save_cmdline(). |
95 | 3151 */ |
3152 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3153 restore_cmdline(struct cmdline_info *ccp) |
95 | 3154 { |
3155 ccline = prev_ccline; | |
3156 prev_ccline = *ccp; | |
3157 } | |
3158 | |
849 | 3159 #if defined(FEAT_EVAL) || defined(PROTO) |
3160 /* | |
3161 * Save the command line into allocated memory. Returns a pointer to be | |
3162 * passed to restore_cmdline_alloc() later. | |
3163 * Returns NULL when failed. | |
3164 */ | |
3165 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3166 save_cmdline_alloc(void) |
849 | 3167 { |
3168 struct cmdline_info *p; | |
3169 | |
3170 p = (struct cmdline_info *)alloc((unsigned)sizeof(struct cmdline_info)); | |
3171 if (p != NULL) | |
3172 save_cmdline(p); | |
3173 return (char_u *)p; | |
3174 } | |
3175 | |
3176 /* | |
3177 * Restore the command line from the return value of save_cmdline_alloc(). | |
3178 */ | |
3179 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3180 restore_cmdline_alloc(char_u *p) |
849 | 3181 { |
3182 if (p != NULL) | |
3183 { | |
3184 restore_cmdline((struct cmdline_info *)p); | |
3185 vim_free(p); | |
3186 } | |
3187 } | |
3188 #endif | |
3189 | |
15 | 3190 /* |
7336
4c5f53a60543
commit https://github.com/vim/vim/commit/6f62fed349bf829da2adb02619dc9acba13c8ab6
Christian Brabandt <cb@256bit.org>
parents:
7250
diff
changeset
|
3191 * Paste a yank register into the command line. |
4c5f53a60543
commit https://github.com/vim/vim/commit/6f62fed349bf829da2adb02619dc9acba13c8ab6
Christian Brabandt <cb@256bit.org>
parents:
7250
diff
changeset
|
3192 * Used by CTRL-R command in command-line mode. |
15 | 3193 * insert_reg() can't be used here, because special characters from the |
3194 * register contents will be interpreted as commands. | |
3195 * | |
7336
4c5f53a60543
commit https://github.com/vim/vim/commit/6f62fed349bf829da2adb02619dc9acba13c8ab6
Christian Brabandt <cb@256bit.org>
parents:
7250
diff
changeset
|
3196 * Return FAIL for failure, OK otherwise. |
15 | 3197 */ |
3198 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3199 cmdline_paste( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3200 int regname, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3201 int literally, /* Insert text literally instead of "as typed" */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3202 int remcr) /* remove trailing CR */ |
15 | 3203 { |
3204 long i; | |
3205 char_u *arg; | |
772 | 3206 char_u *p; |
15 | 3207 int allocated; |
3208 struct cmdline_info save_ccline; | |
3209 | |
3210 /* check for valid regname; also accept special characters for CTRL-R in | |
3211 * the command line */ | |
3212 if (regname != Ctrl_F && regname != Ctrl_P && regname != Ctrl_W | |
3213 && regname != Ctrl_A && !valid_yank_reg(regname, FALSE)) | |
3214 return FAIL; | |
3215 | |
3216 /* A register containing CTRL-R can cause an endless loop. Allow using | |
3217 * CTRL-C to break the loop. */ | |
3218 line_breakcheck(); | |
3219 if (got_int) | |
3220 return FAIL; | |
3221 | |
3222 #ifdef FEAT_CLIPBOARD | |
3223 regname = may_get_selection(regname); | |
3224 #endif | |
3225 | |
634 | 3226 /* Need to save and restore ccline. And set "textlock" to avoid nasty |
632 | 3227 * things like going to another buffer when evaluating an expression. */ |
95 | 3228 save_cmdline(&save_ccline); |
634 | 3229 ++textlock; |
15 | 3230 i = get_spec_reg(regname, &arg, &allocated, TRUE); |
634 | 3231 --textlock; |
95 | 3232 restore_cmdline(&save_ccline); |
15 | 3233 |
3234 if (i) | |
3235 { | |
3236 /* Got the value of a special register in "arg". */ | |
3237 if (arg == NULL) | |
3238 return FAIL; | |
772 | 3239 |
3240 /* When 'incsearch' is set and CTRL-R CTRL-W used: skip the duplicate | |
3241 * part of the word. */ | |
3242 p = arg; | |
3243 if (p_is && regname == Ctrl_W) | |
3244 { | |
3245 char_u *w; | |
3246 int len; | |
3247 | |
3248 /* Locate start of last word in the cmd buffer. */ | |
2937 | 3249 for (w = ccline.cmdbuff + ccline.cmdpos; w > ccline.cmdbuff; ) |
772 | 3250 { |
3251 #ifdef FEAT_MBYTE | |
3252 if (has_mbyte) | |
3253 { | |
3254 len = (*mb_head_off)(ccline.cmdbuff, w - 1) + 1; | |
3255 if (!vim_iswordc(mb_ptr2char(w - len))) | |
3256 break; | |
3257 w -= len; | |
3258 } | |
3259 else | |
3260 #endif | |
3261 { | |
3262 if (!vim_iswordc(w[-1])) | |
3263 break; | |
3264 --w; | |
3265 } | |
3266 } | |
2937 | 3267 len = (int)((ccline.cmdbuff + ccline.cmdpos) - w); |
772 | 3268 if (p_ic ? STRNICMP(w, arg, len) == 0 : STRNCMP(w, arg, len) == 0) |
3269 p += len; | |
3270 } | |
3271 | |
3272 cmdline_paste_str(p, literally); | |
15 | 3273 if (allocated) |
3274 vim_free(arg); | |
3275 return OK; | |
3276 } | |
3277 | |
1015 | 3278 return cmdline_paste_reg(regname, literally, remcr); |
15 | 3279 } |
3280 | |
3281 /* | |
3282 * Put a string on the command line. | |
3283 * When "literally" is TRUE, insert literally. | |
3284 * When "literally" is FALSE, insert as typed, but don't leave the command | |
3285 * line. | |
3286 */ | |
3287 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3288 cmdline_paste_str(char_u *s, int literally) |
15 | 3289 { |
3290 int c, cv; | |
3291 | |
3292 if (literally) | |
3293 put_on_cmdline(s, -1, TRUE); | |
3294 else | |
3295 while (*s != NUL) | |
3296 { | |
3297 cv = *s; | |
3298 if (cv == Ctrl_V && s[1]) | |
3299 ++s; | |
3300 #ifdef FEAT_MBYTE | |
3301 if (has_mbyte) | |
1606 | 3302 c = mb_cptr2char_adv(&s); |
15 | 3303 else |
3304 #endif | |
3305 c = *s++; | |
3628 | 3306 if (cv == Ctrl_V || c == ESC || c == Ctrl_C |
3307 || c == CAR || c == NL || c == Ctrl_L | |
15 | 3308 #ifdef UNIX |
3309 || c == intr_char | |
3310 #endif | |
3311 || (c == Ctrl_BSL && *s == Ctrl_N)) | |
3312 stuffcharReadbuff(Ctrl_V); | |
3313 stuffcharReadbuff(c); | |
3314 } | |
3315 } | |
3316 | |
7 | 3317 #ifdef FEAT_WILDMENU |
3318 /* | |
3319 * Delete characters on the command line, from "from" to the current | |
3320 * position. | |
3321 */ | |
3322 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3323 cmdline_del(int from) |
7 | 3324 { |
3325 mch_memmove(ccline.cmdbuff + from, ccline.cmdbuff + ccline.cmdpos, | |
3326 (size_t)(ccline.cmdlen - ccline.cmdpos + 1)); | |
3327 ccline.cmdlen -= ccline.cmdpos - from; | |
3328 ccline.cmdpos = from; | |
3329 } | |
3330 #endif | |
3331 | |
3332 /* | |
9066
c7bdd383275d
commit https://github.com/vim/vim/commit/89c79b99328b66f77f1d12dc8c6701dfe2c57f15
Christian Brabandt <cb@256bit.org>
parents:
8765
diff
changeset
|
3333 * This function is called when the screen size changes and with incremental |
c7bdd383275d
commit https://github.com/vim/vim/commit/89c79b99328b66f77f1d12dc8c6701dfe2c57f15
Christian Brabandt <cb@256bit.org>
parents:
8765
diff
changeset
|
3334 * search and in other situations where the command line may have been |
c7bdd383275d
commit https://github.com/vim/vim/commit/89c79b99328b66f77f1d12dc8c6701dfe2c57f15
Christian Brabandt <cb@256bit.org>
parents:
8765
diff
changeset
|
3335 * overwritten. |
7 | 3336 */ |
3337 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3338 redrawcmdline(void) |
7 | 3339 { |
11416
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3340 redrawcmdline_ex(TRUE); |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3341 } |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3342 |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3343 void |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3344 redrawcmdline_ex(int do_compute_cmdrow) |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3345 { |
7 | 3346 if (cmd_silent) |
3347 return; | |
3348 need_wait_return = FALSE; | |
11416
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3349 if (do_compute_cmdrow) |
32aed0993813
patch 8.0.0592: if a job writes to a buffer screen is not updated
Christian Brabandt <cb@256bit.org>
parents:
11321
diff
changeset
|
3350 compute_cmdrow(); |
7 | 3351 redrawcmd(); |
3352 cursorcmd(); | |
3353 } | |
3354 | |
3355 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3356 redrawcmdprompt(void) |
7 | 3357 { |
3358 int i; | |
3359 | |
3360 if (cmd_silent) | |
3361 return; | |
531 | 3362 if (ccline.cmdfirstc != NUL) |
7 | 3363 msg_putchar(ccline.cmdfirstc); |
3364 if (ccline.cmdprompt != NULL) | |
3365 { | |
3366 msg_puts_attr(ccline.cmdprompt, ccline.cmdattr); | |
3367 ccline.cmdindent = msg_col + (msg_row - cmdline_row) * Columns; | |
3368 /* do the reverse of set_cmdspos() */ | |
531 | 3369 if (ccline.cmdfirstc != NUL) |
7 | 3370 --ccline.cmdindent; |
3371 } | |
3372 else | |
3373 for (i = ccline.cmdindent; i > 0; --i) | |
3374 msg_putchar(' '); | |
3375 } | |
3376 | |
3377 /* | |
3378 * Redraw what is currently on the command line. | |
3379 */ | |
3380 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3381 redrawcmd(void) |
7 | 3382 { |
3383 if (cmd_silent) | |
3384 return; | |
3385 | |
683 | 3386 /* when 'incsearch' is set there may be no command line while redrawing */ |
3387 if (ccline.cmdbuff == NULL) | |
3388 { | |
3389 windgoto(cmdline_row, 0); | |
3390 msg_clr_eos(); | |
3391 return; | |
3392 } | |
3393 | |
7 | 3394 msg_start(); |
3395 redrawcmdprompt(); | |
3396 | |
3397 /* Don't use more prompt, truncate the cmdline if it doesn't fit. */ | |
3398 msg_no_more = TRUE; | |
3399 draw_cmdline(0, ccline.cmdlen); | |
3400 msg_clr_eos(); | |
3401 msg_no_more = FALSE; | |
3402 | |
3403 set_cmdspos_cursor(); | |
3404 | |
3405 /* | |
3406 * An emsg() before may have set msg_scroll. This is used in normal mode, | |
3407 * in cmdline mode we can reset them now. | |
3408 */ | |
3409 msg_scroll = FALSE; /* next message overwrites cmdline */ | |
3410 | |
3411 /* Typing ':' at the more prompt may set skip_redraw. We don't want this | |
3412 * in cmdline mode */ | |
3413 skip_redraw = FALSE; | |
3414 } | |
3415 | |
3416 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3417 compute_cmdrow(void) |
7 | 3418 { |
540 | 3419 if (exmode_active || msg_scrolled != 0) |
7 | 3420 cmdline_row = Rows - 1; |
3421 else | |
3422 cmdline_row = W_WINROW(lastwin) + lastwin->w_height | |
3423 + W_STATUS_HEIGHT(lastwin); | |
3424 } | |
3425 | |
3426 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3427 cursorcmd(void) |
7 | 3428 { |
3429 if (cmd_silent) | |
3430 return; | |
3431 | |
3432 #ifdef FEAT_RIGHTLEFT | |
3433 if (cmdmsg_rl) | |
3434 { | |
3435 msg_row = cmdline_row + (ccline.cmdspos / (int)(Columns - 1)); | |
3436 msg_col = (int)Columns - (ccline.cmdspos % (int)(Columns - 1)) - 1; | |
3437 if (msg_row <= 0) | |
3438 msg_row = Rows - 1; | |
3439 } | |
3440 else | |
3441 #endif | |
3442 { | |
3443 msg_row = cmdline_row + (ccline.cmdspos / (int)Columns); | |
3444 msg_col = ccline.cmdspos % (int)Columns; | |
3445 if (msg_row >= Rows) | |
3446 msg_row = Rows - 1; | |
3447 } | |
3448 | |
3449 windgoto(msg_row, msg_col); | |
3450 #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) | |
3451 redrawcmd_preedit(); | |
3452 #endif | |
3453 #ifdef MCH_CURSOR_SHAPE | |
3454 mch_update_cursor(); | |
3455 #endif | |
3456 } | |
3457 | |
3458 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3459 gotocmdline(int clr) |
7 | 3460 { |
3461 msg_start(); | |
3462 #ifdef FEAT_RIGHTLEFT | |
3463 if (cmdmsg_rl) | |
3464 msg_col = Columns - 1; | |
3465 else | |
3466 #endif | |
3467 msg_col = 0; /* always start in column 0 */ | |
3468 if (clr) /* clear the bottom line(s) */ | |
3469 msg_clr_eos(); /* will reset clear_cmdline */ | |
3470 windgoto(cmdline_row, 0); | |
3471 } | |
3472 | |
3473 /* | |
3474 * Check the word in front of the cursor for an abbreviation. | |
3475 * Called when the non-id character "c" has been entered. | |
3476 * When an abbreviation is recognized it is removed from the text with | |
3477 * backspaces and the replacement string is inserted, followed by "c". | |
3478 */ | |
3479 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3480 ccheck_abbr(int c) |
7 | 3481 { |
3482 if (p_paste || no_abbr) /* no abbreviations or in paste mode */ | |
3483 return FALSE; | |
3484 | |
3485 return check_abbr(c, ccline.cmdbuff, ccline.cmdpos, 0); | |
3486 } | |
3487 | |
3164 | 3488 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
3489 static int | |
3490 #ifdef __BORLANDC__ | |
3491 _RTLENTRYF | |
3492 #endif | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3493 sort_func_compare(const void *s1, const void *s2) |
3164 | 3494 { |
3495 char_u *p1 = *(char_u **)s1; | |
3496 char_u *p2 = *(char_u **)s2; | |
3497 | |
3498 if (*p1 != '<' && *p2 == '<') return -1; | |
3499 if (*p1 == '<' && *p2 != '<') return 1; | |
3500 return STRCMP(p1, p2); | |
3501 } | |
3502 #endif | |
3503 | |
7 | 3504 /* |
3505 * Return FAIL if this is not an appropriate context in which to do | |
3506 * completion of anything, return OK if it is (even if there are no matches). | |
3507 * For the caller, this means that the character is just passed through like a | |
3508 * normal character (instead of being expanded). This allows :s/^I^D etc. | |
3509 */ | |
3510 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3511 nextwild( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3512 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3513 int type, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3514 int options, /* extra options for ExpandOne() */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3515 int escape) /* if TRUE, escape the returned matches */ |
7 | 3516 { |
3517 int i, j; | |
3518 char_u *p1; | |
3519 char_u *p2; | |
3520 int difflen; | |
3521 int v; | |
3522 | |
3523 if (xp->xp_numfiles == -1) | |
3524 { | |
3525 set_expand_context(xp); | |
3526 cmd_showtail = expand_showtail(xp); | |
3527 } | |
3528 | |
3529 if (xp->xp_context == EXPAND_UNSUCCESSFUL) | |
3530 { | |
3531 beep_flush(); | |
3532 return OK; /* Something illegal on command line */ | |
3533 } | |
3534 if (xp->xp_context == EXPAND_NOTHING) | |
3535 { | |
3536 /* Caller can use the character as a normal char instead */ | |
3537 return FAIL; | |
3538 } | |
3539 | |
3540 MSG_PUTS("..."); /* show that we are busy */ | |
3541 out_flush(); | |
3542 | |
3543 i = (int)(xp->xp_pattern - ccline.cmdbuff); | |
1965 | 3544 xp->xp_pattern_len = ccline.cmdpos - i; |
7 | 3545 |
3546 if (type == WILD_NEXT || type == WILD_PREV) | |
3547 { | |
3548 /* | |
3549 * Get next/previous match for a previous expanded pattern. | |
3550 */ | |
3551 p2 = ExpandOne(xp, NULL, NULL, 0, type); | |
3552 } | |
3553 else | |
3554 { | |
3555 /* | |
3556 * Translate string into pattern and expand it. | |
3557 */ | |
1965 | 3558 if ((p1 = addstar(xp->xp_pattern, xp->xp_pattern_len, |
3559 xp->xp_context)) == NULL) | |
7 | 3560 p2 = NULL; |
3561 else | |
3562 { | |
2652 | 3563 int use_options = options | |
3961 | 3564 WILD_HOME_REPLACE|WILD_ADD_SLASH|WILD_SILENT; |
3565 if (escape) | |
3566 use_options |= WILD_ESCAPE; | |
2652 | 3567 |
3568 if (p_wic) | |
3569 use_options += WILD_ICASE; | |
1965 | 3570 p2 = ExpandOne(xp, p1, |
3571 vim_strnsave(&ccline.cmdbuff[i], xp->xp_pattern_len), | |
2652 | 3572 use_options, type); |
7 | 3573 vim_free(p1); |
2047
85da03763130
updated for version 7.2.333
Bram Moolenaar <bram@zimbu.org>
parents:
2016
diff
changeset
|
3574 /* longest match: make sure it is not shorter, happens with :help */ |
7 | 3575 if (p2 != NULL && type == WILD_LONGEST) |
3576 { | |
1965 | 3577 for (j = 0; j < xp->xp_pattern_len; ++j) |
7 | 3578 if (ccline.cmdbuff[i + j] == '*' |
3579 || ccline.cmdbuff[i + j] == '?') | |
3580 break; | |
3581 if ((int)STRLEN(p2) < j) | |
3582 { | |
3583 vim_free(p2); | |
3584 p2 = NULL; | |
3585 } | |
3586 } | |
3587 } | |
3588 } | |
3589 | |
3590 if (p2 != NULL && !got_int) | |
3591 { | |
1965 | 3592 difflen = (int)STRLEN(p2) - xp->xp_pattern_len; |
2557
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
3593 if (ccline.cmdlen + difflen + 4 > ccline.cmdbufflen) |
7 | 3594 { |
2557
029ace8dff7d
Now really fix using expressions in the command line (hopefully).
Bram Moolenaar <bram@vim.org>
parents:
2556
diff
changeset
|
3595 v = realloc_cmdbuff(ccline.cmdlen + difflen + 4); |
7 | 3596 xp->xp_pattern = ccline.cmdbuff + i; |
3597 } | |
3598 else | |
3599 v = OK; | |
3600 if (v == OK) | |
3601 { | |
323 | 3602 mch_memmove(&ccline.cmdbuff[ccline.cmdpos + difflen], |
3603 &ccline.cmdbuff[ccline.cmdpos], | |
3604 (size_t)(ccline.cmdlen - ccline.cmdpos + 1)); | |
3605 mch_memmove(&ccline.cmdbuff[i], p2, STRLEN(p2)); | |
7 | 3606 ccline.cmdlen += difflen; |
3607 ccline.cmdpos += difflen; | |
3608 } | |
3609 } | |
3610 vim_free(p2); | |
3611 | |
3612 redrawcmd(); | |
33 | 3613 cursorcmd(); |
7 | 3614 |
3615 /* When expanding a ":map" command and no matches are found, assume that | |
3616 * the key is supposed to be inserted literally */ | |
3617 if (xp->xp_context == EXPAND_MAPPINGS && p2 == NULL) | |
3618 return FAIL; | |
3619 | |
3620 if (xp->xp_numfiles <= 0 && p2 == NULL) | |
3621 beep_flush(); | |
3622 else if (xp->xp_numfiles == 1) | |
3623 /* free expanded pattern */ | |
3624 (void)ExpandOne(xp, NULL, NULL, 0, WILD_FREE); | |
3625 | |
3626 return OK; | |
3627 } | |
3628 | |
3629 /* | |
3630 * Do wildcard expansion on the string 'str'. | |
3631 * Chars that should not be expanded must be preceded with a backslash. | |
1612 | 3632 * Return a pointer to allocated memory containing the new string. |
7 | 3633 * Return NULL for failure. |
3634 * | |
1412 | 3635 * "orig" is the originally expanded string, copied to allocated memory. It |
3636 * should either be kept in orig_save or freed. When "mode" is WILD_NEXT or | |
3637 * WILD_PREV "orig" should be NULL. | |
3638 * | |
838 | 3639 * Results are cached in xp->xp_files and xp->xp_numfiles, except when "mode" |
3640 * is WILD_EXPAND_FREE or WILD_ALL. | |
7 | 3641 * |
3642 * mode = WILD_FREE: just free previously expanded matches | |
3643 * mode = WILD_EXPAND_FREE: normal expansion, do not keep matches | |
3644 * mode = WILD_EXPAND_KEEP: normal expansion, keep matches | |
3645 * mode = WILD_NEXT: use next match in multiple match, wrap to first | |
3646 * mode = WILD_PREV: use previous match in multiple match, wrap to first | |
3647 * mode = WILD_ALL: return all matches concatenated | |
3648 * mode = WILD_LONGEST: return longest matched part | |
3398 | 3649 * mode = WILD_ALL_KEEP: get all matches, keep matches |
7 | 3650 * |
3651 * options = WILD_LIST_NOTFOUND: list entries without a match | |
3652 * options = WILD_HOME_REPLACE: do home_replace() for buffer names | |
3653 * options = WILD_USE_NL: Use '\n' for WILD_ALL | |
3654 * options = WILD_NO_BEEP: Don't beep for multiple matches | |
3655 * options = WILD_ADD_SLASH: add a slash after directory names | |
3656 * options = WILD_KEEP_ALL: don't remove 'wildignore' entries | |
3657 * options = WILD_SILENT: don't print warning messages | |
3658 * options = WILD_ESCAPE: put backslash before special chars | |
2652 | 3659 * options = WILD_ICASE: ignore case for files |
7 | 3660 * |
3661 * The variables xp->xp_context and xp->xp_backslash must have been set! | |
3662 */ | |
3663 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3664 ExpandOne( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3665 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3666 char_u *str, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3667 char_u *orig, /* allocated copy of original of expanded string */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3668 int options, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3669 int mode) |
7 | 3670 { |
3671 char_u *ss = NULL; | |
3672 static int findex; | |
3673 static char_u *orig_save = NULL; /* kept value of orig */ | |
1432 | 3674 int orig_saved = FALSE; |
7 | 3675 int i; |
3676 long_u len; | |
3677 int non_suf_match; /* number without matching suffix */ | |
3678 | |
3679 /* | |
3680 * first handle the case of using an old match | |
3681 */ | |
3682 if (mode == WILD_NEXT || mode == WILD_PREV) | |
3683 { | |
3684 if (xp->xp_numfiles > 0) | |
3685 { | |
3686 if (mode == WILD_PREV) | |
3687 { | |
3688 if (findex == -1) | |
3689 findex = xp->xp_numfiles; | |
3690 --findex; | |
3691 } | |
3692 else /* mode == WILD_NEXT */ | |
3693 ++findex; | |
3694 | |
3695 /* | |
3696 * When wrapping around, return the original string, set findex to | |
3697 * -1. | |
3698 */ | |
3699 if (findex < 0) | |
3700 { | |
3701 if (orig_save == NULL) | |
3702 findex = xp->xp_numfiles - 1; | |
3703 else | |
3704 findex = -1; | |
3705 } | |
3706 if (findex >= xp->xp_numfiles) | |
3707 { | |
3708 if (orig_save == NULL) | |
3709 findex = 0; | |
3710 else | |
3711 findex = -1; | |
3712 } | |
3713 #ifdef FEAT_WILDMENU | |
3714 if (p_wmnu) | |
3715 win_redr_status_matches(xp, xp->xp_numfiles, xp->xp_files, | |
3716 findex, cmd_showtail); | |
3717 #endif | |
3718 if (findex == -1) | |
3719 return vim_strsave(orig_save); | |
3720 return vim_strsave(xp->xp_files[findex]); | |
3721 } | |
3722 else | |
3723 return NULL; | |
3724 } | |
3725 | |
1412 | 3726 /* free old names */ |
7 | 3727 if (xp->xp_numfiles != -1 && mode != WILD_ALL && mode != WILD_LONGEST) |
3728 { | |
3729 FreeWild(xp->xp_numfiles, xp->xp_files); | |
3730 xp->xp_numfiles = -1; | |
3731 vim_free(orig_save); | |
3732 orig_save = NULL; | |
3733 } | |
3734 findex = 0; | |
3735 | |
3736 if (mode == WILD_FREE) /* only release file name */ | |
3737 return NULL; | |
3738 | |
3739 if (xp->xp_numfiles == -1) | |
3740 { | |
3741 vim_free(orig_save); | |
3742 orig_save = orig; | |
1432 | 3743 orig_saved = TRUE; |
7 | 3744 |
3745 /* | |
3746 * Do the expansion. | |
3747 */ | |
3748 if (ExpandFromContext(xp, str, &xp->xp_numfiles, &xp->xp_files, | |
3749 options) == FAIL) | |
3750 { | |
3751 #ifdef FNAME_ILLEGAL | |
3752 /* Illegal file name has been silently skipped. But when there | |
3753 * are wildcards, the real problem is that there was no match, | |
3754 * causing the pattern to be added, which has illegal characters. | |
3755 */ | |
3756 if (!(options & WILD_SILENT) && (options & WILD_LIST_NOTFOUND)) | |
3757 EMSG2(_(e_nomatch2), str); | |
3758 #endif | |
3759 } | |
3760 else if (xp->xp_numfiles == 0) | |
3761 { | |
3762 if (!(options & WILD_SILENT)) | |
3763 EMSG2(_(e_nomatch2), str); | |
3764 } | |
3765 else | |
3766 { | |
3767 /* Escape the matches for use on the command line. */ | |
3768 ExpandEscape(xp, str, xp->xp_numfiles, xp->xp_files, options); | |
3769 | |
3770 /* | |
3771 * Check for matching suffixes in file names. | |
3772 */ | |
3398 | 3773 if (mode != WILD_ALL && mode != WILD_ALL_KEEP |
3774 && mode != WILD_LONGEST) | |
7 | 3775 { |
3776 if (xp->xp_numfiles) | |
3777 non_suf_match = xp->xp_numfiles; | |
3778 else | |
3779 non_suf_match = 1; | |
3780 if ((xp->xp_context == EXPAND_FILES | |
3781 || xp->xp_context == EXPAND_DIRECTORIES) | |
3782 && xp->xp_numfiles > 1) | |
3783 { | |
3784 /* | |
3785 * More than one match; check suffix. | |
3786 * The files will have been sorted on matching suffix in | |
3787 * expand_wildcards, only need to check the first two. | |
3788 */ | |
3789 non_suf_match = 0; | |
3790 for (i = 0; i < 2; ++i) | |
3791 if (match_suffix(xp->xp_files[i])) | |
3792 ++non_suf_match; | |
3793 } | |
3794 if (non_suf_match != 1) | |
3795 { | |
3796 /* Can we ever get here unless it's while expanding | |
3797 * interactively? If not, we can get rid of this all | |
3798 * together. Don't really want to wait for this message | |
3799 * (and possibly have to hit return to continue!). | |
3800 */ | |
3801 if (!(options & WILD_SILENT)) | |
3802 EMSG(_(e_toomany)); | |
3803 else if (!(options & WILD_NO_BEEP)) | |
3804 beep_flush(); | |
3805 } | |
3806 if (!(non_suf_match != 1 && mode == WILD_EXPAND_FREE)) | |
3807 ss = vim_strsave(xp->xp_files[0]); | |
3808 } | |
3809 } | |
3810 } | |
3811 | |
3812 /* Find longest common part */ | |
3813 if (mode == WILD_LONGEST && xp->xp_numfiles > 0) | |
3814 { | |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3815 int mb_len = 1; |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3816 int c0, ci; |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3817 |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3818 for (len = 0; xp->xp_files[0][len]; len += mb_len) |
7 | 3819 { |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3820 #ifdef FEAT_MBYTE |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3821 if (has_mbyte) |
7 | 3822 { |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3823 mb_len = (*mb_ptr2len)(&xp->xp_files[0][len]); |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3824 c0 =(* mb_ptr2char)(&xp->xp_files[0][len]); |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3825 } |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3826 else |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3827 #endif |
7250
99476f1aaacd
commit https://github.com/vim/vim/commit/e4eda3bc7157932b0bf380fd3fdc1ba8f4438b60
Christian Brabandt <cb@256bit.org>
parents:
7235
diff
changeset
|
3828 c0 = xp->xp_files[0][len]; |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3829 for (i = 1; i < xp->xp_numfiles; ++i) |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3830 { |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3831 #ifdef FEAT_MBYTE |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3832 if (has_mbyte) |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3833 ci =(* mb_ptr2char)(&xp->xp_files[i][len]); |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3834 else |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3835 #endif |
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3836 ci = xp->xp_files[i][len]; |
4242 | 3837 if (p_fic && (xp->xp_context == EXPAND_DIRECTORIES |
7 | 3838 || xp->xp_context == EXPAND_FILES |
714 | 3839 || xp->xp_context == EXPAND_SHELLCMD |
4242 | 3840 || xp->xp_context == EXPAND_BUFFERS)) |
7 | 3841 { |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3842 if (MB_TOLOWER(c0) != MB_TOLOWER(ci)) |
7 | 3843 break; |
3844 } | |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3845 else if (c0 != ci) |
7 | 3846 break; |
3847 } | |
3848 if (i < xp->xp_numfiles) | |
3849 { | |
3850 if (!(options & WILD_NO_BEEP)) | |
6949 | 3851 vim_beep(BO_WILD); |
7 | 3852 break; |
3853 } | |
3854 } | |
7235
e45271250496
commit https://github.com/vim/vim/commit/4f8fa1633cdfbd09a41160c8480fe67c198067e9
Christian Brabandt <cb@256bit.org>
parents:
7009
diff
changeset
|
3855 |
7 | 3856 ss = alloc((unsigned)len + 1); |
3857 if (ss) | |
419 | 3858 vim_strncpy(ss, xp->xp_files[0], (size_t)len); |
7 | 3859 findex = -1; /* next p_wc gets first one */ |
3860 } | |
3861 | |
3862 /* Concatenate all matching names */ | |
3863 if (mode == WILD_ALL && xp->xp_numfiles > 0) | |
3864 { | |
3865 len = 0; | |
3866 for (i = 0; i < xp->xp_numfiles; ++i) | |
3867 len += (long_u)STRLEN(xp->xp_files[i]) + 1; | |
3868 ss = lalloc(len, TRUE); | |
3869 if (ss != NULL) | |
3870 { | |
3871 *ss = NUL; | |
3872 for (i = 0; i < xp->xp_numfiles; ++i) | |
3873 { | |
3874 STRCAT(ss, xp->xp_files[i]); | |
3875 if (i != xp->xp_numfiles - 1) | |
3876 STRCAT(ss, (options & WILD_USE_NL) ? "\n" : " "); | |
3877 } | |
3878 } | |
3879 } | |
3880 | |
3881 if (mode == WILD_EXPAND_FREE || mode == WILD_ALL) | |
3882 ExpandCleanup(xp); | |
3883 | |
1412 | 3884 /* Free "orig" if it wasn't stored in "orig_save". */ |
1432 | 3885 if (!orig_saved) |
1412 | 3886 vim_free(orig); |
3887 | |
7 | 3888 return ss; |
3889 } | |
3890 | |
3891 /* | |
3892 * Prepare an expand structure for use. | |
3893 */ | |
3894 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3895 ExpandInit(expand_T *xp) |
7 | 3896 { |
1718 | 3897 xp->xp_pattern = NULL; |
1965 | 3898 xp->xp_pattern_len = 0; |
7 | 3899 xp->xp_backslash = XP_BS_NONE; |
632 | 3900 #ifndef BACKSLASH_IN_FILENAME |
3901 xp->xp_shell = FALSE; | |
3902 #endif | |
7 | 3903 xp->xp_numfiles = -1; |
3904 xp->xp_files = NULL; | |
632 | 3905 #if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) && defined(FEAT_CMDL_COMPL) |
3906 xp->xp_arg = NULL; | |
3907 #endif | |
5033
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
3908 xp->xp_line = NULL; |
7 | 3909 } |
3910 | |
3911 /* | |
3912 * Cleanup an expand structure after use. | |
3913 */ | |
3914 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3915 ExpandCleanup(expand_T *xp) |
7 | 3916 { |
3917 if (xp->xp_numfiles >= 0) | |
3918 { | |
3919 FreeWild(xp->xp_numfiles, xp->xp_files); | |
3920 xp->xp_numfiles = -1; | |
3921 } | |
3922 } | |
3923 | |
3924 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3925 ExpandEscape( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3926 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3927 char_u *str, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3928 int numfiles, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3929 char_u **files, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
3930 int options) |
7 | 3931 { |
3932 int i; | |
3933 char_u *p; | |
3934 | |
3935 /* | |
3936 * May change home directory back to "~" | |
3937 */ | |
3938 if (options & WILD_HOME_REPLACE) | |
3939 tilde_replace(str, numfiles, files); | |
3940 | |
3941 if (options & WILD_ESCAPE) | |
3942 { | |
3943 if (xp->xp_context == EXPAND_FILES | |
2778 | 3944 || xp->xp_context == EXPAND_FILES_IN_PATH |
714 | 3945 || xp->xp_context == EXPAND_SHELLCMD |
7 | 3946 || xp->xp_context == EXPAND_BUFFERS |
3947 || xp->xp_context == EXPAND_DIRECTORIES) | |
3948 { | |
3949 /* | |
3950 * Insert a backslash into a file name before a space, \, %, # | |
3951 * and wildmatch characters, except '~'. | |
3952 */ | |
3953 for (i = 0; i < numfiles; ++i) | |
3954 { | |
3955 /* for ":set path=" we need to escape spaces twice */ | |
3956 if (xp->xp_backslash == XP_BS_THREE) | |
3957 { | |
3958 p = vim_strsave_escaped(files[i], (char_u *)" "); | |
3959 if (p != NULL) | |
3960 { | |
3961 vim_free(files[i]); | |
3962 files[i] = p; | |
719 | 3963 #if defined(BACKSLASH_IN_FILENAME) |
7 | 3964 p = vim_strsave_escaped(files[i], (char_u *)" "); |
3965 if (p != NULL) | |
3966 { | |
3967 vim_free(files[i]); | |
3968 files[i] = p; | |
3969 } | |
3970 #endif | |
3971 } | |
3972 } | |
1589 | 3973 #ifdef BACKSLASH_IN_FILENAME |
3974 p = vim_strsave_fnameescape(files[i], FALSE); | |
3975 #else | |
1586 | 3976 p = vim_strsave_fnameescape(files[i], xp->xp_shell); |
1589 | 3977 #endif |
7 | 3978 if (p != NULL) |
3979 { | |
3980 vim_free(files[i]); | |
3981 files[i] = p; | |
3982 } | |
3983 | |
3984 /* If 'str' starts with "\~", replace "~" at start of | |
3985 * files[i] with "\~". */ | |
3986 if (str[0] == '\\' && str[1] == '~' && files[i][0] == '~') | |
435 | 3987 escape_fname(&files[i]); |
7 | 3988 } |
3989 xp->xp_backslash = XP_BS_NONE; | |
435 | 3990 |
3991 /* If the first file starts with a '+' escape it. Otherwise it | |
3992 * could be seen as "+cmd". */ | |
3993 if (*files[0] == '+') | |
3994 escape_fname(&files[0]); | |
7 | 3995 } |
3996 else if (xp->xp_context == EXPAND_TAGS) | |
3997 { | |
3998 /* | |
3999 * Insert a backslash before characters in a tag name that | |
4000 * would terminate the ":tag" command. | |
4001 */ | |
4002 for (i = 0; i < numfiles; ++i) | |
4003 { | |
4004 p = vim_strsave_escaped(files[i], (char_u *)"\\|\""); | |
4005 if (p != NULL) | |
4006 { | |
4007 vim_free(files[i]); | |
4008 files[i] = p; | |
4009 } | |
4010 } | |
4011 } | |
4012 } | |
4013 } | |
4014 | |
4015 /* | |
1586 | 4016 * Escape special characters in "fname" for when used as a file name argument |
4017 * after a Vim command, or, when "shell" is non-zero, a shell command. | |
4018 * Returns the result in allocated memory. | |
4019 */ | |
4020 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4021 vim_strsave_fnameescape(char_u *fname, int shell) |
1586 | 4022 { |
1685 | 4023 char_u *p; |
1586 | 4024 #ifdef BACKSLASH_IN_FILENAME |
4025 char_u buf[20]; | |
4026 int j = 0; | |
4027 | |
5481 | 4028 /* Don't escape '[', '{' and '!' if they are in 'isfname'. */ |
1586 | 4029 for (p = PATH_ESC_CHARS; *p != NUL; ++p) |
5481 | 4030 if ((*p != '[' && *p != '{' && *p != '!') || !vim_isfilec(*p)) |
1586 | 4031 buf[j++] = *p; |
4032 buf[j] = NUL; | |
1700 | 4033 p = vim_strsave_escaped(fname, buf); |
1586 | 4034 #else |
1685 | 4035 p = vim_strsave_escaped(fname, shell ? SHELL_ESC_CHARS : PATH_ESC_CHARS); |
4036 if (shell && csh_like_shell() && p != NULL) | |
4037 { | |
4038 char_u *s; | |
4039 | |
4040 /* For csh and similar shells need to put two backslashes before '!'. | |
4041 * One is taken by Vim, one by the shell. */ | |
4042 s = vim_strsave_escaped(p, (char_u *)"!"); | |
4043 vim_free(p); | |
4044 p = s; | |
4045 } | |
1700 | 4046 #endif |
4047 | |
4048 /* '>' and '+' are special at the start of some commands, e.g. ":edit" and | |
4049 * ":write". "cd -" has a special meaning. */ | |
2445
04dae202d316
Fixes for coverity warnings.
Bram Moolenaar <bram@vim.org>
parents:
2433
diff
changeset
|
4050 if (p != NULL && (*p == '>' || *p == '+' || (*p == '-' && p[1] == NUL))) |
1700 | 4051 escape_fname(&p); |
4052 | |
1685 | 4053 return p; |
1586 | 4054 } |
4055 | |
4056 /* | |
435 | 4057 * Put a backslash before the file name in "pp", which is in allocated memory. |
4058 */ | |
4059 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4060 escape_fname(char_u **pp) |
435 | 4061 { |
4062 char_u *p; | |
4063 | |
4064 p = alloc((unsigned)(STRLEN(*pp) + 2)); | |
4065 if (p != NULL) | |
4066 { | |
4067 p[0] = '\\'; | |
4068 STRCPY(p + 1, *pp); | |
4069 vim_free(*pp); | |
4070 *pp = p; | |
4071 } | |
4072 } | |
4073 | |
4074 /* | |
7 | 4075 * For each file name in files[num_files]: |
4076 * If 'orig_pat' starts with "~/", replace the home directory with "~". | |
4077 */ | |
4078 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4079 tilde_replace( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4080 char_u *orig_pat, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4081 int num_files, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4082 char_u **files) |
7 | 4083 { |
4084 int i; | |
4085 char_u *p; | |
4086 | |
4087 if (orig_pat[0] == '~' && vim_ispathsep(orig_pat[1])) | |
4088 { | |
4089 for (i = 0; i < num_files; ++i) | |
4090 { | |
4091 p = home_replace_save(NULL, files[i]); | |
4092 if (p != NULL) | |
4093 { | |
4094 vim_free(files[i]); | |
4095 files[i] = p; | |
4096 } | |
4097 } | |
4098 } | |
4099 } | |
4100 | |
4101 /* | |
4102 * Show all matches for completion on the command line. | |
4103 * Returns EXPAND_NOTHING when the character that triggered expansion should | |
4104 * be inserted like a normal character. | |
4105 */ | |
4106 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4107 showmatches(expand_T *xp, int wildmenu UNUSED) |
7 | 4108 { |
4109 #define L_SHOWFILE(m) (showtail ? sm_gettail(files_found[m]) : files_found[m]) | |
4110 int num_files; | |
4111 char_u **files_found; | |
4112 int i, j, k; | |
4113 int maxlen; | |
4114 int lines; | |
4115 int columns; | |
4116 char_u *p; | |
4117 int lastlen; | |
4118 int attr; | |
4119 int showtail; | |
4120 | |
4121 if (xp->xp_numfiles == -1) | |
4122 { | |
4123 set_expand_context(xp); | |
4124 i = expand_cmdline(xp, ccline.cmdbuff, ccline.cmdpos, | |
4125 &num_files, &files_found); | |
4126 showtail = expand_showtail(xp); | |
4127 if (i != EXPAND_OK) | |
4128 return i; | |
4129 | |
4130 } | |
4131 else | |
4132 { | |
4133 num_files = xp->xp_numfiles; | |
4134 files_found = xp->xp_files; | |
4135 showtail = cmd_showtail; | |
4136 } | |
4137 | |
4138 #ifdef FEAT_WILDMENU | |
4139 if (!wildmenu) | |
4140 { | |
4141 #endif | |
4142 msg_didany = FALSE; /* lines_left will be set */ | |
4143 msg_start(); /* prepare for paging */ | |
4144 msg_putchar('\n'); | |
4145 out_flush(); | |
4146 cmdline_row = msg_row; | |
4147 msg_didany = FALSE; /* lines_left will be set again */ | |
4148 msg_start(); /* prepare for paging */ | |
4149 #ifdef FEAT_WILDMENU | |
4150 } | |
4151 #endif | |
4152 | |
4153 if (got_int) | |
4154 got_int = FALSE; /* only int. the completion, not the cmd line */ | |
4155 #ifdef FEAT_WILDMENU | |
4156 else if (wildmenu) | |
11285
0b4adcfb7b25
patch 8.0.0528: highlight wrong text when 'wim' includes "longest"
Christian Brabandt <cb@256bit.org>
parents:
11163
diff
changeset
|
4157 win_redr_status_matches(xp, num_files, files_found, -1, showtail); |
7 | 4158 #endif |
4159 else | |
4160 { | |
4161 /* find the length of the longest file name */ | |
4162 maxlen = 0; | |
4163 for (i = 0; i < num_files; ++i) | |
4164 { | |
4165 if (!showtail && (xp->xp_context == EXPAND_FILES | |
714 | 4166 || xp->xp_context == EXPAND_SHELLCMD |
7 | 4167 || xp->xp_context == EXPAND_BUFFERS)) |
4168 { | |
4169 home_replace(NULL, files_found[i], NameBuff, MAXPATHL, TRUE); | |
4170 j = vim_strsize(NameBuff); | |
4171 } | |
4172 else | |
4173 j = vim_strsize(L_SHOWFILE(i)); | |
4174 if (j > maxlen) | |
4175 maxlen = j; | |
4176 } | |
4177 | |
4178 if (xp->xp_context == EXPAND_TAGS_LISTFILES) | |
4179 lines = num_files; | |
4180 else | |
4181 { | |
4182 /* compute the number of columns and lines for the listing */ | |
4183 maxlen += 2; /* two spaces between file names */ | |
4184 columns = ((int)Columns + 2) / maxlen; | |
4185 if (columns < 1) | |
4186 columns = 1; | |
4187 lines = (num_files + columns - 1) / columns; | |
4188 } | |
4189 | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
4190 attr = HL_ATTR(HLF_D); /* find out highlighting for directories */ |
7 | 4191 |
4192 if (xp->xp_context == EXPAND_TAGS_LISTFILES) | |
4193 { | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
4194 MSG_PUTS_ATTR(_("tagname"), HL_ATTR(HLF_T)); |
7 | 4195 msg_clr_eos(); |
4196 msg_advance(maxlen - 3); | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
4197 MSG_PUTS_ATTR(_(" kind file\n"), HL_ATTR(HLF_T)); |
7 | 4198 } |
4199 | |
4200 /* list the files line by line */ | |
4201 for (i = 0; i < lines; ++i) | |
4202 { | |
4203 lastlen = 999; | |
4204 for (k = i; k < num_files; k += lines) | |
4205 { | |
4206 if (xp->xp_context == EXPAND_TAGS_LISTFILES) | |
4207 { | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
4208 msg_outtrans_attr(files_found[k], HL_ATTR(HLF_D)); |
7 | 4209 p = files_found[k] + STRLEN(files_found[k]) + 1; |
4210 msg_advance(maxlen + 1); | |
4211 msg_puts(p); | |
4212 msg_advance(maxlen + 3); | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
4213 msg_puts_long_attr(p + 2, HL_ATTR(HLF_D)); |
7 | 4214 break; |
4215 } | |
4216 for (j = maxlen - lastlen; --j >= 0; ) | |
4217 msg_putchar(' '); | |
4218 if (xp->xp_context == EXPAND_FILES | |
714 | 4219 || xp->xp_context == EXPAND_SHELLCMD |
7 | 4220 || xp->xp_context == EXPAND_BUFFERS) |
4221 { | |
2118
63bf37c1e7a2
updated for version 7.2.401
Bram Moolenaar <bram@zimbu.org>
parents:
2099
diff
changeset
|
4222 /* highlight directories */ |
2128
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4223 if (xp->xp_numfiles != -1) |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4224 { |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4225 char_u *halved_slash; |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4226 char_u *exp_path; |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4227 |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4228 /* Expansion was done before and special characters |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4229 * were escaped, need to halve backslashes. Also |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4230 * $HOME has been replaced with ~/. */ |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4231 exp_path = expand_env_save_opt(files_found[k], TRUE); |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4232 halved_slash = backslash_halve_save( |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4233 exp_path != NULL ? exp_path : files_found[k]); |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4234 j = mch_isdir(halved_slash != NULL ? halved_slash |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4235 : files_found[k]); |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4236 vim_free(exp_path); |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4237 vim_free(halved_slash); |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4238 } |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4239 else |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4240 /* Expansion was done here, file names are literal. */ |
a16af0072ea8
updated for version 7.2.410
Bram Moolenaar <bram@zimbu.org>
parents:
2118
diff
changeset
|
4241 j = mch_isdir(files_found[k]); |
7 | 4242 if (showtail) |
4243 p = L_SHOWFILE(k); | |
4244 else | |
4245 { | |
4246 home_replace(NULL, files_found[k], NameBuff, MAXPATHL, | |
4247 TRUE); | |
4248 p = NameBuff; | |
4249 } | |
4250 } | |
4251 else | |
4252 { | |
4253 j = FALSE; | |
4254 p = L_SHOWFILE(k); | |
4255 } | |
4256 lastlen = msg_outtrans_attr(p, j ? attr : 0); | |
4257 } | |
4258 if (msg_col > 0) /* when not wrapped around */ | |
4259 { | |
4260 msg_clr_eos(); | |
4261 msg_putchar('\n'); | |
4262 } | |
4263 out_flush(); /* show one line at a time */ | |
4264 if (got_int) | |
4265 { | |
4266 got_int = FALSE; | |
4267 break; | |
4268 } | |
4269 } | |
4270 | |
4271 /* | |
4272 * we redraw the command below the lines that we have just listed | |
4273 * This is a bit tricky, but it saves a lot of screen updating. | |
4274 */ | |
4275 cmdline_row = msg_row; /* will put it back later */ | |
4276 } | |
4277 | |
4278 if (xp->xp_numfiles == -1) | |
4279 FreeWild(num_files, files_found); | |
4280 | |
4281 return EXPAND_OK; | |
4282 } | |
4283 | |
4284 /* | |
4285 * Private gettail for showmatches() (and win_redr_status_matches()): | |
4286 * Find tail of file name path, but ignore trailing "/". | |
4287 */ | |
4288 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4289 sm_gettail(char_u *s) |
7 | 4290 { |
4291 char_u *p; | |
4292 char_u *t = s; | |
4293 int had_sep = FALSE; | |
4294 | |
4295 for (p = s; *p != NUL; ) | |
4296 { | |
4297 if (vim_ispathsep(*p) | |
4298 #ifdef BACKSLASH_IN_FILENAME | |
4299 && !rem_backslash(p) | |
4300 #endif | |
4301 ) | |
4302 had_sep = TRUE; | |
4303 else if (had_sep) | |
4304 { | |
4305 t = p; | |
4306 had_sep = FALSE; | |
4307 } | |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
4308 MB_PTR_ADV(p); |
7 | 4309 } |
4310 return t; | |
4311 } | |
4312 | |
4313 /* | |
4314 * Return TRUE if we only need to show the tail of completion matches. | |
4315 * When not completing file names or there is a wildcard in the path FALSE is | |
4316 * returned. | |
4317 */ | |
4318 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4319 expand_showtail(expand_T *xp) |
7 | 4320 { |
4321 char_u *s; | |
4322 char_u *end; | |
4323 | |
4324 /* When not completing file names a "/" may mean something different. */ | |
714 | 4325 if (xp->xp_context != EXPAND_FILES |
4326 && xp->xp_context != EXPAND_SHELLCMD | |
4327 && xp->xp_context != EXPAND_DIRECTORIES) | |
7 | 4328 return FALSE; |
4329 | |
4330 end = gettail(xp->xp_pattern); | |
4331 if (end == xp->xp_pattern) /* there is no path separator */ | |
4332 return FALSE; | |
4333 | |
4334 for (s = xp->xp_pattern; s < end; s++) | |
4335 { | |
4336 /* Skip escaped wildcards. Only when the backslash is not a path | |
4337 * separator, on DOS the '*' "path\*\file" must not be skipped. */ | |
4338 if (rem_backslash(s)) | |
4339 ++s; | |
4340 else if (vim_strchr((char_u *)"*?[", *s) != NULL) | |
4341 return FALSE; | |
4342 } | |
4343 return TRUE; | |
4344 } | |
4345 | |
4346 /* | |
4347 * Prepare a string for expansion. | |
4348 * When expanding file names: The string will be used with expand_wildcards(). | |
5438 | 4349 * Copy "fname[len]" into allocated memory and add a '*' at the end. |
7 | 4350 * When expanding other names: The string will be used with regcomp(). Copy |
4351 * the name into allocated memory and prepend "^". | |
4352 */ | |
4353 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4354 addstar( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4355 char_u *fname, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4356 int len, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4357 int context) /* EXPAND_FILES etc. */ |
7 | 4358 { |
4359 char_u *retval; | |
4360 int i, j; | |
4361 int new_len; | |
4362 char_u *tail; | |
2243
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4363 int ends_in_star; |
7 | 4364 |
714 | 4365 if (context != EXPAND_FILES |
2311
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4366 && context != EXPAND_FILES_IN_PATH |
714 | 4367 && context != EXPAND_SHELLCMD |
4368 && context != EXPAND_DIRECTORIES) | |
7 | 4369 { |
4370 /* | |
4371 * Matching will be done internally (on something other than files). | |
4372 * So we convert the file-matching-type wildcards into our kind for | |
4373 * use with vim_regcomp(). First work out how long it will be: | |
4374 */ | |
4375 | |
4376 /* For help tags the translation is done in find_help_tags(). | |
4377 * For a tag pattern starting with "/" no translation is needed. */ | |
4378 if (context == EXPAND_HELP | |
4379 || context == EXPAND_COLORS | |
4380 || context == EXPAND_COMPILER | |
2433
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
4381 || context == EXPAND_OWNSYNTAX |
2268
aafed4a4866f
Command line completion for :ownsyntax. (Dominique Pelle)
Bram Moolenaar <bram@vim.org>
parents:
2243
diff
changeset
|
4382 || context == EXPAND_FILETYPE |
8402
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
4383 || context == EXPAND_PACKADD |
10694
fa6c4825a1c4
patch 8.0.0237: when 'wildoptions' is "tagfile" completion may not work
Christian Brabandt <cb@256bit.org>
parents:
10676
diff
changeset
|
4384 || ((context == EXPAND_TAGS_LISTFILES |
fa6c4825a1c4
patch 8.0.0237: when 'wildoptions' is "tagfile" completion may not work
Christian Brabandt <cb@256bit.org>
parents:
10676
diff
changeset
|
4385 || context == EXPAND_TAGS) |
fa6c4825a1c4
patch 8.0.0237: when 'wildoptions' is "tagfile" completion may not work
Christian Brabandt <cb@256bit.org>
parents:
10676
diff
changeset
|
4386 && fname[0] == '/')) |
7 | 4387 retval = vim_strnsave(fname, len); |
4388 else | |
4389 { | |
4390 new_len = len + 2; /* +2 for '^' at start, NUL at end */ | |
4391 for (i = 0; i < len; i++) | |
4392 { | |
4393 if (fname[i] == '*' || fname[i] == '~') | |
4394 new_len++; /* '*' needs to be replaced by ".*" | |
4395 '~' needs to be replaced by "\~" */ | |
4396 | |
4397 /* Buffer names are like file names. "." should be literal */ | |
4398 if (context == EXPAND_BUFFERS && fname[i] == '.') | |
4399 new_len++; /* "." becomes "\." */ | |
4400 | |
4401 /* Custom expansion takes care of special things, match | |
4402 * backslashes literally (perhaps also for other types?) */ | |
634 | 4403 if ((context == EXPAND_USER_DEFINED |
4404 || context == EXPAND_USER_LIST) && fname[i] == '\\') | |
7 | 4405 new_len++; /* '\' becomes "\\" */ |
4406 } | |
4407 retval = alloc(new_len); | |
4408 if (retval != NULL) | |
4409 { | |
4410 retval[0] = '^'; | |
4411 j = 1; | |
4412 for (i = 0; i < len; i++, j++) | |
4413 { | |
4414 /* Skip backslash. But why? At least keep it for custom | |
4415 * expansion. */ | |
4416 if (context != EXPAND_USER_DEFINED | |
407 | 4417 && context != EXPAND_USER_LIST |
4418 && fname[i] == '\\' | |
4419 && ++i == len) | |
7 | 4420 break; |
4421 | |
4422 switch (fname[i]) | |
4423 { | |
4424 case '*': retval[j++] = '.'; | |
4425 break; | |
4426 case '~': retval[j++] = '\\'; | |
4427 break; | |
4428 case '?': retval[j] = '.'; | |
4429 continue; | |
4430 case '.': if (context == EXPAND_BUFFERS) | |
4431 retval[j++] = '\\'; | |
4432 break; | |
407 | 4433 case '\\': if (context == EXPAND_USER_DEFINED |
4434 || context == EXPAND_USER_LIST) | |
7 | 4435 retval[j++] = '\\'; |
4436 break; | |
4437 } | |
4438 retval[j] = fname[i]; | |
4439 } | |
4440 retval[j] = NUL; | |
4441 } | |
4442 } | |
4443 } | |
4444 else | |
4445 { | |
4446 retval = alloc(len + 4); | |
4447 if (retval != NULL) | |
4448 { | |
419 | 4449 vim_strncpy(retval, fname, len); |
7 | 4450 |
4451 /* | |
831 | 4452 * Don't add a star to *, ~, ~user, $var or `cmd`. |
4453 * * would become **, which walks the whole tree. | |
7 | 4454 * ~ would be at the start of the file name, but not the tail. |
4455 * $ could be anywhere in the tail. | |
4456 * ` could be anywhere in the file name. | |
1484 | 4457 * When the name ends in '$' don't add a star, remove the '$'. |
7 | 4458 */ |
4459 tail = gettail(retval); | |
2243
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4460 ends_in_star = (len > 0 && retval[len - 1] == '*'); |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4461 #ifndef BACKSLASH_IN_FILENAME |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4462 for (i = len - 2; i >= 0; --i) |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4463 { |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4464 if (retval[i] != '\\') |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4465 break; |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4466 ends_in_star = !ends_in_star; |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4467 } |
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4468 #endif |
7 | 4469 if ((*retval != '~' || tail != retval) |
2243
03a5f2897db3
Fix completion of file names with '%' and '*'.
Bram Moolenaar <bram@vim.org>
parents:
2128
diff
changeset
|
4470 && !ends_in_star |
7 | 4471 && vim_strchr(tail, '$') == NULL |
4472 && vim_strchr(retval, '`') == NULL) | |
4473 retval[len++] = '*'; | |
1484 | 4474 else if (len > 0 && retval[len - 1] == '$') |
4475 --len; | |
7 | 4476 retval[len] = NUL; |
4477 } | |
4478 } | |
4479 return retval; | |
4480 } | |
4481 | |
4482 /* | |
4483 * Must parse the command line so far to work out what context we are in. | |
4484 * Completion can then be done based on that context. | |
4485 * This routine sets the variables: | |
4486 * xp->xp_pattern The start of the pattern to be expanded within | |
4487 * the command line (ends at the cursor). | |
4488 * xp->xp_context The type of thing to expand. Will be one of: | |
4489 * | |
4490 * EXPAND_UNSUCCESSFUL Used sometimes when there is something illegal on | |
4491 * the command line, like an unknown command. Caller | |
4492 * should beep. | |
4493 * EXPAND_NOTHING Unrecognised context for completion, use char like | |
4494 * a normal char, rather than for completion. eg | |
4495 * :s/^I/ | |
4496 * EXPAND_COMMANDS Cursor is still touching the command, so complete | |
4497 * it. | |
4498 * EXPAND_BUFFERS Complete file names for :buf and :sbuf commands. | |
4499 * EXPAND_FILES After command with XFILE set, or after setting | |
4500 * with P_EXPAND set. eg :e ^I, :w>>^I | |
4501 * EXPAND_DIRECTORIES In some cases this is used instead of the latter | |
4502 * when we know only directories are of interest. eg | |
4503 * :set dir=^I | |
714 | 4504 * EXPAND_SHELLCMD After ":!cmd", ":r !cmd" or ":w !cmd". |
7 | 4505 * EXPAND_SETTINGS Complete variable names. eg :set d^I |
4506 * EXPAND_BOOL_SETTINGS Complete boolean variables only, eg :set no^I | |
4507 * EXPAND_TAGS Complete tags from the files in p_tags. eg :ta a^I | |
4508 * EXPAND_TAGS_LISTFILES As above, but list filenames on ^D, after :tselect | |
4509 * EXPAND_HELP Complete tags from the file 'helpfile'/tags | |
4510 * EXPAND_EVENTS Complete event names | |
4511 * EXPAND_SYNTAX Complete :syntax command arguments | |
4512 * EXPAND_HIGHLIGHT Complete highlight (syntax) group names | |
4513 * EXPAND_AUGROUP Complete autocommand group names | |
4514 * EXPAND_USER_VARS Complete user defined variable names, eg :unlet a^I | |
4515 * EXPAND_MAPPINGS Complete mapping and abbreviation names, | |
4516 * eg :unmap a^I , :cunab x^I | |
4517 * EXPAND_FUNCTIONS Complete internal or user defined function names, | |
4518 * eg :call sub^I | |
4519 * EXPAND_USER_FUNC Complete user defined function names, eg :delf F^I | |
4520 * EXPAND_EXPRESSION Complete internal or user defined function/variable | |
4521 * names in expressions, eg :while s^I | |
4522 * EXPAND_ENV_VARS Complete environment variable names | |
3744 | 4523 * EXPAND_USER Complete user names |
7 | 4524 */ |
4525 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4526 set_expand_context(expand_T *xp) |
7 | 4527 { |
168 | 4528 /* only expansion for ':', '>' and '=' command-lines */ |
7 | 4529 if (ccline.cmdfirstc != ':' |
4530 #ifdef FEAT_EVAL | |
168 | 4531 && ccline.cmdfirstc != '>' && ccline.cmdfirstc != '=' |
531 | 4532 && !ccline.input_fn |
7 | 4533 #endif |
4534 ) | |
4535 { | |
4536 xp->xp_context = EXPAND_NOTHING; | |
4537 return; | |
4538 } | |
10120
fb040c9d8ce9
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Christian Brabandt <cb@256bit.org>
parents:
10098
diff
changeset
|
4539 set_cmd_context(xp, ccline.cmdbuff, ccline.cmdlen, ccline.cmdpos, TRUE); |
7 | 4540 } |
4541 | |
4542 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4543 set_cmd_context( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4544 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4545 char_u *str, /* start of command line */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4546 int len, /* length of command line (excl. NUL) */ |
10120
fb040c9d8ce9
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Christian Brabandt <cb@256bit.org>
parents:
10098
diff
changeset
|
4547 int col, /* position of cursor */ |
fb040c9d8ce9
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Christian Brabandt <cb@256bit.org>
parents:
10098
diff
changeset
|
4548 int use_ccline UNUSED) /* use ccline for info */ |
7 | 4549 { |
4550 int old_char = NUL; | |
4551 char_u *nextcomm; | |
4552 | |
4553 /* | |
4554 * Avoid a UMR warning from Purify, only save the character if it has been | |
4555 * written before. | |
4556 */ | |
4557 if (col < len) | |
4558 old_char = str[col]; | |
4559 str[col] = NUL; | |
4560 nextcomm = str; | |
168 | 4561 |
4562 #ifdef FEAT_EVAL | |
10120
fb040c9d8ce9
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Christian Brabandt <cb@256bit.org>
parents:
10098
diff
changeset
|
4563 if (use_ccline && ccline.cmdfirstc == '=') |
1322 | 4564 { |
4565 # ifdef FEAT_CMDL_COMPL | |
168 | 4566 /* pass CMD_SIZE because there is no real command */ |
4567 set_context_for_expression(xp, str, CMD_SIZE); | |
1322 | 4568 # endif |
4569 } | |
10120
fb040c9d8ce9
commit https://github.com/vim/vim/commit/33a80eeb859a78ba93432da6fa585786cfd77249
Christian Brabandt <cb@256bit.org>
parents:
10098
diff
changeset
|
4570 else if (use_ccline && ccline.input_fn) |
531 | 4571 { |
4572 xp->xp_context = ccline.xp_context; | |
4573 xp->xp_pattern = ccline.cmdbuff; | |
1322 | 4574 # if defined(FEAT_USR_CMDS) && defined(FEAT_CMDL_COMPL) |
531 | 4575 xp->xp_arg = ccline.xp_arg; |
1322 | 4576 # endif |
531 | 4577 } |
168 | 4578 else |
4579 #endif | |
4580 while (nextcomm != NULL) | |
4581 nextcomm = set_one_cmd_context(xp, nextcomm); | |
4582 | |
5056
034abed357a1
updated for version 7.3.1271
Bram Moolenaar <bram@vim.org>
parents:
5033
diff
changeset
|
4583 /* Store the string here so that call_user_expand_func() can get to them |
034abed357a1
updated for version 7.3.1271
Bram Moolenaar <bram@vim.org>
parents:
5033
diff
changeset
|
4584 * easily. */ |
034abed357a1
updated for version 7.3.1271
Bram Moolenaar <bram@vim.org>
parents:
5033
diff
changeset
|
4585 xp->xp_line = str; |
034abed357a1
updated for version 7.3.1271
Bram Moolenaar <bram@vim.org>
parents:
5033
diff
changeset
|
4586 xp->xp_col = col; |
034abed357a1
updated for version 7.3.1271
Bram Moolenaar <bram@vim.org>
parents:
5033
diff
changeset
|
4587 |
7 | 4588 str[col] = old_char; |
4589 } | |
4590 | |
4591 /* | |
4592 * Expand the command line "str" from context "xp". | |
4593 * "xp" must have been set by set_cmd_context(). | |
4594 * xp->xp_pattern points into "str", to where the text that is to be expanded | |
4595 * starts. | |
4596 * Returns EXPAND_UNSUCCESSFUL when there is something illegal before the | |
4597 * cursor. | |
4598 * Returns EXPAND_NOTHING when there is nothing to expand, might insert the | |
4599 * key that triggered expansion literally. | |
4600 * Returns EXPAND_OK otherwise. | |
4601 */ | |
4602 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4603 expand_cmdline( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4604 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4605 char_u *str, /* start of command line */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4606 int col, /* position of cursor */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4607 int *matchcount, /* return: nr of matches */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4608 char_u ***matches) /* return: array of pointers to matches */ |
7 | 4609 { |
4610 char_u *file_str = NULL; | |
2652 | 4611 int options = WILD_ADD_SLASH|WILD_SILENT; |
7 | 4612 |
4613 if (xp->xp_context == EXPAND_UNSUCCESSFUL) | |
4614 { | |
4615 beep_flush(); | |
4616 return EXPAND_UNSUCCESSFUL; /* Something illegal on command line */ | |
4617 } | |
4618 if (xp->xp_context == EXPAND_NOTHING) | |
4619 { | |
4620 /* Caller can use the character as a normal char instead */ | |
4621 return EXPAND_NOTHING; | |
4622 } | |
4623 | |
4624 /* add star to file name, or convert to regexp if not exp. files. */ | |
1965 | 4625 xp->xp_pattern_len = (int)(str + col - xp->xp_pattern); |
4626 file_str = addstar(xp->xp_pattern, xp->xp_pattern_len, xp->xp_context); | |
7 | 4627 if (file_str == NULL) |
4628 return EXPAND_UNSUCCESSFUL; | |
4629 | |
2652 | 4630 if (p_wic) |
4631 options += WILD_ICASE; | |
4632 | |
7 | 4633 /* find all files that match the description */ |
2652 | 4634 if (ExpandFromContext(xp, file_str, matchcount, matches, options) == FAIL) |
7 | 4635 { |
4636 *matchcount = 0; | |
4637 *matches = NULL; | |
4638 } | |
4639 vim_free(file_str); | |
4640 | |
4641 return EXPAND_OK; | |
4642 } | |
4643 | |
4644 #ifdef FEAT_MULTI_LANG | |
4645 /* | |
8765
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4646 * Cleanup matches for help tags: |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4647 * Remove "@ab" if the top of 'helplang' is "ab" and the language of the first |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4648 * tag matches it. Otherwise remove "@en" if "en" is the only language. |
7 | 4649 */ |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
4650 static void cleanup_help_tags(int num_file, char_u **file); |
7 | 4651 |
4652 static void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4653 cleanup_help_tags(int num_file, char_u **file) |
7 | 4654 { |
4655 int i, j; | |
4656 int len; | |
8765
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4657 char_u buf[4]; |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4658 char_u *p = buf; |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4659 |
9066
c7bdd383275d
commit https://github.com/vim/vim/commit/89c79b99328b66f77f1d12dc8c6701dfe2c57f15
Christian Brabandt <cb@256bit.org>
parents:
8765
diff
changeset
|
4660 if (p_hlg[0] != NUL && (p_hlg[0] != 'e' || p_hlg[1] != 'n')) |
8765
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4661 { |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4662 *p++ = '@'; |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4663 *p++ = p_hlg[0]; |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4664 *p++ = p_hlg[1]; |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4665 } |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4666 *p = NUL; |
7 | 4667 |
4668 for (i = 0; i < num_file; ++i) | |
4669 { | |
4670 len = (int)STRLEN(file[i]) - 3; | |
8765
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4671 if (len <= 0) |
3daf70d22168
commit https://github.com/vim/vim/commit/61264d99692803eec76a171916ab9720c75536b0
Christian Brabandt <cb@256bit.org>
parents:
8694
diff
changeset
|
4672 continue; |
9070
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4673 if (STRCMP(file[i] + len, "@en") == 0) |
7 | 4674 { |
4675 /* Sorting on priority means the same item in another language may | |
4676 * be anywhere. Search all items for a match up to the "@en". */ | |
4677 for (j = 0; j < num_file; ++j) | |
9070
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4678 if (j != i && (int)STRLEN(file[j]) == len + 3 |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4679 && STRNCMP(file[i], file[j], len + 1) == 0) |
7 | 4680 break; |
4681 if (j == num_file) | |
9066
c7bdd383275d
commit https://github.com/vim/vim/commit/89c79b99328b66f77f1d12dc8c6701dfe2c57f15
Christian Brabandt <cb@256bit.org>
parents:
8765
diff
changeset
|
4682 /* item only exists with @en, remove it */ |
7 | 4683 file[i][len] = NUL; |
4684 } | |
4685 } | |
9070
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4686 |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4687 if (*buf != NUL) |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4688 for (i = 0; i < num_file; ++i) |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4689 { |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4690 len = (int)STRLEN(file[i]) - 3; |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4691 if (len <= 0) |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4692 continue; |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4693 if (STRCMP(file[i] + len, buf) == 0) |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4694 { |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4695 /* remove the default language */ |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4696 file[i][len] = NUL; |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4697 } |
0bb25b026fc9
commit https://github.com/vim/vim/commit/9ccaae04c6f263e6db14fc403bca2404a7871114
Christian Brabandt <cb@256bit.org>
parents:
9066
diff
changeset
|
4698 } |
7 | 4699 } |
4700 #endif | |
4701 | |
4702 /* | |
4703 * Do the expansion based on xp->xp_context and "pat". | |
4704 */ | |
4705 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4706 ExpandFromContext( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4707 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4708 char_u *pat, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4709 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4710 char_u ***file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4711 int options) /* EW_ flags */ |
7 | 4712 { |
4713 #ifdef FEAT_CMDL_COMPL | |
4714 regmatch_T regmatch; | |
4715 #endif | |
4716 int ret; | |
4717 int flags; | |
4718 | |
4719 flags = EW_DIR; /* include directories */ | |
4720 if (options & WILD_LIST_NOTFOUND) | |
4721 flags |= EW_NOTFOUND; | |
4722 if (options & WILD_ADD_SLASH) | |
4723 flags |= EW_ADDSLASH; | |
4724 if (options & WILD_KEEP_ALL) | |
4725 flags |= EW_KEEPALL; | |
4726 if (options & WILD_SILENT) | |
4727 flags |= EW_SILENT; | |
6659 | 4728 if (options & WILD_ALLLINKS) |
4729 flags |= EW_ALLLINKS; | |
7 | 4730 |
2311
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4731 if (xp->xp_context == EXPAND_FILES |
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4732 || xp->xp_context == EXPAND_DIRECTORIES |
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4733 || xp->xp_context == EXPAND_FILES_IN_PATH) |
7 | 4734 { |
4735 /* | |
4736 * Expand file or directory names. | |
4737 */ | |
4738 int free_pat = FALSE; | |
4739 int i; | |
4740 | |
4741 /* for ":set path=" and ":set tags=" halve backslashes for escaped | |
4742 * space */ | |
4743 if (xp->xp_backslash != XP_BS_NONE) | |
4744 { | |
4745 free_pat = TRUE; | |
4746 pat = vim_strsave(pat); | |
4747 for (i = 0; pat[i]; ++i) | |
4748 if (pat[i] == '\\') | |
4749 { | |
4750 if (xp->xp_backslash == XP_BS_THREE | |
4751 && pat[i + 1] == '\\' | |
4752 && pat[i + 2] == '\\' | |
4753 && pat[i + 3] == ' ') | |
1621 | 4754 STRMOVE(pat + i, pat + i + 3); |
7 | 4755 if (xp->xp_backslash == XP_BS_ONE |
4756 && pat[i + 1] == ' ') | |
1621 | 4757 STRMOVE(pat + i, pat + i + 1); |
7 | 4758 } |
4759 } | |
4760 | |
4761 if (xp->xp_context == EXPAND_FILES) | |
4762 flags |= EW_FILE; | |
2311
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4763 else if (xp->xp_context == EXPAND_FILES_IN_PATH) |
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2302
diff
changeset
|
4764 flags |= (EW_FILE | EW_PATH); |
7 | 4765 else |
4766 flags = (flags | EW_DIR) & ~EW_FILE; | |
2652 | 4767 if (options & WILD_ICASE) |
4768 flags |= EW_ICASE; | |
4769 | |
2016 | 4770 /* Expand wildcards, supporting %:h and the like. */ |
4771 ret = expand_wildcards_eval(&pat, num_file, file, flags); | |
7 | 4772 if (free_pat) |
4773 vim_free(pat); | |
4774 return ret; | |
4775 } | |
4776 | |
4777 *file = (char_u **)""; | |
4778 *num_file = 0; | |
4779 if (xp->xp_context == EXPAND_HELP) | |
4780 { | |
1696 | 4781 /* With an empty argument we would get all the help tags, which is |
4782 * very slow. Get matches for "help" instead. */ | |
4783 if (find_help_tags(*pat == NUL ? (char_u *)"help" : pat, | |
4784 num_file, file, FALSE) == OK) | |
7 | 4785 { |
4786 #ifdef FEAT_MULTI_LANG | |
4787 cleanup_help_tags(*num_file, *file); | |
4788 #endif | |
4789 return OK; | |
4790 } | |
4791 return FAIL; | |
4792 } | |
4793 | |
4794 #ifndef FEAT_CMDL_COMPL | |
4795 return FAIL; | |
4796 #else | |
716 | 4797 if (xp->xp_context == EXPAND_SHELLCMD) |
4798 return expand_shellcmd(pat, num_file, file, flags); | |
7 | 4799 if (xp->xp_context == EXPAND_OLD_SETTING) |
4800 return ExpandOldSetting(num_file, file); | |
4801 if (xp->xp_context == EXPAND_BUFFERS) | |
4802 return ExpandBufnames(pat, num_file, file, options); | |
4803 if (xp->xp_context == EXPAND_TAGS | |
4804 || xp->xp_context == EXPAND_TAGS_LISTFILES) | |
4805 return expand_tags(xp->xp_context == EXPAND_TAGS, pat, num_file, file); | |
4806 if (xp->xp_context == EXPAND_COLORS) | |
2929 | 4807 { |
4808 char *directories[] = {"colors", NULL}; | |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
4809 return ExpandRTDir(pat, DIP_START + DIP_OPT, num_file, file, |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
4810 directories); |
2929 | 4811 } |
7 | 4812 if (xp->xp_context == EXPAND_COMPILER) |
2929 | 4813 { |
3106 | 4814 char *directories[] = {"compiler", NULL}; |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
4815 return ExpandRTDir(pat, 0, num_file, file, directories); |
2929 | 4816 } |
2433
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
4817 if (xp->xp_context == EXPAND_OWNSYNTAX) |
2929 | 4818 { |
4819 char *directories[] = {"syntax", NULL}; | |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
4820 return ExpandRTDir(pat, 0, num_file, file, directories); |
2929 | 4821 } |
2268
aafed4a4866f
Command line completion for :ownsyntax. (Dominique Pelle)
Bram Moolenaar <bram@vim.org>
parents:
2243
diff
changeset
|
4822 if (xp->xp_context == EXPAND_FILETYPE) |
2929 | 4823 { |
4824 char *directories[] = {"syntax", "indent", "ftplugin", NULL}; | |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
4825 return ExpandRTDir(pat, 0, num_file, file, directories); |
2929 | 4826 } |
407 | 4827 # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) |
4828 if (xp->xp_context == EXPAND_USER_LIST) | |
856 | 4829 return ExpandUserList(xp, num_file, file); |
407 | 4830 # endif |
8402
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
4831 if (xp->xp_context == EXPAND_PACKADD) |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
4832 return ExpandPackAddDir(pat, num_file, file); |
7 | 4833 |
4834 regmatch.regprog = vim_regcomp(pat, p_magic ? RE_MAGIC : 0); | |
4835 if (regmatch.regprog == NULL) | |
4836 return FAIL; | |
4837 | |
4838 /* set ignore-case according to p_ic, p_scs and pat */ | |
4839 regmatch.rm_ic = ignorecase(pat); | |
4840 | |
4841 if (xp->xp_context == EXPAND_SETTINGS | |
4842 || xp->xp_context == EXPAND_BOOL_SETTINGS) | |
4843 ret = ExpandSettings(xp, ®match, num_file, file); | |
4844 else if (xp->xp_context == EXPAND_MAPPINGS) | |
4845 ret = ExpandMappings(®match, num_file, file); | |
4846 # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) | |
4847 else if (xp->xp_context == EXPAND_USER_DEFINED) | |
4848 ret = ExpandUserDefined(xp, ®match, num_file, file); | |
4849 # endif | |
4850 else | |
4851 { | |
4852 static struct expgen | |
4853 { | |
4854 int context; | |
7807
1a5d34492798
commit https://github.com/vim/vim/commit/d99df423c559d85c17779b3685426c489554908c
Christian Brabandt <cb@256bit.org>
parents:
7801
diff
changeset
|
4855 char_u *((*func)(expand_T *, int)); |
7 | 4856 int ic; |
2849 | 4857 int escaped; |
7 | 4858 } tab[] = |
4859 { | |
2849 | 4860 {EXPAND_COMMANDS, get_command_name, FALSE, TRUE}, |
4861 {EXPAND_BEHAVE, get_behave_arg, TRUE, TRUE}, | |
10275
6d8b2da002e9
commit https://github.com/vim/vim/commit/9e507ca8a3e1535e62de4bd86374b0fcd18ef5b8
Christian Brabandt <cb@256bit.org>
parents:
10174
diff
changeset
|
4862 {EXPAND_MESSAGES, get_messages_arg, TRUE, TRUE}, |
3503 | 4863 #ifdef FEAT_CMDHIST |
4864 {EXPAND_HISTORY, get_history_arg, TRUE, TRUE}, | |
4865 #endif | |
7 | 4866 #ifdef FEAT_USR_CMDS |
2849 | 4867 {EXPAND_USER_COMMANDS, get_user_commands, FALSE, TRUE}, |
6424 | 4868 {EXPAND_USER_ADDR_TYPE, get_user_cmd_addr_type, FALSE, TRUE}, |
2849 | 4869 {EXPAND_USER_CMD_FLAGS, get_user_cmd_flags, FALSE, TRUE}, |
4870 {EXPAND_USER_NARGS, get_user_cmd_nargs, FALSE, TRUE}, | |
4871 {EXPAND_USER_COMPLETE, get_user_cmd_complete, FALSE, TRUE}, | |
7 | 4872 #endif |
4873 #ifdef FEAT_EVAL | |
2849 | 4874 {EXPAND_USER_VARS, get_user_var_name, FALSE, TRUE}, |
4875 {EXPAND_FUNCTIONS, get_function_name, FALSE, TRUE}, | |
4876 {EXPAND_USER_FUNC, get_user_func_name, FALSE, TRUE}, | |
4877 {EXPAND_EXPRESSION, get_expr_name, FALSE, TRUE}, | |
7 | 4878 #endif |
4879 #ifdef FEAT_MENU | |
2849 | 4880 {EXPAND_MENUS, get_menu_name, FALSE, TRUE}, |
4881 {EXPAND_MENUNAMES, get_menu_names, FALSE, TRUE}, | |
7 | 4882 #endif |
4883 #ifdef FEAT_SYN_HL | |
2849 | 4884 {EXPAND_SYNTAX, get_syntax_name, TRUE, TRUE}, |
4885 #endif | |
4803
220bdea4f579
updated for version 7.3.1148
Bram Moolenaar <bram@vim.org>
parents:
4327
diff
changeset
|
4886 #ifdef FEAT_PROFILE |
220bdea4f579
updated for version 7.3.1148
Bram Moolenaar <bram@vim.org>
parents:
4327
diff
changeset
|
4887 {EXPAND_SYNTIME, get_syntime_arg, TRUE, TRUE}, |
220bdea4f579
updated for version 7.3.1148
Bram Moolenaar <bram@vim.org>
parents:
4327
diff
changeset
|
4888 #endif |
2849 | 4889 {EXPAND_HIGHLIGHT, get_highlight_name, TRUE, TRUE}, |
7 | 4890 #ifdef FEAT_AUTOCMD |
2849 | 4891 {EXPAND_EVENTS, get_event_name, TRUE, TRUE}, |
4892 {EXPAND_AUGROUP, get_augroup_name, TRUE, TRUE}, | |
7 | 4893 #endif |
1845 | 4894 #ifdef FEAT_CSCOPE |
2849 | 4895 {EXPAND_CSCOPE, get_cscope_name, TRUE, TRUE}, |
1845 | 4896 #endif |
1868 | 4897 #ifdef FEAT_SIGNS |
2849 | 4898 {EXPAND_SIGN, get_sign_name, TRUE, TRUE}, |
1868 | 4899 #endif |
2068
98a2a6e6b966
updated for version 7.2.353
Bram Moolenaar <bram@zimbu.org>
parents:
2047
diff
changeset
|
4900 #ifdef FEAT_PROFILE |
2849 | 4901 {EXPAND_PROFILE, get_profile_name, TRUE, TRUE}, |
2068
98a2a6e6b966
updated for version 7.2.353
Bram Moolenaar <bram@zimbu.org>
parents:
2047
diff
changeset
|
4902 #endif |
7 | 4903 #if (defined(HAVE_LOCALE_H) || defined(X_LOCALE)) \ |
4904 && (defined(FEAT_GETTEXT) || defined(FEAT_MBYTE)) | |
2849 | 4905 {EXPAND_LANGUAGE, get_lang_arg, TRUE, FALSE}, |
4906 {EXPAND_LOCALES, get_locales, TRUE, FALSE}, | |
4907 #endif | |
4908 {EXPAND_ENV_VARS, get_env_name, TRUE, TRUE}, | |
3744 | 4909 {EXPAND_USER, get_users, TRUE, FALSE}, |
7 | 4910 }; |
4911 int i; | |
4912 | |
4913 /* | |
4914 * Find a context in the table and call the ExpandGeneric() with the | |
4915 * right function to do the expansion. | |
4916 */ | |
4917 ret = FAIL; | |
1880 | 4918 for (i = 0; i < (int)(sizeof(tab) / sizeof(struct expgen)); ++i) |
7 | 4919 if (xp->xp_context == tab[i].context) |
4920 { | |
4921 if (tab[i].ic) | |
4922 regmatch.rm_ic = TRUE; | |
2849 | 4923 ret = ExpandGeneric(xp, ®match, num_file, file, |
3628 | 4924 tab[i].func, tab[i].escaped); |
7 | 4925 break; |
4926 } | |
4927 } | |
4928 | |
4805
66803af09906
updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents:
4803
diff
changeset
|
4929 vim_regfree(regmatch.regprog); |
7 | 4930 |
4931 return ret; | |
4932 #endif /* FEAT_CMDL_COMPL */ | |
4933 } | |
4934 | |
4935 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) | |
4936 /* | |
4937 * Expand a list of names. | |
4938 * | |
4939 * Generic function for command line completion. It calls a function to | |
4940 * obtain strings, one by one. The strings are matched against a regexp | |
4941 * program. Matching strings are copied into an array, which is returned. | |
4942 * | |
4943 * Returns OK when no problems encountered, FAIL for error (out of memory). | |
4944 */ | |
4945 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4946 ExpandGeneric( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4947 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4948 regmatch_T *regmatch, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4949 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4950 char_u ***file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4951 char_u *((*func)(expand_T *, int)), |
7 | 4952 /* returns a string from the list */ |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
4953 int escaped) |
7 | 4954 { |
4955 int i; | |
4956 int count = 0; | |
480 | 4957 int round; |
7 | 4958 char_u *str; |
4959 | |
4960 /* do this loop twice: | |
480 | 4961 * round == 0: count the number of matching names |
4962 * round == 1: copy the matching names into allocated memory | |
7 | 4963 */ |
480 | 4964 for (round = 0; round <= 1; ++round) |
7 | 4965 { |
4966 for (i = 0; ; ++i) | |
4967 { | |
4968 str = (*func)(xp, i); | |
4969 if (str == NULL) /* end of list */ | |
4970 break; | |
4971 if (*str == NUL) /* skip empty strings */ | |
4972 continue; | |
4973 | |
4974 if (vim_regexec(regmatch, str, (colnr_T)0)) | |
4975 { | |
480 | 4976 if (round) |
7 | 4977 { |
2849 | 4978 if (escaped) |
4979 str = vim_strsave_escaped(str, (char_u *)" \t\\."); | |
4980 else | |
4981 str = vim_strsave(str); | |
7 | 4982 (*file)[count] = str; |
4983 #ifdef FEAT_MENU | |
4984 if (func == get_menu_names && str != NULL) | |
4985 { | |
4986 /* test for separator added by get_menu_names() */ | |
4987 str += STRLEN(str) - 1; | |
4988 if (*str == '\001') | |
4989 *str = '.'; | |
4990 } | |
4991 #endif | |
4992 } | |
4993 ++count; | |
4994 } | |
4995 } | |
480 | 4996 if (round == 0) |
7 | 4997 { |
4998 if (count == 0) | |
4999 return OK; | |
5000 *num_file = count; | |
5001 *file = (char_u **)alloc((unsigned)(count * sizeof(char_u *))); | |
5002 if (*file == NULL) | |
5003 { | |
5004 *file = (char_u **)""; | |
5005 return FAIL; | |
5006 } | |
5007 count = 0; | |
5008 } | |
5009 } | |
480 | 5010 |
828 | 5011 /* Sort the results. Keep menu's in the specified order. */ |
5012 if (xp->xp_context != EXPAND_MENUNAMES && xp->xp_context != EXPAND_MENUS) | |
3164 | 5013 { |
5014 if (xp->xp_context == EXPAND_EXPRESSION | |
5015 || xp->xp_context == EXPAND_FUNCTIONS | |
5016 || xp->xp_context == EXPAND_USER_FUNC) | |
5017 /* <SNR> functions should be sorted to the end. */ | |
5018 qsort((void *)*file, (size_t)*num_file, sizeof(char_u *), | |
5019 sort_func_compare); | |
5020 else | |
5021 sort_strings(*file, *num_file); | |
5022 } | |
480 | 5023 |
1322 | 5024 #ifdef FEAT_CMDL_COMPL |
5025 /* Reset the variables used for special highlight names expansion, so that | |
5026 * they don't show up when getting normal highlight names by ID. */ | |
5027 reset_expand_highlight(); | |
5028 #endif | |
5029 | |
7 | 5030 return OK; |
5031 } | |
5032 | |
716 | 5033 /* |
5034 * Complete a shell command. | |
5035 * Returns FAIL or OK; | |
5036 */ | |
5037 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5038 expand_shellcmd( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5039 char_u *filepat, /* pattern to match with command names */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5040 int *num_file, /* return: number of matches */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5041 char_u ***file, /* return: array with matches */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5042 int flagsarg) /* EW_ flags */ |
716 | 5043 { |
5044 char_u *pat; | |
5045 int i; | |
5046 char_u *path; | |
5047 int mustfree = FALSE; | |
5048 garray_T ga; | |
5049 char_u *buf = alloc(MAXPATHL); | |
5050 size_t l; | |
5051 char_u *s, *e; | |
5052 int flags = flagsarg; | |
5053 int ret; | |
6695 | 5054 int did_curdir = FALSE; |
716 | 5055 |
5056 if (buf == NULL) | |
5057 return FAIL; | |
5058 | |
5059 /* for ":set path=" and ":set tags=" halve backslashes for escaped | |
5060 * space */ | |
5061 pat = vim_strsave(filepat); | |
5062 for (i = 0; pat[i]; ++i) | |
5063 if (pat[i] == '\\' && pat[i + 1] == ' ') | |
1621 | 5064 STRMOVE(pat + i, pat + i + 1); |
716 | 5065 |
6695 | 5066 flags |= EW_FILE | EW_EXEC | EW_SHELLCMD; |
716 | 5067 |
5068 /* For an absolute name we don't use $PATH. */ | |
955 | 5069 if (mch_isFullName(pat)) |
5070 path = (char_u *)" "; | |
5071 else if ((pat[0] == '.' && (vim_ispathsep(pat[1]) | |
716 | 5072 || (pat[1] == '.' && vim_ispathsep(pat[2]))))) |
5073 path = (char_u *)"."; | |
5074 else | |
2630 | 5075 { |
716 | 5076 path = vim_getenv((char_u *)"PATH", &mustfree); |
2630 | 5077 if (path == NULL) |
5078 path = (char_u *)""; | |
5079 } | |
716 | 5080 |
5081 /* | |
5082 * Go over all directories in $PATH. Expand matches in that directory and | |
6695 | 5083 * collect them in "ga". When "." is not in $PATH also expand for the |
5084 * current directory, to find "subdir/cmd". | |
716 | 5085 */ |
5086 ga_init2(&ga, (int)sizeof(char *), 10); | |
6695 | 5087 for (s = path; ; s = e) |
716 | 5088 { |
6695 | 5089 if (*s == NUL) |
5090 { | |
5091 if (did_curdir) | |
5092 break; | |
5093 /* Find directories in the current directory, path is empty. */ | |
5094 did_curdir = TRUE; | |
5095 } | |
5096 else if (*s == '.') | |
5097 did_curdir = TRUE; | |
5098 | |
955 | 5099 if (*s == ' ') |
5100 ++s; /* Skip space used for absolute path name. */ | |
5101 | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8080
diff
changeset
|
5102 #if defined(MSWIN) |
716 | 5103 e = vim_strchr(s, ';'); |
5104 #else | |
5105 e = vim_strchr(s, ':'); | |
5106 #endif | |
5107 if (e == NULL) | |
5108 e = s + STRLEN(s); | |
5109 | |
5110 l = e - s; | |
5111 if (l > MAXPATHL - 5) | |
5112 break; | |
5113 vim_strncpy(buf, s, l); | |
5114 add_pathsep(buf); | |
5115 l = STRLEN(buf); | |
5116 vim_strncpy(buf + l, pat, MAXPATHL - 1 - l); | |
5117 | |
5118 /* Expand matches in one directory of $PATH. */ | |
5119 ret = expand_wildcards(1, &buf, num_file, file, flags); | |
5120 if (ret == OK) | |
5121 { | |
5122 if (ga_grow(&ga, *num_file) == FAIL) | |
5123 FreeWild(*num_file, *file); | |
5124 else | |
5125 { | |
5126 for (i = 0; i < *num_file; ++i) | |
5127 { | |
5128 s = (*file)[i]; | |
5129 if (STRLEN(s) > l) | |
5130 { | |
5131 /* Remove the path again. */ | |
1621 | 5132 STRMOVE(s, s + l); |
716 | 5133 ((char_u **)ga.ga_data)[ga.ga_len++] = s; |
5134 } | |
5135 else | |
5136 vim_free(s); | |
5137 } | |
5138 vim_free(*file); | |
5139 } | |
5140 } | |
5141 if (*e != NUL) | |
5142 ++e; | |
5143 } | |
5144 *file = ga.ga_data; | |
5145 *num_file = ga.ga_len; | |
5146 | |
5147 vim_free(buf); | |
5148 vim_free(pat); | |
5149 if (mustfree) | |
5150 vim_free(path); | |
5151 return OK; | |
5152 } | |
5153 | |
5154 | |
7 | 5155 # if defined(FEAT_USR_CMDS) && defined(FEAT_EVAL) |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
5156 static void * call_user_expand_func(void *(*user_expand_func)(char_u *, int, char_u **, int), expand_T *xp, int *num_file, char_u ***file); |
410 | 5157 |
7 | 5158 /* |
10942
e05695e59f6d
patch 8.0.0360: sometimes VimL is used instead of "Vim script"
Christian Brabandt <cb@256bit.org>
parents:
10861
diff
changeset
|
5159 * Call "user_expand_func()" to invoke a user defined Vim script function and |
e05695e59f6d
patch 8.0.0360: sometimes VimL is used instead of "Vim script"
Christian Brabandt <cb@256bit.org>
parents:
10861
diff
changeset
|
5160 * return the result (either a string or a List). |
7 | 5161 */ |
407 | 5162 static void * |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5163 call_user_expand_func( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5164 void *(*user_expand_func)(char_u *, int, char_u **, int), |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5165 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5166 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5167 char_u ***file) |
7 | 5168 { |
5072
cca600e60928
updated for version 7.3.1279
Bram Moolenaar <bram@vim.org>
parents:
5056
diff
changeset
|
5169 int keep = 0; |
407 | 5170 char_u num[50]; |
7 | 5171 char_u *args[3]; |
5172 int save_current_SID = current_SID; | |
407 | 5173 void *ret; |
13 | 5174 struct cmdline_info save_ccline; |
7 | 5175 |
5033
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
5176 if (xp->xp_arg == NULL || xp->xp_arg[0] == '\0' || xp->xp_line == NULL) |
407 | 5177 return NULL; |
7 | 5178 *num_file = 0; |
5179 *file = NULL; | |
5180 | |
5033
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
5181 if (ccline.cmdbuff != NULL) |
1518 | 5182 { |
5183 keep = ccline.cmdbuff[ccline.cmdlen]; | |
5184 ccline.cmdbuff[ccline.cmdlen] = 0; | |
5185 } | |
5033
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
5186 |
1965 | 5187 args[0] = vim_strnsave(xp->xp_pattern, xp->xp_pattern_len); |
5033
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
5188 args[1] = xp->xp_line; |
7aa4e0822dec
updated for version 7.3.1260
Bram Moolenaar <bram@vim.org>
parents:
4980
diff
changeset
|
5189 sprintf((char *)num, "%d", xp->xp_col); |
7 | 5190 args[2] = num; |
5191 | |
13 | 5192 /* Save the cmdline, we don't know what the function may do. */ |
5193 save_ccline = ccline; | |
5194 ccline.cmdbuff = NULL; | |
5195 ccline.cmdprompt = NULL; | |
7 | 5196 current_SID = xp->xp_scriptID; |
13 | 5197 |
407 | 5198 ret = user_expand_func(xp->xp_arg, 3, args, FALSE); |
13 | 5199 |
5200 ccline = save_ccline; | |
7 | 5201 current_SID = save_current_SID; |
1518 | 5202 if (ccline.cmdbuff != NULL) |
5203 ccline.cmdbuff[ccline.cmdlen] = keep; | |
407 | 5204 |
1965 | 5205 vim_free(args[0]); |
407 | 5206 return ret; |
5207 } | |
5208 | |
5209 /* | |
5210 * Expand names with a function defined by the user. | |
5211 */ | |
5212 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5213 ExpandUserDefined( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5214 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5215 regmatch_T *regmatch, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5216 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5217 char_u ***file) |
407 | 5218 { |
5219 char_u *retstr; | |
5220 char_u *s; | |
5221 char_u *e; | |
5222 char_u keep; | |
5223 garray_T ga; | |
5224 | |
5225 retstr = call_user_expand_func(call_func_retstr, xp, num_file, file); | |
5226 if (retstr == NULL) | |
7 | 5227 return FAIL; |
5228 | |
5229 ga_init2(&ga, (int)sizeof(char *), 3); | |
407 | 5230 for (s = retstr; *s != NUL; s = e) |
7 | 5231 { |
5232 e = vim_strchr(s, '\n'); | |
5233 if (e == NULL) | |
5234 e = s + STRLEN(s); | |
5235 keep = *e; | |
5236 *e = 0; | |
5237 | |
5238 if (xp->xp_pattern[0] && vim_regexec(regmatch, s, (colnr_T)0) == 0) | |
5239 { | |
5240 *e = keep; | |
5241 if (*e != NUL) | |
5242 ++e; | |
5243 continue; | |
5244 } | |
5245 | |
5246 if (ga_grow(&ga, 1) == FAIL) | |
5247 break; | |
5248 | |
5249 ((char_u **)ga.ga_data)[ga.ga_len] = vim_strnsave(s, (int)(e - s)); | |
5250 ++ga.ga_len; | |
5251 | |
5252 *e = keep; | |
5253 if (*e != NUL) | |
5254 ++e; | |
5255 } | |
407 | 5256 vim_free(retstr); |
5257 *file = ga.ga_data; | |
5258 *num_file = ga.ga_len; | |
5259 return OK; | |
5260 } | |
5261 | |
5262 /* | |
5263 * Expand names with a list returned by a function defined by the user. | |
5264 */ | |
5265 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5266 ExpandUserList( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5267 expand_T *xp, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5268 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5269 char_u ***file) |
407 | 5270 { |
5271 list_T *retlist; | |
5272 listitem_T *li; | |
5273 garray_T ga; | |
5274 | |
5275 retlist = call_user_expand_func(call_func_retlist, xp, num_file, file); | |
5276 if (retlist == NULL) | |
5277 return FAIL; | |
5278 | |
5279 ga_init2(&ga, (int)sizeof(char *), 3); | |
5280 /* Loop over the items in the list. */ | |
5281 for (li = retlist->lv_first; li != NULL; li = li->li_next) | |
5282 { | |
1917 | 5283 if (li->li_tv.v_type != VAR_STRING || li->li_tv.vval.v_string == NULL) |
5284 continue; /* Skip non-string items and empty strings */ | |
407 | 5285 |
5286 if (ga_grow(&ga, 1) == FAIL) | |
5287 break; | |
5288 | |
5289 ((char_u **)ga.ga_data)[ga.ga_len] = | |
1917 | 5290 vim_strsave(li->li_tv.vval.v_string); |
407 | 5291 ++ga.ga_len; |
5292 } | |
5293 list_unref(retlist); | |
5294 | |
7 | 5295 *file = ga.ga_data; |
5296 *num_file = ga.ga_len; | |
5297 return OK; | |
5298 } | |
5299 #endif | |
5300 | |
5301 /* | |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5302 * Expand color scheme, compiler or filetype names. |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5303 * Search from 'runtimepath': |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5304 * 'runtimepath'/{dirnames}/{pat}.vim |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5305 * When "flags" has DIP_START: search also from 'start' of 'packpath': |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5306 * 'packpath'/pack/ * /start/ * /{dirnames}/{pat}.vim |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5307 * When "flags" has DIP_OPT: search also from 'opt' of 'packpath': |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5308 * 'packpath'/pack/ * /opt/ * /{dirnames}/{pat}.vim |
2929 | 5309 * "dirnames" is an array with one or more directory names. |
7 | 5310 */ |
5311 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5312 ExpandRTDir( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5313 char_u *pat, |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5314 int flags, |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5315 int *num_file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5316 char_u ***file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5317 char *dirnames[]) |
7 | 5318 { |
5319 char_u *s; | |
5320 char_u *e; | |
5873 | 5321 char_u *match; |
7 | 5322 garray_T ga; |
2929 | 5323 int i; |
5324 int pat_len; | |
7 | 5325 |
5326 *num_file = 0; | |
5327 *file = NULL; | |
2931 | 5328 pat_len = (int)STRLEN(pat); |
2929 | 5329 ga_init2(&ga, (int)sizeof(char *), 10); |
5330 | |
5331 for (i = 0; dirnames[i] != NULL; ++i) | |
7 | 5332 { |
2929 | 5333 s = alloc((unsigned)(STRLEN(dirnames[i]) + pat_len + 7)); |
5334 if (s == NULL) | |
5335 { | |
5336 ga_clear_strings(&ga); | |
5337 return FAIL; | |
5338 } | |
5339 sprintf((char *)s, "%s/%s*.vim", dirnames[i], pat); | |
5873 | 5340 globpath(p_rtp, s, &ga, 0); |
2929 | 5341 vim_free(s); |
5873 | 5342 } |
5343 | |
8528
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5344 if (flags & DIP_START) { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5345 for (i = 0; dirnames[i] != NULL; ++i) |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5346 { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5347 s = alloc((unsigned)(STRLEN(dirnames[i]) + pat_len + 22)); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5348 if (s == NULL) |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5349 { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5350 ga_clear_strings(&ga); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5351 return FAIL; |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5352 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5353 sprintf((char *)s, "pack/*/start/*/%s/%s*.vim", dirnames[i], pat); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5354 globpath(p_pp, s, &ga, 0); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5355 vim_free(s); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5356 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5357 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5358 |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5359 if (flags & DIP_OPT) { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5360 for (i = 0; dirnames[i] != NULL; ++i) |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5361 { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5362 s = alloc((unsigned)(STRLEN(dirnames[i]) + pat_len + 20)); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5363 if (s == NULL) |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5364 { |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5365 ga_clear_strings(&ga); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5366 return FAIL; |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5367 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5368 sprintf((char *)s, "pack/*/opt/*/%s/%s*.vim", dirnames[i], pat); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5369 globpath(p_pp, s, &ga, 0); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5370 vim_free(s); |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5371 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5372 } |
630300c7a26c
commit https://github.com/vim/vim/commit/52f9c19015df5ee1ee8592b6f3f15b8a57c8f5be
Christian Brabandt <cb@256bit.org>
parents:
8406
diff
changeset
|
5373 |
5873 | 5374 for (i = 0; i < ga.ga_len; ++i) |
5375 { | |
5376 match = ((char_u **)ga.ga_data)[i]; | |
5377 s = match; | |
5378 e = s + STRLEN(s); | |
5379 if (e - 4 > s && STRNICMP(e - 4, ".vim", 4) == 0) | |
7 | 5380 { |
5873 | 5381 e -= 4; |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
5382 for (s = e; s > match; MB_PTR_BACK(match, s)) |
5873 | 5383 if (s < match || vim_ispathsep(*s)) |
5384 break; | |
5385 ++s; | |
5386 *e = NUL; | |
5387 mch_memmove(match, s, e - s + 1); | |
7 | 5388 } |
5389 } | |
5873 | 5390 |
2929 | 5391 if (ga.ga_len == 0) |
3628 | 5392 return FAIL; |
2433
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
5393 |
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
5394 /* Sort and remove duplicates which can happen when specifying multiple |
2929 | 5395 * directories in dirnames. */ |
2433
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
5396 remove_duplicates(&ga); |
98b9a6b9e7d5
Add completion for ":ownsyntax" and improve completion for ":filetype".
Bram Moolenaar <bram@vim.org>
parents:
2429
diff
changeset
|
5397 |
7 | 5398 *file = ga.ga_data; |
5399 *num_file = ga.ga_len; | |
5400 return OK; | |
5401 } | |
5402 | |
8402
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5403 /* |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5404 * Expand loadplugin names: |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5405 * 'packpath'/pack/ * /opt/{pat} |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5406 */ |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5407 static int |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5408 ExpandPackAddDir( |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5409 char_u *pat, |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5410 int *num_file, |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5411 char_u ***file) |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5412 { |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5413 char_u *s; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5414 char_u *e; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5415 char_u *match; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5416 garray_T ga; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5417 int i; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5418 int pat_len; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5419 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5420 *num_file = 0; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5421 *file = NULL; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5422 pat_len = (int)STRLEN(pat); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5423 ga_init2(&ga, (int)sizeof(char *), 10); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5424 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5425 s = alloc((unsigned)(pat_len + 26)); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5426 if (s == NULL) |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5427 { |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5428 ga_clear_strings(&ga); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5429 return FAIL; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5430 } |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5431 sprintf((char *)s, "pack/*/opt/%s*", pat); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5432 globpath(p_pp, s, &ga, 0); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5433 vim_free(s); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5434 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5435 for (i = 0; i < ga.ga_len; ++i) |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5436 { |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5437 match = ((char_u **)ga.ga_data)[i]; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5438 s = gettail(match); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5439 e = s + STRLEN(s); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5440 mch_memmove(match, s, e - s + 1); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5441 } |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5442 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5443 if (ga.ga_len == 0) |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5444 return FAIL; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5445 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5446 /* Sort and remove duplicates which can happen when specifying multiple |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5447 * directories in dirnames. */ |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5448 remove_duplicates(&ga); |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5449 |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5450 *file = ga.ga_data; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5451 *num_file = ga.ga_len; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5452 return OK; |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5453 } |
eed1ca42f9aa
commit https://github.com/vim/vim/commit/35ca0e7a1cb6e6daef8e0052a8437801226cef19
Christian Brabandt <cb@256bit.org>
parents:
8281
diff
changeset
|
5454 |
7 | 5455 #endif |
5456 | |
5457 #if defined(FEAT_CMDL_COMPL) || defined(FEAT_EVAL) || defined(PROTO) | |
5458 /* | |
5459 * Expand "file" for all comma-separated directories in "path". | |
5873 | 5460 * Adds the matches to "ga". Caller must init "ga". |
7 | 5461 */ |
5873 | 5462 void |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5463 globpath( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5464 char_u *path, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5465 char_u *file, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5466 garray_T *ga, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5467 int expand_options) |
7 | 5468 { |
5469 expand_T xpc; | |
5470 char_u *buf; | |
5471 int i; | |
5472 int num_p; | |
5473 char_u **p; | |
5474 | |
5475 buf = alloc(MAXPATHL); | |
5476 if (buf == NULL) | |
5873 | 5477 return; |
7 | 5478 |
632 | 5479 ExpandInit(&xpc); |
7 | 5480 xpc.xp_context = EXPAND_FILES; |
632 | 5481 |
7 | 5482 /* Loop over all entries in {path}. */ |
5483 while (*path != NUL) | |
5484 { | |
5485 /* Copy one item of the path to buf[] and concatenate the file name. */ | |
5486 copy_option_part(&path, buf, MAXPATHL, ","); | |
5487 if (STRLEN(buf) + STRLEN(file) + 2 < MAXPATHL) | |
5488 { | |
8212
05b88224cea1
commit https://github.com/vim/vim/commit/48e330aff911be1c798c88a973af6437a8141fce
Christian Brabandt <cb@256bit.org>
parents:
8080
diff
changeset
|
5489 # if defined(MSWIN) |
2495
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5490 /* Using the platform's path separator (\) makes vim incorrectly |
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5491 * treat it as an escape character, use '/' instead. */ |
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5492 if (*buf != NUL && !after_pathsep(buf, buf + STRLEN(buf))) |
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5493 STRCAT(buf, "/"); |
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5494 # else |
7 | 5495 add_pathsep(buf); |
2495
a847363bf06e
Fix a few problems for :find completion. Test much more. (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2445
diff
changeset
|
5496 # endif |
7 | 5497 STRCAT(buf, file); |
1754 | 5498 if (ExpandFromContext(&xpc, buf, &num_p, &p, |
5499 WILD_SILENT|expand_options) != FAIL && num_p > 0) | |
7 | 5500 { |
1754 | 5501 ExpandEscape(&xpc, buf, num_p, p, WILD_SILENT|expand_options); |
5873 | 5502 |
5503 if (ga_grow(ga, num_p) == OK) | |
7 | 5504 { |
5505 for (i = 0; i < num_p; ++i) | |
5506 { | |
5873 | 5507 ((char_u **)ga->ga_data)[ga->ga_len] = |
5950 | 5508 vim_strnsave(p[i], (int)STRLEN(p[i])); |
5873 | 5509 ++ga->ga_len; |
7 | 5510 } |
5511 } | |
5873 | 5512 |
7 | 5513 FreeWild(num_p, p); |
5514 } | |
5515 } | |
5516 } | |
5517 | |
5518 vim_free(buf); | |
5519 } | |
5520 | |
5521 #endif | |
5522 | |
5523 #if defined(FEAT_CMDHIST) || defined(PROTO) | |
5524 | |
5525 /********************************* | |
5526 * Command line history stuff * | |
5527 *********************************/ | |
5528 | |
5529 /* | |
5530 * Translate a history character to the associated type number. | |
5531 */ | |
5532 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5533 hist_char2type(int c) |
7 | 5534 { |
5535 if (c == ':') | |
5536 return HIST_CMD; | |
5537 if (c == '=') | |
5538 return HIST_EXPR; | |
5539 if (c == '@') | |
5540 return HIST_INPUT; | |
5541 if (c == '>') | |
5542 return HIST_DEBUG; | |
5543 return HIST_SEARCH; /* must be '?' or '/' */ | |
5544 } | |
5545 | |
5546 /* | |
5547 * Table of history names. | |
5548 * These names are used in :history and various hist...() functions. | |
5549 * It is sufficient to give the significant prefix of a history name. | |
5550 */ | |
5551 | |
5552 static char *(history_names[]) = | |
5553 { | |
5554 "cmd", | |
5555 "search", | |
5556 "expr", | |
5557 "input", | |
5558 "debug", | |
5559 NULL | |
5560 }; | |
5561 | |
3503 | 5562 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
5563 /* | |
5564 * Function given to ExpandGeneric() to obtain the possible first | |
5565 * arguments of the ":history command. | |
5566 */ | |
5567 static char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5568 get_history_arg(expand_T *xp UNUSED, int idx) |
3503 | 5569 { |
5570 static char_u compl[2] = { NUL, NUL }; | |
5571 char *short_names = ":=@>?/"; | |
3529 | 5572 int short_names_count = (int)STRLEN(short_names); |
3503 | 5573 int history_name_count = sizeof(history_names) / sizeof(char *) - 1; |
5574 | |
5575 if (idx < short_names_count) | |
5576 { | |
5577 compl[0] = (char_u)short_names[idx]; | |
5578 return compl; | |
5579 } | |
5580 if (idx < short_names_count + history_name_count) | |
5581 return (char_u *)history_names[idx - short_names_count]; | |
5582 if (idx == short_names_count + history_name_count) | |
5583 return (char_u *)"all"; | |
5584 return NULL; | |
5585 } | |
5586 #endif | |
5587 | |
7 | 5588 /* |
5589 * init_history() - Initialize the command line history. | |
5590 * Also used to re-allocate the history when the size changes. | |
5591 */ | |
356 | 5592 void |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5593 init_history(void) |
7 | 5594 { |
5595 int newlen; /* new length of history table */ | |
5596 histentry_T *temp; | |
5597 int i; | |
5598 int j; | |
5599 int type; | |
5600 | |
5601 /* | |
5602 * If size of history table changed, reallocate it | |
5603 */ | |
5604 newlen = (int)p_hi; | |
5605 if (newlen != hislen) /* history length changed */ | |
5606 { | |
5607 for (type = 0; type < HIST_COUNT; ++type) /* adjust the tables */ | |
5608 { | |
5609 if (newlen) | |
5610 { | |
5611 temp = (histentry_T *)lalloc( | |
5612 (long_u)(newlen * sizeof(histentry_T)), TRUE); | |
5613 if (temp == NULL) /* out of memory! */ | |
5614 { | |
5615 if (type == 0) /* first one: just keep the old length */ | |
5616 { | |
5617 newlen = hislen; | |
5618 break; | |
5619 } | |
5620 /* Already changed one table, now we can only have zero | |
5621 * length for all tables. */ | |
5622 newlen = 0; | |
5623 type = -1; | |
5624 continue; | |
5625 } | |
5626 } | |
5627 else | |
5628 temp = NULL; | |
5629 if (newlen == 0 || temp != NULL) | |
5630 { | |
5631 if (hisidx[type] < 0) /* there are no entries yet */ | |
5632 { | |
5633 for (i = 0; i < newlen; ++i) | |
4258 | 5634 clear_hist_entry(&temp[i]); |
7 | 5635 } |
5636 else if (newlen > hislen) /* array becomes bigger */ | |
5637 { | |
5638 for (i = 0; i <= hisidx[type]; ++i) | |
5639 temp[i] = history[type][i]; | |
5640 j = i; | |
5641 for ( ; i <= newlen - (hislen - hisidx[type]); ++i) | |
4258 | 5642 clear_hist_entry(&temp[i]); |
7 | 5643 for ( ; j < hislen; ++i, ++j) |
5644 temp[i] = history[type][j]; | |
5645 } | |
5646 else /* array becomes smaller or 0 */ | |
5647 { | |
5648 j = hisidx[type]; | |
5649 for (i = newlen - 1; ; --i) | |
5650 { | |
5651 if (i >= 0) /* copy newest entries */ | |
5652 temp[i] = history[type][j]; | |
5653 else /* remove older entries */ | |
5654 vim_free(history[type][j].hisstr); | |
5655 if (--j < 0) | |
5656 j = hislen - 1; | |
5657 if (j == hisidx[type]) | |
5658 break; | |
5659 } | |
5660 hisidx[type] = newlen - 1; | |
5661 } | |
5662 vim_free(history[type]); | |
5663 history[type] = temp; | |
5664 } | |
5665 } | |
5666 hislen = newlen; | |
5667 } | |
5668 } | |
5669 | |
4258 | 5670 static void |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5671 clear_hist_entry(histentry_T *hisptr) |
4258 | 5672 { |
5673 hisptr->hisnum = 0; | |
5674 hisptr->viminfo = FALSE; | |
5675 hisptr->hisstr = NULL; | |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
5676 hisptr->time_set = 0; |
4258 | 5677 } |
5678 | |
7 | 5679 /* |
5680 * Check if command line 'str' is already in history. | |
5681 * If 'move_to_front' is TRUE, matching entry is moved to end of history. | |
5682 */ | |
5683 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5684 in_history( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5685 int type, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5686 char_u *str, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5687 int move_to_front, /* Move the entry to the front if it exists */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5688 int sep, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5689 int writing) /* ignore entries read from viminfo */ |
7 | 5690 { |
5691 int i; | |
5692 int last_i = -1; | |
2986 | 5693 char_u *p; |
7 | 5694 |
5695 if (hisidx[type] < 0) | |
5696 return FALSE; | |
5697 i = hisidx[type]; | |
5698 do | |
5699 { | |
5700 if (history[type][i].hisstr == NULL) | |
5701 return FALSE; | |
2986 | 5702 |
5703 /* For search history, check that the separator character matches as | |
5704 * well. */ | |
5705 p = history[type][i].hisstr; | |
5706 if (STRCMP(str, p) == 0 | |
4285 | 5707 && !(writing && history[type][i].viminfo) |
2986 | 5708 && (type != HIST_SEARCH || sep == p[STRLEN(p) + 1])) |
7 | 5709 { |
5710 if (!move_to_front) | |
5711 return TRUE; | |
5712 last_i = i; | |
5713 break; | |
5714 } | |
5715 if (--i < 0) | |
5716 i = hislen - 1; | |
5717 } while (i != hisidx[type]); | |
5718 | |
5719 if (last_i >= 0) | |
5720 { | |
5721 str = history[type][i].hisstr; | |
5722 while (i != hisidx[type]) | |
5723 { | |
5724 if (++i >= hislen) | |
5725 i = 0; | |
5726 history[type][last_i] = history[type][i]; | |
5727 last_i = i; | |
5728 } | |
4258 | 5729 history[type][i].hisnum = ++hisnum[type]; |
5730 history[type][i].viminfo = FALSE; | |
7 | 5731 history[type][i].hisstr = str; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
5732 history[type][i].time_set = vim_time(); |
7 | 5733 return TRUE; |
5734 } | |
5735 return FALSE; | |
5736 } | |
5737 | |
5738 /* | |
5739 * Convert history name (from table above) to its HIST_ equivalent. | |
5740 * When "name" is empty, return "cmd" history. | |
5741 * Returns -1 for unknown history name. | |
5742 */ | |
5743 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5744 get_histtype(char_u *name) |
7 | 5745 { |
5746 int i; | |
5747 int len = (int)STRLEN(name); | |
5748 | |
5749 /* No argument: use current history. */ | |
5750 if (len == 0) | |
5751 return hist_char2type(ccline.cmdfirstc); | |
5752 | |
5753 for (i = 0; history_names[i] != NULL; ++i) | |
5754 if (STRNICMP(name, history_names[i], len) == 0) | |
5755 return i; | |
5756 | |
5757 if (vim_strchr((char_u *)":=@>?/", name[0]) != NULL && name[1] == NUL) | |
5758 return hist_char2type(name[0]); | |
5759 | |
5760 return -1; | |
5761 } | |
5762 | |
5763 static int last_maptick = -1; /* last seen maptick */ | |
5764 | |
5765 /* | |
5766 * Add the given string to the given history. If the string is already in the | |
5767 * history then it is moved to the front. "histype" may be one of he HIST_ | |
5768 * values. | |
5769 */ | |
5770 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5771 add_to_history( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5772 int histype, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5773 char_u *new_entry, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5774 int in_map, /* consider maptick when inside a mapping */ |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5775 int sep) /* separator character used (search hist) */ |
7 | 5776 { |
5777 histentry_T *hisptr; | |
5778 int len; | |
5779 | |
5780 if (hislen == 0) /* no history */ | |
5781 return; | |
5782 | |
5467 | 5783 if (cmdmod.keeppatterns && histype == HIST_SEARCH) |
5784 return; | |
5785 | |
7 | 5786 /* |
5787 * Searches inside the same mapping overwrite each other, so that only | |
5788 * the last line is kept. Be careful not to remove a line that was moved | |
5789 * down, only lines that were added. | |
5790 */ | |
5791 if (histype == HIST_SEARCH && in_map) | |
5792 { | |
10174
b17c82587755
commit https://github.com/vim/vim/commit/46643713dc6bb04b4e84986b1763ef309e960161
Christian Brabandt <cb@256bit.org>
parents:
10120
diff
changeset
|
5793 if (maptick == last_maptick && hisidx[HIST_SEARCH] >= 0) |
7 | 5794 { |
5795 /* Current line is from the same mapping, remove it */ | |
5796 hisptr = &history[HIST_SEARCH][hisidx[HIST_SEARCH]]; | |
5797 vim_free(hisptr->hisstr); | |
4258 | 5798 clear_hist_entry(hisptr); |
7 | 5799 --hisnum[histype]; |
5800 if (--hisidx[HIST_SEARCH] < 0) | |
5801 hisidx[HIST_SEARCH] = hislen - 1; | |
5802 } | |
5803 last_maptick = -1; | |
5804 } | |
4285 | 5805 if (!in_history(histype, new_entry, TRUE, sep, FALSE)) |
7 | 5806 { |
5807 if (++hisidx[histype] == hislen) | |
5808 hisidx[histype] = 0; | |
5809 hisptr = &history[histype][hisidx[histype]]; | |
5810 vim_free(hisptr->hisstr); | |
5811 | |
5812 /* Store the separator after the NUL of the string. */ | |
835 | 5813 len = (int)STRLEN(new_entry); |
7 | 5814 hisptr->hisstr = vim_strnsave(new_entry, len + 2); |
5815 if (hisptr->hisstr != NULL) | |
5816 hisptr->hisstr[len + 1] = sep; | |
5817 | |
5818 hisptr->hisnum = ++hisnum[histype]; | |
4258 | 5819 hisptr->viminfo = FALSE; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
5820 hisptr->time_set = vim_time(); |
7 | 5821 if (histype == HIST_SEARCH && in_map) |
5822 last_maptick = maptick; | |
5823 } | |
5824 } | |
5825 | |
5826 #if defined(FEAT_EVAL) || defined(PROTO) | |
5827 | |
5828 /* | |
5829 * Get identifier of newest history entry. | |
5830 * "histype" may be one of the HIST_ values. | |
5831 */ | |
5832 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5833 get_history_idx(int histype) |
7 | 5834 { |
5835 if (hislen == 0 || histype < 0 || histype >= HIST_COUNT | |
5836 || hisidx[histype] < 0) | |
5837 return -1; | |
5838 | |
5839 return history[histype][hisidx[histype]].hisnum; | |
5840 } | |
5841 | |
531 | 5842 /* |
7 | 5843 * Calculate history index from a number: |
5844 * num > 0: seen as identifying number of a history entry | |
5845 * num < 0: relative position in history wrt newest entry | |
5846 * "histype" may be one of the HIST_ values. | |
5847 */ | |
5848 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5849 calc_hist_idx(int histype, int num) |
7 | 5850 { |
5851 int i; | |
5852 histentry_T *hist; | |
5853 int wrapped = FALSE; | |
5854 | |
5855 if (hislen == 0 || histype < 0 || histype >= HIST_COUNT | |
5856 || (i = hisidx[histype]) < 0 || num == 0) | |
5857 return -1; | |
5858 | |
5859 hist = history[histype]; | |
5860 if (num > 0) | |
5861 { | |
5862 while (hist[i].hisnum > num) | |
5863 if (--i < 0) | |
5864 { | |
5865 if (wrapped) | |
5866 break; | |
5867 i += hislen; | |
5868 wrapped = TRUE; | |
5869 } | |
5870 if (hist[i].hisnum == num && hist[i].hisstr != NULL) | |
5871 return i; | |
5872 } | |
5873 else if (-num <= hislen) | |
5874 { | |
5875 i += num + 1; | |
5876 if (i < 0) | |
5877 i += hislen; | |
5878 if (hist[i].hisstr != NULL) | |
5879 return i; | |
5880 } | |
5881 return -1; | |
5882 } | |
5883 | |
5884 /* | |
5885 * Get a history entry by its index. | |
5886 * "histype" may be one of the HIST_ values. | |
5887 */ | |
5888 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5889 get_history_entry(int histype, int idx) |
7 | 5890 { |
5891 idx = calc_hist_idx(histype, idx); | |
5892 if (idx >= 0) | |
5893 return history[histype][idx].hisstr; | |
5894 else | |
5895 return (char_u *)""; | |
5896 } | |
5897 | |
5898 /* | |
5899 * Clear all entries of a history. | |
5900 * "histype" may be one of the HIST_ values. | |
5901 */ | |
5902 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5903 clr_history(int histype) |
7 | 5904 { |
5905 int i; | |
5906 histentry_T *hisptr; | |
5907 | |
5908 if (hislen != 0 && histype >= 0 && histype < HIST_COUNT) | |
5909 { | |
5910 hisptr = history[histype]; | |
5911 for (i = hislen; i--;) | |
5912 { | |
5913 vim_free(hisptr->hisstr); | |
4258 | 5914 clear_hist_entry(hisptr); |
8406
5d926807c19c
commit https://github.com/vim/vim/commit/119d4693e06e68d4f099aa7287e375ae3d265fd0
Christian Brabandt <cb@256bit.org>
parents:
8402
diff
changeset
|
5915 hisptr++; |
7 | 5916 } |
5917 hisidx[histype] = -1; /* mark history as cleared */ | |
5918 hisnum[histype] = 0; /* reset identifier counter */ | |
5919 return OK; | |
5920 } | |
5921 return FAIL; | |
5922 } | |
5923 | |
5924 /* | |
5925 * Remove all entries matching {str} from a history. | |
5926 * "histype" may be one of the HIST_ values. | |
5927 */ | |
5928 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5929 del_history_entry(int histype, char_u *str) |
7 | 5930 { |
5931 regmatch_T regmatch; | |
5932 histentry_T *hisptr; | |
5933 int idx; | |
5934 int i; | |
5935 int last; | |
5936 int found = FALSE; | |
5937 | |
5938 regmatch.regprog = NULL; | |
5939 regmatch.rm_ic = FALSE; /* always match case */ | |
5940 if (hislen != 0 | |
5941 && histype >= 0 | |
5942 && histype < HIST_COUNT | |
5943 && *str != NUL | |
5944 && (idx = hisidx[histype]) >= 0 | |
5945 && (regmatch.regprog = vim_regcomp(str, RE_MAGIC + RE_STRING)) | |
5946 != NULL) | |
5947 { | |
5948 i = last = idx; | |
5949 do | |
5950 { | |
5951 hisptr = &history[histype][i]; | |
5952 if (hisptr->hisstr == NULL) | |
5953 break; | |
5954 if (vim_regexec(®match, hisptr->hisstr, (colnr_T)0)) | |
5955 { | |
5956 found = TRUE; | |
5957 vim_free(hisptr->hisstr); | |
4258 | 5958 clear_hist_entry(hisptr); |
7 | 5959 } |
5960 else | |
5961 { | |
5962 if (i != last) | |
5963 { | |
5964 history[histype][last] = *hisptr; | |
4258 | 5965 clear_hist_entry(hisptr); |
7 | 5966 } |
5967 if (--last < 0) | |
5968 last += hislen; | |
5969 } | |
5970 if (--i < 0) | |
5971 i += hislen; | |
5972 } while (i != idx); | |
5973 if (history[histype][idx].hisstr == NULL) | |
5974 hisidx[histype] = -1; | |
5975 } | |
4805
66803af09906
updated for version 7.3.1149
Bram Moolenaar <bram@vim.org>
parents:
4803
diff
changeset
|
5976 vim_regfree(regmatch.regprog); |
7 | 5977 return found; |
5978 } | |
5979 | |
5980 /* | |
5981 * Remove an indexed entry from a history. | |
5982 * "histype" may be one of the HIST_ values. | |
5983 */ | |
5984 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
5985 del_history_idx(int histype, int idx) |
7 | 5986 { |
5987 int i, j; | |
5988 | |
5989 i = calc_hist_idx(histype, idx); | |
5990 if (i < 0) | |
5991 return FALSE; | |
5992 idx = hisidx[histype]; | |
5993 vim_free(history[histype][i].hisstr); | |
5994 | |
5995 /* When deleting the last added search string in a mapping, reset | |
5996 * last_maptick, so that the last added search string isn't deleted again. | |
5997 */ | |
5998 if (histype == HIST_SEARCH && maptick == last_maptick && i == idx) | |
5999 last_maptick = -1; | |
6000 | |
6001 while (i != idx) | |
6002 { | |
6003 j = (i + 1) % hislen; | |
6004 history[histype][i] = history[histype][j]; | |
6005 i = j; | |
6006 } | |
4258 | 6007 clear_hist_entry(&history[histype][i]); |
7 | 6008 if (--i < 0) |
6009 i += hislen; | |
6010 hisidx[histype] = i; | |
6011 return TRUE; | |
6012 } | |
6013 | |
6014 #endif /* FEAT_EVAL */ | |
6015 | |
6016 #if defined(FEAT_CRYPT) || defined(PROTO) | |
6017 /* | |
6018 * Very specific function to remove the value in ":set key=val" from the | |
6019 * history. | |
6020 */ | |
6021 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6022 remove_key_from_history(void) |
7 | 6023 { |
6024 char_u *p; | |
6025 int i; | |
6026 | |
6027 i = hisidx[HIST_CMD]; | |
6028 if (i < 0) | |
6029 return; | |
6030 p = history[HIST_CMD][i].hisstr; | |
6031 if (p != NULL) | |
6032 for ( ; *p; ++p) | |
6033 if (STRNCMP(p, "key", 3) == 0 && !isalpha(p[3])) | |
6034 { | |
6035 p = vim_strchr(p + 3, '='); | |
6036 if (p == NULL) | |
6037 break; | |
6038 ++p; | |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
6039 for (i = 0; p[i] && !VIM_ISWHITE(p[i]); ++i) |
7 | 6040 if (p[i] == '\\' && p[i + 1]) |
6041 ++i; | |
1621 | 6042 STRMOVE(p, p + i); |
7 | 6043 --p; |
6044 } | |
6045 } | |
6046 #endif | |
6047 | |
6048 #endif /* FEAT_CMDHIST */ | |
6049 | |
8647
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6050 #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO) |
8645
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6051 /* |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6052 * Get pointer to the command line info to use. cmdline_paste() may clear |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6053 * ccline and put the previous value in prev_ccline. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6054 */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6055 static struct cmdline_info * |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6056 get_ccline_ptr(void) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6057 { |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6058 if ((State & CMDLINE) == 0) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6059 return NULL; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6060 if (ccline.cmdbuff != NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6061 return &ccline; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6062 if (prev_ccline_used && prev_ccline.cmdbuff != NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6063 return &prev_ccline; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6064 return NULL; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6065 } |
8647
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6066 #endif |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6067 |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6068 #if defined(FEAT_EVAL) || defined(PROTO) |
8645
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6069 /* |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6070 * Get the current command line in allocated memory. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6071 * Only works when the command line is being edited. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6072 * Returns NULL when something is wrong. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6073 */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6074 char_u * |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6075 get_cmdline_str(void) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6076 { |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6077 struct cmdline_info *p = get_ccline_ptr(); |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6078 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6079 if (p == NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6080 return NULL; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6081 return vim_strnsave(p->cmdbuff, p->cmdlen); |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6082 } |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6083 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6084 /* |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6085 * Get the current command line position, counted in bytes. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6086 * Zero is the first position. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6087 * Only works when the command line is being edited. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6088 * Returns -1 when something is wrong. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6089 */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6090 int |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6091 get_cmdline_pos(void) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6092 { |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6093 struct cmdline_info *p = get_ccline_ptr(); |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6094 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6095 if (p == NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6096 return -1; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6097 return p->cmdpos; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6098 } |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6099 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6100 /* |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6101 * Set the command line byte position to "pos". Zero is the first position. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6102 * Only works when the command line is being edited. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6103 * Returns 1 when failed, 0 when OK. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6104 */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6105 int |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6106 set_cmdline_pos( |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6107 int pos) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6108 { |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6109 struct cmdline_info *p = get_ccline_ptr(); |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6110 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6111 if (p == NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6112 return 1; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6113 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6114 /* The position is not set directly but after CTRL-\ e or CTRL-R = has |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6115 * changed the command line. */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6116 if (pos < 0) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6117 new_cmdpos = 0; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6118 else |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6119 new_cmdpos = pos; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6120 return 0; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6121 } |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6122 #endif |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6123 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6124 #if defined(FEAT_EVAL) || defined(FEAT_CMDWIN) || defined(PROTO) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6125 /* |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6126 * Get the current command-line type. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6127 * Returns ':' or '/' or '?' or '@' or '>' or '-' |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6128 * Only works when the command line is being edited. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6129 * Returns NUL when something is wrong. |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6130 */ |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6131 int |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6132 get_cmdline_type(void) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6133 { |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6134 struct cmdline_info *p = get_ccline_ptr(); |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6135 |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6136 if (p == NULL) |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6137 return NUL; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6138 if (p->cmdfirstc == NUL) |
8647
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6139 return |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6140 # ifdef FEAT_EVAL |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6141 (p->input_fn) ? '@' : |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6142 # endif |
59866aabe737
commit https://github.com/vim/vim/commit/064154c3fedd6a46ca2f61463d7e5567bd22d9f1
Christian Brabandt <cb@256bit.org>
parents:
8645
diff
changeset
|
6143 '-'; |
8645
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6144 return p->cmdfirstc; |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6145 } |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6146 #endif |
f4819f0fc5ad
commit https://github.com/vim/vim/commit/d293b2b9d43ee4b7b48ca6974202cbf319438975
Christian Brabandt <cb@256bit.org>
parents:
8643
diff
changeset
|
6147 |
7 | 6148 #if defined(FEAT_QUICKFIX) || defined(FEAT_CMDHIST) || defined(PROTO) |
6149 /* | |
6150 * Get indices "num1,num2" that specify a range within a list (not a range of | |
6151 * text lines in a buffer!) from a string. Used for ":history" and ":clist". | |
6152 * Returns OK if parsed successfully, otherwise FAIL. | |
6153 */ | |
6154 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6155 get_list_range(char_u **str, int *num1, int *num2) |
7 | 6156 { |
6157 int len; | |
6158 int first = FALSE; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9301
diff
changeset
|
6159 varnumber_T num; |
7 | 6160 |
6161 *str = skipwhite(*str); | |
6162 if (**str == '-' || vim_isdigit(**str)) /* parse "from" part of range */ | |
6163 { | |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7408
diff
changeset
|
6164 vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); |
7 | 6165 *str += len; |
6166 *num1 = (int)num; | |
6167 first = TRUE; | |
6168 } | |
6169 *str = skipwhite(*str); | |
6170 if (**str == ',') /* parse "to" part of range */ | |
6171 { | |
6172 *str = skipwhite(*str + 1); | |
7447
ad432f8f68fb
commit https://github.com/vim/vim/commit/887c1fea4a114e7170091942d0446c8882701b5b
Christian Brabandt <cb@256bit.org>
parents:
7408
diff
changeset
|
6173 vim_str2nr(*str, NULL, &len, 0, &num, NULL, 0); |
7 | 6174 if (len > 0) |
6175 { | |
6176 *num2 = (int)num; | |
6177 *str = skipwhite(*str + len); | |
6178 } | |
6179 else if (!first) /* no number given at all */ | |
6180 return FAIL; | |
6181 } | |
6182 else if (first) /* only one number given */ | |
6183 *num2 = *num1; | |
6184 return OK; | |
6185 } | |
6186 #endif | |
6187 | |
6188 #if defined(FEAT_CMDHIST) || defined(PROTO) | |
6189 /* | |
6190 * :history command - print a history | |
6191 */ | |
6192 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6193 ex_history(exarg_T *eap) |
7 | 6194 { |
6195 histentry_T *hist; | |
6196 int histype1 = HIST_CMD; | |
6197 int histype2 = HIST_CMD; | |
6198 int hisidx1 = 1; | |
6199 int hisidx2 = -1; | |
6200 int idx; | |
6201 int i, j, k; | |
6202 char_u *end; | |
6203 char_u *arg = eap->arg; | |
6204 | |
6205 if (hislen == 0) | |
6206 { | |
6207 MSG(_("'history' option is zero")); | |
6208 return; | |
6209 } | |
6210 | |
6211 if (!(VIM_ISDIGIT(*arg) || *arg == '-' || *arg == ',')) | |
6212 { | |
6213 end = arg; | |
6214 while (ASCII_ISALPHA(*end) | |
6215 || vim_strchr((char_u *)":=@>/?", *end) != NULL) | |
6216 end++; | |
6217 i = *end; | |
6218 *end = NUL; | |
6219 histype1 = get_histtype(arg); | |
6220 if (histype1 == -1) | |
6221 { | |
1853 | 6222 if (STRNICMP(arg, "all", STRLEN(arg)) == 0) |
7 | 6223 { |
6224 histype1 = 0; | |
6225 histype2 = HIST_COUNT-1; | |
6226 } | |
6227 else | |
6228 { | |
6229 *end = i; | |
6230 EMSG(_(e_trailing)); | |
6231 return; | |
6232 } | |
6233 } | |
6234 else | |
6235 histype2 = histype1; | |
6236 *end = i; | |
6237 } | |
6238 else | |
6239 end = arg; | |
6240 if (!get_list_range(&end, &hisidx1, &hisidx2) || *end != NUL) | |
6241 { | |
6242 EMSG(_(e_trailing)); | |
6243 return; | |
6244 } | |
6245 | |
6246 for (; !got_int && histype1 <= histype2; ++histype1) | |
6247 { | |
6248 STRCPY(IObuff, "\n # "); | |
6249 STRCAT(STRCAT(IObuff, history_names[histype1]), " history"); | |
6250 MSG_PUTS_TITLE(IObuff); | |
6251 idx = hisidx[histype1]; | |
6252 hist = history[histype1]; | |
6253 j = hisidx1; | |
6254 k = hisidx2; | |
6255 if (j < 0) | |
6256 j = (-j > hislen) ? 0 : hist[(hislen+j+idx+1) % hislen].hisnum; | |
6257 if (k < 0) | |
6258 k = (-k > hislen) ? 0 : hist[(hislen+k+idx+1) % hislen].hisnum; | |
6259 if (idx >= 0 && j <= k) | |
6260 for (i = idx + 1; !got_int; ++i) | |
6261 { | |
6262 if (i == hislen) | |
6263 i = 0; | |
6264 if (hist[i].hisstr != NULL | |
6265 && hist[i].hisnum >= j && hist[i].hisnum <= k) | |
6266 { | |
6267 msg_putchar('\n'); | |
6268 sprintf((char *)IObuff, "%c%6d ", i == idx ? '>' : ' ', | |
6269 hist[i].hisnum); | |
6270 if (vim_strsize(hist[i].hisstr) > (int)Columns - 10) | |
6271 trunc_string(hist[i].hisstr, IObuff + STRLEN(IObuff), | |
3290 | 6272 (int)Columns - 10, IOSIZE - (int)STRLEN(IObuff)); |
7 | 6273 else |
6274 STRCAT(IObuff, hist[i].hisstr); | |
6275 msg_outtrans(IObuff); | |
6276 out_flush(); | |
6277 } | |
6278 if (i == idx) | |
6279 break; | |
6280 } | |
6281 } | |
6282 } | |
6283 #endif | |
6284 | |
6285 #if (defined(FEAT_VIMINFO) && defined(FEAT_CMDHIST)) || defined(PROTO) | |
4903
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6286 /* |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6287 * Buffers for history read from a viminfo file. Only valid while reading. |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6288 */ |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6289 static histentry_T *viminfo_history[HIST_COUNT] = |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6290 {NULL, NULL, NULL, NULL, NULL}; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6291 static int viminfo_hisidx[HIST_COUNT] = {0, 0, 0, 0, 0}; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6292 static int viminfo_hislen[HIST_COUNT] = {0, 0, 0, 0, 0}; |
7 | 6293 static int viminfo_add_at_front = FALSE; |
6294 | |
7801
a1e71a01dbd6
commit https://github.com/vim/vim/commit/d25c16e2f2776d50245bf31d6e4d5364f12d188e
Christian Brabandt <cb@256bit.org>
parents:
7447
diff
changeset
|
6295 static int hist_type2char(int type, int use_question); |
7 | 6296 |
6297 /* | |
6298 * Translate a history type number to the associated character. | |
6299 */ | |
6300 static int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6301 hist_type2char( |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6302 int type, |
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6303 int use_question) /* use '?' instead of '/' */ |
7 | 6304 { |
6305 if (type == HIST_CMD) | |
6306 return ':'; | |
6307 if (type == HIST_SEARCH) | |
6308 { | |
6309 if (use_question) | |
6310 return '?'; | |
6311 else | |
6312 return '/'; | |
6313 } | |
6314 if (type == HIST_EXPR) | |
6315 return '='; | |
6316 return '@'; | |
6317 } | |
6318 | |
6319 /* | |
6320 * Prepare for reading the history from the viminfo file. | |
6321 * This allocates history arrays to store the read history lines. | |
6322 */ | |
6323 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6324 prepare_viminfo_history(int asklen, int writing) |
7 | 6325 { |
6326 int i; | |
6327 int num; | |
6328 int type; | |
6329 int len; | |
6330 | |
6331 init_history(); | |
4285 | 6332 viminfo_add_at_front = (asklen != 0 && !writing); |
7 | 6333 if (asklen > hislen) |
6334 asklen = hislen; | |
6335 | |
6336 for (type = 0; type < HIST_COUNT; ++type) | |
6337 { | |
4258 | 6338 /* Count the number of empty spaces in the history list. Entries read |
6339 * from viminfo previously are also considered empty. If there are | |
6340 * more spaces available than we request, then fill them up. */ | |
7 | 6341 for (i = 0, num = 0; i < hislen; i++) |
4258 | 6342 if (history[type][i].hisstr == NULL || history[type][i].viminfo) |
7 | 6343 num++; |
6344 len = asklen; | |
6345 if (num > len) | |
6346 len = num; | |
6347 if (len <= 0) | |
6348 viminfo_history[type] = NULL; | |
6349 else | |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6350 viminfo_history[type] = (histentry_T *)lalloc( |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6351 (long_u)(len * sizeof(histentry_T)), FALSE); |
7 | 6352 if (viminfo_history[type] == NULL) |
6353 len = 0; | |
6354 viminfo_hislen[type] = len; | |
6355 viminfo_hisidx[type] = 0; | |
6356 } | |
6357 } | |
6358 | |
6359 /* | |
6360 * Accept a line from the viminfo, store it in the history array when it's | |
6361 * new. | |
6362 */ | |
6363 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6364 read_viminfo_history(vir_T *virp, int writing) |
7 | 6365 { |
6366 int type; | |
6367 long_u len; | |
6368 char_u *val; | |
6369 char_u *p; | |
6370 | |
6371 type = hist_char2type(virp->vir_line[0]); | |
6372 if (viminfo_hisidx[type] < viminfo_hislen[type]) | |
6373 { | |
6374 val = viminfo_readstring(virp, 1, TRUE); | |
6375 if (val != NULL && *val != NUL) | |
6376 { | |
3316 | 6377 int sep = (*val == ' ' ? NUL : *val); |
6378 | |
7 | 6379 if (!in_history(type, val + (type == HIST_SEARCH), |
4285 | 6380 viminfo_add_at_front, sep, writing)) |
7 | 6381 { |
6382 /* Need to re-allocate to append the separator byte. */ | |
6383 len = STRLEN(val); | |
6384 p = lalloc(len + 2, TRUE); | |
6385 if (p != NULL) | |
6386 { | |
6387 if (type == HIST_SEARCH) | |
6388 { | |
6389 /* Search entry: Move the separator from the first | |
6390 * column to after the NUL. */ | |
6391 mch_memmove(p, val + 1, (size_t)len); | |
3316 | 6392 p[len] = sep; |
7 | 6393 } |
6394 else | |
6395 { | |
6396 /* Not a search entry: No separator in the viminfo | |
6397 * file, add a NUL separator. */ | |
6398 mch_memmove(p, val, (size_t)len + 1); | |
6399 p[len + 1] = NUL; | |
6400 } | |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6401 viminfo_history[type][viminfo_hisidx[type]].hisstr = p; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6402 viminfo_history[type][viminfo_hisidx[type]].time_set = 0; |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6403 viminfo_history[type][viminfo_hisidx[type]].viminfo = TRUE; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6404 viminfo_history[type][viminfo_hisidx[type]].hisnum = 0; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6405 viminfo_hisidx[type]++; |
7 | 6406 } |
6407 } | |
6408 } | |
6409 vim_free(val); | |
6410 } | |
6411 return viminfo_readline(virp); | |
6412 } | |
6413 | |
4285 | 6414 /* |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6415 * Accept a new style history line from the viminfo, store it in the history |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6416 * array when it's new. |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6417 */ |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6418 void |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6419 handle_viminfo_history( |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6420 garray_T *values, |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6421 int writing) |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6422 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6423 int type; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6424 long_u len; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6425 char_u *val; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6426 char_u *p; |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6427 bval_T *vp = (bval_T *)values->ga_data; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6428 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6429 /* Check the format: |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6430 * |{bartype},{histtype},{timestamp},{separator},"text" */ |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6431 if (values->ga_len < 4 |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6432 || vp[0].bv_type != BVAL_NR |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6433 || vp[1].bv_type != BVAL_NR |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6434 || (vp[2].bv_type != BVAL_NR && vp[2].bv_type != BVAL_EMPTY) |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6435 || vp[3].bv_type != BVAL_STRING) |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6436 return; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6437 |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6438 type = vp[0].bv_nr; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6439 if (type >= HIST_COUNT) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6440 return; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6441 if (viminfo_hisidx[type] < viminfo_hislen[type]) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6442 { |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6443 val = vp[3].bv_string; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6444 if (val != NULL && *val != NUL) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6445 { |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6446 int sep = type == HIST_SEARCH && vp[2].bv_type == BVAL_NR |
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6447 ? vp[2].bv_nr : NUL; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6448 int idx; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6449 int overwrite = FALSE; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6450 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6451 if (!in_history(type, val, viminfo_add_at_front, sep, writing)) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6452 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6453 /* If lines were written by an older Vim we need to avoid |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6454 * getting duplicates. See if the entry already exists. */ |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6455 for (idx = 0; idx < viminfo_hisidx[type]; ++idx) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6456 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6457 p = viminfo_history[type][idx].hisstr; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6458 if (STRCMP(val, p) == 0 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6459 && (type != HIST_SEARCH || sep == p[STRLEN(p) + 1])) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6460 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6461 overwrite = TRUE; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6462 break; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6463 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6464 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6465 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6466 if (!overwrite) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6467 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6468 /* Need to re-allocate to append the separator byte. */ |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6469 len = vp[3].bv_len; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6470 p = lalloc(len + 2, TRUE); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6471 } |
9301
c3805fb080a6
commit https://github.com/vim/vim/commit/72e697d189616265ecefe0df4509d476df3bae40
Christian Brabandt <cb@256bit.org>
parents:
9287
diff
changeset
|
6472 else |
c3805fb080a6
commit https://github.com/vim/vim/commit/72e697d189616265ecefe0df4509d476df3bae40
Christian Brabandt <cb@256bit.org>
parents:
9287
diff
changeset
|
6473 len = 0; /* for picky compilers */ |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6474 if (p != NULL) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6475 { |
9272
f5d9eb512f8b
commit https://github.com/vim/vim/commit/46bbb0c4ba27395859dfeaa26938483946bb4ec2
Christian Brabandt <cb@256bit.org>
parents:
9270
diff
changeset
|
6476 viminfo_history[type][idx].time_set = vp[1].bv_nr; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6477 if (!overwrite) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6478 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6479 mch_memmove(p, val, (size_t)len + 1); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6480 /* Put the separator after the NUL. */ |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6481 p[len + 1] = sep; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6482 viminfo_history[type][idx].hisstr = p; |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6483 viminfo_history[type][idx].hisnum = 0; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6484 viminfo_history[type][idx].viminfo = TRUE; |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6485 viminfo_hisidx[type]++; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6486 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6487 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6488 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6489 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6490 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6491 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6492 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6493 /* |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6494 * Concatenate history lines from viminfo after the lines typed in this Vim. |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6495 */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6496 static void |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6497 concat_history(int type) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6498 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6499 int idx; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6500 int i; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6501 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6502 idx = hisidx[type] + viminfo_hisidx[type]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6503 if (idx >= hislen) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6504 idx -= hislen; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6505 else if (idx < 0) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6506 idx = hislen - 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6507 if (viminfo_add_at_front) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6508 hisidx[type] = idx; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6509 else |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6510 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6511 if (hisidx[type] == -1) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6512 hisidx[type] = hislen - 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6513 do |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6514 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6515 if (history[type][idx].hisstr != NULL |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6516 || history[type][idx].viminfo) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6517 break; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6518 if (++idx == hislen) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6519 idx = 0; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6520 } while (idx != hisidx[type]); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6521 if (idx != hisidx[type] && --idx < 0) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6522 idx = hislen - 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6523 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6524 for (i = 0; i < viminfo_hisidx[type]; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6525 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6526 vim_free(history[type][idx].hisstr); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6527 history[type][idx].hisstr = viminfo_history[type][i].hisstr; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6528 history[type][idx].viminfo = TRUE; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6529 history[type][idx].time_set = viminfo_history[type][i].time_set; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6530 if (--idx < 0) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6531 idx = hislen - 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6532 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6533 idx += 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6534 idx %= hislen; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6535 for (i = 0; i < viminfo_hisidx[type]; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6536 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6537 history[type][idx++].hisnum = ++hisnum[type]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6538 idx %= hislen; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6539 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6540 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6541 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6542 #if defined(FEAT_CMDL_COMPL) || defined(PROTO) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6543 static int |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6544 #ifdef __BORLANDC__ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6545 _RTLENTRYF |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6546 #endif |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6547 sort_hist(const void *s1, const void *s2) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6548 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6549 histentry_T *p1 = *(histentry_T **)s1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6550 histentry_T *p2 = *(histentry_T **)s2; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6551 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6552 if (p1->time_set < p2->time_set) return -1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6553 if (p1->time_set > p2->time_set) return 1; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6554 return 0; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6555 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6556 #endif |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6557 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6558 /* |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6559 * Merge history lines from viminfo and lines typed in this Vim based on the |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6560 * timestamp; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6561 */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6562 static void |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6563 merge_history(int type) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6564 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6565 int max_len; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6566 histentry_T **tot_hist; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6567 histentry_T *new_hist; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6568 int i; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6569 int len; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6570 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6571 /* Make one long list with all entries. */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6572 max_len = hislen + viminfo_hisidx[type]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6573 tot_hist = (histentry_T **)alloc(max_len * (int)sizeof(histentry_T *)); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6574 new_hist = (histentry_T *)alloc(hislen * (int)sizeof(histentry_T)); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6575 if (tot_hist == NULL || new_hist == NULL) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6576 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6577 vim_free(tot_hist); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6578 vim_free(new_hist); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6579 return; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6580 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6581 for (i = 0; i < viminfo_hisidx[type]; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6582 tot_hist[i] = &viminfo_history[type][i]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6583 len = i; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6584 for (i = 0; i < hislen; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6585 if (history[type][i].hisstr != NULL) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6586 tot_hist[len++] = &history[type][i]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6587 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6588 /* Sort the list on timestamp. */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6589 qsort((void *)tot_hist, (size_t)len, sizeof(histentry_T *), sort_hist); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6590 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6591 /* Keep the newest ones. */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6592 for (i = 0; i < hislen; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6593 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6594 if (i < len) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6595 { |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6596 new_hist[i] = *tot_hist[i]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6597 tot_hist[i]->hisstr = NULL; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6598 if (new_hist[i].hisnum == 0) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6599 new_hist[i].hisnum = ++hisnum[type]; |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6600 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6601 else |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6602 clear_hist_entry(&new_hist[i]); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6603 } |
9287
af25a1a875db
commit https://github.com/vim/vim/commit/a890f5e34887bff7616bdb4b9ee0bf98c8d2a8f0
Christian Brabandt <cb@256bit.org>
parents:
9272
diff
changeset
|
6604 hisidx[type] = (i < len ? i : len) - 1; |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6605 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6606 /* Free what is not kept. */ |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6607 for (i = 0; i < viminfo_hisidx[type]; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6608 vim_free(viminfo_history[type][i].hisstr); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6609 for (i = 0; i < hislen; i++) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6610 vim_free(history[type][i].hisstr); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6611 vim_free(history[type]); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6612 history[type] = new_hist; |
9270
79cb08f0d812
commit https://github.com/vim/vim/commit/62f8b4e18014b259bcde4a2845c602b0a44a3714
Christian Brabandt <cb@256bit.org>
parents:
9256
diff
changeset
|
6613 vim_free(tot_hist); |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6614 } |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6615 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6616 /* |
4285 | 6617 * Finish reading history lines from viminfo. Not used when writing viminfo. |
6618 */ | |
7 | 6619 void |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6620 finish_viminfo_history(vir_T *virp) |
7 | 6621 { |
6622 int type; | |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6623 int merge = virp->vir_version >= VIMINFO_VERSION_WITH_HISTORY; |
7 | 6624 |
6625 for (type = 0; type < HIST_COUNT; ++type) | |
6626 { | |
6627 if (history[type] == NULL) | |
4283 | 6628 continue; |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6629 |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6630 if (merge) |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6631 merge_history(type); |
7 | 6632 else |
9256
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6633 concat_history(type); |
26c7bf23ec1d
commit https://github.com/vim/vim/commit/1fd99c1ca89a3d13bb53aff4a5a8f5ee740713e5
Christian Brabandt <cb@256bit.org>
parents:
9240
diff
changeset
|
6634 |
7 | 6635 vim_free(viminfo_history[type]); |
6636 viminfo_history[type] = NULL; | |
4327 | 6637 viminfo_hisidx[type] = 0; |
7 | 6638 } |
6639 } | |
6640 | |
4903
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6641 /* |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6642 * Write history to viminfo file in "fp". |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6643 * When "merge" is TRUE merge history lines with a previously read viminfo |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6644 * file, data is in viminfo_history[]. |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6645 * When "merge" is FALSE just write all history lines. Used for ":wviminfo!". |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6646 */ |
7 | 6647 void |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6648 write_viminfo_history(FILE *fp, int merge) |
7 | 6649 { |
6650 int i; | |
6651 int type; | |
6652 int num_saved; | |
4283 | 6653 int round; |
7 | 6654 |
6655 init_history(); | |
6656 if (hislen == 0) | |
6657 return; | |
6658 for (type = 0; type < HIST_COUNT; ++type) | |
6659 { | |
6660 num_saved = get_viminfo_parameter(hist_type2char(type, FALSE)); | |
6661 if (num_saved == 0) | |
6662 continue; | |
6663 if (num_saved < 0) /* Use default */ | |
6664 num_saved = hislen; | |
6665 fprintf(fp, _("\n# %s History (newest to oldest):\n"), | |
6666 type == HIST_CMD ? _("Command Line") : | |
6667 type == HIST_SEARCH ? _("Search String") : | |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6668 type == HIST_EXPR ? _("Expression") : |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6669 type == HIST_INPUT ? _("Input Line") : |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6670 _("Debug Line")); |
7 | 6671 if (num_saved > hislen) |
6672 num_saved = hislen; | |
4283 | 6673 |
6674 /* | |
6675 * Merge typed and viminfo history: | |
6676 * round 1: history of typed commands. | |
6677 * round 2: history from recently read viminfo. | |
6678 */ | |
6679 for (round = 1; round <= 2; ++round) | |
6680 { | |
4307 | 6681 if (round == 1) |
6682 /* start at newest entry, somewhere in the list */ | |
6683 i = hisidx[type]; | |
6684 else if (viminfo_hisidx[type] > 0) | |
6685 /* start at newest entry, first in the list */ | |
6686 i = 0; | |
6687 else | |
6688 /* empty list */ | |
6689 i = -1; | |
4283 | 6690 if (i >= 0) |
6691 while (num_saved > 0 | |
6692 && !(round == 2 && i >= viminfo_hisidx[type])) | |
7 | 6693 { |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6694 char_u *p; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6695 time_t timestamp; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6696 int c = NUL; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6697 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6698 if (round == 1) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6699 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6700 p = history[type][i].hisstr; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6701 timestamp = history[type][i].time_set; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6702 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6703 else |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6704 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6705 p = viminfo_history[type] == NULL ? NULL |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6706 : viminfo_history[type][i].hisstr; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6707 timestamp = viminfo_history[type] == NULL ? 0 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6708 : viminfo_history[type][i].time_set; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6709 } |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6710 |
4903
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6711 if (p != NULL && (round == 2 |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6712 || !merge |
2fc1f3346bfb
updated for version 7.3.1197
Bram Moolenaar <bram@vim.org>
parents:
4805
diff
changeset
|
6713 || !history[type][i].viminfo)) |
7 | 6714 { |
4283 | 6715 --num_saved; |
6716 fputc(hist_type2char(type, TRUE), fp); | |
6717 /* For the search history: put the separator in the | |
6718 * second column; use a space if there isn't one. */ | |
6719 if (type == HIST_SEARCH) | |
6720 { | |
6721 c = p[STRLEN(p) + 1]; | |
6722 putc(c == NUL ? ' ' : c, fp); | |
6723 } | |
6724 viminfo_writestring(fp, p); | |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6725 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6726 { |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6727 char cbuf[NUMBUFLEN]; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6728 |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6729 /* New style history with a bar line. Format: |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6730 * |{bartype},{histtype},{timestamp},{separator},"text" */ |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6731 if (c == NUL) |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6732 cbuf[0] = NUL; |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6733 else |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6734 sprintf(cbuf, "%d", c); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6735 fprintf(fp, "|%d,%d,%ld,%s,", BARTYPE_HISTORY, |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6736 type, (long)timestamp, cbuf); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6737 barline_writestring(fp, p, LSIZE - 20); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6738 putc('\n', fp); |
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6739 } |
7 | 6740 } |
4283 | 6741 if (round == 1) |
6742 { | |
6743 /* Decrement index, loop around and stop when back at | |
6744 * the start. */ | |
6745 if (--i < 0) | |
6746 i = hislen - 1; | |
6747 if (i == hisidx[type]) | |
6748 break; | |
6749 } | |
6750 else | |
6751 { | |
6752 /* Increment index. Stop at the end in the while. */ | |
6753 ++i; | |
6754 } | |
7 | 6755 } |
4283 | 6756 } |
4285 | 6757 for (i = 0; i < viminfo_hisidx[type]; ++i) |
4327 | 6758 if (viminfo_history[type] != NULL) |
9240
636cfa97200e
commit https://github.com/vim/vim/commit/45d2eeaad66939348893b9254171067b0457cd9d
Christian Brabandt <cb@256bit.org>
parents:
9070
diff
changeset
|
6759 vim_free(viminfo_history[type][i].hisstr); |
4285 | 6760 vim_free(viminfo_history[type]); |
6761 viminfo_history[type] = NULL; | |
4311 | 6762 viminfo_hisidx[type] = 0; |
7 | 6763 } |
6764 } | |
6765 #endif /* FEAT_VIMINFO */ | |
6766 | |
6767 #if defined(FEAT_FKMAP) || defined(PROTO) | |
6768 /* | |
6769 * Write a character at the current cursor+offset position. | |
6770 * It is directly written into the command buffer block. | |
6771 */ | |
6772 void | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6773 cmd_pchar(int c, int offset) |
7 | 6774 { |
6775 if (ccline.cmdpos + offset >= ccline.cmdlen || ccline.cmdpos + offset < 0) | |
6776 { | |
6777 EMSG(_("E198: cmd_pchar beyond the command length")); | |
6778 return; | |
6779 } | |
6780 ccline.cmdbuff[ccline.cmdpos + offset] = (char_u)c; | |
6781 ccline.cmdbuff[ccline.cmdlen] = NUL; | |
6782 } | |
6783 | |
6784 int | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
6785 cmd_gchar(int offset) |
7 | 6786 { |
6787 if (ccline.cmdpos + offset >= ccline.cmdlen || ccline.cmdpos + offset < 0) | |
6788 { | |
6789 /* EMSG(_("cmd_gchar beyond the command length")); */ | |
6790 return NUL; | |
6791 } | |
6792 return (int)ccline.cmdbuff[ccline.cmdpos + offset]; | |
6793 } | |
6794 #endif | |
6795 | |
6796 #if defined(FEAT_CMDWIN) || defined(PROTO) | |
6797 /* | |
6798 * Open a window on the current command line and history. Allow editing in | |
6799 * the window. Returns when the window is closed. | |
6800 * Returns: | |
6801 * CR if the command is to be executed | |
6802 * Ctrl_C if it is to be abandoned | |
6803 * K_IGNORE if editing continues | |
6804 */ | |
6805 static int | |
11321
f57dce6b934b
patch 8.0.0546: swap file exists briefly when opening the command window
Christian Brabandt <cb@256bit.org>
parents:
11285
diff
changeset
|
6806 open_cmdwin(void) |
7 | 6807 { |
6808 struct cmdline_info save_ccline; | |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
6809 bufref_T old_curbuf; |
7 | 6810 win_T *old_curwin = curwin; |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
6811 bufref_T bufref; |
7 | 6812 win_T *wp; |
6813 int i; | |
6814 linenr_T lnum; | |
6815 int histtype; | |
6816 garray_T winsizes; | |
1685 | 6817 #ifdef FEAT_AUTOCMD |
7 | 6818 char_u typestr[2]; |
1685 | 6819 #endif |
7 | 6820 int save_restart_edit = restart_edit; |
6821 int save_State = State; | |
6822 int save_exmode = exmode_active; | |
510 | 6823 #ifdef FEAT_RIGHTLEFT |
6824 int save_cmdmsg_rl = cmdmsg_rl; | |
6825 #endif | |
6145 | 6826 #ifdef FEAT_FOLDING |
6827 int save_KeyTyped; | |
6828 #endif | |
7 | 6829 |
6830 /* Can't do this recursively. Can't do it when typing a password. */ | |
6831 if (cmdwin_type != 0 | |
6832 # if defined(FEAT_CRYPT) || defined(FEAT_EVAL) | |
6833 || cmdline_star > 0 | |
6834 # endif | |
6835 ) | |
6836 { | |
6837 beep_flush(); | |
6838 return K_IGNORE; | |
6839 } | |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
6840 set_bufref(&old_curbuf, curbuf); |
7 | 6841 |
6842 /* Save current window sizes. */ | |
6843 win_size_save(&winsizes); | |
6844 | |
6845 # ifdef FEAT_AUTOCMD | |
6846 /* Don't execute autocommands while creating the window. */ | |
1410 | 6847 block_autocmds(); |
7 | 6848 # endif |
683 | 6849 /* don't use a new tab page */ |
6850 cmdmod.tab = 0; | |
11321
f57dce6b934b
patch 8.0.0546: swap file exists briefly when opening the command window
Christian Brabandt <cb@256bit.org>
parents:
11285
diff
changeset
|
6851 cmdmod.noswapfile = 1; |
683 | 6852 |
7 | 6853 /* Create a window for the command-line buffer. */ |
6854 if (win_split((int)p_cwh, WSP_BOT) == FAIL) | |
6855 { | |
6856 beep_flush(); | |
1410 | 6857 # ifdef FEAT_AUTOCMD |
6858 unblock_autocmds(); | |
6859 # endif | |
7 | 6860 return K_IGNORE; |
6861 } | |
1831 | 6862 cmdwin_type = get_cmdline_type(); |
7 | 6863 |
6864 /* Create the command-line buffer empty. */ | |
1743 | 6865 (void)do_ecmd(0, NULL, NULL, NULL, ECMD_ONE, ECMD_HIDE, NULL); |
1621 | 6866 (void)setfname(curbuf, (char_u *)"[Command Line]", NULL, TRUE); |
7 | 6867 set_option_value((char_u *)"bt", 0L, (char_u *)"nofile", OPT_LOCAL); |
6868 curbuf->b_p_ma = TRUE; | |
1865 | 6869 #ifdef FEAT_FOLDING |
6870 curwin->w_p_fen = FALSE; | |
6871 #endif | |
7 | 6872 # ifdef FEAT_RIGHTLEFT |
510 | 6873 curwin->w_p_rl = cmdmsg_rl; |
6874 cmdmsg_rl = FALSE; | |
7 | 6875 # endif |
2583 | 6876 RESET_BINDING(curwin); |
7 | 6877 |
6878 # ifdef FEAT_AUTOCMD | |
6879 /* Do execute autocommands for setting the filetype (load syntax). */ | |
1410 | 6880 unblock_autocmds(); |
7 | 6881 # endif |
6882 | |
510 | 6883 /* Showing the prompt may have set need_wait_return, reset it. */ |
6884 need_wait_return = FALSE; | |
6885 | |
1831 | 6886 histtype = hist_char2type(cmdwin_type); |
7 | 6887 if (histtype == HIST_CMD || histtype == HIST_DEBUG) |
6888 { | |
6889 if (p_wc == TAB) | |
6890 { | |
6891 add_map((char_u *)"<buffer> <Tab> <C-X><C-V>", INSERT); | |
6892 add_map((char_u *)"<buffer> <Tab> a<C-X><C-V>", NORMAL); | |
6893 } | |
6894 set_option_value((char_u *)"ft", 0L, (char_u *)"vim", OPT_LOCAL); | |
6895 } | |
6896 | |
10 | 6897 /* Reset 'textwidth' after setting 'filetype' (the Vim filetype plugin |
6898 * sets 'textwidth' to 78). */ | |
6899 curbuf->b_p_tw = 0; | |
6900 | |
7 | 6901 /* Fill the buffer with the history. */ |
6902 init_history(); | |
6903 if (hislen > 0) | |
6904 { | |
6905 i = hisidx[histtype]; | |
6906 if (i >= 0) | |
6907 { | |
6908 lnum = 0; | |
6909 do | |
6910 { | |
6911 if (++i == hislen) | |
6912 i = 0; | |
6913 if (history[histtype][i].hisstr != NULL) | |
6914 ml_append(lnum++, history[histtype][i].hisstr, | |
6915 (colnr_T)0, FALSE); | |
6916 } | |
6917 while (i != hisidx[histtype]); | |
6918 } | |
6919 } | |
6920 | |
6921 /* Replace the empty last line with the current command-line and put the | |
6922 * cursor there. */ | |
6923 ml_replace(curbuf->b_ml.ml_line_count, ccline.cmdbuff, TRUE); | |
6924 curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; | |
6925 curwin->w_cursor.col = ccline.cmdpos; | |
510 | 6926 changed_line_abv_curs(); |
6927 invalidate_botline(); | |
743 | 6928 redraw_later(SOME_VALID); |
7 | 6929 |
6930 /* Save the command line info, can be used recursively. */ | |
10565
ea0dadb041c9
patch 8.0.0172: command line window does not work
Christian Brabandt <cb@256bit.org>
parents:
10542
diff
changeset
|
6931 save_cmdline(&save_ccline); |
7 | 6932 |
6933 /* No Ex mode here! */ | |
6934 exmode_active = 0; | |
6935 | |
6936 State = NORMAL; | |
6937 # ifdef FEAT_MOUSE | |
6938 setmouse(); | |
6939 # endif | |
6940 | |
6941 # ifdef FEAT_AUTOCMD | |
6942 /* Trigger CmdwinEnter autocommands. */ | |
6943 typestr[0] = cmdwin_type; | |
6944 typestr[1] = NUL; | |
6945 apply_autocmds(EVENT_CMDWINENTER, typestr, typestr, FALSE, curbuf); | |
929 | 6946 if (restart_edit != 0) /* autocmd with ":startinsert" */ |
6947 stuffcharReadbuff(K_NOP); | |
7 | 6948 # endif |
6949 | |
6950 i = RedrawingDisabled; | |
6951 RedrawingDisabled = 0; | |
6952 | |
6953 /* | |
6954 * Call the main loop until <CR> or CTRL-C is typed. | |
6955 */ | |
6956 cmdwin_result = 0; | |
168 | 6957 main_loop(TRUE, FALSE); |
7 | 6958 |
6959 RedrawingDisabled = i; | |
6960 | |
6961 # ifdef FEAT_AUTOCMD | |
6145 | 6962 |
6963 # ifdef FEAT_FOLDING | |
6964 save_KeyTyped = KeyTyped; | |
6965 # endif | |
6966 | |
7 | 6967 /* Trigger CmdwinLeave autocommands. */ |
6968 apply_autocmds(EVENT_CMDWINLEAVE, typestr, typestr, FALSE, curbuf); | |
6145 | 6969 |
6970 # ifdef FEAT_FOLDING | |
6971 /* Restore KeyTyped in case it is modified by autocommands */ | |
6972 KeyTyped = save_KeyTyped; | |
6973 # endif | |
6974 | |
7 | 6975 # endif |
6976 | |
1214 | 6977 /* Restore the command line info. */ |
10565
ea0dadb041c9
patch 8.0.0172: command line window does not work
Christian Brabandt <cb@256bit.org>
parents:
10542
diff
changeset
|
6978 restore_cmdline(&save_ccline); |
7 | 6979 cmdwin_type = 0; |
6980 | |
6981 exmode_active = save_exmode; | |
6982 | |
1612 | 6983 /* Safety check: The old window or buffer was deleted: It's a bug when |
7 | 6984 * this happens! */ |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
6985 if (!win_valid(old_curwin) || !bufref_valid(&old_curbuf)) |
7 | 6986 { |
6987 cmdwin_result = Ctrl_C; | |
6988 EMSG(_("E199: Active window or buffer deleted")); | |
6989 } | |
6990 else | |
6991 { | |
6992 # if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL) | |
6993 /* autocmds may abort script processing */ | |
6994 if (aborting() && cmdwin_result != K_IGNORE) | |
6995 cmdwin_result = Ctrl_C; | |
6996 # endif | |
6997 /* Set the new command line from the cmdline buffer. */ | |
6998 vim_free(ccline.cmdbuff); | |
510 | 6999 if (cmdwin_result == K_XF1 || cmdwin_result == K_XF2) /* :qa[!] typed */ |
7 | 7000 { |
510 | 7001 char *p = (cmdwin_result == K_XF2) ? "qa" : "qa!"; |
7002 | |
7003 if (histtype == HIST_CMD) | |
7004 { | |
7005 /* Execute the command directly. */ | |
7006 ccline.cmdbuff = vim_strsave((char_u *)p); | |
7007 cmdwin_result = CAR; | |
7008 } | |
7009 else | |
7010 { | |
7011 /* First need to cancel what we were doing. */ | |
7012 ccline.cmdbuff = NULL; | |
7013 stuffcharReadbuff(':'); | |
7014 stuffReadbuff((char_u *)p); | |
7015 stuffcharReadbuff(CAR); | |
7016 } | |
7 | 7017 } |
7018 else if (cmdwin_result == K_XF2) /* :qa typed */ | |
7019 { | |
7020 ccline.cmdbuff = vim_strsave((char_u *)"qa"); | |
7021 cmdwin_result = CAR; | |
7022 } | |
2839 | 7023 else if (cmdwin_result == Ctrl_C) |
7024 { | |
7025 /* :q or :close, don't execute any command | |
7026 * and don't modify the cmd window. */ | |
7027 ccline.cmdbuff = NULL; | |
7028 } | |
7 | 7029 else |
7030 ccline.cmdbuff = vim_strsave(ml_get_curline()); | |
7031 if (ccline.cmdbuff == NULL) | |
7032 cmdwin_result = Ctrl_C; | |
7033 else | |
7034 { | |
7035 ccline.cmdlen = (int)STRLEN(ccline.cmdbuff); | |
7036 ccline.cmdbufflen = ccline.cmdlen + 1; | |
7037 ccline.cmdpos = curwin->w_cursor.col; | |
7038 if (ccline.cmdpos > ccline.cmdlen) | |
7039 ccline.cmdpos = ccline.cmdlen; | |
7040 if (cmdwin_result == K_IGNORE) | |
7041 { | |
7042 set_cmdspos_cursor(); | |
7043 redrawcmd(); | |
7044 } | |
7045 } | |
7046 | |
7047 # ifdef FEAT_AUTOCMD | |
7048 /* Don't execute autocommands while deleting the window. */ | |
1410 | 7049 block_autocmds(); |
7 | 7050 # endif |
6876 | 7051 # ifdef FEAT_CONCEAL |
7052 /* Avoid command-line window first character being concealed. */ | |
7053 curwin->w_p_cole = 0; | |
7054 # endif | |
7 | 7055 wp = curwin; |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
7056 set_bufref(&bufref, curbuf); |
7 | 7057 win_goto(old_curwin); |
7058 win_close(wp, TRUE); | |
2099
c1f67ce5740a
updated for version 7.2.382
Bram Moolenaar <bram@zimbu.org>
parents:
2097
diff
changeset
|
7059 |
c1f67ce5740a
updated for version 7.2.382
Bram Moolenaar <bram@zimbu.org>
parents:
2097
diff
changeset
|
7060 /* win_close() may have already wiped the buffer when 'bh' is |
c1f67ce5740a
updated for version 7.2.382
Bram Moolenaar <bram@zimbu.org>
parents:
2097
diff
changeset
|
7061 * set to 'wipe' */ |
9487
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
7062 if (bufref_valid(&bufref)) |
69ed2c9d34a6
commit https://github.com/vim/vim/commit/7c0a2f367f2507669560b1a66423155c70d2e75b
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
7063 close_buffer(NULL, bufref.br_buf, DOBUF_WIPE, FALSE); |
7 | 7064 |
7065 /* Restore window sizes. */ | |
7066 win_size_restore(&winsizes); | |
7067 | |
7068 # ifdef FEAT_AUTOCMD | |
1410 | 7069 unblock_autocmds(); |
7 | 7070 # endif |
7071 } | |
7072 | |
7073 ga_clear(&winsizes); | |
7074 restart_edit = save_restart_edit; | |
510 | 7075 # ifdef FEAT_RIGHTLEFT |
7076 cmdmsg_rl = save_cmdmsg_rl; | |
7077 # endif | |
7 | 7078 |
7079 State = save_State; | |
7080 # ifdef FEAT_MOUSE | |
7081 setmouse(); | |
7082 # endif | |
7083 | |
7084 return cmdwin_result; | |
7085 } | |
7086 #endif /* FEAT_CMDWIN */ | |
7087 | |
7088 /* | |
7089 * Used for commands that either take a simple command string argument, or: | |
7090 * cmd << endmarker | |
7091 * {script} | |
7092 * endmarker | |
7093 * Returns a pointer to allocated memory with {script} or NULL. | |
7094 */ | |
7095 char_u * | |
7819
f86adafb28d4
commit https://github.com/vim/vim/commit/78c0b7d43e5048fd71d12816659667834170c76d
Christian Brabandt <cb@256bit.org>
parents:
7807
diff
changeset
|
7096 script_get(exarg_T *eap, char_u *cmd) |
7 | 7097 { |
7098 char_u *theline; | |
7099 char *end_pattern = NULL; | |
7100 char dot[] = "."; | |
7101 garray_T ga; | |
7102 | |
7103 if (cmd[0] != '<' || cmd[1] != '<' || eap->getline == NULL) | |
7104 return NULL; | |
7105 | |
7106 ga_init2(&ga, 1, 0x400); | |
7107 | |
7108 if (cmd[2] != NUL) | |
7109 end_pattern = (char *)skipwhite(cmd + 2); | |
7110 else | |
7111 end_pattern = dot; | |
7112 | |
7113 for (;;) | |
7114 { | |
7115 theline = eap->getline( | |
7116 #ifdef FEAT_EVAL | |
75 | 7117 eap->cstack->cs_looplevel > 0 ? -1 : |
7 | 7118 #endif |
7119 NUL, eap->cookie, 0); | |
7120 | |
7121 if (theline == NULL || STRCMP(end_pattern, theline) == 0) | |
1694 | 7122 { |
7123 vim_free(theline); | |
7 | 7124 break; |
1694 | 7125 } |
7 | 7126 |
7127 ga_concat(&ga, theline); | |
7128 ga_append(&ga, '\n'); | |
7129 vim_free(theline); | |
7130 } | |
21 | 7131 ga_append(&ga, NUL); |
7 | 7132 |
7133 return (char_u *)ga.ga_data; | |
7134 } | |
9971
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7135 |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7136 #ifdef FEAT_SEARCH_EXTRA |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7137 static void |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7138 set_search_match(pos_T *t) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7139 { |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7140 /* |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7141 * First move cursor to end of match, then to the start. This |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7142 * moves the whole match onto the screen when 'nowrap' is set. |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7143 */ |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7144 t->lnum += search_match_lines; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7145 t->col = search_match_endcol; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7146 if (t->lnum > curbuf->b_ml.ml_line_count) |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7147 { |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7148 t->lnum = curbuf->b_ml.ml_line_count; |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7149 coladvance((colnr_T)MAXCOL); |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7150 } |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7151 } |
98b39d2eb895
commit https://github.com/vim/vim/commit/4d6f32cbfbaf324ac4a25c0206a5db0e9f7a48f7
Christian Brabandt <cb@256bit.org>
parents:
9487
diff
changeset
|
7152 #endif |