Mercurial > vim
annotate src/mark.c @ 19828:2dc8d3e6993e v8.2.0470
patch 8.2.0470: Test_confirm_cmd_cancel() can fail on a slow system
Commit: https://github.com/vim/vim/commit/7b1b36b1cb744e87adfbef88b7ce26c863b0594a
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Mar 28 21:48:55 2020 +0100
patch 8.2.0470: Test_confirm_cmd_cancel() can fail on a slow system
Problem: Test_confirm_cmd_cancel() can fail on a slow system.
Solution: Use WaitForAssert(). (Ozaki Kiichi, closes https://github.com/vim/vim/issues/5861)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 28 Mar 2020 22:00:04 +0100 |
parents | de2d1820215a |
children | 8eed1e9389bb |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9649
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 * mark.c: functions for setting marks and jumping to them | |
12 */ | |
13 | |
14 #include "vim.h" | |
15 | |
16 /* | |
17 * This file contains routines to maintain and manipulate marks. | |
18 */ | |
19 | |
20 /* | |
21 * If a named file mark's lnum is non-zero, it is valid. | |
22 * If a named file mark's fnum is non-zero, it is for an existing buffer, | |
23 * otherwise it is from .viminfo and namedfm[n].fname is the file name. | |
24 * There are marks 'A - 'Z (set by user) and '0 to '9 (set when writing | |
25 * viminfo). | |
26 */ | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
27 static xfmark_T namedfm[NMARKS + EXTRA_MARKS]; // marks with file nr |
7 | 28 |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17464
diff
changeset
|
29 static void fname2fnum(xfmark_T *fm); |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
5735
diff
changeset
|
30 static void fmarks_check_one(xfmark_T *fm, char_u *name, buf_T *buf); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
5735
diff
changeset
|
31 static char_u *mark_line(pos_T *mp, int lead_len); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
5735
diff
changeset
|
32 static void show_one_mark(int, char_u *, pos_T *, char_u *, int current); |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
33 static void mark_adjust_internal(linenr_T line1, linenr_T line2, long amount, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
34 long amount_after, int adjust_folds); |
7 | 35 |
36 /* | |
706 | 37 * Set named mark "c" at current cursor position. |
7 | 38 * Returns OK on success, FAIL if bad name given. |
39 */ | |
40 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
41 setmark(int c) |
7 | 42 { |
706 | 43 return setmark_pos(c, &curwin->w_cursor, curbuf->b_fnum); |
44 } | |
45 | |
46 /* | |
47 * Set named mark "c" to position "pos". | |
48 * When "c" is upper case use file "fnum". | |
49 * Returns OK on success, FAIL if bad name given. | |
50 */ | |
51 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
52 setmark_pos(int c, pos_T *pos, int fnum) |
706 | 53 { |
7 | 54 int i; |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
55 buf_T *buf; |
7 | 56 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
57 // Check for a special key (may cause islower() to crash). |
7 | 58 if (c < 0) |
59 return FAIL; | |
60 | |
61 if (c == '\'' || c == '`') | |
62 { | |
706 | 63 if (pos == &curwin->w_cursor) |
64 { | |
65 setpcmark(); | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
66 // keep it even when the cursor doesn't move |
706 | 67 curwin->w_prev_pcmark = curwin->w_pcmark; |
68 } | |
69 else | |
70 curwin->w_pcmark = *pos; | |
7 | 71 return OK; |
72 } | |
73 | |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
74 buf = buflist_findnr(fnum); |
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
75 if (buf == NULL) |
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
76 return FAIL; |
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
77 |
1533 | 78 if (c == '"') |
79 { | |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
80 buf->b_last_cursor = *pos; |
1533 | 81 return OK; |
82 } | |
83 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
84 // Allow setting '[ and '] for an autocommand that simulates reading a |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
85 // file. |
7 | 86 if (c == '[') |
87 { | |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
88 buf->b_op_start = *pos; |
7 | 89 return OK; |
90 } | |
91 if (c == ']') | |
92 { | |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
93 buf->b_op_end = *pos; |
7 | 94 return OK; |
95 } | |
96 | |
5265
cd971e951b06
updated for version 7.4b.009
Bram Moolenaar <bram@vim.org>
parents:
4092
diff
changeset
|
97 if (c == '<' || c == '>') |
3660 | 98 { |
5265
cd971e951b06
updated for version 7.4b.009
Bram Moolenaar <bram@vim.org>
parents:
4092
diff
changeset
|
99 if (c == '<') |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
100 buf->b_visual.vi_start = *pos; |
5265
cd971e951b06
updated for version 7.4b.009
Bram Moolenaar <bram@vim.org>
parents:
4092
diff
changeset
|
101 else |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
102 buf->b_visual.vi_end = *pos; |
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
103 if (buf->b_visual.vi_mode == NUL) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
104 // Visual_mode has not yet been set, use a sane default. |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
105 buf->b_visual.vi_mode = 'v'; |
3660 | 106 return OK; |
107 } | |
108 | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
109 if (ASCII_ISLOWER(c)) |
7 | 110 { |
111 i = c - 'a'; | |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
112 buf->b_namedm[i] = *pos; |
7 | 113 return OK; |
114 } | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
115 if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) |
7 | 116 { |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
117 if (VIM_ISDIGIT(c)) |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
118 i = c - '0' + NMARKS; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
119 else |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
120 i = c - 'A'; |
706 | 121 namedfm[i].fmark.mark = *pos; |
122 namedfm[i].fmark.fnum = fnum; | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
123 VIM_CLEAR(namedfm[i].fname); |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
124 #ifdef FEAT_VIMINFO |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
125 namedfm[i].time_set = vim_time(); |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
126 #endif |
7 | 127 return OK; |
128 } | |
129 return FAIL; | |
130 } | |
131 | |
132 /* | |
133 * Set the previous context mark to the current position and add it to the | |
134 * jump list. | |
135 */ | |
136 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
137 setpcmark(void) |
7 | 138 { |
139 #ifdef FEAT_JUMPLIST | |
140 int i; | |
141 xfmark_T *fm; | |
142 #endif | |
143 #ifdef JUMPLIST_ROTATE | |
144 xfmark_T tempmark; | |
145 #endif | |
146 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
147 // for :global the mark is set only once |
7 | 148 if (global_busy || listcmd_busy || cmdmod.keepjumps) |
149 return; | |
150 | |
151 curwin->w_prev_pcmark = curwin->w_pcmark; | |
152 curwin->w_pcmark = curwin->w_cursor; | |
153 | |
154 #ifdef FEAT_JUMPLIST | |
155 # ifdef JUMPLIST_ROTATE | |
156 /* | |
157 * If last used entry is not at the top, put it at the top by rotating | |
158 * the stack until it is (the newer entries will be at the bottom). | |
159 * Keep one entry (the last used one) at the top. | |
160 */ | |
161 if (curwin->w_jumplistidx < curwin->w_jumplistlen) | |
162 ++curwin->w_jumplistidx; | |
163 while (curwin->w_jumplistidx < curwin->w_jumplistlen) | |
164 { | |
165 tempmark = curwin->w_jumplist[curwin->w_jumplistlen - 1]; | |
166 for (i = curwin->w_jumplistlen - 1; i > 0; --i) | |
167 curwin->w_jumplist[i] = curwin->w_jumplist[i - 1]; | |
168 curwin->w_jumplist[0] = tempmark; | |
169 ++curwin->w_jumplistidx; | |
170 } | |
171 # endif | |
172 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
173 // If jumplist is full: remove oldest entry |
7 | 174 if (++curwin->w_jumplistlen > JUMPLISTSIZE) |
175 { | |
176 curwin->w_jumplistlen = JUMPLISTSIZE; | |
177 vim_free(curwin->w_jumplist[0].fname); | |
178 for (i = 1; i < JUMPLISTSIZE; ++i) | |
179 curwin->w_jumplist[i - 1] = curwin->w_jumplist[i]; | |
180 } | |
181 curwin->w_jumplistidx = curwin->w_jumplistlen; | |
182 fm = &curwin->w_jumplist[curwin->w_jumplistlen - 1]; | |
183 | |
184 fm->fmark.mark = curwin->w_pcmark; | |
185 fm->fmark.fnum = curbuf->b_fnum; | |
186 fm->fname = NULL; | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
187 # ifdef FEAT_VIMINFO |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
188 fm->time_set = vim_time(); |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
189 # endif |
7 | 190 #endif |
191 } | |
192 | |
193 /* | |
194 * To change context, call setpcmark(), then move the current position to | |
195 * where ever, then call checkpcmark(). This ensures that the previous | |
196 * context will only be changed if the cursor moved to a different line. | |
197 * If pcmark was deleted (with "dG") the previous mark is restored. | |
198 */ | |
199 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
200 checkpcmark(void) |
7 | 201 { |
202 if (curwin->w_prev_pcmark.lnum != 0 | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
203 && (EQUAL_POS(curwin->w_pcmark, curwin->w_cursor) |
7 | 204 || curwin->w_pcmark.lnum == 0)) |
205 { | |
206 curwin->w_pcmark = curwin->w_prev_pcmark; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
207 curwin->w_prev_pcmark.lnum = 0; // Show it has been checked |
7 | 208 } |
209 } | |
210 | |
211 #if defined(FEAT_JUMPLIST) || defined(PROTO) | |
212 /* | |
213 * move "count" positions in the jump list (count may be negative) | |
214 */ | |
215 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
216 movemark(int count) |
7 | 217 { |
218 pos_T *pos; | |
219 xfmark_T *jmp; | |
220 | |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
221 cleanup_jumplist(curwin, TRUE); |
7 | 222 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
223 if (curwin->w_jumplistlen == 0) // nothing to jump to |
7 | 224 return (pos_T *)NULL; |
225 | |
226 for (;;) | |
227 { | |
228 if (curwin->w_jumplistidx + count < 0 | |
229 || curwin->w_jumplistidx + count >= curwin->w_jumplistlen) | |
230 return (pos_T *)NULL; | |
231 | |
232 /* | |
233 * if first CTRL-O or CTRL-I command after a jump, add cursor position | |
1188 | 234 * to list. Careful: If there are duplicates (CTRL-O immediately after |
7 | 235 * starting Vim on a file), another entry may have been removed. |
236 */ | |
237 if (curwin->w_jumplistidx == curwin->w_jumplistlen) | |
238 { | |
239 setpcmark(); | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
240 --curwin->w_jumplistidx; // skip the new entry |
7 | 241 if (curwin->w_jumplistidx + count < 0) |
242 return (pos_T *)NULL; | |
243 } | |
244 | |
245 curwin->w_jumplistidx += count; | |
246 | |
247 jmp = curwin->w_jumplist + curwin->w_jumplistidx; | |
248 if (jmp->fmark.fnum == 0) | |
249 fname2fnum(jmp); | |
250 if (jmp->fmark.fnum != curbuf->b_fnum) | |
251 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
252 // jump to other file |
7 | 253 if (buflist_findnr(jmp->fmark.fnum) == NULL) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
254 { // Skip this one .. |
7 | 255 count += count < 0 ? -1 : 1; |
256 continue; | |
257 } | |
258 if (buflist_getfile(jmp->fmark.fnum, jmp->fmark.mark.lnum, | |
259 0, FALSE) == FAIL) | |
260 return (pos_T *)NULL; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
261 // Set lnum again, autocommands my have changed it |
7 | 262 curwin->w_cursor = jmp->fmark.mark; |
263 pos = (pos_T *)-1; | |
264 } | |
265 else | |
266 pos = &(jmp->fmark.mark); | |
267 return pos; | |
268 } | |
269 } | |
270 | |
271 /* | |
272 * Move "count" positions in the changelist (count may be negative). | |
273 */ | |
274 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
275 movechangelist(int count) |
7 | 276 { |
277 int n; | |
278 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
279 if (curbuf->b_changelistlen == 0) // nothing to jump to |
7 | 280 return (pos_T *)NULL; |
281 | |
282 n = curwin->w_changelistidx; | |
283 if (n + count < 0) | |
284 { | |
285 if (n == 0) | |
286 return (pos_T *)NULL; | |
287 n = 0; | |
288 } | |
289 else if (n + count >= curbuf->b_changelistlen) | |
290 { | |
291 if (n == curbuf->b_changelistlen - 1) | |
292 return (pos_T *)NULL; | |
293 n = curbuf->b_changelistlen - 1; | |
294 } | |
295 else | |
296 n += count; | |
297 curwin->w_changelistidx = n; | |
298 return curbuf->b_changelist + n; | |
299 } | |
300 #endif | |
301 | |
302 /* | |
4043 | 303 * Find mark "c" in buffer pointed to by "buf". |
706 | 304 * If "changefile" is TRUE it's allowed to edit another file for '0, 'A, etc. |
305 * If "fnum" is not NULL store the fnum there for '0, 'A etc., don't edit | |
306 * another file. | |
7 | 307 * Returns: |
308 * - pointer to pos_T if found. lnum is 0 when mark not set, -1 when mark is | |
309 * in another file which can't be gotten. (caller needs to check lnum!) | |
310 * - NULL if there is no mark called 'c'. | |
311 * - -1 if mark is in other file and jumped there (only if changefile is TRUE) | |
312 */ | |
313 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
314 getmark_buf(buf_T *buf, int c, int changefile) |
4043 | 315 { |
316 return getmark_buf_fnum(buf, c, changefile, NULL); | |
317 } | |
318 | |
319 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
320 getmark(int c, int changefile) |
706 | 321 { |
4043 | 322 return getmark_buf_fnum(curbuf, c, changefile, NULL); |
706 | 323 } |
324 | |
325 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
326 getmark_buf_fnum( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
327 buf_T *buf, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
328 int c, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
329 int changefile, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
330 int *fnum) |
7 | 331 { |
332 pos_T *posp; | |
333 pos_T *startp, *endp; | |
334 static pos_T pos_copy; | |
335 | |
336 posp = NULL; | |
337 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
338 // Check for special key, can't be a mark name and might cause islower() |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
339 // to crash. |
7 | 340 if (c < 0) |
341 return posp; | |
342 #ifndef EBCDIC | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
343 if (c > '~') // check for islower()/isupper() |
7 | 344 ; |
345 else | |
346 #endif | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
347 if (c == '\'' || c == '`') // previous context mark |
7 | 348 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
349 pos_copy = curwin->w_pcmark; // need to make a copy because |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
350 posp = &pos_copy; // w_pcmark may be changed soon |
7 | 351 } |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
352 else if (c == '"') // to pos when leaving buffer |
4043 | 353 posp = &(buf->b_last_cursor); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
354 else if (c == '^') // to where Insert mode stopped |
4043 | 355 posp = &(buf->b_last_insert); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
356 else if (c == '.') // to where last change was made |
4043 | 357 posp = &(buf->b_last_change); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
358 else if (c == '[') // to start of previous operator |
4043 | 359 posp = &(buf->b_op_start); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
360 else if (c == ']') // to end of previous operator |
4043 | 361 posp = &(buf->b_op_end); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
362 else if (c == '{' || c == '}') // to previous/next paragraph |
7 | 363 { |
364 pos_T pos; | |
365 oparg_T oa; | |
366 int slcb = listcmd_busy; | |
367 | |
368 pos = curwin->w_cursor; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
369 listcmd_busy = TRUE; // avoid that '' is changed |
503 | 370 if (findpar(&oa.inclusive, |
371 c == '}' ? FORWARD : BACKWARD, 1L, NUL, FALSE)) | |
7 | 372 { |
373 pos_copy = curwin->w_cursor; | |
374 posp = &pos_copy; | |
375 } | |
376 curwin->w_cursor = pos; | |
377 listcmd_busy = slcb; | |
378 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
379 else if (c == '(' || c == ')') // to previous/next sentence |
7 | 380 { |
381 pos_T pos; | |
382 int slcb = listcmd_busy; | |
383 | |
384 pos = curwin->w_cursor; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
385 listcmd_busy = TRUE; // avoid that '' is changed |
7 | 386 if (findsent(c == ')' ? FORWARD : BACKWARD, 1L)) |
387 { | |
388 pos_copy = curwin->w_cursor; | |
389 posp = &pos_copy; | |
390 } | |
391 curwin->w_cursor = pos; | |
392 listcmd_busy = slcb; | |
393 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
394 else if (c == '<' || c == '>') // start/end of visual area |
7 | 395 { |
4043 | 396 startp = &buf->b_visual.vi_start; |
397 endp = &buf->b_visual.vi_end; | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
398 if (((c == '<') == LT_POS(*startp, *endp) || endp->lnum == 0) |
10730
44e9340dc604
patch 8.0.0255: setpos() does not use the buffer argument for all marks
Christian Brabandt <cb@256bit.org>
parents:
10285
diff
changeset
|
399 && startp->lnum != 0) |
7 | 400 posp = startp; |
401 else | |
402 posp = endp; | |
403 /* | |
404 * For Visual line mode, set mark at begin or end of line | |
405 */ | |
4043 | 406 if (buf->b_visual.vi_mode == 'V') |
7 | 407 { |
408 pos_copy = *posp; | |
409 posp = &pos_copy; | |
410 if (c == '<') | |
411 pos_copy.col = 0; | |
412 else | |
413 pos_copy.col = MAXCOL; | |
414 pos_copy.coladd = 0; | |
415 } | |
416 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
417 else if (ASCII_ISLOWER(c)) // normal named mark |
7 | 418 { |
4043 | 419 posp = &(buf->b_namedm[c - 'a']); |
7 | 420 } |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
421 else if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) // named file mark |
7 | 422 { |
423 if (VIM_ISDIGIT(c)) | |
424 c = c - '0' + NMARKS; | |
425 else | |
426 c -= 'A'; | |
427 posp = &(namedfm[c].fmark.mark); | |
428 | |
429 if (namedfm[c].fmark.fnum == 0) | |
430 fname2fnum(&namedfm[c]); | |
706 | 431 |
432 if (fnum != NULL) | |
433 *fnum = namedfm[c].fmark.fnum; | |
4043 | 434 else if (namedfm[c].fmark.fnum != buf->b_fnum) |
7 | 435 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
436 // mark is in another file |
7 | 437 posp = &pos_copy; |
438 | |
439 if (namedfm[c].fmark.mark.lnum != 0 | |
440 && changefile && namedfm[c].fmark.fnum) | |
441 { | |
442 if (buflist_getfile(namedfm[c].fmark.fnum, | |
443 (linenr_T)1, GETF_SETMARK, FALSE) == OK) | |
444 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
445 // Set the lnum now, autocommands could have changed it |
7 | 446 curwin->w_cursor = namedfm[c].fmark.mark; |
447 return (pos_T *)-1; | |
448 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
449 pos_copy.lnum = -1; // can't get file |
7 | 450 } |
451 else | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
452 pos_copy.lnum = 0; // mark exists, but is not valid in |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
453 // current buffer |
7 | 454 } |
455 } | |
456 | |
457 return posp; | |
458 } | |
459 | |
460 /* | |
461 * Search for the next named mark in the current file. | |
462 * | |
463 * Returns pointer to pos_T of the next mark or NULL if no mark is found. | |
464 */ | |
465 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
466 getnextmark( |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
467 pos_T *startpos, // where to start |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
468 int dir, // direction for search |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
469 int begin_line) |
7 | 470 { |
471 int i; | |
472 pos_T *result = NULL; | |
473 pos_T pos; | |
474 | |
475 pos = *startpos; | |
476 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
477 // When searching backward and leaving the cursor on the first non-blank, |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
478 // position must be in a previous line. |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
479 // When searching forward and leaving the cursor on the first non-blank, |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
480 // position must be in a next line. |
7 | 481 if (dir == BACKWARD && begin_line) |
482 pos.col = 0; | |
483 else if (dir == FORWARD && begin_line) | |
484 pos.col = MAXCOL; | |
485 | |
486 for (i = 0; i < NMARKS; i++) | |
487 { | |
488 if (curbuf->b_namedm[i].lnum > 0) | |
489 { | |
490 if (dir == FORWARD) | |
491 { | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
492 if ((result == NULL || LT_POS(curbuf->b_namedm[i], *result)) |
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
493 && LT_POS(pos, curbuf->b_namedm[i])) |
7 | 494 result = &curbuf->b_namedm[i]; |
495 } | |
496 else | |
497 { | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
498 if ((result == NULL || LT_POS(*result, curbuf->b_namedm[i])) |
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
499 && LT_POS(curbuf->b_namedm[i], pos)) |
7 | 500 result = &curbuf->b_namedm[i]; |
501 } | |
502 } | |
503 } | |
504 | |
505 return result; | |
506 } | |
507 | |
508 /* | |
509 * For an xtended filemark: set the fnum from the fname. | |
510 * This is used for marks obtained from the .viminfo file. It's postponed | |
511 * until the mark is used to avoid a long startup delay. | |
512 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17464
diff
changeset
|
513 static void |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
514 fname2fnum(xfmark_T *fm) |
7 | 515 { |
516 char_u *p; | |
517 | |
518 if (fm->fname != NULL) | |
519 { | |
520 /* | |
521 * First expand "~/" in the file name to the home directory. | |
1480 | 522 * Don't expand the whole name, it may contain other '~' chars. |
7 | 523 */ |
1480 | 524 if (fm->fname[0] == '~' && (fm->fname[1] == '/' |
525 #ifdef BACKSLASH_IN_FILENAME | |
526 || fm->fname[1] == '\\' | |
527 #endif | |
528 )) | |
529 { | |
530 int len; | |
531 | |
532 expand_env((char_u *)"~/", NameBuff, MAXPATHL); | |
1570 | 533 len = (int)STRLEN(NameBuff); |
1480 | 534 vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); |
535 } | |
536 else | |
537 vim_strncpy(NameBuff, fm->fname, MAXPATHL - 1); | |
538 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
539 // Try to shorten the file name. |
7 | 540 mch_dirname(IObuff, IOSIZE); |
541 p = shorten_fname(NameBuff, IObuff); | |
542 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
543 // buflist_new() will call fmarks_check_names() |
7 | 544 (void)buflist_new(NameBuff, p, (linenr_T)1, 0); |
545 } | |
546 } | |
547 | |
548 /* | |
549 * Check all file marks for a name that matches the file name in buf. | |
550 * May replace the name with an fnum. | |
551 * Used for marks that come from the .viminfo file. | |
552 */ | |
553 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
554 fmarks_check_names(buf_T *buf) |
7 | 555 { |
556 char_u *name; | |
557 int i; | |
558 #ifdef FEAT_JUMPLIST | |
559 win_T *wp; | |
560 #endif | |
561 | |
562 if (buf->b_ffname == NULL) | |
563 return; | |
564 | |
565 name = home_replace_save(buf, buf->b_ffname); | |
566 if (name == NULL) | |
567 return; | |
568 | |
569 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) | |
570 fmarks_check_one(&namedfm[i], name, buf); | |
571 | |
572 #ifdef FEAT_JUMPLIST | |
573 FOR_ALL_WINDOWS(wp) | |
574 { | |
575 for (i = 0; i < wp->w_jumplistlen; ++i) | |
576 fmarks_check_one(&wp->w_jumplist[i], name, buf); | |
577 } | |
578 #endif | |
579 | |
580 vim_free(name); | |
581 } | |
582 | |
583 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
584 fmarks_check_one(xfmark_T *fm, char_u *name, buf_T *buf) |
7 | 585 { |
586 if (fm->fmark.fnum == 0 | |
587 && fm->fname != NULL | |
588 && fnamecmp(name, fm->fname) == 0) | |
589 { | |
590 fm->fmark.fnum = buf->b_fnum; | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
591 VIM_CLEAR(fm->fname); |
7 | 592 } |
593 } | |
594 | |
595 /* | |
596 * Check a if a position from a mark is valid. | |
597 * Give and error message and return FAIL if not. | |
598 */ | |
599 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
600 check_mark(pos_T *pos) |
7 | 601 { |
602 if (pos == NULL) | |
603 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
604 emsg(_(e_umark)); |
7 | 605 return FAIL; |
606 } | |
607 if (pos->lnum <= 0) | |
608 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
609 // lnum is negative if mark is in another file can can't get that |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
610 // file, error message already give then. |
7 | 611 if (pos->lnum == 0) |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
612 emsg(_(e_marknotset)); |
7 | 613 return FAIL; |
614 } | |
615 if (pos->lnum > curbuf->b_ml.ml_line_count) | |
616 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
617 emsg(_(e_markinval)); |
7 | 618 return FAIL; |
619 } | |
620 return OK; | |
621 } | |
622 | |
623 /* | |
624 * clrallmarks() - clear all marks in the buffer 'buf' | |
625 * | |
626 * Used mainly when trashing the entire buffer during ":e" type commands | |
627 */ | |
628 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
629 clrallmarks(buf_T *buf) |
7 | 630 { |
631 static int i = -1; | |
632 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
633 if (i == -1) // first call ever: initialize |
7 | 634 for (i = 0; i < NMARKS + 1; i++) |
635 { | |
636 namedfm[i].fmark.mark.lnum = 0; | |
637 namedfm[i].fname = NULL; | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
638 #ifdef FEAT_VIMINFO |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
639 namedfm[i].time_set = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
640 #endif |
7 | 641 } |
642 | |
643 for (i = 0; i < NMARKS; i++) | |
644 buf->b_namedm[i].lnum = 0; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
645 buf->b_op_start.lnum = 0; // start/end op mark cleared |
7 | 646 buf->b_op_end.lnum = 0; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
647 buf->b_last_cursor.lnum = 1; // '" mark cleared |
7 | 648 buf->b_last_cursor.col = 0; |
649 buf->b_last_cursor.coladd = 0; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
650 buf->b_last_insert.lnum = 0; // '^ mark cleared |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
651 buf->b_last_change.lnum = 0; // '. mark cleared |
7 | 652 #ifdef FEAT_JUMPLIST |
653 buf->b_changelistlen = 0; | |
654 #endif | |
655 } | |
656 | |
657 /* | |
658 * Get name of file from a filemark. | |
659 * When it's in the current buffer, return the text at the mark. | |
660 * Returns an allocated string. | |
661 */ | |
662 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
663 fm_getname(fmark_T *fmark, int lead_len) |
7 | 664 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
665 if (fmark->fnum == curbuf->b_fnum) // current buffer |
7 | 666 return mark_line(&(fmark->mark), lead_len); |
667 return buflist_nr2name(fmark->fnum, FALSE, TRUE); | |
668 } | |
669 | |
670 /* | |
671 * Return the line at mark "mp". Truncate to fit in window. | |
672 * The returned string has been allocated. | |
673 */ | |
674 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
675 mark_line(pos_T *mp, int lead_len) |
7 | 676 { |
677 char_u *s, *p; | |
678 int len; | |
679 | |
680 if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count) | |
681 return vim_strsave((char_u *)"-invalid-"); | |
14305
8a4c0ab88201
patch 8.1.0168: output of :marks is too short with multi-byte chars
Christian Brabandt <cb@256bit.org>
parents:
13278
diff
changeset
|
682 // Allow for up to 5 bytes per character. |
8a4c0ab88201
patch 8.1.0168: output of :marks is too short with multi-byte chars
Christian Brabandt <cb@256bit.org>
parents:
13278
diff
changeset
|
683 s = vim_strnsave(skipwhite(ml_get(mp->lnum)), (int)Columns * 5); |
7 | 684 if (s == NULL) |
685 return NULL; | |
14305
8a4c0ab88201
patch 8.1.0168: output of :marks is too short with multi-byte chars
Christian Brabandt <cb@256bit.org>
parents:
13278
diff
changeset
|
686 // Truncate the line to fit it in the window. |
7 | 687 len = 0; |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
688 for (p = s; *p != NUL; MB_PTR_ADV(p)) |
7 | 689 { |
690 len += ptr2cells(p); | |
691 if (len >= Columns - lead_len) | |
692 break; | |
693 } | |
694 *p = NUL; | |
695 return s; | |
696 } | |
697 | |
698 /* | |
699 * print the marks | |
700 */ | |
701 void | |
18126
f89e2e720b5b
patch 8.1.2058: function for ex command is named inconsistently
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
702 ex_marks(exarg_T *eap) |
7 | 703 { |
704 char_u *arg = eap->arg; | |
705 int i; | |
706 char_u *name; | |
707 | |
708 if (arg != NULL && *arg == NUL) | |
709 arg = NULL; | |
710 | |
711 show_one_mark('\'', arg, &curwin->w_pcmark, NULL, TRUE); | |
712 for (i = 0; i < NMARKS; ++i) | |
713 show_one_mark(i + 'a', arg, &curbuf->b_namedm[i], NULL, TRUE); | |
714 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) | |
715 { | |
716 if (namedfm[i].fmark.fnum != 0) | |
717 name = fm_getname(&namedfm[i].fmark, 15); | |
718 else | |
719 name = namedfm[i].fname; | |
720 if (name != NULL) | |
721 { | |
722 show_one_mark(i >= NMARKS ? i - NMARKS + '0' : i + 'A', | |
723 arg, &namedfm[i].fmark.mark, name, | |
724 namedfm[i].fmark.fnum == curbuf->b_fnum); | |
725 if (namedfm[i].fmark.fnum != 0) | |
726 vim_free(name); | |
727 } | |
728 } | |
729 show_one_mark('"', arg, &curbuf->b_last_cursor, NULL, TRUE); | |
730 show_one_mark('[', arg, &curbuf->b_op_start, NULL, TRUE); | |
731 show_one_mark(']', arg, &curbuf->b_op_end, NULL, TRUE); | |
732 show_one_mark('^', arg, &curbuf->b_last_insert, NULL, TRUE); | |
733 show_one_mark('.', arg, &curbuf->b_last_change, NULL, TRUE); | |
690 | 734 show_one_mark('<', arg, &curbuf->b_visual.vi_start, NULL, TRUE); |
735 show_one_mark('>', arg, &curbuf->b_visual.vi_end, NULL, TRUE); | |
7 | 736 show_one_mark(-1, arg, NULL, NULL, FALSE); |
737 } | |
738 | |
739 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
740 show_one_mark( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
741 int c, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
742 char_u *arg, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
743 pos_T *p, |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
744 char_u *name_arg, |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
745 int current) // in current file |
7 | 746 { |
747 static int did_title = FALSE; | |
748 int mustfree = FALSE; | |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
749 char_u *name = name_arg; |
7 | 750 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
751 if (c == -1) // finish up |
7 | 752 { |
753 if (did_title) | |
754 did_title = FALSE; | |
755 else | |
756 { | |
757 if (arg == NULL) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
758 msg(_("No marks set")); |
7 | 759 else |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
760 semsg(_("E283: No marks matching \"%s\""), arg); |
7 | 761 } |
762 } | |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
763 // don't output anything if 'q' typed at --more-- prompt |
7 | 764 else if (!got_int |
765 && (arg == NULL || vim_strchr(arg, c) != NULL) | |
766 && p->lnum != 0) | |
767 { | |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
768 if (name == NULL && current) |
7 | 769 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
770 name = mark_line(p, 15); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
771 mustfree = TRUE; |
7 | 772 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
773 if (!message_filtered(name)) |
7 | 774 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
775 if (!did_title) |
7 | 776 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
777 // Highlight title |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
778 msg_puts_title(_("\nmark line col file/text")); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
779 did_title = TRUE; |
7 | 780 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
781 msg_putchar('\n'); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
782 if (!got_int) |
7 | 783 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
784 sprintf((char *)IObuff, " %c %6ld %4d ", c, p->lnum, p->col); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
785 msg_outtrans(IObuff); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
786 if (name != NULL) |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
787 { |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
788 msg_outtrans_attr(name, current ? HL_ATTR(HLF_D) : 0); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
789 } |
7 | 790 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
791 out_flush(); // show one line at a time |
7 | 792 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
793 if (mustfree) |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
794 vim_free(name); |
7 | 795 } |
796 } | |
797 | |
24 | 798 /* |
799 * ":delmarks[!] [marks]" | |
800 */ | |
801 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
802 ex_delmarks(exarg_T *eap) |
24 | 803 { |
804 char_u *p; | |
805 int from, to; | |
806 int i; | |
807 int lower; | |
808 int digit; | |
809 int n; | |
810 | |
811 if (*eap->arg == NUL && eap->forceit) | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
812 // clear all marks |
24 | 813 clrallmarks(curbuf); |
814 else if (eap->forceit) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
815 emsg(_(e_invarg)); |
24 | 816 else if (*eap->arg == NUL) |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
817 emsg(_(e_argreq)); |
24 | 818 else |
819 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
820 // clear specified marks only |
24 | 821 for (p = eap->arg; *p != NUL; ++p) |
822 { | |
823 lower = ASCII_ISLOWER(*p); | |
824 digit = VIM_ISDIGIT(*p); | |
825 if (lower || digit || ASCII_ISUPPER(*p)) | |
826 { | |
827 if (p[1] == '-') | |
828 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
829 // clear range of marks |
24 | 830 from = *p; |
831 to = p[2]; | |
832 if (!(lower ? ASCII_ISLOWER(p[2]) | |
833 : (digit ? VIM_ISDIGIT(p[2]) | |
834 : ASCII_ISUPPER(p[2]))) | |
835 || to < from) | |
836 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
837 semsg(_(e_invarg2), p); |
24 | 838 return; |
839 } | |
840 p += 2; | |
841 } | |
842 else | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
843 // clear one lower case mark |
24 | 844 from = to = *p; |
845 | |
846 for (i = from; i <= to; ++i) | |
847 { | |
848 if (lower) | |
849 curbuf->b_namedm[i - 'a'].lnum = 0; | |
850 else | |
851 { | |
852 if (digit) | |
853 n = i - '0' + NMARKS; | |
854 else | |
855 n = i - 'A'; | |
856 namedfm[n].fmark.mark.lnum = 0; | |
18979
de2d1820215a
patch 8.2.0050: after deleting a file mark it is still in viminfo
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
857 namedfm[n].fmark.fnum = 0; |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
858 VIM_CLEAR(namedfm[n].fname); |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
859 #ifdef FEAT_VIMINFO |
18979
de2d1820215a
patch 8.2.0050: after deleting a file mark it is still in viminfo
Bram Moolenaar <Bram@vim.org>
parents:
18800
diff
changeset
|
860 namedfm[n].time_set = digit ? 0 : vim_time(); |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
861 #endif |
24 | 862 } |
863 } | |
864 } | |
865 else | |
866 switch (*p) | |
867 { | |
868 case '"': curbuf->b_last_cursor.lnum = 0; break; | |
869 case '^': curbuf->b_last_insert.lnum = 0; break; | |
870 case '.': curbuf->b_last_change.lnum = 0; break; | |
871 case '[': curbuf->b_op_start.lnum = 0; break; | |
872 case ']': curbuf->b_op_end.lnum = 0; break; | |
690 | 873 case '<': curbuf->b_visual.vi_start.lnum = 0; break; |
874 case '>': curbuf->b_visual.vi_end.lnum = 0; break; | |
24 | 875 case ' ': break; |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15326
diff
changeset
|
876 default: semsg(_(e_invarg2), p); |
24 | 877 return; |
878 } | |
879 } | |
880 } | |
881 } | |
882 | |
7 | 883 #if defined(FEAT_JUMPLIST) || defined(PROTO) |
884 /* | |
885 * print the jumplist | |
886 */ | |
887 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
888 ex_jumps(exarg_T *eap UNUSED) |
7 | 889 { |
890 int i; | |
891 char_u *name; | |
892 | |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
893 cleanup_jumplist(curwin, TRUE); |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
894 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
895 // Highlight title |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
896 msg_puts_title(_("\n jump line col file/text")); |
7 | 897 for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) |
898 { | |
899 if (curwin->w_jumplist[i].fmark.mark.lnum != 0) | |
900 { | |
901 name = fm_getname(&curwin->w_jumplist[i].fmark, 16); | |
14968
c5ec5ddbe814
patch 8.1.0495: :filter only supports some commands
Bram Moolenaar <Bram@vim.org>
parents:
14305
diff
changeset
|
902 |
c5ec5ddbe814
patch 8.1.0495: :filter only supports some commands
Bram Moolenaar <Bram@vim.org>
parents:
14305
diff
changeset
|
903 // apply :filter /pat/ or file name not available |
c5ec5ddbe814
patch 8.1.0495: :filter only supports some commands
Bram Moolenaar <Bram@vim.org>
parents:
14305
diff
changeset
|
904 if (name == NULL || message_filtered(name)) |
15651
dd4e6f077874
patch 8.1.0833: memory leak when jumps output is filtered
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
905 { |
dd4e6f077874
patch 8.1.0833: memory leak when jumps output is filtered
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
906 vim_free(name); |
7 | 907 continue; |
15651
dd4e6f077874
patch 8.1.0833: memory leak when jumps output is filtered
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
908 } |
7 | 909 |
910 msg_putchar('\n'); | |
911 if (got_int) | |
1702 | 912 { |
913 vim_free(name); | |
7 | 914 break; |
1702 | 915 } |
7 | 916 sprintf((char *)IObuff, "%c %2d %5ld %4d ", |
917 i == curwin->w_jumplistidx ? '>' : ' ', | |
918 i > curwin->w_jumplistidx ? i - curwin->w_jumplistidx | |
919 : curwin->w_jumplistidx - i, | |
920 curwin->w_jumplist[i].fmark.mark.lnum, | |
921 curwin->w_jumplist[i].fmark.mark.col); | |
922 msg_outtrans(IObuff); | |
923 msg_outtrans_attr(name, | |
924 curwin->w_jumplist[i].fmark.fnum == curbuf->b_fnum | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11140
diff
changeset
|
925 ? HL_ATTR(HLF_D) : 0); |
7 | 926 vim_free(name); |
927 ui_breakcheck(); | |
928 } | |
929 out_flush(); | |
930 } | |
931 if (curwin->w_jumplistidx == curwin->w_jumplistlen) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
932 msg_puts("\n>"); |
7 | 933 } |
934 | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
935 void |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
936 ex_clearjumps(exarg_T *eap UNUSED) |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
937 { |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
938 free_jumplist(curwin); |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
939 curwin->w_jumplistlen = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
940 curwin->w_jumplistidx = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
941 } |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
942 |
7 | 943 /* |
944 * print the changelist | |
945 */ | |
946 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
947 ex_changes(exarg_T *eap UNUSED) |
7 | 948 { |
949 int i; | |
950 char_u *name; | |
951 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
952 // Highlight title |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
953 msg_puts_title(_("\nchange line col text")); |
7 | 954 |
955 for (i = 0; i < curbuf->b_changelistlen && !got_int; ++i) | |
956 { | |
957 if (curbuf->b_changelist[i].lnum != 0) | |
958 { | |
959 msg_putchar('\n'); | |
960 if (got_int) | |
961 break; | |
962 sprintf((char *)IObuff, "%c %3d %5ld %4d ", | |
963 i == curwin->w_changelistidx ? '>' : ' ', | |
964 i > curwin->w_changelistidx ? i - curwin->w_changelistidx | |
965 : curwin->w_changelistidx - i, | |
966 (long)curbuf->b_changelist[i].lnum, | |
967 curbuf->b_changelist[i].col); | |
968 msg_outtrans(IObuff); | |
969 name = mark_line(&curbuf->b_changelist[i], 17); | |
970 if (name == NULL) | |
971 break; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11140
diff
changeset
|
972 msg_outtrans_attr(name, HL_ATTR(HLF_D)); |
7 | 973 vim_free(name); |
974 ui_breakcheck(); | |
975 } | |
976 out_flush(); | |
977 } | |
978 if (curwin->w_changelistidx == curbuf->b_changelistlen) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
979 msg_puts("\n>"); |
7 | 980 } |
981 #endif | |
982 | |
983 #define one_adjust(add) \ | |
984 { \ | |
985 lp = add; \ | |
986 if (*lp >= line1 && *lp <= line2) \ | |
987 { \ | |
988 if (amount == MAXLNUM) \ | |
989 *lp = 0; \ | |
990 else \ | |
991 *lp += amount; \ | |
992 } \ | |
993 else if (amount_after && *lp > line2) \ | |
994 *lp += amount_after; \ | |
995 } | |
996 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
997 // don't delete the line, just put at first deleted line |
7 | 998 #define one_adjust_nodel(add) \ |
999 { \ | |
1000 lp = add; \ | |
1001 if (*lp >= line1 && *lp <= line2) \ | |
1002 { \ | |
1003 if (amount == MAXLNUM) \ | |
1004 *lp = line1; \ | |
1005 else \ | |
1006 *lp += amount; \ | |
1007 } \ | |
1008 else if (amount_after && *lp > line2) \ | |
1009 *lp += amount_after; \ | |
1010 } | |
1011 | |
1012 /* | |
1013 * Adjust marks between line1 and line2 (inclusive) to move 'amount' lines. | |
1014 * Must be called before changed_*(), appended_lines() or deleted_lines(). | |
1015 * May be called before or after changing the text. | |
1016 * When deleting lines line1 to line2, use an 'amount' of MAXLNUM: The marks | |
1017 * within this range are made invalid. | |
1018 * If 'amount_after' is non-zero adjust marks after line2. | |
1019 * Example: Delete lines 34 and 35: mark_adjust(34, 35, MAXLNUM, -2); | |
1020 * Example: Insert two lines below 55: mark_adjust(56, MAXLNUM, 2, 0); | |
1021 * or: mark_adjust(56, 55, MAXLNUM, 2); | |
1022 */ | |
1023 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1024 mark_adjust( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1025 linenr_T line1, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1026 linenr_T line2, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1027 long amount, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1028 long amount_after) |
7 | 1029 { |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1030 mark_adjust_internal(line1, line2, amount, amount_after, TRUE); |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1031 } |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1032 |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1033 void |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1034 mark_adjust_nofold( |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1035 linenr_T line1, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1036 linenr_T line2, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1037 long amount, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1038 long amount_after) |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1039 { |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1040 mark_adjust_internal(line1, line2, amount, amount_after, FALSE); |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1041 } |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1042 |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1043 static void |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1044 mark_adjust_internal( |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1045 linenr_T line1, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1046 linenr_T line2, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1047 long amount, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1048 long amount_after, |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1049 int adjust_folds UNUSED) |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1050 { |
7 | 1051 int i; |
1052 int fnum = curbuf->b_fnum; | |
1053 linenr_T *lp; | |
1054 win_T *win; | |
1863 | 1055 tabpage_T *tab; |
15636
6f1c7e9a6393
patch 8.1.0826: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1056 static pos_T initpos = {1, 0, 0}; |
7 | 1057 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1058 if (line2 < line1 && amount_after == 0L) // nothing to do |
7 | 1059 return; |
1060 | |
1061 if (!cmdmod.lockmarks) | |
1062 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1063 // named marks, lower case and upper case |
7 | 1064 for (i = 0; i < NMARKS; i++) |
1065 { | |
1066 one_adjust(&(curbuf->b_namedm[i].lnum)); | |
1067 if (namedfm[i].fmark.fnum == fnum) | |
1068 one_adjust_nodel(&(namedfm[i].fmark.mark.lnum)); | |
1069 } | |
1070 for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) | |
1071 { | |
1072 if (namedfm[i].fmark.fnum == fnum) | |
1073 one_adjust_nodel(&(namedfm[i].fmark.mark.lnum)); | |
1074 } | |
1075 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1076 // last Insert position |
7 | 1077 one_adjust(&(curbuf->b_last_insert.lnum)); |
1078 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1079 // last change position |
7 | 1080 one_adjust(&(curbuf->b_last_change.lnum)); |
1081 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1082 // last cursor position, if it was set |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
1083 if (!EQUAL_POS(curbuf->b_last_cursor, initpos)) |
4092 | 1084 one_adjust(&(curbuf->b_last_cursor.lnum)); |
1085 | |
1086 | |
7 | 1087 #ifdef FEAT_JUMPLIST |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1088 // list of change positions |
7 | 1089 for (i = 0; i < curbuf->b_changelistlen; ++i) |
1090 one_adjust_nodel(&(curbuf->b_changelist[i].lnum)); | |
1091 #endif | |
1092 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1093 // Visual area |
690 | 1094 one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum)); |
1095 one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum)); | |
7 | 1096 |
1097 #ifdef FEAT_QUICKFIX | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1098 // quickfix marks |
643 | 1099 qf_mark_adjust(NULL, line1, line2, amount, amount_after); |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1100 // location lists |
1863 | 1101 FOR_ALL_TAB_WINDOWS(tab, win) |
643 | 1102 qf_mark_adjust(win, line1, line2, amount, amount_after); |
7 | 1103 #endif |
1104 | |
1105 #ifdef FEAT_SIGNS | |
1106 sign_mark_adjust(line1, line2, amount, amount_after); | |
1107 #endif | |
1108 } | |
1109 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1110 // previous context mark |
7 | 1111 one_adjust(&(curwin->w_pcmark.lnum)); |
1112 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1113 // previous pcmark |
7 | 1114 one_adjust(&(curwin->w_prev_pcmark.lnum)); |
1115 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1116 // saved cursor for formatting |
7 | 1117 if (saved_cursor.lnum != 0) |
1118 one_adjust_nodel(&(saved_cursor.lnum)); | |
1119 | |
1120 /* | |
1121 * Adjust items in all windows related to the current buffer. | |
1122 */ | |
1863 | 1123 FOR_ALL_TAB_WINDOWS(tab, win) |
7 | 1124 { |
1125 #ifdef FEAT_JUMPLIST | |
1126 if (!cmdmod.lockmarks) | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1127 // Marks in the jumplist. When deleting lines, this may create |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1128 // duplicate marks in the jumplist, they will be removed later. |
7 | 1129 for (i = 0; i < win->w_jumplistlen; ++i) |
1130 if (win->w_jumplist[i].fmark.fnum == fnum) | |
1131 one_adjust_nodel(&(win->w_jumplist[i].fmark.mark.lnum)); | |
1132 #endif | |
1133 | |
1134 if (win->w_buffer == curbuf) | |
1135 { | |
1136 if (!cmdmod.lockmarks) | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1137 // marks in the tag stack |
7 | 1138 for (i = 0; i < win->w_tagstacklen; i++) |
1139 if (win->w_tagstack[i].fmark.fnum == fnum) | |
1140 one_adjust_nodel(&(win->w_tagstack[i].fmark.mark.lnum)); | |
1141 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1142 // the displayed Visual area |
7 | 1143 if (win->w_old_cursor_lnum != 0) |
1144 { | |
1145 one_adjust_nodel(&(win->w_old_cursor_lnum)); | |
1146 one_adjust_nodel(&(win->w_old_visual_lnum)); | |
1147 } | |
1148 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1149 // topline and cursor position for windows with the same buffer |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1150 // other than the current window |
7 | 1151 if (win != curwin) |
1152 { | |
1153 if (win->w_topline >= line1 && win->w_topline <= line2) | |
1154 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1155 if (amount == MAXLNUM) // topline is deleted |
7 | 1156 { |
1157 if (line1 <= 1) | |
1158 win->w_topline = 1; | |
1159 else | |
1160 win->w_topline = line1 - 1; | |
1161 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1162 else // keep topline on the same line |
7 | 1163 win->w_topline += amount; |
1164 #ifdef FEAT_DIFF | |
1165 win->w_topfill = 0; | |
1166 #endif | |
1167 } | |
1168 else if (amount_after && win->w_topline > line2) | |
1169 { | |
1170 win->w_topline += amount_after; | |
1171 #ifdef FEAT_DIFF | |
1172 win->w_topfill = 0; | |
1173 #endif | |
1174 } | |
1175 if (win->w_cursor.lnum >= line1 && win->w_cursor.lnum <= line2) | |
1176 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1177 if (amount == MAXLNUM) // line with cursor is deleted |
7 | 1178 { |
1179 if (line1 <= 1) | |
1180 win->w_cursor.lnum = 1; | |
1181 else | |
1182 win->w_cursor.lnum = line1 - 1; | |
1183 win->w_cursor.col = 0; | |
1184 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1185 else // keep cursor on the same line |
7 | 1186 win->w_cursor.lnum += amount; |
1187 } | |
1188 else if (amount_after && win->w_cursor.lnum > line2) | |
1189 win->w_cursor.lnum += amount_after; | |
1190 } | |
1191 | |
1192 #ifdef FEAT_FOLDING | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1193 // adjust folds |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1194 if (adjust_folds) |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1195 foldMarkAdjust(win, line1, line2, amount, amount_after); |
7 | 1196 #endif |
1197 } | |
1198 } | |
1199 | |
1200 #ifdef FEAT_DIFF | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1201 // adjust diffs |
7 | 1202 diff_mark_adjust(line1, line2, amount, amount_after); |
1203 #endif | |
1204 } | |
1205 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1206 // This code is used often, needs to be fast. |
7 | 1207 #define col_adjust(pp) \ |
1208 { \ | |
1209 posp = pp; \ | |
1210 if (posp->lnum == lnum && posp->col >= mincol) \ | |
1211 { \ | |
1212 posp->lnum += lnum_amount; \ | |
1213 if (col_amount < 0 && posp->col <= (colnr_T)-col_amount) \ | |
1214 posp->col = 0; \ | |
15326
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1215 else if (posp->col < spaces_removed) \ |
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1216 posp->col = col_amount + spaces_removed; \ |
7 | 1217 else \ |
1218 posp->col += col_amount; \ | |
1219 } \ | |
1220 } | |
1221 | |
1222 /* | |
1223 * Adjust marks in line "lnum" at column "mincol" and further: add | |
1224 * "lnum_amount" to the line number and add "col_amount" to the column | |
1225 * position. | |
15326
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1226 * "spaces_removed" is the number of spaces that were removed, matters when the |
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1227 * cursor is inside them. |
7 | 1228 */ |
1229 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1230 mark_col_adjust( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1231 linenr_T lnum, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1232 colnr_T mincol, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1233 long lnum_amount, |
15326
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1234 long col_amount, |
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1235 int spaces_removed) |
7 | 1236 { |
1237 int i; | |
1238 int fnum = curbuf->b_fnum; | |
1239 win_T *win; | |
1240 pos_T *posp; | |
1241 | |
1242 if ((col_amount == 0L && lnum_amount == 0L) || cmdmod.lockmarks) | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1243 return; // nothing to do |
7 | 1244 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1245 // named marks, lower case and upper case |
7 | 1246 for (i = 0; i < NMARKS; i++) |
1247 { | |
1248 col_adjust(&(curbuf->b_namedm[i])); | |
1249 if (namedfm[i].fmark.fnum == fnum) | |
1250 col_adjust(&(namedfm[i].fmark.mark)); | |
1251 } | |
1252 for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) | |
1253 { | |
1254 if (namedfm[i].fmark.fnum == fnum) | |
1255 col_adjust(&(namedfm[i].fmark.mark)); | |
1256 } | |
1257 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1258 // last Insert position |
7 | 1259 col_adjust(&(curbuf->b_last_insert)); |
1260 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1261 // last change position |
7 | 1262 col_adjust(&(curbuf->b_last_change)); |
1263 | |
1264 #ifdef FEAT_JUMPLIST | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1265 // list of change positions |
7 | 1266 for (i = 0; i < curbuf->b_changelistlen; ++i) |
1267 col_adjust(&(curbuf->b_changelist[i])); | |
1268 #endif | |
1269 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1270 // Visual area |
690 | 1271 col_adjust(&(curbuf->b_visual.vi_start)); |
1272 col_adjust(&(curbuf->b_visual.vi_end)); | |
7 | 1273 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1274 // previous context mark |
7 | 1275 col_adjust(&(curwin->w_pcmark)); |
1276 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1277 // previous pcmark |
7 | 1278 col_adjust(&(curwin->w_prev_pcmark)); |
1279 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1280 // saved cursor for formatting |
7 | 1281 col_adjust(&saved_cursor); |
1282 | |
1283 /* | |
1284 * Adjust items in all windows related to the current buffer. | |
1285 */ | |
1286 FOR_ALL_WINDOWS(win) | |
1287 { | |
1288 #ifdef FEAT_JUMPLIST | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1289 // marks in the jumplist |
7 | 1290 for (i = 0; i < win->w_jumplistlen; ++i) |
1291 if (win->w_jumplist[i].fmark.fnum == fnum) | |
1292 col_adjust(&(win->w_jumplist[i].fmark.mark)); | |
1293 #endif | |
1294 | |
1295 if (win->w_buffer == curbuf) | |
1296 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1297 // marks in the tag stack |
7 | 1298 for (i = 0; i < win->w_tagstacklen; i++) |
1299 if (win->w_tagstack[i].fmark.fnum == fnum) | |
1300 col_adjust(&(win->w_tagstack[i].fmark.mark)); | |
1301 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1302 // cursor position for other windows with the same buffer |
7 | 1303 if (win != curwin) |
1304 col_adjust(&win->w_cursor); | |
1305 } | |
1306 } | |
1307 } | |
1308 | |
1309 #ifdef FEAT_JUMPLIST | |
1310 /* | |
1311 * When deleting lines, this may create duplicate marks in the | |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1312 * jumplist. They will be removed here for the specified window. |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1313 * When "loadfiles" is TRUE first ensure entries have the "fnum" field set |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1314 * (this may be a bit slow). |
7 | 1315 */ |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1316 void |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1317 cleanup_jumplist(win_T *wp, int loadfiles) |
7 | 1318 { |
1319 int i; | |
1320 int from, to; | |
1321 | |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1322 if (loadfiles) |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1323 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1324 // If specified, load all the files from the jump list. This is |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1325 // needed to properly clean up duplicate entries, but will take some |
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1326 // time. |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1327 for (i = 0; i < wp->w_jumplistlen; ++i) |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1328 { |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1329 if ((wp->w_jumplist[i].fmark.fnum == 0) && |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1330 (wp->w_jumplist[i].fmark.mark.lnum != 0)) |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1331 fname2fnum(&wp->w_jumplist[i]); |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1332 } |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1333 } |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1334 |
7 | 1335 to = 0; |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1336 for (from = 0; from < wp->w_jumplistlen; ++from) |
7 | 1337 { |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1338 if (wp->w_jumplistidx == from) |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1339 wp->w_jumplistidx = to; |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1340 for (i = from + 1; i < wp->w_jumplistlen; ++i) |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1341 if (wp->w_jumplist[i].fmark.fnum |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1342 == wp->w_jumplist[from].fmark.fnum |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1343 && wp->w_jumplist[from].fmark.fnum != 0 |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1344 && wp->w_jumplist[i].fmark.mark.lnum |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1345 == wp->w_jumplist[from].fmark.mark.lnum) |
7 | 1346 break; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1347 if (i >= wp->w_jumplistlen) // no duplicate |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1348 wp->w_jumplist[to++] = wp->w_jumplist[from]; |
7 | 1349 else |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1350 vim_free(wp->w_jumplist[from].fname); |
7 | 1351 } |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1352 if (wp->w_jumplistidx == wp->w_jumplistlen) |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1353 wp->w_jumplistidx = to; |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1354 wp->w_jumplistlen = to; |
7 | 1355 } |
1356 | |
1357 /* | |
1358 * Copy the jumplist from window "from" to window "to". | |
1359 */ | |
1360 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1361 copy_jumplist(win_T *from, win_T *to) |
7 | 1362 { |
1363 int i; | |
1364 | |
1365 for (i = 0; i < from->w_jumplistlen; ++i) | |
1366 { | |
1367 to->w_jumplist[i] = from->w_jumplist[i]; | |
1368 if (from->w_jumplist[i].fname != NULL) | |
1369 to->w_jumplist[i].fname = vim_strsave(from->w_jumplist[i].fname); | |
1370 } | |
1371 to->w_jumplistlen = from->w_jumplistlen; | |
1372 to->w_jumplistidx = from->w_jumplistidx; | |
1373 } | |
1374 | |
1375 /* | |
1376 * Free items in the jumplist of window "wp". | |
1377 */ | |
1378 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1379 free_jumplist(win_T *wp) |
7 | 1380 { |
1381 int i; | |
1382 | |
1383 for (i = 0; i < wp->w_jumplistlen; ++i) | |
1384 vim_free(wp->w_jumplist[i].fname); | |
1385 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1386 #endif // FEAT_JUMPLIST |
7 | 1387 |
1388 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1389 set_last_cursor(win_T *win) |
7 | 1390 { |
5417 | 1391 if (win->w_buffer != NULL) |
1392 win->w_buffer->b_last_cursor = win->w_cursor; | |
7 | 1393 } |
1394 | |
358 | 1395 #if defined(EXITFREE) || defined(PROTO) |
1396 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1397 free_all_marks(void) |
358 | 1398 { |
1399 int i; | |
1400 | |
1401 for (i = 0; i < NMARKS + EXTRA_MARKS; i++) | |
1402 if (namedfm[i].fmark.mark.lnum != 0) | |
1403 vim_free(namedfm[i].fname); | |
1404 } | |
1405 #endif | |
1406 | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
1407 /* |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1408 * Return a pointer to the named file marks. |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
1409 */ |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1410 xfmark_T * |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1411 get_namedfm(void) |
7 | 1412 { |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1413 return namedfm; |
7 | 1414 } |