Mercurial > vim
annotate src/mark.c @ 34686:83875247fbc0 v9.1.0224
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15
Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Date: Thu Mar 28 12:01:14 2024 +0100
patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text
Problem: If a line has "right" & "below" virtual text properties,
where the "below" property may be stored first due to lack of
ordering between them, then the line height is calculated to
be 1 more and causes the cursor to far over the line.
Solution: Remove some unnecessary setting of a
`next_right_goes_below = TRUE` flag for "below" and "above"
text properties. (Dylan Thacker-Smith)
I modified a regression test I recently added to cover this case,
leveraging the fact that "after", "right" & "below" text properties are
being stored in the reverse of the order they are added in. The
previous version of this regression test was crafted to workaround this
issue so it can be addressed by this separate patch.
closes: #14317
Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Thu, 28 Mar 2024 12:15:03 +0100 |
parents | 1f3bcb7f3bd0 |
children | 814fcbca4d8d |
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 int i; | |
140 xfmark_T *fm; | |
141 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
142 // for :global the mark is set only once |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
143 if (global_busy || listcmd_busy || (cmdmod.cmod_flags & CMOD_KEEPJUMPS)) |
7 | 144 return; |
145 | |
146 curwin->w_prev_pcmark = curwin->w_pcmark; | |
147 curwin->w_pcmark = curwin->w_cursor; | |
148 | |
33311
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
149 if (jop_flags & JOP_STACK) |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
150 { |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
151 // jumpoptions=stack: if we're somewhere in the middle of the jumplist |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
152 // discard everything after the current index. |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
153 if (curwin->w_jumplistidx < curwin->w_jumplistlen - 1) |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
154 // Discard the rest of the jumplist by cutting the length down to |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
155 // contain nothing beyond the current index. |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
156 curwin->w_jumplistlen = curwin->w_jumplistidx + 1; |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
157 } |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
158 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
159 // If jumplist is full: remove oldest entry |
7 | 160 if (++curwin->w_jumplistlen > JUMPLISTSIZE) |
161 { | |
162 curwin->w_jumplistlen = JUMPLISTSIZE; | |
163 vim_free(curwin->w_jumplist[0].fname); | |
164 for (i = 1; i < JUMPLISTSIZE; ++i) | |
165 curwin->w_jumplist[i - 1] = curwin->w_jumplist[i]; | |
166 } | |
167 curwin->w_jumplistidx = curwin->w_jumplistlen; | |
168 fm = &curwin->w_jumplist[curwin->w_jumplistlen - 1]; | |
169 | |
170 fm->fmark.mark = curwin->w_pcmark; | |
171 fm->fmark.fnum = curbuf->b_fnum; | |
172 fm->fname = NULL; | |
26532
255bc9a08e58
patch 8.2.3795: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
26439
diff
changeset
|
173 #ifdef FEAT_VIMINFO |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
174 fm->time_set = vim_time(); |
7 | 175 #endif |
176 } | |
177 | |
178 /* | |
179 * To change context, call setpcmark(), then move the current position to | |
180 * where ever, then call checkpcmark(). This ensures that the previous | |
181 * context will only be changed if the cursor moved to a different line. | |
182 * If pcmark was deleted (with "dG") the previous mark is restored. | |
183 */ | |
184 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
185 checkpcmark(void) |
7 | 186 { |
187 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
|
188 && (EQUAL_POS(curwin->w_pcmark, curwin->w_cursor) |
7 | 189 || curwin->w_pcmark.lnum == 0)) |
190 curwin->w_pcmark = curwin->w_prev_pcmark; | |
25998
902aab6dc499
patch 8.2.3532: the previous '' mark is restored after moving the cursor
Bram Moolenaar <Bram@vim.org>
parents:
25384
diff
changeset
|
191 curwin->w_prev_pcmark.lnum = 0; // it has been checked |
7 | 192 } |
193 | |
194 /* | |
195 * move "count" positions in the jump list (count may be negative) | |
196 */ | |
197 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
198 movemark(int count) |
7 | 199 { |
200 pos_T *pos; | |
201 xfmark_T *jmp; | |
202 | |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
203 cleanup_jumplist(curwin, TRUE); |
7 | 204 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
205 if (curwin->w_jumplistlen == 0) // nothing to jump to |
7 | 206 return (pos_T *)NULL; |
207 | |
208 for (;;) | |
209 { | |
210 if (curwin->w_jumplistidx + count < 0 | |
211 || curwin->w_jumplistidx + count >= curwin->w_jumplistlen) | |
212 return (pos_T *)NULL; | |
213 | |
214 /* | |
215 * if first CTRL-O or CTRL-I command after a jump, add cursor position | |
1188 | 216 * to list. Careful: If there are duplicates (CTRL-O immediately after |
7 | 217 * starting Vim on a file), another entry may have been removed. |
218 */ | |
219 if (curwin->w_jumplistidx == curwin->w_jumplistlen) | |
220 { | |
221 setpcmark(); | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
222 --curwin->w_jumplistidx; // skip the new entry |
7 | 223 if (curwin->w_jumplistidx + count < 0) |
224 return (pos_T *)NULL; | |
225 } | |
226 | |
227 curwin->w_jumplistidx += count; | |
228 | |
229 jmp = curwin->w_jumplist + curwin->w_jumplistidx; | |
230 if (jmp->fmark.fnum == 0) | |
231 fname2fnum(jmp); | |
232 if (jmp->fmark.fnum != curbuf->b_fnum) | |
233 { | |
30389
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
234 // Make a copy, an autocommand may make "jmp" invalid. |
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
235 fmark_T fmark = jmp->fmark; |
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
236 |
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
237 // jump to the file with the mark |
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
238 if (buflist_findnr(fmark.fnum) == NULL) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
239 { // Skip this one .. |
7 | 240 count += count < 0 ? -1 : 1; |
241 continue; | |
242 } | |
30389
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
243 if (buflist_getfile(fmark.fnum, fmark.mark.lnum, 0, FALSE) == FAIL) |
7 | 244 return (pos_T *)NULL; |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
245 // Set lnum again, autocommands my have changed it |
30389
14c0d0c72bcd
patch 9.0.0530: using freed memory when autocmd changes mark
Bram Moolenaar <Bram@vim.org>
parents:
29239
diff
changeset
|
246 curwin->w_cursor = fmark.mark; |
7 | 247 pos = (pos_T *)-1; |
248 } | |
249 else | |
250 pos = &(jmp->fmark.mark); | |
251 return pos; | |
252 } | |
253 } | |
254 | |
255 /* | |
256 * Move "count" positions in the changelist (count may be negative). | |
257 */ | |
258 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
259 movechangelist(int count) |
7 | 260 { |
261 int n; | |
262 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
263 if (curbuf->b_changelistlen == 0) // nothing to jump to |
7 | 264 return (pos_T *)NULL; |
265 | |
266 n = curwin->w_changelistidx; | |
267 if (n + count < 0) | |
268 { | |
269 if (n == 0) | |
270 return (pos_T *)NULL; | |
271 n = 0; | |
272 } | |
273 else if (n + count >= curbuf->b_changelistlen) | |
274 { | |
275 if (n == curbuf->b_changelistlen - 1) | |
276 return (pos_T *)NULL; | |
277 n = curbuf->b_changelistlen - 1; | |
278 } | |
279 else | |
280 n += count; | |
281 curwin->w_changelistidx = n; | |
282 return curbuf->b_changelist + n; | |
283 } | |
284 | |
285 /* | |
4043 | 286 * Find mark "c" in buffer pointed to by "buf". |
706 | 287 * If "changefile" is TRUE it's allowed to edit another file for '0, 'A, etc. |
288 * If "fnum" is not NULL store the fnum there for '0, 'A etc., don't edit | |
289 * another file. | |
7 | 290 * Returns: |
291 * - pointer to pos_T if found. lnum is 0 when mark not set, -1 when mark is | |
292 * in another file which can't be gotten. (caller needs to check lnum!) | |
293 * - NULL if there is no mark called 'c'. | |
294 * - -1 if mark is in other file and jumped there (only if changefile is TRUE) | |
295 */ | |
296 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
297 getmark_buf(buf_T *buf, int c, int changefile) |
4043 | 298 { |
299 return getmark_buf_fnum(buf, c, changefile, NULL); | |
300 } | |
301 | |
302 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
303 getmark(int c, int changefile) |
706 | 304 { |
4043 | 305 return getmark_buf_fnum(curbuf, c, changefile, NULL); |
706 | 306 } |
307 | |
308 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
309 getmark_buf_fnum( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
310 buf_T *buf, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
311 int c, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
312 int changefile, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
313 int *fnum) |
7 | 314 { |
315 pos_T *posp; | |
316 pos_T *startp, *endp; | |
317 static pos_T pos_copy; | |
318 | |
319 posp = NULL; | |
320 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
321 // 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
|
322 // to crash. |
7 | 323 if (c < 0) |
324 return posp; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
325 if (c > '~') // check for islower()/isupper() |
7 | 326 ; |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
327 else if (c == '\'' || c == '`') // previous context mark |
7 | 328 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
329 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
|
330 posp = &pos_copy; // w_pcmark may be changed soon |
7 | 331 } |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
332 else if (c == '"') // to pos when leaving buffer |
4043 | 333 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
|
334 else if (c == '^') // to where Insert mode stopped |
4043 | 335 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
|
336 else if (c == '.') // to where last change was made |
4043 | 337 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
|
338 else if (c == '[') // to start of previous operator |
4043 | 339 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
|
340 else if (c == ']') // to end of previous operator |
4043 | 341 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
|
342 else if (c == '{' || c == '}') // to previous/next paragraph |
7 | 343 { |
344 pos_T pos; | |
345 oparg_T oa; | |
346 int slcb = listcmd_busy; | |
347 | |
348 pos = curwin->w_cursor; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
349 listcmd_busy = TRUE; // avoid that '' is changed |
503 | 350 if (findpar(&oa.inclusive, |
351 c == '}' ? FORWARD : BACKWARD, 1L, NUL, FALSE)) | |
7 | 352 { |
353 pos_copy = curwin->w_cursor; | |
354 posp = &pos_copy; | |
355 } | |
356 curwin->w_cursor = pos; | |
357 listcmd_busy = slcb; | |
358 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
359 else if (c == '(' || c == ')') // to previous/next sentence |
7 | 360 { |
361 pos_T pos; | |
362 int slcb = listcmd_busy; | |
363 | |
364 pos = curwin->w_cursor; | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
365 listcmd_busy = TRUE; // avoid that '' is changed |
7 | 366 if (findsent(c == ')' ? FORWARD : BACKWARD, 1L)) |
367 { | |
368 pos_copy = curwin->w_cursor; | |
369 posp = &pos_copy; | |
370 } | |
371 curwin->w_cursor = pos; | |
372 listcmd_busy = slcb; | |
373 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
374 else if (c == '<' || c == '>') // start/end of visual area |
7 | 375 { |
4043 | 376 startp = &buf->b_visual.vi_start; |
377 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
|
378 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
|
379 && startp->lnum != 0) |
7 | 380 posp = startp; |
381 else | |
382 posp = endp; | |
383 /* | |
384 * For Visual line mode, set mark at begin or end of line | |
385 */ | |
4043 | 386 if (buf->b_visual.vi_mode == 'V') |
7 | 387 { |
388 pos_copy = *posp; | |
389 posp = &pos_copy; | |
390 if (c == '<') | |
391 pos_copy.col = 0; | |
392 else | |
393 pos_copy.col = MAXCOL; | |
394 pos_copy.coladd = 0; | |
395 } | |
396 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
397 else if (ASCII_ISLOWER(c)) // normal named mark |
7 | 398 { |
4043 | 399 posp = &(buf->b_namedm[c - 'a']); |
7 | 400 } |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
401 else if (ASCII_ISUPPER(c) || VIM_ISDIGIT(c)) // named file mark |
7 | 402 { |
403 if (VIM_ISDIGIT(c)) | |
404 c = c - '0' + NMARKS; | |
405 else | |
406 c -= 'A'; | |
407 posp = &(namedfm[c].fmark.mark); | |
408 | |
409 if (namedfm[c].fmark.fnum == 0) | |
410 fname2fnum(&namedfm[c]); | |
706 | 411 |
412 if (fnum != NULL) | |
413 *fnum = namedfm[c].fmark.fnum; | |
4043 | 414 else if (namedfm[c].fmark.fnum != buf->b_fnum) |
7 | 415 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
416 // mark is in another file |
7 | 417 posp = &pos_copy; |
418 | |
419 if (namedfm[c].fmark.mark.lnum != 0 | |
420 && changefile && namedfm[c].fmark.fnum) | |
421 { | |
422 if (buflist_getfile(namedfm[c].fmark.fnum, | |
423 (linenr_T)1, GETF_SETMARK, FALSE) == OK) | |
424 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
425 // Set the lnum now, autocommands could have changed it |
7 | 426 curwin->w_cursor = namedfm[c].fmark.mark; |
427 return (pos_T *)-1; | |
428 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
429 pos_copy.lnum = -1; // can't get file |
7 | 430 } |
431 else | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
432 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
|
433 // current buffer |
7 | 434 } |
435 } | |
436 | |
437 return posp; | |
438 } | |
439 | |
440 /* | |
441 * Search for the next named mark in the current file. | |
442 * | |
443 * Returns pointer to pos_T of the next mark or NULL if no mark is found. | |
444 */ | |
445 pos_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
446 getnextmark( |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
447 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
|
448 int dir, // direction for search |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
449 int begin_line) |
7 | 450 { |
451 int i; | |
452 pos_T *result = NULL; | |
453 pos_T pos; | |
454 | |
455 pos = *startpos; | |
456 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
457 // 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
|
458 // 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
|
459 // 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
|
460 // position must be in a next line. |
7 | 461 if (dir == BACKWARD && begin_line) |
462 pos.col = 0; | |
463 else if (dir == FORWARD && begin_line) | |
464 pos.col = MAXCOL; | |
465 | |
466 for (i = 0; i < NMARKS; i++) | |
467 { | |
468 if (curbuf->b_namedm[i].lnum > 0) | |
469 { | |
470 if (dir == FORWARD) | |
471 { | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
472 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
|
473 && LT_POS(pos, curbuf->b_namedm[i])) |
7 | 474 result = &curbuf->b_namedm[i]; |
475 } | |
476 else | |
477 { | |
11121
778c10516955
patch 8.0.0448: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
10730
diff
changeset
|
478 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
|
479 && LT_POS(curbuf->b_namedm[i], pos)) |
7 | 480 result = &curbuf->b_namedm[i]; |
481 } | |
482 } | |
483 } | |
484 | |
485 return result; | |
486 } | |
487 | |
488 /* | |
489 * For an xtended filemark: set the fnum from the fname. | |
490 * This is used for marks obtained from the .viminfo file. It's postponed | |
491 * until the mark is used to avoid a long startup delay. | |
492 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17464
diff
changeset
|
493 static void |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
494 fname2fnum(xfmark_T *fm) |
7 | 495 { |
496 char_u *p; | |
497 | |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
498 if (fm->fname == NULL) |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
499 return; |
1480 | 500 |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
501 /* |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
502 * First expand "~/" in the file name to the home directory. |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
503 * Don't expand the whole name, it may contain other '~' chars. |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
504 */ |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
505 if (fm->fname[0] == '~' && (fm->fname[1] == '/' |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
506 #ifdef BACKSLASH_IN_FILENAME |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
507 || fm->fname[1] == '\\' |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
508 #endif |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
509 )) |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
510 { |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
511 int len; |
1480 | 512 |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
513 expand_env((char_u *)"~/", NameBuff, MAXPATHL); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
514 len = (int)STRLEN(NameBuff); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
515 vim_strncpy(NameBuff + len, fm->fname + 2, MAXPATHL - len - 1); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
516 } |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
517 else |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
518 vim_strncpy(NameBuff, fm->fname, MAXPATHL - 1); |
7 | 519 |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
520 // Try to shorten the file name. |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
521 mch_dirname(IObuff, IOSIZE); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
522 p = shorten_fname(NameBuff, IObuff); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
523 |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
524 // buflist_new() will call fmarks_check_names() |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
30389
diff
changeset
|
525 (void)buflist_new(NameBuff, p, (linenr_T)1, 0); |
7 | 526 } |
527 | |
528 /* | |
529 * Check all file marks for a name that matches the file name in buf. | |
530 * May replace the name with an fnum. | |
531 * Used for marks that come from the .viminfo file. | |
532 */ | |
533 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
534 fmarks_check_names(buf_T *buf) |
7 | 535 { |
536 char_u *name; | |
537 int i; | |
538 win_T *wp; | |
539 | |
540 if (buf->b_ffname == NULL) | |
541 return; | |
542 | |
543 name = home_replace_save(buf, buf->b_ffname); | |
544 if (name == NULL) | |
545 return; | |
546 | |
547 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) | |
548 fmarks_check_one(&namedfm[i], name, buf); | |
549 | |
550 FOR_ALL_WINDOWS(wp) | |
551 { | |
552 for (i = 0; i < wp->w_jumplistlen; ++i) | |
553 fmarks_check_one(&wp->w_jumplist[i], name, buf); | |
554 } | |
555 | |
556 vim_free(name); | |
557 } | |
558 | |
559 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
560 fmarks_check_one(xfmark_T *fm, char_u *name, buf_T *buf) |
7 | 561 { |
562 if (fm->fmark.fnum == 0 | |
563 && fm->fname != NULL | |
564 && fnamecmp(name, fm->fname) == 0) | |
565 { | |
566 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
|
567 VIM_CLEAR(fm->fname); |
7 | 568 } |
569 } | |
570 | |
571 /* | |
572 * Check a if a position from a mark is valid. | |
573 * Give and error message and return FAIL if not. | |
574 */ | |
575 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
576 check_mark(pos_T *pos) |
7 | 577 { |
578 if (pos == NULL) | |
579 { | |
26439
b18f3b0f317c
patch 8.2.3750: error messages are everywhere
Bram Moolenaar <Bram@vim.org>
parents:
25998
diff
changeset
|
580 emsg(_(e_unknown_mark)); |
7 | 581 return FAIL; |
582 } | |
583 if (pos->lnum <= 0) | |
584 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
585 // 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
|
586 // file, error message already give then. |
7 | 587 if (pos->lnum == 0) |
25064
8f2262c72178
patch 8.2.3069: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
23731
diff
changeset
|
588 emsg(_(e_mark_not_set)); |
7 | 589 return FAIL; |
590 } | |
591 if (pos->lnum > curbuf->b_ml.ml_line_count) | |
592 { | |
25064
8f2262c72178
patch 8.2.3069: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
23731
diff
changeset
|
593 emsg(_(e_mark_has_invalid_line_number)); |
7 | 594 return FAIL; |
595 } | |
596 return OK; | |
597 } | |
598 | |
599 /* | |
600 * clrallmarks() - clear all marks in the buffer 'buf' | |
601 * | |
602 * Used mainly when trashing the entire buffer during ":e" type commands | |
603 */ | |
604 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
605 clrallmarks(buf_T *buf) |
7 | 606 { |
607 static int i = -1; | |
608 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
609 if (i == -1) // first call ever: initialize |
7 | 610 for (i = 0; i < NMARKS + 1; i++) |
611 { | |
612 namedfm[i].fmark.mark.lnum = 0; | |
613 namedfm[i].fname = NULL; | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
614 #ifdef FEAT_VIMINFO |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
615 namedfm[i].time_set = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
616 #endif |
7 | 617 } |
618 | |
619 for (i = 0; i < NMARKS; i++) | |
620 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
|
621 buf->b_op_start.lnum = 0; // start/end op mark cleared |
7 | 622 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
|
623 buf->b_last_cursor.lnum = 1; // '" mark cleared |
7 | 624 buf->b_last_cursor.col = 0; |
625 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
|
626 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
|
627 buf->b_last_change.lnum = 0; // '. mark cleared |
7 | 628 buf->b_changelistlen = 0; |
629 } | |
630 | |
631 /* | |
632 * Get name of file from a filemark. | |
633 * When it's in the current buffer, return the text at the mark. | |
634 * Returns an allocated string. | |
635 */ | |
636 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
637 fm_getname(fmark_T *fmark, int lead_len) |
7 | 638 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
639 if (fmark->fnum == curbuf->b_fnum) // current buffer |
7 | 640 return mark_line(&(fmark->mark), lead_len); |
641 return buflist_nr2name(fmark->fnum, FALSE, TRUE); | |
642 } | |
643 | |
644 /* | |
645 * Return the line at mark "mp". Truncate to fit in window. | |
646 * The returned string has been allocated. | |
647 */ | |
648 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
649 mark_line(pos_T *mp, int lead_len) |
7 | 650 { |
651 char_u *s, *p; | |
652 int len; | |
653 | |
654 if (mp->lnum == 0 || mp->lnum > curbuf->b_ml.ml_line_count) | |
655 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
|
656 // Allow for up to 5 bytes per character. |
20830
9064044fd4f6
patch 8.2.0967: unnecessary type casts for vim_strnsave()
Bram Moolenaar <Bram@vim.org>
parents:
20635
diff
changeset
|
657 s = vim_strnsave(skipwhite(ml_get(mp->lnum)), Columns * 5); |
7 | 658 if (s == NULL) |
659 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
|
660 // Truncate the line to fit it in the window. |
7 | 661 len = 0; |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11121
diff
changeset
|
662 for (p = s; *p != NUL; MB_PTR_ADV(p)) |
7 | 663 { |
664 len += ptr2cells(p); | |
665 if (len >= Columns - lead_len) | |
666 break; | |
667 } | |
668 *p = NUL; | |
669 return s; | |
670 } | |
671 | |
672 /* | |
673 * print the marks | |
674 */ | |
675 void | |
18126
f89e2e720b5b
patch 8.1.2058: function for ex command is named inconsistently
Bram Moolenaar <Bram@vim.org>
parents:
17789
diff
changeset
|
676 ex_marks(exarg_T *eap) |
7 | 677 { |
678 char_u *arg = eap->arg; | |
679 int i; | |
680 char_u *name; | |
21403
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
681 pos_T *posp, *startp, *endp; |
7 | 682 |
683 if (arg != NULL && *arg == NUL) | |
684 arg = NULL; | |
685 | |
686 show_one_mark('\'', arg, &curwin->w_pcmark, NULL, TRUE); | |
687 for (i = 0; i < NMARKS; ++i) | |
688 show_one_mark(i + 'a', arg, &curbuf->b_namedm[i], NULL, TRUE); | |
689 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) | |
690 { | |
691 if (namedfm[i].fmark.fnum != 0) | |
692 name = fm_getname(&namedfm[i].fmark, 15); | |
693 else | |
694 name = namedfm[i].fname; | |
695 if (name != NULL) | |
696 { | |
697 show_one_mark(i >= NMARKS ? i - NMARKS + '0' : i + 'A', | |
698 arg, &namedfm[i].fmark.mark, name, | |
699 namedfm[i].fmark.fnum == curbuf->b_fnum); | |
700 if (namedfm[i].fmark.fnum != 0) | |
701 vim_free(name); | |
702 } | |
703 } | |
704 show_one_mark('"', arg, &curbuf->b_last_cursor, NULL, TRUE); | |
705 show_one_mark('[', arg, &curbuf->b_op_start, NULL, TRUE); | |
706 show_one_mark(']', arg, &curbuf->b_op_end, NULL, TRUE); | |
707 show_one_mark('^', arg, &curbuf->b_last_insert, NULL, TRUE); | |
708 show_one_mark('.', arg, &curbuf->b_last_change, NULL, TRUE); | |
21403
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
709 |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
710 // Show the marks as where they will jump to. |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
711 startp = &curbuf->b_visual.vi_start; |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
712 endp = &curbuf->b_visual.vi_end; |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
713 if ((LT_POS(*startp, *endp) || endp->lnum == 0) && startp->lnum != 0) |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
714 posp = startp; |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
715 else |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
716 posp = endp; |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
717 show_one_mark('<', arg, posp, NULL, TRUE); |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
718 show_one_mark('>', arg, posp == startp ? endp : startp, NULL, TRUE); |
d387121083a4
patch 8.2.1252: ":marks" may show '< and '> mixed up
Bram Moolenaar <Bram@vim.org>
parents:
20830
diff
changeset
|
719 |
7 | 720 show_one_mark(-1, arg, NULL, NULL, FALSE); |
721 } | |
722 | |
723 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
724 show_one_mark( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
725 int c, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
726 char_u *arg, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
727 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
|
728 char_u *name_arg, |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
729 int current) // in current file |
7 | 730 { |
731 static int did_title = FALSE; | |
732 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
|
733 char_u *name = name_arg; |
7 | 734 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
735 if (c == -1) // finish up |
7 | 736 { |
737 if (did_title) | |
738 did_title = FALSE; | |
739 else | |
740 { | |
741 if (arg == NULL) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
742 msg(_("No marks set")); |
7 | 743 else |
26897
d02d40f0261c
patch 8.2.3977: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
744 semsg(_(e_no_marks_matching_str), arg); |
7 | 745 } |
746 } | |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
747 // don't output anything if 'q' typed at --more-- prompt |
7 | 748 else if (!got_int |
749 && (arg == NULL || vim_strchr(arg, c) != NULL) | |
750 && p->lnum != 0) | |
751 { | |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
752 if (name == NULL && current) |
7 | 753 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
754 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
|
755 mustfree = TRUE; |
7 | 756 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
757 if (!message_filtered(name)) |
7 | 758 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
759 if (!did_title) |
7 | 760 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
761 // Highlight title |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
762 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
|
763 did_title = TRUE; |
7 | 764 } |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
765 msg_putchar('\n'); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
766 if (!got_int) |
7 | 767 { |
16433
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
768 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
|
769 msg_outtrans(IObuff); |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
770 if (name != NULL) |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
771 { |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
772 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
|
773 } |
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 out_flush(); // show one line at a time |
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 if (mustfree) |
9c206a78ec04
patch 8.1.1221: filtering does not work when listing marks
Bram Moolenaar <Bram@vim.org>
parents:
15651
diff
changeset
|
778 vim_free(name); |
7 | 779 } |
780 } | |
781 | |
24 | 782 /* |
783 * ":delmarks[!] [marks]" | |
784 */ | |
785 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
786 ex_delmarks(exarg_T *eap) |
24 | 787 { |
788 char_u *p; | |
789 int from, to; | |
790 int i; | |
791 int lower; | |
792 int digit; | |
793 int n; | |
794 | |
795 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
|
796 // clear all marks |
24 | 797 clrallmarks(curbuf); |
798 else if (eap->forceit) | |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26532
diff
changeset
|
799 emsg(_(e_invalid_argument)); |
24 | 800 else if (*eap->arg == NUL) |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26532
diff
changeset
|
801 emsg(_(e_argument_required)); |
24 | 802 else |
803 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
804 // clear specified marks only |
24 | 805 for (p = eap->arg; *p != NUL; ++p) |
806 { | |
807 lower = ASCII_ISLOWER(*p); | |
808 digit = VIM_ISDIGIT(*p); | |
809 if (lower || digit || ASCII_ISUPPER(*p)) | |
810 { | |
811 if (p[1] == '-') | |
812 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
813 // clear range of marks |
24 | 814 from = *p; |
815 to = p[2]; | |
816 if (!(lower ? ASCII_ISLOWER(p[2]) | |
817 : (digit ? VIM_ISDIGIT(p[2]) | |
818 : ASCII_ISUPPER(p[2]))) | |
819 || to < from) | |
820 { | |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26532
diff
changeset
|
821 semsg(_(e_invalid_argument_str), p); |
24 | 822 return; |
823 } | |
824 p += 2; | |
825 } | |
826 else | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
827 // clear one lower case mark |
24 | 828 from = to = *p; |
829 | |
830 for (i = from; i <= to; ++i) | |
831 { | |
832 if (lower) | |
833 curbuf->b_namedm[i - 'a'].lnum = 0; | |
834 else | |
835 { | |
836 if (digit) | |
837 n = i - '0' + NMARKS; | |
838 else | |
839 n = i - 'A'; | |
840 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
|
841 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
|
842 VIM_CLEAR(namedfm[n].fname); |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
843 #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
|
844 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
|
845 #endif |
24 | 846 } |
847 } | |
848 } | |
849 else | |
850 switch (*p) | |
851 { | |
852 case '"': curbuf->b_last_cursor.lnum = 0; break; | |
853 case '^': curbuf->b_last_insert.lnum = 0; break; | |
854 case '.': curbuf->b_last_change.lnum = 0; break; | |
855 case '[': curbuf->b_op_start.lnum = 0; break; | |
856 case ']': curbuf->b_op_end.lnum = 0; break; | |
690 | 857 case '<': curbuf->b_visual.vi_start.lnum = 0; break; |
858 case '>': curbuf->b_visual.vi_end.lnum = 0; break; | |
24 | 859 case ' ': break; |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26532
diff
changeset
|
860 default: semsg(_(e_invalid_argument_str), p); |
24 | 861 return; |
862 } | |
863 } | |
864 } | |
865 } | |
866 | |
7 | 867 /* |
868 * print the jumplist | |
869 */ | |
870 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
871 ex_jumps(exarg_T *eap UNUSED) |
7 | 872 { |
873 int i; | |
874 char_u *name; | |
875 | |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
876 cleanup_jumplist(curwin, TRUE); |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
877 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
878 // Highlight title |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
879 msg_puts_title(_("\n jump line col file/text")); |
7 | 880 for (i = 0; i < curwin->w_jumplistlen && !got_int; ++i) |
881 { | |
882 if (curwin->w_jumplist[i].fmark.mark.lnum != 0) | |
883 { | |
884 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
|
885 |
28388
320991d9812e
patch 8.2.4719: ">" marker sometimes not displayed in the jumplist
Bram Moolenaar <Bram@vim.org>
parents:
28247
diff
changeset
|
886 // Make sure to output the current indicator, even when on an wiped |
320991d9812e
patch 8.2.4719: ">" marker sometimes not displayed in the jumplist
Bram Moolenaar <Bram@vim.org>
parents:
28247
diff
changeset
|
887 // out buffer. ":filter" may still skip it. |
320991d9812e
patch 8.2.4719: ">" marker sometimes not displayed in the jumplist
Bram Moolenaar <Bram@vim.org>
parents:
28247
diff
changeset
|
888 if (name == NULL && i == curwin->w_jumplistidx) |
320991d9812e
patch 8.2.4719: ">" marker sometimes not displayed in the jumplist
Bram Moolenaar <Bram@vim.org>
parents:
28247
diff
changeset
|
889 name = vim_strsave((char_u *)"-invalid-"); |
14968
c5ec5ddbe814
patch 8.1.0495: :filter only supports some commands
Bram Moolenaar <Bram@vim.org>
parents:
14305
diff
changeset
|
890 // 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
|
891 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
|
892 { |
dd4e6f077874
patch 8.1.0833: memory leak when jumps output is filtered
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
893 vim_free(name); |
7 | 894 continue; |
15651
dd4e6f077874
patch 8.1.0833: memory leak when jumps output is filtered
Bram Moolenaar <Bram@vim.org>
parents:
15636
diff
changeset
|
895 } |
7 | 896 |
897 msg_putchar('\n'); | |
898 if (got_int) | |
1702 | 899 { |
900 vim_free(name); | |
7 | 901 break; |
1702 | 902 } |
7 | 903 sprintf((char *)IObuff, "%c %2d %5ld %4d ", |
904 i == curwin->w_jumplistidx ? '>' : ' ', | |
905 i > curwin->w_jumplistidx ? i - curwin->w_jumplistidx | |
906 : curwin->w_jumplistidx - i, | |
907 curwin->w_jumplist[i].fmark.mark.lnum, | |
908 curwin->w_jumplist[i].fmark.mark.col); | |
909 msg_outtrans(IObuff); | |
910 msg_outtrans_attr(name, | |
911 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
|
912 ? HL_ATTR(HLF_D) : 0); |
7 | 913 vim_free(name); |
914 ui_breakcheck(); | |
915 } | |
916 out_flush(); | |
917 } | |
918 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
|
919 msg_puts("\n>"); |
7 | 920 } |
921 | |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
922 void |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
923 ex_clearjumps(exarg_T *eap UNUSED) |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
924 { |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
925 free_jumplist(curwin); |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
926 curwin->w_jumplistlen = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
927 curwin->w_jumplistidx = 0; |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
928 } |
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
929 |
7 | 930 /* |
931 * print the changelist | |
932 */ | |
933 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
934 ex_changes(exarg_T *eap UNUSED) |
7 | 935 { |
936 int i; | |
937 char_u *name; | |
938 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
939 // Highlight title |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
940 msg_puts_title(_("\nchange line col text")); |
7 | 941 |
942 for (i = 0; i < curbuf->b_changelistlen && !got_int; ++i) | |
943 { | |
944 if (curbuf->b_changelist[i].lnum != 0) | |
945 { | |
946 msg_putchar('\n'); | |
947 if (got_int) | |
948 break; | |
949 sprintf((char *)IObuff, "%c %3d %5ld %4d ", | |
950 i == curwin->w_changelistidx ? '>' : ' ', | |
951 i > curwin->w_changelistidx ? i - curwin->w_changelistidx | |
952 : curwin->w_changelistidx - i, | |
953 (long)curbuf->b_changelist[i].lnum, | |
954 curbuf->b_changelist[i].col); | |
955 msg_outtrans(IObuff); | |
956 name = mark_line(&curbuf->b_changelist[i], 17); | |
957 if (name == NULL) | |
958 break; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11140
diff
changeset
|
959 msg_outtrans_attr(name, HL_ATTR(HLF_D)); |
7 | 960 vim_free(name); |
961 ui_breakcheck(); | |
962 } | |
963 out_flush(); | |
964 } | |
965 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
|
966 msg_puts("\n>"); |
7 | 967 } |
968 | |
969 #define one_adjust(add) \ | |
970 { \ | |
971 lp = add; \ | |
972 if (*lp >= line1 && *lp <= line2) \ | |
973 { \ | |
974 if (amount == MAXLNUM) \ | |
975 *lp = 0; \ | |
976 else \ | |
977 *lp += amount; \ | |
978 } \ | |
979 else if (amount_after && *lp > line2) \ | |
980 *lp += amount_after; \ | |
981 } | |
982 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
983 // don't delete the line, just put at first deleted line |
7 | 984 #define one_adjust_nodel(add) \ |
985 { \ | |
986 lp = add; \ | |
987 if (*lp >= line1 && *lp <= line2) \ | |
988 { \ | |
989 if (amount == MAXLNUM) \ | |
990 *lp = line1; \ | |
991 else \ | |
992 *lp += amount; \ | |
993 } \ | |
994 else if (amount_after && *lp > line2) \ | |
995 *lp += amount_after; \ | |
996 } | |
997 | |
998 /* | |
32288
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
999 * Adjust marks between "line1" and "line2" (inclusive) to move "amount" lines. |
7 | 1000 * Must be called before changed_*(), appended_lines() or deleted_lines(). |
1001 * May be called before or after changing the text. | |
32288
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1002 * When deleting lines "line1" to "line2", use an "amount" of MAXLNUM: The |
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1003 * marks within this range are made invalid. |
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1004 * If "amount_after" is non-zero adjust marks after "line2". |
7 | 1005 * Example: Delete lines 34 and 35: mark_adjust(34, 35, MAXLNUM, -2); |
1006 * Example: Insert two lines below 55: mark_adjust(56, MAXLNUM, 2, 0); | |
1007 * or: mark_adjust(56, 55, MAXLNUM, 2); | |
1008 */ | |
1009 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1010 mark_adjust( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1011 linenr_T line1, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1012 linenr_T line2, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1013 long amount, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1014 long amount_after) |
7 | 1015 { |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1016 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
|
1017 } |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1018 |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1019 void |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1020 mark_adjust_nofold( |
28247
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1021 linenr_T line1, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1022 linenr_T line2, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1023 long amount, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1024 long amount_after) |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1025 { |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1026 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
|
1027 } |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1028 |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1029 static void |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1030 mark_adjust_internal( |
28247
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1031 linenr_T line1, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1032 linenr_T line2, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1033 long amount, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1034 long amount_after, |
f70015784777
patch 8.2.4649: various formatting problems
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1035 int adjust_folds UNUSED) |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1036 { |
7 | 1037 int i; |
1038 int fnum = curbuf->b_fnum; | |
1039 linenr_T *lp; | |
1040 win_T *win; | |
1863 | 1041 tabpage_T *tab; |
15636
6f1c7e9a6393
patch 8.1.0826: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1042 static pos_T initpos = {1, 0, 0}; |
7 | 1043 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1044 if (line2 < line1 && amount_after == 0L) // nothing to do |
7 | 1045 return; |
1046 | |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
1047 if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0) |
7 | 1048 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1049 // named marks, lower case and upper case |
7 | 1050 for (i = 0; i < NMARKS; i++) |
1051 { | |
1052 one_adjust(&(curbuf->b_namedm[i].lnum)); | |
1053 if (namedfm[i].fmark.fnum == fnum) | |
1054 one_adjust_nodel(&(namedfm[i].fmark.mark.lnum)); | |
1055 } | |
1056 for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) | |
1057 { | |
1058 if (namedfm[i].fmark.fnum == fnum) | |
1059 one_adjust_nodel(&(namedfm[i].fmark.mark.lnum)); | |
1060 } | |
1061 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1062 // last Insert position |
7 | 1063 one_adjust(&(curbuf->b_last_insert.lnum)); |
1064 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1065 // last change position |
7 | 1066 one_adjust(&(curbuf->b_last_change.lnum)); |
1067 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1068 // 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
|
1069 if (!EQUAL_POS(curbuf->b_last_cursor, initpos)) |
4092 | 1070 one_adjust(&(curbuf->b_last_cursor.lnum)); |
1071 | |
1072 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1073 // list of change positions |
7 | 1074 for (i = 0; i < curbuf->b_changelistlen; ++i) |
1075 one_adjust_nodel(&(curbuf->b_changelist[i].lnum)); | |
1076 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1077 // Visual area |
690 | 1078 one_adjust_nodel(&(curbuf->b_visual.vi_start.lnum)); |
1079 one_adjust_nodel(&(curbuf->b_visual.vi_end.lnum)); | |
7 | 1080 |
1081 #ifdef FEAT_QUICKFIX | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1082 // quickfix marks |
643 | 1083 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
|
1084 // location lists |
1863 | 1085 FOR_ALL_TAB_WINDOWS(tab, win) |
643 | 1086 qf_mark_adjust(win, line1, line2, amount, amount_after); |
7 | 1087 #endif |
1088 | |
1089 #ifdef FEAT_SIGNS | |
1090 sign_mark_adjust(line1, line2, amount, amount_after); | |
1091 #endif | |
1092 } | |
1093 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1094 // previous context mark |
7 | 1095 one_adjust(&(curwin->w_pcmark.lnum)); |
1096 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1097 // previous pcmark |
7 | 1098 one_adjust(&(curwin->w_prev_pcmark.lnum)); |
1099 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1100 // saved cursor for formatting |
7 | 1101 if (saved_cursor.lnum != 0) |
1102 one_adjust_nodel(&(saved_cursor.lnum)); | |
1103 | |
1104 /* | |
1105 * Adjust items in all windows related to the current buffer. | |
1106 */ | |
1863 | 1107 FOR_ALL_TAB_WINDOWS(tab, win) |
7 | 1108 { |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
1109 if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1110 // 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
|
1111 // duplicate marks in the jumplist, they will be removed later. |
7 | 1112 for (i = 0; i < win->w_jumplistlen; ++i) |
1113 if (win->w_jumplist[i].fmark.fnum == fnum) | |
1114 one_adjust_nodel(&(win->w_jumplist[i].fmark.mark.lnum)); | |
1115 | |
1116 if (win->w_buffer == curbuf) | |
1117 { | |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
1118 if ((cmdmod.cmod_flags & CMOD_LOCKMARKS) == 0) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1119 // marks in the tag stack |
7 | 1120 for (i = 0; i < win->w_tagstacklen; i++) |
1121 if (win->w_tagstack[i].fmark.fnum == fnum) | |
1122 one_adjust_nodel(&(win->w_tagstack[i].fmark.mark.lnum)); | |
1123 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1124 // the displayed Visual area |
7 | 1125 if (win->w_old_cursor_lnum != 0) |
1126 { | |
1127 one_adjust_nodel(&(win->w_old_cursor_lnum)); | |
1128 one_adjust_nodel(&(win->w_old_visual_lnum)); | |
1129 } | |
1130 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1131 // 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
|
1132 // other than the current window |
7 | 1133 if (win != curwin) |
1134 { | |
1135 if (win->w_topline >= line1 && win->w_topline <= line2) | |
1136 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1137 if (amount == MAXLNUM) // topline is deleted |
7 | 1138 { |
1139 if (line1 <= 1) | |
1140 win->w_topline = 1; | |
1141 else | |
1142 win->w_topline = line1 - 1; | |
1143 } | |
32288
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1144 else if (win->w_topline > line1) |
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1145 // keep topline on the same line, unless inserting just |
8201b0fcea02
patch 9.0.1476: lines put in non-current window are not displayed
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1146 // above it (we probably want to see that line then) |
7 | 1147 win->w_topline += amount; |
1148 #ifdef FEAT_DIFF | |
1149 win->w_topfill = 0; | |
1150 #endif | |
1151 } | |
1152 else if (amount_after && win->w_topline > line2) | |
1153 { | |
1154 win->w_topline += amount_after; | |
1155 #ifdef FEAT_DIFF | |
1156 win->w_topfill = 0; | |
1157 #endif | |
1158 } | |
1159 if (win->w_cursor.lnum >= line1 && win->w_cursor.lnum <= line2) | |
1160 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1161 if (amount == MAXLNUM) // line with cursor is deleted |
7 | 1162 { |
1163 if (line1 <= 1) | |
1164 win->w_cursor.lnum = 1; | |
1165 else | |
1166 win->w_cursor.lnum = line1 - 1; | |
1167 win->w_cursor.col = 0; | |
1168 } | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1169 else // keep cursor on the same line |
7 | 1170 win->w_cursor.lnum += amount; |
1171 } | |
1172 else if (amount_after && win->w_cursor.lnum > line2) | |
1173 win->w_cursor.lnum += amount_after; | |
1174 } | |
1175 | |
1176 #ifdef FEAT_FOLDING | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1177 // adjust folds |
11140
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1178 if (adjust_folds) |
6b26e044b6f5
patch 8.0.0457: using :move messes up manual folds
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1179 foldMarkAdjust(win, line1, line2, amount, amount_after); |
7 | 1180 #endif |
1181 } | |
1182 } | |
1183 | |
1184 #ifdef FEAT_DIFF | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1185 // adjust diffs |
7 | 1186 diff_mark_adjust(line1, line2, amount, amount_after); |
1187 #endif | |
1188 } | |
1189 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1190 // This code is used often, needs to be fast. |
7 | 1191 #define col_adjust(pp) \ |
1192 { \ | |
1193 posp = pp; \ | |
1194 if (posp->lnum == lnum && posp->col >= mincol) \ | |
1195 { \ | |
1196 posp->lnum += lnum_amount; \ | |
1197 if (col_amount < 0 && posp->col <= (colnr_T)-col_amount) \ | |
1198 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
|
1199 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
|
1200 posp->col = col_amount + spaces_removed; \ |
7 | 1201 else \ |
1202 posp->col += col_amount; \ | |
1203 } \ | |
1204 } | |
1205 | |
1206 /* | |
1207 * Adjust marks in line "lnum" at column "mincol" and further: add | |
1208 * "lnum_amount" to the line number and add "col_amount" to the column | |
1209 * position. | |
15326
fe428bee74b3
patch 8.1.0671: cursor in the wrong column after auto-formatting
Bram Moolenaar <Bram@vim.org>
parents:
14968
diff
changeset
|
1210 * "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
|
1211 * cursor is inside them. |
7 | 1212 */ |
1213 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1214 mark_col_adjust( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1215 linenr_T lnum, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1216 colnr_T mincol, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1217 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
|
1218 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
|
1219 int spaces_removed) |
7 | 1220 { |
1221 int i; | |
1222 int fnum = curbuf->b_fnum; | |
1223 win_T *win; | |
1224 pos_T *posp; | |
1225 | |
22699
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
1226 if ((col_amount == 0L && lnum_amount == 0L) |
e82579016863
patch 8.2.1898: command modifier parsing always uses global cmdmod
Bram Moolenaar <Bram@vim.org>
parents:
21403
diff
changeset
|
1227 || (cmdmod.cmod_flags & CMOD_LOCKMARKS)) |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1228 return; // nothing to do |
7 | 1229 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1230 // named marks, lower case and upper case |
7 | 1231 for (i = 0; i < NMARKS; i++) |
1232 { | |
1233 col_adjust(&(curbuf->b_namedm[i])); | |
1234 if (namedfm[i].fmark.fnum == fnum) | |
1235 col_adjust(&(namedfm[i].fmark.mark)); | |
1236 } | |
1237 for (i = NMARKS; i < NMARKS + EXTRA_MARKS; i++) | |
1238 { | |
1239 if (namedfm[i].fmark.fnum == fnum) | |
1240 col_adjust(&(namedfm[i].fmark.mark)); | |
1241 } | |
1242 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1243 // last Insert position |
7 | 1244 col_adjust(&(curbuf->b_last_insert)); |
1245 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1246 // last change position |
7 | 1247 col_adjust(&(curbuf->b_last_change)); |
1248 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1249 // list of change positions |
7 | 1250 for (i = 0; i < curbuf->b_changelistlen; ++i) |
1251 col_adjust(&(curbuf->b_changelist[i])); | |
1252 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1253 // Visual area |
690 | 1254 col_adjust(&(curbuf->b_visual.vi_start)); |
1255 col_adjust(&(curbuf->b_visual.vi_end)); | |
7 | 1256 |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1257 // previous context mark |
7 | 1258 col_adjust(&(curwin->w_pcmark)); |
1259 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1260 // previous pcmark |
7 | 1261 col_adjust(&(curwin->w_prev_pcmark)); |
1262 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1263 // saved cursor for formatting |
7 | 1264 col_adjust(&saved_cursor); |
1265 | |
1266 /* | |
1267 * Adjust items in all windows related to the current buffer. | |
1268 */ | |
1269 FOR_ALL_WINDOWS(win) | |
1270 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1271 // marks in the jumplist |
7 | 1272 for (i = 0; i < win->w_jumplistlen; ++i) |
1273 if (win->w_jumplist[i].fmark.fnum == fnum) | |
1274 col_adjust(&(win->w_jumplist[i].fmark.mark)); | |
1275 | |
1276 if (win->w_buffer == curbuf) | |
1277 { | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1278 // marks in the tag stack |
7 | 1279 for (i = 0; i < win->w_tagstacklen; i++) |
1280 if (win->w_tagstack[i].fmark.fnum == fnum) | |
1281 col_adjust(&(win->w_tagstack[i].fmark.mark)); | |
1282 | |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1283 // cursor position for other windows with the same buffer |
7 | 1284 if (win != curwin) |
1285 col_adjust(&win->w_cursor); | |
1286 } | |
1287 } | |
1288 } | |
1289 | |
1290 /* | |
1291 * 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
|
1292 * 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
|
1293 * 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
|
1294 * (this may be a bit slow). |
7 | 1295 */ |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1296 void |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1297 cleanup_jumplist(win_T *wp, int loadfiles) |
7 | 1298 { |
1299 int i; | |
1300 int from, to; | |
33311
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1301 int mustfree; |
7 | 1302 |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1303 if (loadfiles) |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1304 { |
18800
f41b55f9357c
patch 8.1.2388: using old C style comments
Bram Moolenaar <Bram@vim.org>
parents:
18126
diff
changeset
|
1305 // 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
|
1306 // 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
|
1307 // time. |
13278
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1308 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
|
1309 { |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1310 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
|
1311 (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
|
1312 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
|
1313 } |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1314 } |
28ae299c6af0
patch 8.0.1513: the jumplist is not always properly cleaned up
Christian Brabandt <cb@256bit.org>
parents:
13248
diff
changeset
|
1315 |
7 | 1316 to = 0; |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1317 for (from = 0; from < wp->w_jumplistlen; ++from) |
7 | 1318 { |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1319 if (wp->w_jumplistidx == from) |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1320 wp->w_jumplistidx = to; |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1321 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
|
1322 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
|
1323 == wp->w_jumplist[from].fmark.fnum |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1324 && 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
|
1325 && 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
|
1326 == wp->w_jumplist[from].fmark.mark.lnum) |
7 | 1327 break; |
33311
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1328 if (i >= wp->w_jumplistlen) // not duplicate |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1329 mustfree = FALSE; |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1330 else if (i > from + 1) // non-adjacent duplicate |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1331 // jumpoptions=stack: remove duplicates only when adjacent. |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1332 mustfree = !(jop_flags & JOP_STACK); |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1333 else // adjacent duplicate |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1334 mustfree = TRUE; |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1335 |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1336 if (mustfree) |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1337 vim_free(wp->w_jumplist[from].fname); |
1f3bcb7f3bd0
patch 9.0.1921: not possible to use the jumplist like a stack
Christian Brabandt <cb@256bit.org>
parents:
32288
diff
changeset
|
1338 else |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1339 wp->w_jumplist[to++] = wp->w_jumplist[from]; |
7 | 1340 } |
13248
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1341 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
|
1342 wp->w_jumplistidx = to; |
5958573d8a72
patch 8.0.1498: getjumplist() returns duplicate entries
Christian Brabandt <cb@256bit.org>
parents:
13244
diff
changeset
|
1343 wp->w_jumplistlen = to; |
7 | 1344 } |
1345 | |
1346 /* | |
1347 * Copy the jumplist from window "from" to window "to". | |
1348 */ | |
1349 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1350 copy_jumplist(win_T *from, win_T *to) |
7 | 1351 { |
1352 int i; | |
1353 | |
1354 for (i = 0; i < from->w_jumplistlen; ++i) | |
1355 { | |
1356 to->w_jumplist[i] = from->w_jumplist[i]; | |
1357 if (from->w_jumplist[i].fname != NULL) | |
1358 to->w_jumplist[i].fname = vim_strsave(from->w_jumplist[i].fname); | |
1359 } | |
1360 to->w_jumplistlen = from->w_jumplistlen; | |
1361 to->w_jumplistidx = from->w_jumplistidx; | |
1362 } | |
1363 | |
1364 /* | |
1365 * Free items in the jumplist of window "wp". | |
1366 */ | |
1367 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1368 free_jumplist(win_T *wp) |
7 | 1369 { |
1370 int i; | |
1371 | |
1372 for (i = 0; i < wp->w_jumplistlen; ++i) | |
1373 vim_free(wp->w_jumplist[i].fname); | |
1374 } | |
1375 | |
1376 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1377 set_last_cursor(win_T *win) |
7 | 1378 { |
5417 | 1379 if (win->w_buffer != NULL) |
1380 win->w_buffer->b_last_cursor = win->w_cursor; | |
7 | 1381 } |
1382 | |
358 | 1383 #if defined(EXITFREE) || defined(PROTO) |
1384 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1385 free_all_marks(void) |
358 | 1386 { |
1387 int i; | |
1388 | |
1389 for (i = 0; i < NMARKS + EXTRA_MARKS; i++) | |
1390 if (namedfm[i].fmark.mark.lnum != 0) | |
1391 vim_free(namedfm[i].fname); | |
1392 } | |
1393 #endif | |
1394 | |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
1395 #if defined(FEAT_VIMINFO) || defined(PROTO) |
9284
78712a2f687a
commit https://github.com/vim/vim/commit/2d35899721da0e9359a9fe1059554f8c4ea7f0c1
Christian Brabandt <cb@256bit.org>
parents:
7827
diff
changeset
|
1396 /* |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1397 * 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
|
1398 */ |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1399 xfmark_T * |
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1400 get_namedfm(void) |
7 | 1401 { |
17464
3e708b5c0509
patch 8.1.1730: wrong place for mark viminfo support
Bram Moolenaar <Bram@vim.org>
parents:
16825
diff
changeset
|
1402 return namedfm; |
7 | 1403 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26897
diff
changeset
|
1404 #endif |
20615
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1405 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1406 #if defined(FEAT_EVAL) || defined(PROTO) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1407 /* |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1408 * Add information about mark 'mname' to list 'l' |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1409 */ |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1410 static int |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1411 add_mark(list_T *l, char_u *mname, pos_T *pos, int bufnr, char_u *fname) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1412 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1413 dict_T *d; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1414 list_T *lpos; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1415 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1416 if (pos->lnum <= 0) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1417 return OK; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1418 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1419 d = dict_alloc(); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1420 if (d == NULL) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1421 return FAIL; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1422 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1423 if (list_append_dict(l, d) == FAIL) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1424 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1425 dict_unref(d); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1426 return FAIL; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1427 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1428 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1429 lpos = list_alloc(); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1430 if (lpos == NULL) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1431 return FAIL; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1432 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1433 list_append_number(lpos, bufnr); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1434 list_append_number(lpos, pos->lnum); |
20635
3e36a51ff152
patch 8.2.0871: cannot use getmarklist() as a method
Bram Moolenaar <Bram@vim.org>
parents:
20615
diff
changeset
|
1435 list_append_number(lpos, pos->col + 1); |
20615
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1436 list_append_number(lpos, pos->coladd); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1437 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1438 if (dict_add_string(d, "mark", mname) == FAIL |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1439 || dict_add_list(d, "pos", lpos) == FAIL |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1440 || (fname != NULL && dict_add_string(d, "file", fname) == FAIL)) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1441 return FAIL; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1442 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1443 return OK; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1444 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1445 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1446 /* |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1447 * Get information about marks local to a buffer. |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1448 */ |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1449 static void |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1450 get_buf_local_marks(buf_T *buf, list_T *l) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1451 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1452 char_u mname[3] = "' "; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1453 int i; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1454 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1455 // Marks 'a' to 'z' |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1456 for (i = 0; i < NMARKS; ++i) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1457 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1458 mname[1] = 'a' + i; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1459 add_mark(l, mname, &buf->b_namedm[i], buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1460 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1461 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1462 // Mark '' is a window local mark and not a buffer local mark |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1463 add_mark(l, (char_u *)"''", &curwin->w_pcmark, curbuf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1464 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1465 add_mark(l, (char_u *)"'\"", &buf->b_last_cursor, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1466 add_mark(l, (char_u *)"'[", &buf->b_op_start, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1467 add_mark(l, (char_u *)"']", &buf->b_op_end, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1468 add_mark(l, (char_u *)"'^", &buf->b_last_insert, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1469 add_mark(l, (char_u *)"'.", &buf->b_last_change, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1470 add_mark(l, (char_u *)"'<", &buf->b_visual.vi_start, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1471 add_mark(l, (char_u *)"'>", &buf->b_visual.vi_end, buf->b_fnum, NULL); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1472 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1473 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1474 /* |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1475 * Get information about global marks ('A' to 'Z' and '0' to '9') |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1476 */ |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1477 static void |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1478 get_global_marks(list_T *l) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1479 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1480 char_u mname[3] = "' "; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1481 int i; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1482 char_u *name; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1483 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1484 // Marks 'A' to 'Z' and '0' to '9' |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1485 for (i = 0; i < NMARKS + EXTRA_MARKS; ++i) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1486 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1487 if (namedfm[i].fmark.fnum != 0) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1488 name = buflist_nr2name(namedfm[i].fmark.fnum, TRUE, TRUE); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1489 else |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1490 name = namedfm[i].fname; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1491 if (name != NULL) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1492 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1493 mname[1] = i >= NMARKS ? i - NMARKS + '0' : i + 'A'; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1494 add_mark(l, mname, &namedfm[i].fmark.mark, |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1495 namedfm[i].fmark.fnum, name); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1496 if (namedfm[i].fmark.fnum != 0) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1497 vim_free(name); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1498 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1499 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1500 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1501 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1502 /* |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1503 * getmarklist() function |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1504 */ |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1505 void |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1506 f_getmarklist(typval_T *argvars, typval_T *rettv) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1507 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1508 buf_T *buf = NULL; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1509 |
29239
da56650de132
patch 8.2.5138: various small issues
Bram Moolenaar <Bram@vim.org>
parents:
28388
diff
changeset
|
1510 if (rettv_list_alloc(rettv) == FAIL) |
20615
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1511 return; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1512 |
25384
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
1513 if (in_vim9script() && check_for_opt_buffer_arg(argvars, 0) == FAIL) |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
1514 return; |
e8e2c4d33b9b
patch 8.2.3229: Vim9: runtime and compile time type checks are not the same
Bram Moolenaar <Bram@vim.org>
parents:
25064
diff
changeset
|
1515 |
20615
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1516 if (argvars[0].v_type == VAR_UNKNOWN) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1517 { |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1518 get_global_marks(rettv->vval.v_list); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1519 return; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1520 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1521 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1522 buf = tv_get_buf(&argvars[0], FALSE); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1523 if (buf == NULL) |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1524 return; |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1525 |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1526 get_buf_local_marks(buf, rettv->vval.v_list); |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1527 } |
8eed1e9389bb
patch 8.2.0861: cannot easily get all the current marks
Bram Moolenaar <Bram@vim.org>
parents:
18979
diff
changeset
|
1528 #endif |