Mercurial > vim
annotate src/misc2.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 | 9e093c96dff6 |
children | 63e3334bcadb |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
9869
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 * misc2.c: Various functions. | |
12 */ | |
13 #include "vim.h" | |
14 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
15 static char_u *username = NULL; // cached result of mch_get_user_name() |
359 | 16 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
7664
diff
changeset
|
17 static int coladvance2(pos_T *pos, int addspaces, int finetune, colnr_T wcol); |
7 | 18 |
19 /* | |
20 * Return TRUE if in the current mode we need to use virtual. | |
21 */ | |
22 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
23 virtual_active(void) |
7 | 24 { |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
25 unsigned int cur_ve_flags = get_ve_flags(); |
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
26 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
27 // While an operator is being executed we return "virtual_op", because |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
28 // VIsual_active has already been reset, thus we can't check for "block" |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
29 // being used. |
7 | 30 if (virtual_op != MAYBE) |
31 return virtual_op; | |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
32 return (cur_ve_flags == VE_ALL |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
33 || ((cur_ve_flags & VE_BLOCK) && VIsual_active |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
34 && VIsual_mode == Ctrl_V) |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
35 || ((cur_ve_flags & VE_INSERT) && (State & MODE_INSERT))); |
7 | 36 } |
37 | |
38 /* | |
39 * Get the screen position of the cursor. | |
40 */ | |
41 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
42 getviscol(void) |
7 | 43 { |
44 colnr_T x; | |
45 | |
46 getvvcol(curwin, &curwin->w_cursor, &x, NULL, NULL); | |
47 return (int)x; | |
48 } | |
49 | |
50 /* | |
1209 | 51 * Go to column "wcol", and add/insert white space as necessary to get the |
7 | 52 * cursor in that column. |
53 * The caller must have saved the cursor line for undo! | |
54 */ | |
55 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
56 coladvance_force(colnr_T wcol) |
7 | 57 { |
58 int rc = coladvance2(&curwin->w_cursor, TRUE, FALSE, wcol); | |
59 | |
60 if (wcol == MAXCOL) | |
61 curwin->w_valid &= ~VALID_VIRTCOL; | |
62 else | |
63 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
64 // Virtcol is valid |
7 | 65 curwin->w_valid |= VALID_VIRTCOL; |
66 curwin->w_virtcol = wcol; | |
67 } | |
68 return rc; | |
69 } | |
70 | |
71 /* | |
15428
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
72 * Get the screen position of character col with a coladd in the cursor line. |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
73 */ |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
74 int |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
75 getviscol2(colnr_T col, colnr_T coladd UNUSED) |
15428
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
76 { |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
77 colnr_T x; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
78 pos_T pos; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
79 |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
80 pos.lnum = curwin->w_cursor.lnum; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
81 pos.col = col; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
82 pos.coladd = coladd; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
83 getvvcol(curwin, &pos, &x, NULL, NULL); |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
84 return (int)x; |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
85 } |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
86 |
eae582bfb293
patch 8.1.0722: cannot build without the virtualedit feature
Bram Moolenaar <Bram@vim.org>
parents:
15292
diff
changeset
|
87 /* |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
88 * Try to advance the Cursor to the specified screen column "wantcol". |
7 | 89 * If virtual editing: fine tune the cursor position. |
90 * Note that all virtual positions off the end of a line should share | |
91 * a curwin->w_cursor.col value (n.b. this is equal to STRLEN(line)), | |
92 * beginning at coladd 0. | |
93 * | |
94 * return OK if desired column is reached, FAIL if not | |
95 */ | |
96 int | |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
97 coladvance(colnr_T wantcol) |
7 | 98 { |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
99 int rc = getvpos(&curwin->w_cursor, wantcol); |
7 | 100 |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
101 if (wantcol == MAXCOL || rc == FAIL) |
7 | 102 curwin->w_valid &= ~VALID_VIRTCOL; |
44 | 103 else if (*ml_get_cursor() != TAB) |
7 | 104 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
105 // Virtcol is valid when not on a TAB |
7 | 106 curwin->w_valid |= VALID_VIRTCOL; |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
107 curwin->w_virtcol = wantcol; |
7 | 108 } |
109 return rc; | |
110 } | |
111 | |
112 /* | |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
113 * Return in "pos" the position of the cursor advanced to screen column |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
114 * "wantcol". |
7 | 115 * return OK if desired column is reached, FAIL if not |
116 */ | |
117 int | |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
118 getvpos(pos_T *pos, colnr_T wantcol) |
7 | 119 { |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
120 return coladvance2(pos, FALSE, virtual_active(), wantcol); |
7 | 121 } |
122 | |
123 static int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
124 coladvance2( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
125 pos_T *pos, |
18291
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
126 int addspaces, // change the text to achieve our goal? |
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
127 int finetune, // change char offset for the exact column |
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
128 colnr_T wcol_arg) // column to move to (can be negative) |
7 | 129 { |
18291
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
130 colnr_T wcol = wcol_arg; |
7 | 131 int idx; |
132 char_u *line; | |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
133 int linelen; |
7 | 134 colnr_T col = 0; |
135 int csize = 0; | |
136 int one_more; | |
137 #ifdef FEAT_LINEBREAK | |
138 int head = 0; | |
139 #endif | |
140 | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
141 one_more = (State & MODE_INSERT) |
772 | 142 || restart_edit != NUL |
143 || (VIsual_active && *p_sel != 'o') | |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
144 || ((get_ve_flags() & VE_ONEMORE) && wcol < MAXCOL); |
1982 | 145 line = ml_get_buf(curbuf, pos->lnum, FALSE); |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
146 linelen = ml_get_buf_len(curbuf, pos->lnum); |
7 | 147 |
148 if (wcol >= MAXCOL) | |
149 { | |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
150 idx = linelen - 1 + one_more; |
7 | 151 col = wcol; |
152 | |
153 if ((addspaces || finetune) && !VIsual_active) | |
154 { | |
33000
bc3b293a965c
patch 9.0.1792: problem with gj/gk/gM and virtual text
Christian Brabandt <cb@256bit.org>
parents:
32138
diff
changeset
|
155 curwin->w_curswant = linetabsize(curwin, pos->lnum) + one_more; |
7 | 156 if (curwin->w_curswant > 0) |
157 --curwin->w_curswant; | |
158 } | |
159 } | |
160 else | |
161 { | |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
162 int width = curwin->w_width - win_col_off(curwin); |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
163 chartabsize_T cts; |
7 | 164 |
620 | 165 if (finetune |
7 | 166 && curwin->w_p_wrap |
167 && curwin->w_width != 0 | |
25642
b46214b82d6e
patch 8.2.3357: crash when 'virtualedit' is set and window is narrow
Bram Moolenaar <Bram@vim.org>
parents:
25529
diff
changeset
|
168 && wcol >= (colnr_T)width |
b46214b82d6e
patch 8.2.3357: crash when 'virtualedit' is set and window is narrow
Bram Moolenaar <Bram@vim.org>
parents:
25529
diff
changeset
|
169 && width > 0) |
7 | 170 { |
33000
bc3b293a965c
patch 9.0.1792: problem with gj/gk/gM and virtual text
Christian Brabandt <cb@256bit.org>
parents:
32138
diff
changeset
|
171 csize = linetabsize(curwin, pos->lnum); |
7 | 172 if (csize > 0) |
173 csize--; | |
174 | |
620 | 175 if (wcol / width > (colnr_T)csize / width |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
176 && ((State & MODE_INSERT) == 0 || (int)wcol > csize + 1)) |
7 | 177 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
178 // In case of line wrapping don't move the cursor beyond the |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
179 // right screen edge. In Insert mode allow going just beyond |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
180 // the last character (like what happens when typing and |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
181 // reaching the right window edge). |
7 | 182 wcol = (csize / width + 1) * width - 1; |
183 } | |
184 } | |
185 | |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
186 init_chartabsize_arg(&cts, curwin, pos->lnum, 0, line, line); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
187 while (cts.cts_vcol <= wcol && *cts.cts_ptr != NUL) |
7 | 188 { |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
189 #ifdef FEAT_PROP_POPUP |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
190 int at_start = cts.cts_ptr == cts.cts_line; |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
191 #endif |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
192 // Count a tab for what it's worth (if list mode not on) |
7 | 193 #ifdef FEAT_LINEBREAK |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
194 csize = win_lbr_chartabsize(&cts, &head); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
195 MB_PTR_ADV(cts.cts_ptr); |
7 | 196 #else |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
197 csize = lbr_chartabsize_adv(&cts); |
7 | 198 #endif |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
199 cts.cts_vcol += csize; |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
200 #ifdef FEAT_PROP_POPUP |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
201 if (at_start) |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
202 // do not count the columns for virtual text above |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
203 cts.cts_vcol -= cts.cts_first_char; |
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
204 #endif |
7 | 205 } |
29451
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
206 col = cts.cts_vcol; |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
207 idx = (int)(cts.cts_ptr - line); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
208 clear_chartabsize_arg(&cts); |
057c26b5c33a
patch 9.0.0067: cannot show virtual text
Bram Moolenaar <Bram@vim.org>
parents:
28893
diff
changeset
|
209 |
7 | 210 /* |
211 * Handle all the special cases. The virtual_active() check | |
212 * is needed to ensure that a virtual position off the end of | |
213 * a line has the correct indexing. The one_more comparison | |
214 * replaces an explicit add of one_more later on. | |
215 */ | |
216 if (col > wcol || (!virtual_active() && one_more == 0)) | |
217 { | |
218 idx -= 1; | |
219 # ifdef FEAT_LINEBREAK | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
220 // Don't count the chars from 'showbreak'. |
7 | 221 csize -= head; |
222 # endif | |
223 col -= csize; | |
224 } | |
225 | |
226 if (virtual_active() | |
227 && addspaces | |
18291
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
228 && wcol >= 0 |
7 | 229 && ((col != wcol && col != wcol + 1) || csize > 1)) |
230 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
231 // 'virtualedit' is set: The difference between wcol and col is |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
232 // filled with spaces. |
7 | 233 |
234 if (line[idx] == NUL) | |
235 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
236 // Append spaces |
7 | 237 int correct = wcol - col; |
238 char_u *newline = alloc(idx + correct + 1); | |
239 int t; | |
240 | |
241 if (newline == NULL) | |
242 return FAIL; | |
243 | |
244 for (t = 0; t < idx; ++t) | |
245 newline[t] = line[t]; | |
246 | |
247 for (t = 0; t < correct; ++t) | |
248 newline[t + idx] = ' '; | |
249 | |
250 newline[idx + correct] = NUL; | |
251 | |
252 ml_replace(pos->lnum, newline, FALSE); | |
253 changed_bytes(pos->lnum, (colnr_T)idx); | |
254 idx += correct; | |
255 col = wcol; | |
256 } | |
257 else | |
258 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
259 // Break a tab |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
260 int correct = wcol - col - csize + 1; // negative!! |
840 | 261 char_u *newline; |
7 | 262 int t, s = 0; |
263 int v; | |
264 | |
840 | 265 if (-correct > csize) |
266 return FAIL; | |
267 | |
268 newline = alloc(linelen + csize); | |
269 if (newline == NULL) | |
7 | 270 return FAIL; |
271 | |
272 for (t = 0; t < linelen; t++) | |
273 { | |
274 if (t != idx) | |
275 newline[s++] = line[t]; | |
276 else | |
277 for (v = 0; v < csize; v++) | |
278 newline[s++] = ' '; | |
279 } | |
280 | |
281 newline[linelen + csize - 1] = NUL; | |
282 | |
283 ml_replace(pos->lnum, newline, FALSE); | |
284 changed_bytes(pos->lnum, idx); | |
285 idx += (csize - 1 + correct); | |
286 col += correct; | |
287 } | |
288 } | |
289 } | |
290 | |
291 if (idx < 0) | |
292 pos->col = 0; | |
293 else | |
294 pos->col = idx; | |
295 | |
296 pos->coladd = 0; | |
297 | |
298 if (finetune) | |
299 { | |
300 if (wcol == MAXCOL) | |
301 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
302 // The width of the last character is used to set coladd. |
7 | 303 if (!one_more) |
304 { | |
305 colnr_T scol, ecol; | |
306 | |
307 getvcol(curwin, pos, &scol, NULL, &ecol); | |
308 pos->coladd = ecol - scol; | |
309 } | |
310 } | |
311 else | |
312 { | |
313 int b = (int)wcol - (int)col; | |
314 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
315 // The difference between wcol and col is used to set coladd. |
12515
972ea22c946f
patch 8.0.1136: W_WIDTH() is always the same
Christian Brabandt <cb@256bit.org>
parents:
12477
diff
changeset
|
316 if (b > 0 && b < (MAXCOL - 2 * curwin->w_width)) |
7 | 317 pos->coladd = b; |
318 | |
319 col += b; | |
320 } | |
321 } | |
322 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
323 // prevent from moving onto a trail byte |
7 | 324 if (has_mbyte) |
2933 | 325 mb_adjustpos(curbuf, pos); |
7 | 326 |
18291
11f68eb58fda
patch 8.1.2140: "gk" and "gj" do not work correctly in number column
Bram Moolenaar <Bram@vim.org>
parents:
18195
diff
changeset
|
327 if (wcol < 0 || col < wcol) |
7 | 328 return FAIL; |
329 return OK; | |
330 } | |
331 | |
332 /* | |
1621 | 333 * Increment the cursor position. See inc() for return values. |
7 | 334 */ |
335 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
336 inc_cursor(void) |
7 | 337 { |
338 return inc(&curwin->w_cursor); | |
339 } | |
340 | |
1621 | 341 /* |
342 * Increment the line pointer "lp" crossing line boundaries as necessary. | |
343 * Return 1 when going to the next line. | |
344 * Return 2 when moving forward onto a NUL at the end of the line). | |
345 * Return -1 when at the end of file. | |
346 * Return 0 otherwise. | |
347 */ | |
7 | 348 int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
349 inc(pos_T *lp) |
7 | 350 { |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
351 char_u *p; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
352 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
353 // when searching position may be set to end of a line |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
354 if (lp->col != MAXCOL) |
7 | 355 { |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
356 p = ml_get_pos(lp); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
357 if (*p != NUL) // still within line, move to next char (may be NUL) |
7 | 358 { |
13082
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
359 if (has_mbyte) |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
360 { |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
361 int l = (*mb_ptr2len)(p); |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
362 |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
363 lp->col += l; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
364 return ((p[l] != NUL) ? 0 : 2); |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
365 } |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
366 lp->col++; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
367 lp->coladd = 0; |
a80082fd1a1d
patch 8.0.1416: crash when searching for a sentence
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
368 return ((p[1] != NUL) ? 0 : 2); |
7 | 369 } |
370 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
371 if (lp->lnum != curbuf->b_ml.ml_line_count) // there is a next line |
7 | 372 { |
373 lp->col = 0; | |
374 lp->lnum++; | |
375 lp->coladd = 0; | |
376 return 1; | |
377 } | |
378 return -1; | |
379 } | |
380 | |
381 /* | |
382 * incl(lp): same as inc(), but skip the NUL at the end of non-empty lines | |
383 */ | |
384 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
385 incl(pos_T *lp) |
7 | 386 { |
387 int r; | |
388 | |
389 if ((r = inc(lp)) >= 1 && lp->col) | |
390 r = inc(lp); | |
391 return r; | |
392 } | |
393 | |
394 /* | |
395 * dec(p) | |
396 * | |
397 * Decrement the line pointer 'p' crossing line boundaries as necessary. | |
398 * Return 1 when crossing a line, -1 when at start of file, 0 otherwise. | |
399 */ | |
400 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
401 dec_cursor(void) |
7 | 402 { |
10549
055b1633aed7
patch 8.0.0164: outdated and misplaced comments
Christian Brabandt <cb@256bit.org>
parents:
10449
diff
changeset
|
403 return dec(&curwin->w_cursor); |
7 | 404 } |
405 | |
406 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
407 dec(pos_T *lp) |
7 | 408 { |
409 char_u *p; | |
410 | |
411 lp->coladd = 0; | |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
412 if (lp->col == MAXCOL) |
7 | 413 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
414 // past end of line |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
415 p = ml_get(lp->lnum); |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
416 lp->col = ml_get_len(lp->lnum); |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
417 if (has_mbyte) |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
418 lp->col -= (*mb_head_off)(p, p + lp->col); |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
419 return 0; |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
420 } |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
421 |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
422 if (lp->col > 0) |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
423 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
424 // still within line |
7 | 425 lp->col--; |
426 if (has_mbyte) | |
427 { | |
428 p = ml_get(lp->lnum); | |
429 lp->col -= (*mb_head_off)(p, p + lp->col); | |
430 } | |
431 return 0; | |
432 } | |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
433 |
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
434 if (lp->lnum > 1) |
7 | 435 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
436 // there is a prior line |
7 | 437 lp->lnum--; |
438 p = ml_get(lp->lnum); | |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
439 lp->col = ml_get_len(lp->lnum); |
7 | 440 if (has_mbyte) |
441 lp->col -= (*mb_head_off)(p, p + lp->col); | |
442 return 1; | |
443 } | |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
444 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
445 // at start of file |
13084
25ab78f14c8b
patch 8.0.1417: test doesn't search for a sentence
Christian Brabandt <cb@256bit.org>
parents:
13082
diff
changeset
|
446 return -1; |
7 | 447 } |
448 | |
449 /* | |
450 * decl(lp): same as dec(), but skip the NUL at the end of non-empty lines | |
451 */ | |
452 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
453 decl(pos_T *lp) |
7 | 454 { |
455 int r; | |
456 | |
457 if ((r = dec(lp)) == 1 && lp->col) | |
458 r = dec(lp); | |
459 return r; | |
460 } | |
461 | |
462 /* | |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
463 * Get the line number relative to the current cursor position, i.e. the |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
464 * difference between line number and cursor position. Only look for lines that |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
465 * can be visible, folded lines don't count. |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
466 */ |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
467 linenr_T |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
468 get_cursor_rel_lnum( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
469 win_T *wp, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
470 linenr_T lnum) // line number to get the result for |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
471 { |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
472 linenr_T cursor = wp->w_cursor.lnum; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
473 linenr_T retval = 0; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
474 |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
475 #ifdef FEAT_FOLDING |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
476 if (hasAnyFolding(wp)) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
477 { |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
478 if (lnum > cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
479 { |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
480 while (lnum > cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
481 { |
5564 | 482 (void)hasFoldingWin(wp, lnum, &lnum, NULL, TRUE, NULL); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
483 // if lnum and cursor are in the same fold, |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
484 // now lnum <= cursor |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
485 if (lnum > cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
486 retval++; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
487 lnum--; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
488 } |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
489 } |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
490 else if (lnum < cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
491 { |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
492 while (lnum < cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
493 { |
5564 | 494 (void)hasFoldingWin(wp, lnum, NULL, &lnum, TRUE, NULL); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
495 // if lnum and cursor are in the same fold, |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
496 // now lnum >= cursor |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
497 if (lnum < cursor) |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
498 retval--; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
499 lnum++; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
500 } |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
501 } |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
502 // else if (lnum == cursor) |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
503 // retval = 0; |
2178
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
504 } |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
505 else |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
506 #endif |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
507 retval = lnum - cursor; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
508 |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
509 return retval; |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
510 } |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
511 |
c6f1aa1e9f32
Add 'relativenumber' patch from Markus Heidelberg.
Bram Moolenaar <bram@vim.org>
parents:
2027
diff
changeset
|
512 /* |
10110
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
513 * Make sure "pos.lnum" and "pos.col" are valid in "buf". |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
514 * This allows for the col to be on the NUL byte. |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
515 */ |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
516 void |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
517 check_pos(buf_T *buf, pos_T *pos) |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
518 { |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
519 colnr_T len; |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
520 |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
521 if (pos->lnum > buf->b_ml.ml_line_count) |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
522 pos->lnum = buf->b_ml.ml_line_count; |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
523 |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
524 if (pos->col > 0) |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
525 { |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
526 len = ml_get_buf_len(buf, pos->lnum); |
10110
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
527 if (pos->col > len) |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
528 pos->col = len; |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
529 } |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
530 } |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
531 |
cfb38b57d407
commit https://github.com/vim/vim/commit/d5824ce1b5491df7d2eb0b66189d366fa67b4585
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
532 /* |
7 | 533 * Make sure curwin->w_cursor.lnum is valid. |
534 */ | |
535 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
536 check_cursor_lnum(void) |
7 | 537 { |
538 if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count) | |
539 { | |
540 #ifdef FEAT_FOLDING | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
541 // If there is a closed fold at the end of the file, put the cursor in |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
542 // its first line. Otherwise in the last line. |
7 | 543 if (!hasFolding(curbuf->b_ml.ml_line_count, |
544 &curwin->w_cursor.lnum, NULL)) | |
545 #endif | |
546 curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count; | |
547 } | |
548 if (curwin->w_cursor.lnum <= 0) | |
549 curwin->w_cursor.lnum = 1; | |
550 } | |
551 | |
552 /* | |
553 * Make sure curwin->w_cursor.col is valid. | |
554 */ | |
555 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
556 check_cursor_col(void) |
7 | 557 { |
2933 | 558 check_cursor_col_win(curwin); |
559 } | |
560 | |
561 /* | |
562 * Make sure win->w_cursor.col is valid. | |
563 */ | |
564 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
565 check_cursor_col_win(win_T *win) |
2933 | 566 { |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
567 colnr_T len; |
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
568 colnr_T oldcol = win->w_cursor.col; |
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
569 colnr_T oldcoladd = win->w_cursor.col + win->w_cursor.coladd; |
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
570 unsigned int cur_ve_flags = get_ve_flags(); |
2933 | 571 |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
572 len = ml_get_buf_len(win->w_buffer, win->w_cursor.lnum); |
7 | 573 if (len == 0) |
2933 | 574 win->w_cursor.col = 0; |
575 else if (win->w_cursor.col >= len) | |
7 | 576 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
577 // Allow cursor past end-of-line when: |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
578 // - in Insert mode or restarting Insert mode |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
579 // - in Visual mode and 'selection' isn't "old" |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
580 // - 'virtualedit' is set |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
581 if ((State & MODE_INSERT) || restart_edit |
7 | 582 || (VIsual_active && *p_sel != 'o') |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
583 || (cur_ve_flags & VE_ONEMORE) |
7 | 584 || virtual_active()) |
2933 | 585 win->w_cursor.col = len; |
7 | 586 else |
1099 | 587 { |
2933 | 588 win->w_cursor.col = len - 1; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
589 // Move the cursor to the head byte. |
1099 | 590 if (has_mbyte) |
2933 | 591 mb_adjustpos(win->w_buffer, &win->w_cursor); |
1099 | 592 } |
7 | 593 } |
2933 | 594 else if (win->w_cursor.col < 0) |
595 win->w_cursor.col = 0; | |
7 | 596 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
597 // If virtual editing is on, we can leave the cursor on the old position, |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
598 // only we must set it to virtual. But don't do it when at the end of the |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
599 // line. |
7 | 600 if (oldcol == MAXCOL) |
2933 | 601 win->w_cursor.coladd = 0; |
25380
ac88cd21ae88
patch 8.2.3227: 'virtualedit' can only be set globally
Bram Moolenaar <Bram@vim.org>
parents:
25206
diff
changeset
|
602 else if (cur_ve_flags == VE_ALL) |
1841 | 603 { |
2933 | 604 if (oldcoladd > win->w_cursor.col) |
12164
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
605 { |
2933 | 606 win->w_cursor.coladd = oldcoladd - win->w_cursor.col; |
12279
57e0b701611e
patch 8.0.1019: pasting in virtual edit happens in the wrong place
Christian Brabandt <cb@256bit.org>
parents:
12240
diff
changeset
|
607 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
608 // Make sure that coladd is not more than the char width. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
609 // Not for the last character, coladd is then used when the cursor |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
610 // is actually after the last character. |
28169
bef82285dda0
patch 8.2.4610: some conditions are always true
Bram Moolenaar <Bram@vim.org>
parents:
27617
diff
changeset
|
611 if (win->w_cursor.col + 1 < len) |
12164
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
612 { |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
613 int cs, ce; |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
614 |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
615 getvcol(win, &win->w_cursor, &cs, NULL, &ce); |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
616 if (win->w_cursor.coladd > ce - cs) |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
617 win->w_cursor.coladd = ce - cs; |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
618 } |
5d82470552ce
patch 8.0.0962: crash with virtualedit and joining lines
Christian Brabandt <cb@256bit.org>
parents:
11737
diff
changeset
|
619 } |
1841 | 620 else |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
621 // avoid weird number when there is a miscalculation or overflow |
2933 | 622 win->w_cursor.coladd = 0; |
1841 | 623 } |
7 | 624 } |
625 | |
626 /* | |
627 * make sure curwin->w_cursor in on a valid character | |
628 */ | |
629 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
630 check_cursor(void) |
7 | 631 { |
632 check_cursor_lnum(); | |
633 check_cursor_col(); | |
634 } | |
635 | |
28893
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
636 /* |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
637 * Check if VIsual position is valid, correct it if not. |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
638 * Can be called when in Visual mode and a change has been made. |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
639 */ |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
640 void |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
641 check_visual_pos(void) |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
642 { |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
643 if (VIsual.lnum > curbuf->b_ml.ml_line_count) |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
644 { |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
645 VIsual.lnum = curbuf->b_ml.ml_line_count; |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
646 VIsual.col = 0; |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
647 VIsual.coladd = 0; |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
648 } |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
649 else |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
650 { |
34540
9e093c96dff6
patch 9.1.0172: More code can use ml_get_buf_len() instead of STRLEN()
Christian Brabandt <cb@256bit.org>
parents:
34269
diff
changeset
|
651 int len = ml_get_len(VIsual.lnum); |
28893
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
652 |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
653 if (VIsual.col > len) |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
654 { |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
655 VIsual.col = len; |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
656 VIsual.coladd = 0; |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
657 } |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
658 } |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
659 } |
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
660 |
7 | 661 /* |
662 * Make sure curwin->w_cursor is not on the NUL at the end of the line. | |
663 * Allow it when in Visual mode and 'selection' is not "old". | |
664 */ | |
665 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
666 adjust_cursor_col(void) |
7 | 667 { |
668 if (curwin->w_cursor.col > 0 | |
669 && (!VIsual_active || *p_sel == 'o') | |
670 && gchar_cursor() == NUL) | |
671 --curwin->w_cursor.col; | |
672 } | |
673 | |
674 /* | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
675 * Set "curwin->w_leftcol" to "leftcol". |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
676 * Adjust the cursor position if needed. |
7 | 677 * Return TRUE if the cursor was moved. |
678 */ | |
679 int | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
680 set_leftcol(colnr_T leftcol) |
7 | 681 { |
682 int retval = FALSE; | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
683 |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
684 // Return quickly when there is no change. |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
685 if (curwin->w_leftcol == leftcol) |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
686 return FALSE; |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
687 curwin->w_leftcol = leftcol; |
7 | 688 |
689 changed_cline_bef_curs(); | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
690 long lastcol = curwin->w_leftcol + curwin->w_width - curwin_col_off() - 1; |
7 | 691 validate_virtcol(); |
692 | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
693 // If the cursor is right or left of the screen, move it to last or first |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
694 // visible character. |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
695 long siso = get_sidescrolloff_value(); |
15713
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15675
diff
changeset
|
696 if (curwin->w_virtcol > (colnr_T)(lastcol - siso)) |
7 | 697 { |
698 retval = TRUE; | |
15713
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15675
diff
changeset
|
699 coladvance((colnr_T)(lastcol - siso)); |
7 | 700 } |
15713
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15675
diff
changeset
|
701 else if (curwin->w_virtcol < curwin->w_leftcol + siso) |
7 | 702 { |
703 retval = TRUE; | |
15713
ad8b2c109b22
patch 8.1.0864: cannot have a local value for 'scrolloff' and 'sidescrolloff'
Bram Moolenaar <Bram@vim.org>
parents:
15675
diff
changeset
|
704 (void)coladvance((colnr_T)(curwin->w_leftcol + siso)); |
7 | 705 } |
706 | |
31133
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
707 // If the start of the character under the cursor is not on the screen, |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
708 // advance the cursor one more char. If this fails (last char of the |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
709 // line) adjust the scrolling. |
cc0c4141fb73
patch 9.0.0901: setting w_leftcol and handling side effects is confusing
Bram Moolenaar <Bram@vim.org>
parents:
31093
diff
changeset
|
710 colnr_T s, e; |
7 | 711 getvvcol(curwin, &curwin->w_cursor, &s, NULL, &e); |
712 if (e > (colnr_T)lastcol) | |
713 { | |
714 retval = TRUE; | |
715 coladvance(s - 1); | |
716 } | |
717 else if (s < curwin->w_leftcol) | |
718 { | |
719 retval = TRUE; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
720 if (coladvance(e + 1) == FAIL) // there isn't another character |
7 | 721 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
722 curwin->w_leftcol = s; // adjust w_leftcol instead |
7 | 723 changed_cline_bef_curs(); |
724 } | |
725 } | |
726 | |
727 if (retval) | |
728 curwin->w_set_curswant = TRUE; | |
29732
89e1d67814a9
patch 9.0.0206: redraw flags are not named specifically
Bram Moolenaar <Bram@vim.org>
parents:
29451
diff
changeset
|
729 redraw_later(UPD_NOT_VALID); |
7 | 730 return retval; |
731 } | |
732 | |
15292
ba6f0f1bb9d0
patch 8.1.0654: when deleting a line text property flags are not adjusted
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
733 /* |
7 | 734 * Isolate one part of a string option where parts are separated with |
735 * "sep_chars". | |
459 | 736 * The part is copied into "buf[maxlen]". |
7 | 737 * "*option" is advanced to the next part. |
738 * The length is returned. | |
739 */ | |
740 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
741 copy_option_part( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
742 char_u **option, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
743 char_u *buf, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
744 int maxlen, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
745 char *sep_chars) |
7 | 746 { |
747 int len = 0; | |
748 char_u *p = *option; | |
749 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
750 // skip '.' at start of option part, for 'suffixes' |
7 | 751 if (*p == '.') |
752 buf[len++] = *p++; | |
753 while (*p != NUL && vim_strchr((char_u *)sep_chars, *p) == NULL) | |
754 { | |
755 /* | |
756 * Skip backslash before a separator character and space. | |
757 */ | |
758 if (p[0] == '\\' && vim_strchr((char_u *)sep_chars, p[1]) != NULL) | |
759 ++p; | |
760 if (len < maxlen - 1) | |
761 buf[len++] = *p; | |
762 ++p; | |
763 } | |
764 buf[len] = NUL; | |
765 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
766 if (*p != NUL && *p != ',') // skip non-standard separator |
7 | 767 ++p; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
768 p = skip_to_option_part(p); // p points to next file name |
7 | 769 |
770 *option = p; | |
771 return len; | |
772 } | |
773 | |
774 #ifndef HAVE_MEMSET | |
775 void * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
776 vim_memset(void *ptr, int c, size_t size) |
7 | 777 { |
778 char *p = ptr; | |
779 | |
780 while (size-- > 0) | |
781 *p++ = c; | |
782 return ptr; | |
783 } | |
784 #endif | |
785 | |
786 /* | |
787 * Vim has its own isspace() function, because on some machines isspace() | |
788 * can't handle characters above 128. | |
789 */ | |
790 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
791 vim_isspace(int x) |
7 | 792 { |
793 return ((x >= 9 && x <= 13) || x == ' '); | |
794 } | |
795 | |
796 /************************************************************************ | |
797 * functions that use lookup tables for various things, generally to do with | |
798 * special key codes. | |
799 */ | |
800 | |
801 /* | |
802 * Some useful tables. | |
803 */ | |
804 | |
805 static struct modmasktable | |
806 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
807 short mod_mask; // Bit-mask for particular key modifier |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
808 short mod_flag; // Bit(s) for particular key modifier |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
809 char_u name; // Single letter name of modifier |
7 | 810 } mod_mask_table[] = |
811 { | |
812 {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'M'}, | |
179 | 813 {MOD_MASK_META, MOD_MASK_META, (char_u)'T'}, |
7 | 814 {MOD_MASK_CTRL, MOD_MASK_CTRL, (char_u)'C'}, |
815 {MOD_MASK_SHIFT, MOD_MASK_SHIFT, (char_u)'S'}, | |
816 {MOD_MASK_MULTI_CLICK, MOD_MASK_2CLICK, (char_u)'2'}, | |
817 {MOD_MASK_MULTI_CLICK, MOD_MASK_3CLICK, (char_u)'3'}, | |
818 {MOD_MASK_MULTI_CLICK, MOD_MASK_4CLICK, (char_u)'4'}, | |
34219
a0a4a774117b
patch 9.1.0058: Cannot map Super Keys in GTK UI
Christian Brabandt <cb@256bit.org>
parents:
33000
diff
changeset
|
819 #if defined(MACOS_X) || defined(FEAT_GUI_GTK) |
7 | 820 {MOD_MASK_CMD, MOD_MASK_CMD, (char_u)'D'}, |
821 #endif | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
822 // 'A' must be the last one |
7 | 823 {MOD_MASK_ALT, MOD_MASK_ALT, (char_u)'A'}, |
824 {0, 0, NUL} | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
825 // NOTE: when adding an entry, update MAX_KEY_NAME_LEN! |
7 | 826 }; |
827 | |
828 /* | |
829 * Shifted key terminal codes and their unshifted equivalent. | |
1209 | 830 * Don't add mouse codes here, they are handled separately! |
7 | 831 */ |
832 #define MOD_KEYS_ENTRY_SIZE 5 | |
833 | |
834 static char_u modifier_keys_table[] = | |
835 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
836 // mod mask with modifier without modifier |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
837 MOD_MASK_SHIFT, '&', '9', '@', '1', // begin |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
838 MOD_MASK_SHIFT, '&', '0', '@', '2', // cancel |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
839 MOD_MASK_SHIFT, '*', '1', '@', '4', // command |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
840 MOD_MASK_SHIFT, '*', '2', '@', '5', // copy |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
841 MOD_MASK_SHIFT, '*', '3', '@', '6', // create |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
842 MOD_MASK_SHIFT, '*', '4', 'k', 'D', // delete char |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
843 MOD_MASK_SHIFT, '*', '5', 'k', 'L', // delete line |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
844 MOD_MASK_SHIFT, '*', '7', '@', '7', // end |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
845 MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_END, '@', '7', // end |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
846 MOD_MASK_SHIFT, '*', '9', '@', '9', // exit |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
847 MOD_MASK_SHIFT, '*', '0', '@', '0', // find |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
848 MOD_MASK_SHIFT, '#', '1', '%', '1', // help |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
849 MOD_MASK_SHIFT, '#', '2', 'k', 'h', // home |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
850 MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_HOME, 'k', 'h', // home |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
851 MOD_MASK_SHIFT, '#', '3', 'k', 'I', // insert |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
852 MOD_MASK_SHIFT, '#', '4', 'k', 'l', // left arrow |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
853 MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_LEFT, 'k', 'l', // left arrow |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
854 MOD_MASK_SHIFT, '%', 'a', '%', '3', // message |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
855 MOD_MASK_SHIFT, '%', 'b', '%', '4', // move |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
856 MOD_MASK_SHIFT, '%', 'c', '%', '5', // next |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
857 MOD_MASK_SHIFT, '%', 'd', '%', '7', // options |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
858 MOD_MASK_SHIFT, '%', 'e', '%', '8', // previous |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
859 MOD_MASK_SHIFT, '%', 'f', '%', '9', // print |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
860 MOD_MASK_SHIFT, '%', 'g', '%', '0', // redo |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
861 MOD_MASK_SHIFT, '%', 'h', '&', '3', // replace |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
862 MOD_MASK_SHIFT, '%', 'i', 'k', 'r', // right arr. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
863 MOD_MASK_CTRL, KS_EXTRA, (int)KE_C_RIGHT, 'k', 'r', // right arr. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
864 MOD_MASK_SHIFT, '%', 'j', '&', '5', // resume |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
865 MOD_MASK_SHIFT, '!', '1', '&', '6', // save |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
866 MOD_MASK_SHIFT, '!', '2', '&', '7', // suspend |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
867 MOD_MASK_SHIFT, '!', '3', '&', '8', // undo |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
868 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_UP, 'k', 'u', // up arrow |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
869 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_DOWN, 'k', 'd', // down arrow |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
870 |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
871 // vt100 F1 |
7 | 872 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF1, KS_EXTRA, (int)KE_XF1, |
873 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF2, KS_EXTRA, (int)KE_XF2, | |
874 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF3, KS_EXTRA, (int)KE_XF3, | |
875 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_XF4, KS_EXTRA, (int)KE_XF4, | |
876 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
877 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F1, 'k', '1', // F1 |
7 | 878 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F2, 'k', '2', |
879 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F3, 'k', '3', | |
880 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F4, 'k', '4', | |
881 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F5, 'k', '5', | |
882 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F6, 'k', '6', | |
883 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F7, 'k', '7', | |
884 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F8, 'k', '8', | |
885 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F9, 'k', '9', | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
886 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F10, 'k', ';', // F10 |
7 | 887 |
888 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F11, 'F', '1', | |
889 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F12, 'F', '2', | |
890 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F13, 'F', '3', | |
891 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F14, 'F', '4', | |
892 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F15, 'F', '5', | |
893 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F16, 'F', '6', | |
894 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F17, 'F', '7', | |
895 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F18, 'F', '8', | |
896 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F19, 'F', '9', | |
897 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F20, 'F', 'A', | |
898 | |
899 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F21, 'F', 'B', | |
900 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F22, 'F', 'C', | |
901 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F23, 'F', 'D', | |
902 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F24, 'F', 'E', | |
903 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F25, 'F', 'F', | |
904 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F26, 'F', 'G', | |
905 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F27, 'F', 'H', | |
906 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F28, 'F', 'I', | |
907 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F29, 'F', 'J', | |
908 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F30, 'F', 'K', | |
909 | |
910 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F31, 'F', 'L', | |
911 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F32, 'F', 'M', | |
912 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F33, 'F', 'N', | |
913 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F34, 'F', 'O', | |
914 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F35, 'F', 'P', | |
915 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F36, 'F', 'Q', | |
916 MOD_MASK_SHIFT, KS_EXTRA, (int)KE_S_F37, 'F', 'R', | |
917 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
918 // TAB pseudo code |
7 | 919 MOD_MASK_SHIFT, 'k', 'B', KS_EXTRA, (int)KE_TAB, |
920 | |
921 NUL | |
922 }; | |
923 | |
924 static struct key_name_entry | |
925 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
926 int key; // Special key code or ascii value |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
927 char_u *name; // Name of key |
7 | 928 } key_names_table[] = |
929 { | |
930 {' ', (char_u *)"Space"}, | |
931 {TAB, (char_u *)"Tab"}, | |
932 {K_TAB, (char_u *)"Tab"}, | |
933 {NL, (char_u *)"NL"}, | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
934 {NL, (char_u *)"NewLine"}, // Alternative name |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
935 {NL, (char_u *)"LineFeed"}, // Alternative name |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
936 {NL, (char_u *)"LF"}, // Alternative name |
7 | 937 {CAR, (char_u *)"CR"}, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
938 {CAR, (char_u *)"Return"}, // Alternative name |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
939 {CAR, (char_u *)"Enter"}, // Alternative name |
7 | 940 {K_BS, (char_u *)"BS"}, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
941 {K_BS, (char_u *)"BackSpace"}, // Alternative name |
7 | 942 {ESC, (char_u *)"Esc"}, |
943 {CSI, (char_u *)"CSI"}, | |
944 {K_CSI, (char_u *)"xCSI"}, | |
945 {'|', (char_u *)"Bar"}, | |
946 {'\\', (char_u *)"Bslash"}, | |
947 {K_DEL, (char_u *)"Del"}, | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
948 {K_DEL, (char_u *)"Delete"}, // Alternative name |
7 | 949 {K_KDEL, (char_u *)"kDel"}, |
950 {K_UP, (char_u *)"Up"}, | |
951 {K_DOWN, (char_u *)"Down"}, | |
952 {K_LEFT, (char_u *)"Left"}, | |
953 {K_RIGHT, (char_u *)"Right"}, | |
180 | 954 {K_XUP, (char_u *)"xUp"}, |
955 {K_XDOWN, (char_u *)"xDown"}, | |
956 {K_XLEFT, (char_u *)"xLeft"}, | |
957 {K_XRIGHT, (char_u *)"xRight"}, | |
10640
27be410d6d29
patch 8.0.0210: no support for bracketed paste
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
958 {K_PS, (char_u *)"PasteStart"}, |
27be410d6d29
patch 8.0.0210: no support for bracketed paste
Christian Brabandt <cb@256bit.org>
parents:
10549
diff
changeset
|
959 {K_PE, (char_u *)"PasteEnd"}, |
7 | 960 |
961 {K_F1, (char_u *)"F1"}, | |
962 {K_F2, (char_u *)"F2"}, | |
963 {K_F3, (char_u *)"F3"}, | |
964 {K_F4, (char_u *)"F4"}, | |
965 {K_F5, (char_u *)"F5"}, | |
966 {K_F6, (char_u *)"F6"}, | |
967 {K_F7, (char_u *)"F7"}, | |
968 {K_F8, (char_u *)"F8"}, | |
969 {K_F9, (char_u *)"F9"}, | |
970 {K_F10, (char_u *)"F10"}, | |
971 | |
972 {K_F11, (char_u *)"F11"}, | |
973 {K_F12, (char_u *)"F12"}, | |
974 {K_F13, (char_u *)"F13"}, | |
975 {K_F14, (char_u *)"F14"}, | |
976 {K_F15, (char_u *)"F15"}, | |
977 {K_F16, (char_u *)"F16"}, | |
978 {K_F17, (char_u *)"F17"}, | |
979 {K_F18, (char_u *)"F18"}, | |
980 {K_F19, (char_u *)"F19"}, | |
981 {K_F20, (char_u *)"F20"}, | |
982 | |
983 {K_F21, (char_u *)"F21"}, | |
984 {K_F22, (char_u *)"F22"}, | |
985 {K_F23, (char_u *)"F23"}, | |
986 {K_F24, (char_u *)"F24"}, | |
987 {K_F25, (char_u *)"F25"}, | |
988 {K_F26, (char_u *)"F26"}, | |
989 {K_F27, (char_u *)"F27"}, | |
990 {K_F28, (char_u *)"F28"}, | |
991 {K_F29, (char_u *)"F29"}, | |
992 {K_F30, (char_u *)"F30"}, | |
993 | |
994 {K_F31, (char_u *)"F31"}, | |
995 {K_F32, (char_u *)"F32"}, | |
996 {K_F33, (char_u *)"F33"}, | |
997 {K_F34, (char_u *)"F34"}, | |
998 {K_F35, (char_u *)"F35"}, | |
999 {K_F36, (char_u *)"F36"}, | |
1000 {K_F37, (char_u *)"F37"}, | |
1001 | |
1002 {K_XF1, (char_u *)"xF1"}, | |
1003 {K_XF2, (char_u *)"xF2"}, | |
1004 {K_XF3, (char_u *)"xF3"}, | |
1005 {K_XF4, (char_u *)"xF4"}, | |
1006 | |
1007 {K_HELP, (char_u *)"Help"}, | |
1008 {K_UNDO, (char_u *)"Undo"}, | |
1009 {K_INS, (char_u *)"Insert"}, | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1010 {K_INS, (char_u *)"Ins"}, // Alternative name |
7 | 1011 {K_KINS, (char_u *)"kInsert"}, |
1012 {K_HOME, (char_u *)"Home"}, | |
1013 {K_KHOME, (char_u *)"kHome"}, | |
1014 {K_XHOME, (char_u *)"xHome"}, | |
230 | 1015 {K_ZHOME, (char_u *)"zHome"}, |
7 | 1016 {K_END, (char_u *)"End"}, |
1017 {K_KEND, (char_u *)"kEnd"}, | |
1018 {K_XEND, (char_u *)"xEnd"}, | |
230 | 1019 {K_ZEND, (char_u *)"zEnd"}, |
7 | 1020 {K_PAGEUP, (char_u *)"PageUp"}, |
1021 {K_PAGEDOWN, (char_u *)"PageDown"}, | |
1022 {K_KPAGEUP, (char_u *)"kPageUp"}, | |
1023 {K_KPAGEDOWN, (char_u *)"kPageDown"}, | |
1024 | |
1025 {K_KPLUS, (char_u *)"kPlus"}, | |
1026 {K_KMINUS, (char_u *)"kMinus"}, | |
1027 {K_KDIVIDE, (char_u *)"kDivide"}, | |
1028 {K_KMULTIPLY, (char_u *)"kMultiply"}, | |
1029 {K_KENTER, (char_u *)"kEnter"}, | |
1030 {K_KPOINT, (char_u *)"kPoint"}, | |
1031 | |
1032 {K_K0, (char_u *)"k0"}, | |
1033 {K_K1, (char_u *)"k1"}, | |
1034 {K_K2, (char_u *)"k2"}, | |
1035 {K_K3, (char_u *)"k3"}, | |
1036 {K_K4, (char_u *)"k4"}, | |
1037 {K_K5, (char_u *)"k5"}, | |
1038 {K_K6, (char_u *)"k6"}, | |
1039 {K_K7, (char_u *)"k7"}, | |
1040 {K_K8, (char_u *)"k8"}, | |
1041 {K_K9, (char_u *)"k9"}, | |
1042 | |
1043 {'<', (char_u *)"lt"}, | |
1044 | |
1045 {K_MOUSE, (char_u *)"Mouse"}, | |
3273 | 1046 #ifdef FEAT_MOUSE_NET |
7 | 1047 {K_NETTERM_MOUSE, (char_u *)"NetMouse"}, |
3273 | 1048 #endif |
1049 #ifdef FEAT_MOUSE_DEC | |
7 | 1050 {K_DEC_MOUSE, (char_u *)"DecMouse"}, |
3273 | 1051 #endif |
1052 #ifdef FEAT_MOUSE_JSB | |
7 | 1053 {K_JSBTERM_MOUSE, (char_u *)"JsbMouse"}, |
3273 | 1054 #endif |
1055 #ifdef FEAT_MOUSE_PTERM | |
7 | 1056 {K_PTERM_MOUSE, (char_u *)"PtermMouse"}, |
3273 | 1057 #endif |
1058 #ifdef FEAT_MOUSE_URXVT | |
1059 {K_URXVT_MOUSE, (char_u *)"UrxvtMouse"}, | |
1060 #endif | |
3746 | 1061 {K_SGR_MOUSE, (char_u *)"SgrMouse"}, |
24008
51cccde1b1aa
patch 8.2.2546: typo in mouse key name
Bram Moolenaar <Bram@vim.org>
parents:
23683
diff
changeset
|
1062 {K_SGR_MOUSERELEASE, (char_u *)"SgrMouseRelease"}, |
7 | 1063 {K_LEFTMOUSE, (char_u *)"LeftMouse"}, |
1064 {K_LEFTMOUSE_NM, (char_u *)"LeftMouseNM"}, | |
1065 {K_LEFTDRAG, (char_u *)"LeftDrag"}, | |
1066 {K_LEFTRELEASE, (char_u *)"LeftRelease"}, | |
1067 {K_LEFTRELEASE_NM, (char_u *)"LeftReleaseNM"}, | |
12865
ebb4f6c93598
patch 8.0.1309: cannot use 'balloonexpr' in a terminal
Christian Brabandt <cb@256bit.org>
parents:
12798
diff
changeset
|
1068 {K_MOUSEMOVE, (char_u *)"MouseMove"}, |
7 | 1069 {K_MIDDLEMOUSE, (char_u *)"MiddleMouse"}, |
1070 {K_MIDDLEDRAG, (char_u *)"MiddleDrag"}, | |
1071 {K_MIDDLERELEASE, (char_u *)"MiddleRelease"}, | |
1072 {K_RIGHTMOUSE, (char_u *)"RightMouse"}, | |
1073 {K_RIGHTDRAG, (char_u *)"RightDrag"}, | |
1074 {K_RIGHTRELEASE, (char_u *)"RightRelease"}, | |
2409
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2363
diff
changeset
|
1075 {K_MOUSEDOWN, (char_u *)"ScrollWheelUp"}, |
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2363
diff
changeset
|
1076 {K_MOUSEUP, (char_u *)"ScrollWheelDown"}, |
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2363
diff
changeset
|
1077 {K_MOUSELEFT, (char_u *)"ScrollWheelRight"}, |
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2363
diff
changeset
|
1078 {K_MOUSERIGHT, (char_u *)"ScrollWheelLeft"}, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1079 {K_MOUSEDOWN, (char_u *)"MouseDown"}, // OBSOLETE: Use |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1080 {K_MOUSEUP, (char_u *)"MouseUp"}, // ScrollWheelXXX instead |
7 | 1081 {K_X1MOUSE, (char_u *)"X1Mouse"}, |
1082 {K_X1DRAG, (char_u *)"X1Drag"}, | |
1083 {K_X1RELEASE, (char_u *)"X1Release"}, | |
1084 {K_X2MOUSE, (char_u *)"X2Mouse"}, | |
1085 {K_X2DRAG, (char_u *)"X2Drag"}, | |
1086 {K_X2RELEASE, (char_u *)"X2Release"}, | |
1087 {K_DROP, (char_u *)"Drop"}, | |
1088 {K_ZERO, (char_u *)"Nul"}, | |
1089 #ifdef FEAT_EVAL | |
1090 {K_SNR, (char_u *)"SNR"}, | |
1091 #endif | |
1092 {K_PLUG, (char_u *)"Plug"}, | |
6245 | 1093 {K_CURSORHOLD, (char_u *)"CursorHold"}, |
16594
6f52e82d9d4e
patch 8.1.1300: in a terminal 'ballooneval' does not work right away
Bram Moolenaar <Bram@vim.org>
parents:
16511
diff
changeset
|
1094 {K_IGNORE, (char_u *)"Ignore"}, |
22862
6d50182e7e24
patch 8.2.1978: making a mapping work in all modes is complicated
Bram Moolenaar <Bram@vim.org>
parents:
22732
diff
changeset
|
1095 {K_COMMAND, (char_u *)"Cmd"}, |
27140
a9eeb18e749c
patch 8.2.4099: Vim9: cannot use Vim9 syntax in mapping
Bram Moolenaar <Bram@vim.org>
parents:
27018
diff
changeset
|
1096 {K_SCRIPT_COMMAND, (char_u *)"ScriptCmd"}, |
23683
c6b9df4c442d
patch 8.2.2383: focus escape sequences are not named
Bram Moolenaar <Bram@vim.org>
parents:
22862
diff
changeset
|
1097 {K_FOCUSGAINED, (char_u *)"FocusGained"}, |
c6b9df4c442d
patch 8.2.2383: focus escape sequences are not named
Bram Moolenaar <Bram@vim.org>
parents:
22862
diff
changeset
|
1098 {K_FOCUSLOST, (char_u *)"FocusLost"}, |
7 | 1099 {0, NULL} |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1100 // NOTE: When adding a long name update MAX_KEY_NAME_LEN. |
7 | 1101 }; |
1102 | |
24768
7334bf933510
patch 8.2.2922: computing array length is done in various ways
Bram Moolenaar <Bram@vim.org>
parents:
24375
diff
changeset
|
1103 #define KEY_NAMES_TABLE_LEN ARRAY_LENGTH(key_names_table) |
7 | 1104 |
1105 /* | |
1106 * Return the modifier mask bit (MOD_MASK_*) which corresponds to the given | |
1107 * modifier name ('S' for Shift, 'C' for Ctrl etc). | |
1108 */ | |
17789
0f7ae8010787
patch 8.1.1891: functions used in one file are global
Bram Moolenaar <Bram@vim.org>
parents:
17781
diff
changeset
|
1109 static int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1110 name_to_mod_mask(int c) |
7 | 1111 { |
1112 int i; | |
1113 | |
1114 c = TOUPPER_ASC(c); | |
1115 for (i = 0; mod_mask_table[i].mod_mask != 0; i++) | |
1116 if (c == mod_mask_table[i].name) | |
1117 return mod_mask_table[i].mod_flag; | |
1118 return 0; | |
1119 } | |
1120 | |
1121 /* | |
1122 * Check if if there is a special key code for "key" that includes the | |
1123 * modifiers specified. | |
1124 */ | |
1125 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1126 simplify_key(int key, int *modifiers) |
7 | 1127 { |
1128 int i; | |
1129 int key0; | |
1130 int key1; | |
1131 | |
34269
22be86ed7545
patch 9.1.0073: Looping over modifier_keys_table unnecessarily
Christian Brabandt <cb@256bit.org>
parents:
34219
diff
changeset
|
1132 if (!(*modifiers & (MOD_MASK_SHIFT | MOD_MASK_CTRL))) |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1133 return key; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1134 |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1135 // TAB is a special case |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1136 if (key == TAB && (*modifiers & MOD_MASK_SHIFT)) |
7 | 1137 { |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1138 *modifiers &= ~MOD_MASK_SHIFT; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1139 return K_S_TAB; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1140 } |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1141 key0 = KEY2TERMCAP0(key); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1142 key1 = KEY2TERMCAP1(key); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1143 for (i = 0; modifier_keys_table[i] != NUL; i += MOD_KEYS_ENTRY_SIZE) |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1144 { |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1145 if (key0 == modifier_keys_table[i + 3] |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1146 && key1 == modifier_keys_table[i + 4] |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1147 && (*modifiers & modifier_keys_table[i])) |
7 | 1148 { |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1149 *modifiers &= ~modifier_keys_table[i]; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1150 return TERMCAP2KEY(modifier_keys_table[i + 1], |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1151 modifier_keys_table[i + 2]); |
7 | 1152 } |
1153 } | |
1154 return key; | |
1155 } | |
1156 | |
1157 /* | |
180 | 1158 * Change <xHome> to <Home>, <xUp> to <Up>, etc. |
1159 */ | |
1160 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1161 handle_x_keys(int key) |
180 | 1162 { |
1163 switch (key) | |
1164 { | |
1165 case K_XUP: return K_UP; | |
1166 case K_XDOWN: return K_DOWN; | |
1167 case K_XLEFT: return K_LEFT; | |
1168 case K_XRIGHT: return K_RIGHT; | |
1169 case K_XHOME: return K_HOME; | |
230 | 1170 case K_ZHOME: return K_HOME; |
180 | 1171 case K_XEND: return K_END; |
230 | 1172 case K_ZEND: return K_END; |
180 | 1173 case K_XF1: return K_F1; |
1174 case K_XF2: return K_F2; | |
1175 case K_XF3: return K_F3; | |
1176 case K_XF4: return K_F4; | |
1177 case K_S_XF1: return K_S_F1; | |
1178 case K_S_XF2: return K_S_F2; | |
1179 case K_S_XF3: return K_S_F3; | |
1180 case K_S_XF4: return K_S_F4; | |
1181 } | |
1182 return key; | |
1183 } | |
1184 | |
1185 /* | |
7 | 1186 * Return a string which contains the name of the given key when the given |
1187 * modifiers are down. | |
1188 */ | |
1189 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1190 get_special_key_name(int c, int modifiers) |
7 | 1191 { |
1192 static char_u string[MAX_KEY_NAME_LEN + 1]; | |
1193 | |
1194 int i, idx; | |
1195 int table_idx; | |
1196 char_u *s; | |
1197 | |
1198 string[0] = '<'; | |
1199 idx = 1; | |
1200 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1201 // Key that stands for a normal character. |
7 | 1202 if (IS_SPECIAL(c) && KEY2TERMCAP0(c) == KS_KEY) |
1203 c = KEY2TERMCAP1(c); | |
1204 | |
1205 /* | |
1206 * Translate shifted special keys into unshifted keys and set modifier. | |
1207 * Same for CTRL and ALT modifiers. | |
1208 */ | |
1209 if (IS_SPECIAL(c)) | |
1210 { | |
1211 for (i = 0; modifier_keys_table[i] != 0; i += MOD_KEYS_ENTRY_SIZE) | |
1212 if ( KEY2TERMCAP0(c) == (int)modifier_keys_table[i + 1] | |
1213 && (int)KEY2TERMCAP1(c) == (int)modifier_keys_table[i + 2]) | |
1214 { | |
1215 modifiers |= modifier_keys_table[i]; | |
1216 c = TERMCAP2KEY(modifier_keys_table[i + 3], | |
1217 modifier_keys_table[i + 4]); | |
1218 break; | |
1219 } | |
1220 } | |
1221 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1222 // try to find the key in the special key table |
7 | 1223 table_idx = find_special_key_in_table(c); |
1224 | |
1225 /* | |
1226 * When not a known special key, and not a printable character, try to | |
1227 * extract modifiers. | |
1228 */ | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
1229 if (c > 0 && (*mb_char2len)(c) == 1) |
7 | 1230 { |
1231 if (table_idx < 0 | |
1232 && (!vim_isprintc(c) || (c & 0x7f) == ' ') | |
1233 && (c & 0x80)) | |
1234 { | |
1235 c &= 0x7f; | |
1236 modifiers |= MOD_MASK_ALT; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1237 // try again, to find the un-alted key in the special key table |
7 | 1238 table_idx = find_special_key_in_table(c); |
1239 } | |
1240 if (table_idx < 0 && !vim_isprintc(c) && c < ' ') | |
1241 { | |
1242 c += '@'; | |
1243 modifiers |= MOD_MASK_CTRL; | |
1244 } | |
1245 } | |
1246 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1247 // translate the modifier into a string |
7 | 1248 for (i = 0; mod_mask_table[i].name != 'A'; i++) |
1249 if ((modifiers & mod_mask_table[i].mod_mask) | |
1250 == mod_mask_table[i].mod_flag) | |
1251 { | |
1252 string[idx++] = mod_mask_table[i].name; | |
1253 string[idx++] = (char_u)'-'; | |
1254 } | |
1255 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1256 if (table_idx < 0) // unknown special key, may output t_xx |
7 | 1257 { |
1258 if (IS_SPECIAL(c)) | |
1259 { | |
1260 string[idx++] = 't'; | |
1261 string[idx++] = '_'; | |
1262 string[idx++] = KEY2TERMCAP0(c); | |
1263 string[idx++] = KEY2TERMCAP1(c); | |
1264 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1265 // Not a special key, only modifiers, output directly |
7 | 1266 else |
1267 { | |
1268 if (has_mbyte && (*mb_char2len)(c) > 1) | |
1269 idx += (*mb_char2bytes)(c, string + idx); | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
1270 else if (vim_isprintc(c)) |
7 | 1271 string[idx++] = c; |
1272 else | |
1273 { | |
1274 s = transchar(c); | |
1275 while (*s) | |
1276 string[idx++] = *s++; | |
1277 } | |
1278 } | |
1279 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1280 else // use name of special key |
7 | 1281 { |
10644
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1282 size_t len = STRLEN(key_names_table[table_idx].name); |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1283 |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1284 if (len + idx + 2 <= MAX_KEY_NAME_LEN) |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1285 { |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1286 STRCPY(string + idx, key_names_table[table_idx].name); |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1287 idx += (int)len; |
2025bec9175f
patch 8.0.0212: buffer for key name may be too small
Christian Brabandt <cb@256bit.org>
parents:
10640
diff
changeset
|
1288 } |
7 | 1289 } |
1290 string[idx++] = '>'; | |
1291 string[idx] = NUL; | |
1292 return string; | |
1293 } | |
1294 | |
1295 /* | |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1296 * Try translating a <> name at "(*srcp)[]" to "dst[]". |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1297 * Return the number of characters added to "dst[]", zero for no match. |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1298 * If there is a match, "srcp" is advanced to after the <> name. |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1299 * "dst[]" must be big enough to hold the result (up to six characters)! |
7 | 1300 */ |
1301 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1302 trans_special( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1303 char_u **srcp, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1304 char_u *dst, |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1305 int flags, // FSK_ values |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1306 int escape_ks, // escape K_SPECIAL bytes in the character |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1307 int *did_simplify) // FSK_SIMPLIFY and found <C-H> or <A-x> |
7 | 1308 { |
1309 int modifiers = 0; | |
1310 int key; | |
1311 | |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1312 key = find_special_key(srcp, &modifiers, flags, did_simplify); |
7 | 1313 if (key == 0) |
1314 return 0; | |
1315 | |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1316 return special_to_buf(key, modifiers, escape_ks, dst); |
16880
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1317 } |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1318 |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1319 /* |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1320 * Put the character sequence for "key" with "modifiers" into "dst" and return |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1321 * the resulting length. |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1322 * When "escape_ks" is TRUE escape K_SPECIAL bytes in the character. |
16880
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1323 * The sequence is not NUL terminated. |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1324 * This is how characters in a string are encoded. |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1325 */ |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1326 int |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1327 special_to_buf(int key, int modifiers, int escape_ks, char_u *dst) |
16880
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1328 { |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1329 int dlen = 0; |
998603a243d7
patch 8.1.1441: popup window filter not yet implemented
Bram Moolenaar <Bram@vim.org>
parents:
16876
diff
changeset
|
1330 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1331 // Put the appropriate modifier in a string |
7 | 1332 if (modifiers != 0) |
1333 { | |
1334 dst[dlen++] = K_SPECIAL; | |
1335 dst[dlen++] = KS_MODIFIER; | |
1336 dst[dlen++] = modifiers; | |
1337 } | |
1338 | |
1339 if (IS_SPECIAL(key)) | |
1340 { | |
1341 dst[dlen++] = K_SPECIAL; | |
1342 dst[dlen++] = KEY2TERMCAP0(key); | |
1343 dst[dlen++] = KEY2TERMCAP1(key); | |
1344 } | |
28668
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1345 else if (escape_ks) |
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1346 dlen = (int)(add_char2buf(key, dst + dlen) - dst); |
53c608c7ea9e
patch 8.2.4858: K_SPECIAL may be escaped twice
Bram Moolenaar <Bram@vim.org>
parents:
28610
diff
changeset
|
1347 else if (has_mbyte) |
7 | 1348 dlen += (*mb_char2bytes)(key, dst + dlen); |
1349 else | |
1350 dst[dlen++] = key; | |
1351 | |
1352 return dlen; | |
1353 } | |
1354 | |
1355 /* | |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1356 * Try translating a <> name at "(*srcp)[]", return the key and put modifiers |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1357 * in "modp". |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1358 * "srcp" is advanced to after the <> name. |
7 | 1359 * returns 0 if there is no match. |
1360 */ | |
1361 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1362 find_special_key( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1363 char_u **srcp, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1364 int *modp, |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1365 int flags, // FSK_ values |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1366 int *did_simplify) // found <C-H> or <A-x> |
7 | 1367 { |
1368 char_u *last_dash; | |
1369 char_u *end_of_name; | |
1370 char_u *src; | |
1371 char_u *bp; | |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1372 int in_string = flags & FSK_IN_STRING; |
7 | 1373 int modifiers; |
1374 int bit; | |
1375 int key; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9387
diff
changeset
|
1376 uvarnumber_T n; |
3024 | 1377 int l; |
7 | 1378 |
1379 src = *srcp; | |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1380 if (src[0] != '<') |
7 | 1381 return 0; |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1382 if (src[1] == '*') // <*xxx>: do not simplify |
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1383 ++src; |
7 | 1384 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1385 // Find end of modifier list |
7 | 1386 last_dash = src; |
24375
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24188
diff
changeset
|
1387 for (bp = src + 1; *bp == '-' || vim_isNormalIDc(*bp); bp++) |
7 | 1388 { |
1389 if (*bp == '-') | |
1390 { | |
1391 last_dash = bp; | |
3024 | 1392 if (bp[1] != NUL) |
1393 { | |
1394 if (has_mbyte) | |
1395 l = mb_ptr2len(bp + 1); | |
1396 else | |
1397 l = 1; | |
17720
844f470532b6
patch 8.1.1857: cannot use modifier with multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
17708
diff
changeset
|
1398 // Anything accepted, like <C-?>. |
844f470532b6
patch 8.1.1857: cannot use modifier with multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
17708
diff
changeset
|
1399 // <C-"> or <M-"> are not special in strings as " is |
844f470532b6
patch 8.1.1857: cannot use modifier with multi-byte character
Bram Moolenaar <Bram@vim.org>
parents:
17708
diff
changeset
|
1400 // the string delimiter. With a backslash it works: <M-\"> |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1401 if (!(in_string && bp[1] == '"') && bp[l + 1] == '>') |
9373
b88c573d8aa4
commit https://github.com/vim/vim/commit/1d90a5a5af84250e226f8a9121e771f7b72aa894
Christian Brabandt <cb@256bit.org>
parents:
9347
diff
changeset
|
1402 bp += l; |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1403 else if (in_string && bp[1] == '\\' && bp[2] == '"' |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1404 && bp[3] == '>') |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1405 bp += 2; |
3024 | 1406 } |
7 | 1407 } |
1408 if (bp[0] == 't' && bp[1] == '_' && bp[2] && bp[3]) | |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1409 bp += 3; // skip t_xx, xx may be '-' or '>' |
3026 | 1410 else if (STRNICMP(bp, "char-", 5) == 0) |
1411 { | |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
31940
diff
changeset
|
1412 vim_str2nr(bp + 5, NULL, &l, STR2NR_ALL, NULL, NULL, 0, TRUE, NULL); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1413 if (l == 0) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1414 { |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
1415 emsg(_(e_invalid_argument)); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1416 return 0; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1417 } |
3026 | 1418 bp += l + 5; |
1419 break; | |
1420 } | |
7 | 1421 } |
1422 | |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1423 if (*bp == '>') // found matching '>' |
7 | 1424 { |
1425 end_of_name = bp + 1; | |
1426 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1427 // Which modifiers are given? |
7 | 1428 modifiers = 0x0; |
1429 for (bp = src + 1; bp < last_dash; bp++) | |
1430 { | |
1431 if (*bp != '-') | |
1432 { | |
1433 bit = name_to_mod_mask(*bp); | |
1434 if (bit == 0x0) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1435 break; // Illegal modifier name |
7 | 1436 modifiers |= bit; |
1437 } | |
1438 } | |
1439 | |
1440 /* | |
1441 * Legal modifier name. | |
1442 */ | |
1443 if (bp >= last_dash) | |
1444 { | |
3024 | 1445 if (STRNICMP(last_dash + 1, "char-", 5) == 0 |
1446 && VIM_ISDIGIT(last_dash[6])) | |
1447 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1448 // <Char-123> or <Char-033> or <Char-0x33> |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1449 vim_str2nr(last_dash + 6, NULL, &l, STR2NR_ALL, NULL, |
32098
39f4126d2a0d
patch 9.0.1380: CTRL-X on 2**64 subtracts two
Bram Moolenaar <Bram@vim.org>
parents:
31940
diff
changeset
|
1450 &n, 0, TRUE, NULL); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1451 if (l == 0) |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1452 { |
26865
bce848ec8b1b
patch 8.2.3961: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26602
diff
changeset
|
1453 emsg(_(e_invalid_argument)); |
16706
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1454 return 0; |
77bcb5055fec
patch 8.1.1355: obvious mistakes are accepted as valid expressions
Bram Moolenaar <Bram@vim.org>
parents:
16606
diff
changeset
|
1455 } |
3026 | 1456 key = (int)n; |
3024 | 1457 } |
7 | 1458 else |
180 | 1459 { |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1460 int off = 1; |
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1461 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1462 // Modifier with single letter, or special key name. |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1463 if (in_string && last_dash[1] == '\\' && last_dash[2] == '"') |
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1464 off = 2; |
3026 | 1465 if (has_mbyte) |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1466 l = mb_ptr2len(last_dash + off); |
3026 | 1467 else |
1468 l = 1; | |
20627
8bce783af0cb
patch 8.2.0867: using {xxx} for encoding a modifier is not nice
Bram Moolenaar <Bram@vim.org>
parents:
20603
diff
changeset
|
1469 if (modifiers != 0 && last_dash[l + off] == '>') |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1470 key = PTR2CHAR(last_dash + off); |
3026 | 1471 else |
1472 { | |
9869
989d44d35a66
commit https://github.com/vim/vim/commit/35a4cfa200917dd171b1fff3cd5b6cee9add673d
Christian Brabandt <cb@256bit.org>
parents:
9723
diff
changeset
|
1473 key = get_special_key_code(last_dash + off); |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1474 if (!(flags & FSK_KEEP_X_KEY)) |
3026 | 1475 key = handle_x_keys(key); |
1476 } | |
180 | 1477 } |
7 | 1478 |
1479 /* | |
1480 * get_special_key_code() may return NUL for invalid | |
1481 * special key name. | |
1482 */ | |
1483 if (key != NUL) | |
1484 { | |
1485 /* | |
1486 * Only use a modifier when there is no special key code that | |
1487 * includes the modifier. | |
1488 */ | |
1489 key = simplify_key(key, &modifiers); | |
1490 | |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1491 if ((flags & FSK_KEYCODE) == 0) |
7 | 1492 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1493 // don't want keycode, use single byte code |
7 | 1494 if (key == K_BS) |
1495 key = BS; | |
1496 else if (key == K_DEL || key == K_KDEL) | |
1497 key = DEL; | |
1498 } | |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1499 else if (key == 27 |
31734
59c474f6715d
patch 9.0.1199: crash when using kitty and using a mapping with <Esc>
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1500 && (flags & FSK_FROM_PART) != 0 |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1501 && (kitty_protocol_state == KKPS_ENABLED |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1502 || kitty_protocol_state == KKPS_DISABLED)) |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1503 { |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1504 // Using the Kitty key protocol, which uses K_ESC for an |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1505 // Esc character. For the simplified keys use the Esc |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1506 // character and set did_simplify, then in the |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1507 // non-simplified keys use K_ESC. |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1508 if ((flags & FSK_SIMPLIFY) != 0) |
31734
59c474f6715d
patch 9.0.1199: crash when using kitty and using a mapping with <Esc>
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1509 { |
59c474f6715d
patch 9.0.1199: crash when using kitty and using a mapping with <Esc>
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1510 if (did_simplify != NULL) |
59c474f6715d
patch 9.0.1199: crash when using kitty and using a mapping with <Esc>
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1511 *did_simplify = TRUE; |
59c474f6715d
patch 9.0.1199: crash when using kitty and using a mapping with <Esc>
Bram Moolenaar <Bram@vim.org>
parents:
31728
diff
changeset
|
1512 } |
31722
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1513 else |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1514 key = K_ESC; |
6fa4f94aca5a
patch 9.0.1193: cannot map <Esc> when using the Kitty key protocol
Bram Moolenaar <Bram@vim.org>
parents:
31156
diff
changeset
|
1515 } |
7 | 1516 |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1517 // Normal Key with modifier: Try to make a single byte code. |
7 | 1518 if (!IS_SPECIAL(key)) |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1519 key = extract_modifiers(key, &modifiers, |
20603
c2570baa2e4c
patch 8.2.0855: GUI tests fail because the test doesn't use a modifier
Bram Moolenaar <Bram@vim.org>
parents:
20392
diff
changeset
|
1520 flags & FSK_SIMPLIFY, did_simplify); |
7 | 1521 |
1522 *modp = modifiers; | |
1523 *srcp = end_of_name; | |
1524 return key; | |
1525 } | |
1526 } | |
1527 } | |
1528 return 0; | |
1529 } | |
1530 | |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1531 |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1532 /* |
22522
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1533 * Some keys are used with Ctrl without Shift and are still expected to be |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1534 * mapped as if Shift was pressed: |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1535 * CTRL-2 is CTRL-@ |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1536 * CTRL-6 is CTRL-^ |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1537 * CTRL-- is CTRL-_ |
31156
0ecb16d5f86f
patch 9.0.0912: libvterm with modifyOtherKeys level 2 does not match xterm
Bram Moolenaar <Bram@vim.org>
parents:
31133
diff
changeset
|
1538 * Also, unless no_reduce_keys is set then <C-H> and <C-h> mean the same thing, |
0ecb16d5f86f
patch 9.0.0912: libvterm with modifyOtherKeys level 2 does not match xterm
Bram Moolenaar <Bram@vim.org>
parents:
31133
diff
changeset
|
1539 * use "H". |
22522
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1540 * Returns the possibly adjusted key. |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1541 */ |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1542 int |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1543 may_adjust_key_for_ctrl(int modifiers, int key) |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1544 { |
31940
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1545 if ((modifiers & MOD_MASK_CTRL) == 0) |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1546 return key; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1547 |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1548 if (ASCII_ISALPHA(key)) |
22522
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1549 { |
31156
0ecb16d5f86f
patch 9.0.0912: libvterm with modifyOtherKeys level 2 does not match xterm
Bram Moolenaar <Bram@vim.org>
parents:
31133
diff
changeset
|
1550 #ifdef FEAT_TERMINAL |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1551 check_no_reduce_keys(); // may update the no_reduce_keys flag |
31156
0ecb16d5f86f
patch 9.0.0912: libvterm with modifyOtherKeys level 2 does not match xterm
Bram Moolenaar <Bram@vim.org>
parents:
31133
diff
changeset
|
1552 #endif |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1553 return no_reduce_keys == 0 ? TOUPPER_ASC(key) : key; |
22522
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1554 } |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1555 if (key == '2') |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1556 return '@'; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1557 if (key == '6') |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1558 return '^'; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1559 if (key == '-') |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
1560 return '_'; |
31940
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1561 |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1562 // On a Belgian keyboard AltGr $ is ']', on other keyboards '$' can only be |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1563 // obtained with Shift. Assume that '$' without shift implies a Belgian |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1564 // keyboard, where CTRL-$ means CTRL-]. |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1565 if (key == '$' && (modifiers & MOD_MASK_SHIFT) == 0) |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1566 return ']'; |
03188d05289a
patch 9.0.1302: on a Belgian keyboard CTRL-] does not work
Bram Moolenaar <Bram@vim.org>
parents:
31734
diff
changeset
|
1567 |
22522
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1568 return key; |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1569 } |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1570 |
6c7e4db139a3
patch 8.2.1809: mapping some keys with Ctrl does not work properly
Bram Moolenaar <Bram@vim.org>
parents:
22407
diff
changeset
|
1571 /* |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1572 * Some keys already have Shift included, pass them as normal keys. |
22526
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1573 * When Ctrl is also used <C-H> and <C-S-H> are different, but <C-S-{> should |
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1574 * be <C-{>. Same for <C-S-}> and <C-S-|>. |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1575 * Also for <A-S-a> and <M-S-a>. |
30235
2403a1b53826
patch 9.0.0453: on an AZERTY keyboard digit keys get the shift modifier
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1576 * This includes all printable ASCII characters except a-z. |
2403a1b53826
patch 9.0.0453: on an AZERTY keyboard digit keys get the shift modifier
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1577 * Digits are included because with AZERTY the Shift key is used to get them. |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1578 */ |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1579 int |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1580 may_remove_shift_modifier(int modifiers, int key) |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1581 { |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1582 if ((modifiers == MOD_MASK_SHIFT |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1583 || modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT) |
34219
a0a4a774117b
patch 9.1.0058: Cannot map Super Keys in GTK UI
Christian Brabandt <cb@256bit.org>
parents:
33000
diff
changeset
|
1584 #ifdef FEAT_GUI_GTK |
a0a4a774117b
patch 9.1.0058: Cannot map Super Keys in GTK UI
Christian Brabandt <cb@256bit.org>
parents:
33000
diff
changeset
|
1585 || modifiers == (MOD_MASK_SHIFT | MOD_MASK_CMD) |
a0a4a774117b
patch 9.1.0058: Cannot map Super Keys in GTK UI
Christian Brabandt <cb@256bit.org>
parents:
33000
diff
changeset
|
1586 #endif |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1587 || modifiers == (MOD_MASK_SHIFT | MOD_MASK_META)) |
22407
c19acd92ee83
patch 8.2.1752: GTK GUI: cannot map alt-? with <A-?>
Bram Moolenaar <Bram@vim.org>
parents:
21745
diff
changeset
|
1588 && ((key >= '!' && key <= '/') |
c19acd92ee83
patch 8.2.1752: GTK GUI: cannot map alt-? with <A-?>
Bram Moolenaar <Bram@vim.org>
parents:
21745
diff
changeset
|
1589 || (key >= ':' && key <= 'Z') |
30235
2403a1b53826
patch 9.0.0453: on an AZERTY keyboard digit keys get the shift modifier
Bram Moolenaar <Bram@vim.org>
parents:
30205
diff
changeset
|
1590 || vim_isdigit(key) |
22407
c19acd92ee83
patch 8.2.1752: GTK GUI: cannot map alt-? with <A-?>
Bram Moolenaar <Bram@vim.org>
parents:
21745
diff
changeset
|
1591 || (key >= '[' && key <= '`') |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1592 || (key >= '{' && key <= '~'))) |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1593 return modifiers & ~MOD_MASK_SHIFT; |
22526
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1594 |
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1595 if (modifiers == (MOD_MASK_SHIFT | MOD_MASK_CTRL) |
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1596 && (key == '{' || key == '}' || key == '|')) |
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1597 return modifiers & ~MOD_MASK_SHIFT; |
6325ef9143bc
patch 8.2.1811: mapping Ctrl-key does not work for '{', '}' and '|'
Bram Moolenaar <Bram@vim.org>
parents:
22522
diff
changeset
|
1598 |
20935
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1599 return modifiers; |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1600 } |
d64520bfafa0
patch 8.2.1019: mapping <M-S-a> does not work in the GUI
Bram Moolenaar <Bram@vim.org>
parents:
20927
diff
changeset
|
1601 |
7 | 1602 /* |
1603 * Try to include modifiers in the key. | |
1604 * Changes "Shift-a" to 'A', "Alt-A" to 0xc0, etc. | |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1605 * When "simplify" is FALSE don't do Ctrl and Alt. |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1606 * When "simplify" is TRUE and Ctrl or Alt is removed from modifiers set |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1607 * "did_simplify" when it's not NULL. |
7 | 1608 */ |
1609 int | |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1610 extract_modifiers(int key, int *modp, int simplify, int *did_simplify) |
7 | 1611 { |
1612 int modifiers = *modp; | |
1613 | |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12672
diff
changeset
|
1614 #ifdef MACOS_X |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1615 // Command-key really special, no fancynest |
7 | 1616 if (!(modifiers & MOD_MASK_CMD)) |
1617 #endif | |
1618 if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key)) | |
1619 { | |
1620 key = TOUPPER_ASC(key); | |
20927
9328feafbbf5
patch 8.2.1015: popup filter gets key with modifier prepended
Bram Moolenaar <Bram@vim.org>
parents:
20751
diff
changeset
|
1621 // With <C-S-a> we keep the shift modifier. |
9328feafbbf5
patch 8.2.1015: popup filter gets key with modifier prepended
Bram Moolenaar <Bram@vim.org>
parents:
20751
diff
changeset
|
1622 // With <S-a>, <A-S-a> and <S-A> we don't keep the shift modifier. |
9328feafbbf5
patch 8.2.1015: popup filter gets key with modifier prepended
Bram Moolenaar <Bram@vim.org>
parents:
20751
diff
changeset
|
1623 if (simplify || modifiers == MOD_MASK_SHIFT |
9328feafbbf5
patch 8.2.1015: popup filter gets key with modifier prepended
Bram Moolenaar <Bram@vim.org>
parents:
20751
diff
changeset
|
1624 || modifiers == (MOD_MASK_SHIFT | MOD_MASK_ALT) |
9328feafbbf5
patch 8.2.1015: popup filter gets key with modifier prepended
Bram Moolenaar <Bram@vim.org>
parents:
20751
diff
changeset
|
1625 || modifiers == (MOD_MASK_SHIFT | MOD_MASK_META)) |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1626 modifiers &= ~MOD_MASK_SHIFT; |
7 | 1627 } |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1628 |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1629 // <C-H> and <C-h> mean the same thing, always use "H" |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1630 if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key)) |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1631 key = TOUPPER_ASC(key); |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1632 |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1633 if (simplify && (modifiers & MOD_MASK_CTRL) |
27490
fb4c30606b4a
patch 8.2.4273: the EBCDIC support is outdated
Bram Moolenaar <Bram@vim.org>
parents:
27181
diff
changeset
|
1634 && ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) |
7 | 1635 { |
1636 key = Ctrl_chr(key); | |
1637 modifiers &= ~MOD_MASK_CTRL; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1638 // <C-@> is <Nul> |
28610
ce202d2984a0
patch 8.2.4829: a key may be simplified to NUL
Bram Moolenaar <Bram@vim.org>
parents:
28169
diff
changeset
|
1639 if (key == NUL) |
7 | 1640 key = K_ZERO; |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1641 if (did_simplify != NULL) |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1642 *did_simplify = TRUE; |
7 | 1643 } |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1644 |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12672
diff
changeset
|
1645 #ifdef MACOS_X |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1646 // Command-key really special, no fancynest |
7 | 1647 if (!(modifiers & MOD_MASK_CMD)) |
1648 #endif | |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1649 if (simplify && (modifiers & MOD_MASK_ALT) && key < 0x80 |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
1650 && !enc_dbcs) // avoid creating a lead byte |
7 | 1651 { |
1652 key |= 0x80; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1653 modifiers &= ~MOD_MASK_ALT; // remove the META modifier |
18301
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1654 if (did_simplify != NULL) |
506bf60a30a0
patch 8.1.2145: cannot map <C-H> when modifyOtherKeys is enabled
Bram Moolenaar <Bram@vim.org>
parents:
18291
diff
changeset
|
1655 *did_simplify = TRUE; |
7 | 1656 } |
1657 | |
1658 *modp = modifiers; | |
1659 return key; | |
1660 } | |
1661 | |
1662 /* | |
1663 * Try to find key "c" in the special key table. | |
1664 * Return the index when found, -1 when not found. | |
1665 */ | |
1666 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1667 find_special_key_in_table(int c) |
7 | 1668 { |
1669 int i; | |
1670 | |
1671 for (i = 0; key_names_table[i].name != NULL; i++) | |
1672 if (c == key_names_table[i].key) | |
1673 break; | |
1674 if (key_names_table[i].name == NULL) | |
1675 i = -1; | |
1676 return i; | |
1677 } | |
1678 | |
1679 /* | |
1680 * Find the special key with the given name (the given string does not have to | |
1681 * end with NUL, the name is assumed to end before the first non-idchar). | |
1682 * If the name starts with "t_" the next two characters are interpreted as a | |
1683 * termcap name. | |
1684 * Return the key code, or 0 if not found. | |
1685 */ | |
1686 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1687 get_special_key_code(char_u *name) |
7 | 1688 { |
1689 char_u *table_name; | |
1690 char_u string[3]; | |
1691 int i, j; | |
1692 | |
1693 /* | |
1694 * If it's <t_xx> we get the code for xx from the termcap | |
1695 */ | |
1696 if (name[0] == 't' && name[1] == '_' && name[2] != NUL && name[3] != NUL) | |
1697 { | |
1698 string[0] = name[2]; | |
1699 string[1] = name[3]; | |
1700 string[2] = NUL; | |
1701 if (add_termcap_entry(string, FALSE) == OK) | |
1702 return TERMCAP2KEY(name[2], name[3]); | |
1703 } | |
1704 else | |
1705 for (i = 0; key_names_table[i].name != NULL; i++) | |
1706 { | |
1707 table_name = key_names_table[i].name; | |
24375
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24188
diff
changeset
|
1708 for (j = 0; vim_isNormalIDc(name[j]) && table_name[j] != NUL; j++) |
7 | 1709 if (TOLOWER_ASC(table_name[j]) != TOLOWER_ASC(name[j])) |
1710 break; | |
24375
fe4b6fc7149c
patch 8.2.2728: special key names don't work if 'isident' is cleared
Bram Moolenaar <Bram@vim.org>
parents:
24188
diff
changeset
|
1711 if (!vim_isNormalIDc(name[j]) && table_name[j] == NUL) |
7 | 1712 return key_names_table[i].key; |
1713 } | |
1714 return 0; | |
1715 } | |
1716 | |
1717 char_u * | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1718 get_key_name(int i) |
7 | 1719 { |
1881 | 1720 if (i >= (int)KEY_NAMES_TABLE_LEN) |
7 | 1721 return NULL; |
1722 return key_names_table[i].name; | |
1723 } | |
1724 | |
1725 /* | |
1726 * Return the current end-of-line type: EOL_DOS, EOL_UNIX or EOL_MAC. | |
1727 */ | |
1728 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1729 get_fileformat(buf_T *buf) |
7 | 1730 { |
1731 int c = *buf->b_p_ff; | |
1732 | |
1733 if (buf->b_p_bin || c == 'u') | |
1734 return EOL_UNIX; | |
1735 if (c == 'm') | |
1736 return EOL_MAC; | |
1737 return EOL_DOS; | |
1738 } | |
1739 | |
1740 /* | |
1741 * Like get_fileformat(), but override 'fileformat' with "p" for "++opt=val" | |
1742 * argument. | |
1743 */ | |
1744 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1745 get_fileformat_force( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1746 buf_T *buf, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1747 exarg_T *eap) // can be NULL! |
7 | 1748 { |
1749 int c; | |
1750 | |
1751 if (eap != NULL && eap->force_ff != 0) | |
13575
4df23d9bad47
patch 8.0.1660: the terminal API "drop" command doesn't support options
Christian Brabandt <cb@256bit.org>
parents:
13493
diff
changeset
|
1752 c = eap->force_ff; |
7 | 1753 else |
1754 { | |
1755 if ((eap != NULL && eap->force_bin != 0) | |
1756 ? (eap->force_bin == FORCE_BIN) : buf->b_p_bin) | |
1757 return EOL_UNIX; | |
1758 c = *buf->b_p_ff; | |
1759 } | |
1760 if (c == 'u') | |
1761 return EOL_UNIX; | |
1762 if (c == 'm') | |
1763 return EOL_MAC; | |
1764 return EOL_DOS; | |
1765 } | |
1766 | |
1767 /* | |
1768 * Set the current end-of-line type to EOL_DOS, EOL_UNIX or EOL_MAC. | |
1769 * Sets both 'textmode' and 'fileformat'. | |
1770 * Note: Does _not_ set global value of 'textmode'! | |
1771 */ | |
1772 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1773 set_fileformat( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1774 int t, |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1775 int opt_flags) // OPT_LOCAL and/or OPT_GLOBAL |
7 | 1776 { |
1777 char *p = NULL; | |
1778 | |
1779 switch (t) | |
1780 { | |
1781 case EOL_DOS: | |
1782 p = FF_DOS; | |
1783 curbuf->b_p_tx = TRUE; | |
1784 break; | |
1785 case EOL_UNIX: | |
1786 p = FF_UNIX; | |
1787 curbuf->b_p_tx = FALSE; | |
1788 break; | |
1789 case EOL_MAC: | |
1790 p = FF_MAC; | |
1791 curbuf->b_p_tx = FALSE; | |
1792 break; | |
1793 } | |
1794 if (p != NULL) | |
1795 set_string_option_direct((char_u *)"ff", -1, (char_u *)p, | |
694 | 1796 OPT_FREE | opt_flags, 0); |
1797 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1798 // This may cause the buffer to become (un)modified. |
7 | 1799 check_status(curbuf); |
673 | 1800 redraw_tabline = TRUE; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1801 need_maketitle = TRUE; // set window title later |
7 | 1802 } |
1803 | |
1804 /* | |
1805 * Return the default fileformat from 'fileformats'. | |
1806 */ | |
1807 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1808 default_fileformat(void) |
7 | 1809 { |
1810 switch (*p_ffs) | |
1811 { | |
1812 case 'm': return EOL_MAC; | |
1813 case 'd': return EOL_DOS; | |
1814 } | |
1815 return EOL_UNIX; | |
1816 } | |
1817 | |
1818 /* | |
1819 * Call shell. Calls mch_call_shell, with 'shellxquote' added. | |
1820 */ | |
1821 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1822 call_shell(char_u *cmd, int opt) |
7 | 1823 { |
1824 char_u *ncmd; | |
1825 int retval; | |
170 | 1826 #ifdef FEAT_PROFILE |
1827 proftime_T wait_time; | |
1828 #endif | |
7 | 1829 |
1830 if (p_verbose > 3) | |
1831 { | |
293 | 1832 verbose_enter(); |
20380
79c870b68cf3
patch 8.2.0745: crash on exit when not all popups are closed
Bram Moolenaar <Bram@vim.org>
parents:
20033
diff
changeset
|
1833 smsg(_("Calling shell to execute: \"%s\""), cmd == NULL ? p_sh : cmd); |
30519
4a88061200c2
patch 9.0.0595: extra newline in messages after a verbose shell message
Bram Moolenaar <Bram@vim.org>
parents:
30235
diff
changeset
|
1834 msg_putchar_attr('\n', 0); |
7 | 1835 cursor_on(); |
293 | 1836 verbose_leave(); |
7 | 1837 } |
1838 | |
170 | 1839 #ifdef FEAT_PROFILE |
789 | 1840 if (do_profiling == PROF_YES) |
170 | 1841 prof_child_enter(&wait_time); |
1842 #endif | |
1843 | |
7 | 1844 if (*p_sh == NUL) |
1845 { | |
26602
fac6673086df
patch 8.2.3830: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26336
diff
changeset
|
1846 emsg(_(e_shell_option_is_empty)); |
7 | 1847 retval = -1; |
1848 } | |
1849 else | |
1850 { | |
1851 #ifdef FEAT_GUI_MSWIN | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1852 // Don't hide the pointer while executing a shell command. |
7 | 1853 gui_mch_mousehide(FALSE); |
1854 #endif | |
1855 #ifdef FEAT_GUI | |
1856 ++hold_gui_events; | |
1857 #endif | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1858 // The external command may update a tags file, clear cached tags. |
7 | 1859 tag_freematch(); |
1860 | |
17028
70933f7b5de4
patch 8.1.1514: MS-Windows: wrong shell command with ! in 'guioptions'
Bram Moolenaar <Bram@vim.org>
parents:
17000
diff
changeset
|
1861 if (cmd == NULL || *p_sxq == NUL) |
7 | 1862 retval = mch_call_shell(cmd, opt); |
1863 else | |
1864 { | |
3359 | 1865 char_u *ecmd = cmd; |
1866 | |
18195
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1867 if (*p_sxe != NUL && *p_sxq == '(') |
3359 | 1868 { |
1869 ecmd = vim_strsave_escaped_ext(cmd, p_sxe, '^', FALSE); | |
1870 if (ecmd == NULL) | |
1871 ecmd = cmd; | |
1872 } | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
1873 ncmd = alloc(STRLEN(ecmd) + STRLEN(p_sxq) * 2 + 1); |
7 | 1874 if (ncmd != NULL) |
1875 { | |
1876 STRCPY(ncmd, p_sxq); | |
3359 | 1877 STRCAT(ncmd, ecmd); |
18195
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1878 // When 'shellxquote' is ( append ). |
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1879 // When 'shellxquote' is "( append )". |
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1880 STRCAT(ncmd, *p_sxq == '(' ? (char_u *)")" |
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1881 : *p_sxq == '"' && *(p_sxq+1) == '(' ? (char_u *)")\"" |
a81f0c936112
patch 8.1.2092: MS-Windows: redirect in system() does not work
Bram Moolenaar <Bram@vim.org>
parents:
18135
diff
changeset
|
1882 : p_sxq); |
7 | 1883 retval = mch_call_shell(ncmd, opt); |
1884 vim_free(ncmd); | |
1885 } | |
1886 else | |
1887 retval = -1; | |
3359 | 1888 if (ecmd != cmd) |
1889 vim_free(ecmd); | |
7 | 1890 } |
1891 #ifdef FEAT_GUI | |
1892 --hold_gui_events; | |
1893 #endif | |
1894 /* | |
1895 * Check the window size, in case it changed while executing the | |
1896 * external command. | |
1897 */ | |
1898 shell_resized_check(); | |
1899 } | |
1900 | |
1901 #ifdef FEAT_EVAL | |
1902 set_vim_var_nr(VV_SHELL_ERROR, (long)retval); | |
170 | 1903 # ifdef FEAT_PROFILE |
789 | 1904 if (do_profiling == PROF_YES) |
170 | 1905 prof_child_exit(&wait_time); |
1906 # endif | |
7 | 1907 #endif |
1908 | |
1909 return retval; | |
1910 } | |
1911 | |
1912 /* | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1913 * MODE_VISUAL, MODE_SELECT and MODE_OP_PENDING State are never set, they are |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1914 * equal to MODE_NORMAL State with a condition. This function returns the real |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1915 * State. |
7 | 1916 */ |
1917 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1918 get_real_state(void) |
7 | 1919 { |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1920 if (State & MODE_NORMAL) |
7 | 1921 { |
1922 if (VIsual_active) | |
789 | 1923 { |
1924 if (VIsual_select) | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1925 return MODE_SELECT; |
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1926 return MODE_VISUAL; |
789 | 1927 } |
5735 | 1928 else if (finish_op) |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
1929 return MODE_OP_PENDING; |
7 | 1930 } |
1931 return State; | |
1932 } | |
1933 | |
39 | 1934 /* |
1935 * Return TRUE if "p" points to just after a path separator. | |
2939 | 1936 * Takes care of multi-byte characters. |
39 | 1937 * "b" must point to the start of the file name |
1938 */ | |
1939 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1940 after_pathsep(char_u *b, char_u *p) |
39 | 1941 { |
2939 | 1942 return p > b && vim_ispathsep(p[-1]) |
39 | 1943 && (!has_mbyte || (*mb_head_off)(b, p - 1) == 0); |
1944 } | |
1945 | |
1946 /* | |
1947 * Return TRUE if file names "f1" and "f2" are in the same directory. | |
1948 * "f1" may be a short name, "f2" must be a full path. | |
1949 */ | |
1950 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1951 same_directory(char_u *f1, char_u *f2) |
39 | 1952 { |
1953 char_u ffname[MAXPATHL]; | |
1954 char_u *t1; | |
1955 char_u *t2; | |
1956 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
1957 // safety check |
39 | 1958 if (f1 == NULL || f2 == NULL) |
1959 return FALSE; | |
1960 | |
1961 (void)vim_FullName(f1, ffname, MAXPATHL, FALSE); | |
1962 t1 = gettail_sep(ffname); | |
1963 t2 = gettail_sep(f2); | |
1964 return (t1 - ffname == t2 - f2 | |
1965 && pathcmp((char *)ffname, (char *)f2, (int)(t1 - ffname)) == 0); | |
1966 } | |
1967 | |
14220
96e4c6b26998
patch 8.1.0127: build failure when disabling the session feature
Christian Brabandt <cb@256bit.org>
parents:
13750
diff
changeset
|
1968 #if defined(FEAT_SESSION) || defined(FEAT_AUTOCHDIR) \ |
21745
35921b7fc07a
patch 8.2.1422: the Mac GUI implementation is outdated
Bram Moolenaar <Bram@vim.org>
parents:
21558
diff
changeset
|
1969 || defined(MSWIN) || defined(FEAT_GUI_GTK) \ |
15510
41fbbcea0f1b
patch 8.1.0763: nobody is using the Sun Workshop support
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1970 || defined(FEAT_NETBEANS_INTG) \ |
7 | 1971 || defined(PROTO) |
1972 /* | |
1973 * Change to a file's directory. | |
1974 * Caller must call shorten_fnames()! | |
1975 * Return OK or FAIL. | |
1976 */ | |
1977 int | |
15184
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1978 vim_chdirfile(char_u *fname, char *trigger_autocmd) |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1979 { |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1980 char_u old_dir[MAXPATHL]; |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1981 char_u new_dir[MAXPATHL]; |
39 | 1982 |
15184
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1983 if (mch_dirname(old_dir, MAXPATHL) != OK) |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1984 *old_dir = NUL; |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1985 |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1986 vim_strncpy(new_dir, fname, MAXPATHL - 1); |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1987 *gettail_sep(new_dir) = NUL; |
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1988 |
15188
2d8c31ae1e24
patch 8.1.0604: autocommand test fails on MS-Windows
Bram Moolenaar <Bram@vim.org>
parents:
15184
diff
changeset
|
1989 if (pathcmp((char *)old_dir, (char *)new_dir, -1) == 0) |
15184
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1990 // nothing to do |
27511
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1991 return OK; |
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1992 |
27617
269f89efb06a
patch 8.2.4335: no autocommand event triggered before changing directory
Bram Moolenaar <Bram@vim.org>
parents:
27511
diff
changeset
|
1993 if (trigger_autocmd != NULL) |
269f89efb06a
patch 8.2.4335: no autocommand event triggered before changing directory
Bram Moolenaar <Bram@vim.org>
parents:
27511
diff
changeset
|
1994 trigger_DirChangedPre((char_u *)trigger_autocmd, new_dir); |
269f89efb06a
patch 8.2.4335: no autocommand event triggered before changing directory
Bram Moolenaar <Bram@vim.org>
parents:
27511
diff
changeset
|
1995 |
27511
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1996 if (mch_chdir((char *)new_dir) != 0) |
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1997 return FAIL; |
15184
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
1998 |
27511
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
1999 if (trigger_autocmd != NULL) |
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
2000 apply_autocmds(EVENT_DIRCHANGED, (char_u *)trigger_autocmd, |
15184
90ab2d3ce11d
patch 8.1.0602: DirChanged is also triggered when directory didn't change
Bram Moolenaar <Bram@vim.org>
parents:
15160
diff
changeset
|
2001 new_dir, FALSE, curbuf); |
27511
9986f96fb1bd
patch 8.2.4283: using a variable for the return value is not needed
Bram Moolenaar <Bram@vim.org>
parents:
27490
diff
changeset
|
2002 return OK; |
7 | 2003 } |
2004 #endif | |
2005 | |
2006 #if defined(STAT_IGNORES_SLASH) || defined(PROTO) | |
2007 /* | |
2008 * Check if "name" ends in a slash and is not a directory. | |
2009 * Used for systems where stat() ignores a trailing slash on a file name. | |
2010 * The Vim code assumes a trailing slash is only ignored for a directory. | |
2011 */ | |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2012 static int |
11146
6ce90f33373f
patch 8.0.0460: can't build on HPUX
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
2013 illegal_slash(const char *name) |
7 | 2014 { |
2015 if (name[0] == NUL) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2016 return FALSE; // no file name is not illegal |
7 | 2017 if (name[strlen(name) - 1] != '/') |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2018 return FALSE; // no trailing slash |
7 | 2019 if (mch_isdir((char_u *)name)) |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2020 return FALSE; // trailing slash for a directory |
7 | 2021 return TRUE; |
2022 } | |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2023 |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2024 /* |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2025 * Special implementation of mch_stat() for Solaris. |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2026 */ |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2027 int |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2028 vim_stat(const char *name, stat_T *stp) |
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2029 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2030 // On Solaris stat() accepts "file/" as if it was "file". Return -1 if |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2031 // the name ends in "/" and it's not a directory. |
11146
6ce90f33373f
patch 8.0.0460: can't build on HPUX
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
2032 return illegal_slash(name) ? -1 : stat(name, stp); |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
2033 } |
7 | 2034 #endif |
2035 | |
2036 #if defined(CURSOR_SHAPE) || defined(PROTO) | |
2037 | |
2038 /* | |
2039 * Handling of cursor and mouse pointer shapes in various modes. | |
2040 */ | |
2041 | |
2042 cursorentry_T shape_table[SHAPE_IDX_COUNT] = | |
2043 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2044 // The values will be filled in from the 'guicursor' and 'mouseshape' |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2045 // defaults when Vim starts. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2046 // Adjust the SHAPE_IDX_ defines when making changes! |
7 | 2047 {0, 0, 0, 700L, 400L, 250L, 0, 0, "n", SHAPE_CURSOR+SHAPE_MOUSE}, |
2048 {0, 0, 0, 700L, 400L, 250L, 0, 0, "v", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2049 {0, 0, 0, 700L, 400L, 250L, 0, 0, "i", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2050 {0, 0, 0, 700L, 400L, 250L, 0, 0, "r", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2051 {0, 0, 0, 700L, 400L, 250L, 0, 0, "c", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2052 {0, 0, 0, 700L, 400L, 250L, 0, 0, "ci", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2053 {0, 0, 0, 700L, 400L, 250L, 0, 0, "cr", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2054 {0, 0, 0, 700L, 400L, 250L, 0, 0, "o", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2055 {0, 0, 0, 700L, 400L, 250L, 0, 0, "ve", SHAPE_CURSOR+SHAPE_MOUSE}, | |
2056 {0, 0, 0, 0L, 0L, 0L, 0, 0, "e", SHAPE_MOUSE}, | |
2057 {0, 0, 0, 0L, 0L, 0L, 0, 0, "s", SHAPE_MOUSE}, | |
2058 {0, 0, 0, 0L, 0L, 0L, 0, 0, "sd", SHAPE_MOUSE}, | |
2059 {0, 0, 0, 0L, 0L, 0L, 0, 0, "vs", SHAPE_MOUSE}, | |
2060 {0, 0, 0, 0L, 0L, 0L, 0, 0, "vd", SHAPE_MOUSE}, | |
2061 {0, 0, 0, 0L, 0L, 0L, 0, 0, "m", SHAPE_MOUSE}, | |
2062 {0, 0, 0, 0L, 0L, 0L, 0, 0, "ml", SHAPE_MOUSE}, | |
2063 {0, 0, 0, 100L, 100L, 100L, 0, 0, "sm", SHAPE_CURSOR}, | |
2064 }; | |
2065 | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2066 # ifdef FEAT_MOUSESHAPE |
7 | 2067 /* |
2068 * Table with names for mouse shapes. Keep in sync with all the tables for | |
2069 * mch_set_mouse_shape()!. | |
2070 */ | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2071 static char *mshape_names[] = |
7 | 2072 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2073 "arrow", // default, must be the first one |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2074 "blank", // hidden |
7 | 2075 "beam", |
2076 "updown", | |
2077 "udsizing", | |
2078 "leftright", | |
2079 "lrsizing", | |
2080 "busy", | |
2081 "no", | |
2082 "crosshair", | |
2083 "hand1", | |
2084 "hand2", | |
2085 "pencil", | |
2086 "question", | |
2087 "rightup-arrow", | |
2088 "up-arrow", | |
2089 NULL | |
2090 }; | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2091 |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2092 # define MSHAPE_NAMES_COUNT (ARRAY_LENGTH(mshape_names) - 1) |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2093 # endif |
7 | 2094 |
2095 /* | |
2096 * Parse the 'guicursor' option ("what" is SHAPE_CURSOR) or 'mouseshape' | |
2097 * ("what" is SHAPE_MOUSE). | |
2098 * Returns error message for an illegal option, NULL otherwise. | |
2099 */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15428
diff
changeset
|
2100 char * |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2101 parse_shape_opt(int what) |
7 | 2102 { |
2103 char_u *modep; | |
2104 char_u *colonp; | |
2105 char_u *commap; | |
2106 char_u *slashp; | |
2107 char_u *p, *endp; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2108 int idx = 0; // init for GCC |
7 | 2109 int all_idx; |
2110 int len; | |
2111 int i; | |
2112 long n; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2113 int found_ve = FALSE; // found "ve" flag |
7 | 2114 int round; |
2115 | |
2116 /* | |
2117 * First round: check for errors; second round: do it for real. | |
2118 */ | |
2119 for (round = 1; round <= 2; ++round) | |
2120 { | |
2121 /* | |
2122 * Repeat for all comma separated parts. | |
2123 */ | |
2124 #ifdef FEAT_MOUSESHAPE | |
2125 if (what == SHAPE_MOUSE) | |
2126 modep = p_mouseshape; | |
2127 else | |
2128 #endif | |
2129 modep = p_guicursor; | |
2130 while (*modep != NUL) | |
2131 { | |
2132 colonp = vim_strchr(modep, ':'); | |
10936
a516b6c279d9
patch 8.0.0357: crash when setting 'guicursor' to weird value
Christian Brabandt <cb@256bit.org>
parents:
10716
diff
changeset
|
2133 commap = vim_strchr(modep, ','); |
a516b6c279d9
patch 8.0.0357: crash when setting 'guicursor' to weird value
Christian Brabandt <cb@256bit.org>
parents:
10716
diff
changeset
|
2134 |
a516b6c279d9
patch 8.0.0357: crash when setting 'guicursor' to weird value
Christian Brabandt <cb@256bit.org>
parents:
10716
diff
changeset
|
2135 if (colonp == NULL || (commap != NULL && commap < colonp)) |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2136 return e_missing_colon_2; |
7 | 2137 if (colonp == modep) |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2138 return e_illegal_mode; |
7 | 2139 |
2140 /* | |
2141 * Repeat for all mode's before the colon. | |
2142 * For the 'a' mode, we loop to handle all the modes. | |
2143 */ | |
2144 all_idx = -1; | |
2145 while (modep < colonp || all_idx >= 0) | |
2146 { | |
2147 if (all_idx < 0) | |
2148 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2149 // Find the mode. |
7 | 2150 if (modep[1] == '-' || modep[1] == ':') |
2151 len = 1; | |
2152 else | |
2153 len = 2; | |
2154 if (len == 1 && TOLOWER_ASC(modep[0]) == 'a') | |
2155 all_idx = SHAPE_IDX_COUNT - 1; | |
2156 else | |
2157 { | |
2158 for (idx = 0; idx < SHAPE_IDX_COUNT; ++idx) | |
2159 if (STRNICMP(modep, shape_table[idx].name, len) | |
2160 == 0) | |
2161 break; | |
2162 if (idx == SHAPE_IDX_COUNT | |
2163 || (shape_table[idx].used_for & what) == 0) | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2164 return e_illegal_mode; |
7 | 2165 if (len == 2 && modep[0] == 'v' && modep[1] == 'e') |
2166 found_ve = TRUE; | |
2167 } | |
2168 modep += len + 1; | |
2169 } | |
2170 | |
2171 if (all_idx >= 0) | |
2172 idx = all_idx--; | |
2173 else if (round == 2) | |
2174 { | |
2175 #ifdef FEAT_MOUSESHAPE | |
2176 if (what == SHAPE_MOUSE) | |
2177 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2178 // Set the default, for the missing parts |
7 | 2179 shape_table[idx].mshape = 0; |
2180 } | |
2181 else | |
2182 #endif | |
2183 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2184 // Set the defaults, for the missing parts |
7 | 2185 shape_table[idx].shape = SHAPE_BLOCK; |
2186 shape_table[idx].blinkwait = 700L; | |
2187 shape_table[idx].blinkon = 400L; | |
2188 shape_table[idx].blinkoff = 250L; | |
2189 } | |
2190 } | |
2191 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2192 // Parse the part after the colon |
7 | 2193 for (p = colonp + 1; *p && *p != ','; ) |
2194 { | |
2195 #ifdef FEAT_MOUSESHAPE | |
2196 if (what == SHAPE_MOUSE) | |
2197 { | |
2198 for (i = 0; ; ++i) | |
2199 { | |
2200 if (mshape_names[i] == NULL) | |
2201 { | |
2202 if (!VIM_ISDIGIT(*p)) | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2203 return e_illegal_mouseshape; |
7 | 2204 if (round == 2) |
2205 shape_table[idx].mshape = | |
2206 getdigits(&p) + MSHAPE_NUMBERED; | |
2207 else | |
2208 (void)getdigits(&p); | |
2209 break; | |
2210 } | |
2211 len = (int)STRLEN(mshape_names[i]); | |
2212 if (STRNICMP(p, mshape_names[i], len) == 0) | |
2213 { | |
2214 if (round == 2) | |
2215 shape_table[idx].mshape = i; | |
2216 p += len; | |
2217 break; | |
2218 } | |
2219 } | |
2220 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2221 else // if (what == SHAPE_MOUSE) |
7 | 2222 #endif |
2223 { | |
2224 /* | |
2225 * First handle the ones with a number argument. | |
2226 */ | |
2227 i = *p; | |
2228 len = 0; | |
2229 if (STRNICMP(p, "ver", 3) == 0) | |
2230 len = 3; | |
2231 else if (STRNICMP(p, "hor", 3) == 0) | |
2232 len = 3; | |
2233 else if (STRNICMP(p, "blinkwait", 9) == 0) | |
2234 len = 9; | |
2235 else if (STRNICMP(p, "blinkon", 7) == 0) | |
2236 len = 7; | |
2237 else if (STRNICMP(p, "blinkoff", 8) == 0) | |
2238 len = 8; | |
2239 if (len != 0) | |
2240 { | |
2241 p += len; | |
2242 if (!VIM_ISDIGIT(*p)) | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2243 return e_digit_expected; |
7 | 2244 n = getdigits(&p); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2245 if (len == 3) // "ver" or "hor" |
7 | 2246 { |
2247 if (n == 0) | |
26917
d91aea2a612c
patch 8.2.3987: error messages are spread out
Bram Moolenaar <Bram@vim.org>
parents:
26865
diff
changeset
|
2248 return e_illegal_percentage; |
7 | 2249 if (round == 2) |
2250 { | |
2251 if (TOLOWER_ASC(i) == 'v') | |
2252 shape_table[idx].shape = SHAPE_VER; | |
2253 else | |
2254 shape_table[idx].shape = SHAPE_HOR; | |
2255 shape_table[idx].percentage = n; | |
2256 } | |
2257 } | |
2258 else if (round == 2) | |
2259 { | |
2260 if (len == 9) | |
2261 shape_table[idx].blinkwait = n; | |
2262 else if (len == 7) | |
2263 shape_table[idx].blinkon = n; | |
2264 else | |
2265 shape_table[idx].blinkoff = n; | |
2266 } | |
2267 } | |
2268 else if (STRNICMP(p, "block", 5) == 0) | |
2269 { | |
2270 if (round == 2) | |
2271 shape_table[idx].shape = SHAPE_BLOCK; | |
2272 p += 5; | |
2273 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2274 else // must be a highlight group name then |
7 | 2275 { |
2276 endp = vim_strchr(p, '-'); | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2277 if (commap == NULL) // last part |
7 | 2278 { |
2279 if (endp == NULL) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2280 endp = p + STRLEN(p); // find end of part |
7 | 2281 } |
2282 else if (endp > commap || endp == NULL) | |
2283 endp = commap; | |
2284 slashp = vim_strchr(p, '/'); | |
2285 if (slashp != NULL && slashp < endp) | |
2286 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2287 // "group/langmap_group" |
7 | 2288 i = syn_check_group(p, (int)(slashp - p)); |
2289 p = slashp + 1; | |
2290 } | |
2291 if (round == 2) | |
2292 { | |
2293 shape_table[idx].id = syn_check_group(p, | |
2294 (int)(endp - p)); | |
2295 shape_table[idx].id_lm = shape_table[idx].id; | |
2296 if (slashp != NULL && slashp < endp) | |
2297 shape_table[idx].id = i; | |
2298 } | |
2299 p = endp; | |
2300 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2301 } // if (what != SHAPE_MOUSE) |
7 | 2302 |
2303 if (*p == '-') | |
2304 ++p; | |
2305 } | |
2306 } | |
2307 modep = p; | |
2308 if (*modep == ',') | |
2309 ++modep; | |
2310 } | |
2311 } | |
2312 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2313 // If the 's' flag is not given, use the 'v' cursor for 's' |
7 | 2314 if (!found_ve) |
2315 { | |
2316 #ifdef FEAT_MOUSESHAPE | |
2317 if (what == SHAPE_MOUSE) | |
2318 { | |
2319 shape_table[SHAPE_IDX_VE].mshape = shape_table[SHAPE_IDX_V].mshape; | |
2320 } | |
2321 else | |
2322 #endif | |
2323 { | |
2324 shape_table[SHAPE_IDX_VE].shape = shape_table[SHAPE_IDX_V].shape; | |
2325 shape_table[SHAPE_IDX_VE].percentage = | |
2326 shape_table[SHAPE_IDX_V].percentage; | |
2327 shape_table[SHAPE_IDX_VE].blinkwait = | |
2328 shape_table[SHAPE_IDX_V].blinkwait; | |
2329 shape_table[SHAPE_IDX_VE].blinkon = | |
2330 shape_table[SHAPE_IDX_V].blinkon; | |
2331 shape_table[SHAPE_IDX_VE].blinkoff = | |
2332 shape_table[SHAPE_IDX_V].blinkoff; | |
2333 shape_table[SHAPE_IDX_VE].id = shape_table[SHAPE_IDX_V].id; | |
2334 shape_table[SHAPE_IDX_VE].id_lm = shape_table[SHAPE_IDX_V].id_lm; | |
2335 } | |
2336 } | |
2337 | |
2338 return NULL; | |
2339 } | |
2340 | |
500 | 2341 # if defined(MCH_CURSOR_SHAPE) || defined(FEAT_GUI) \ |
2342 || defined(FEAT_MOUSESHAPE) || defined(PROTO) | |
7 | 2343 /* |
2344 * Return the index into shape_table[] for the current mode. | |
2345 * When "mouse" is TRUE, consider indexes valid for the mouse pointer. | |
2346 */ | |
2347 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2348 get_shape_idx(int mouse) |
7 | 2349 { |
2350 #ifdef FEAT_MOUSESHAPE | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
2351 if (mouse && (State == MODE_HITRETURN || State == MODE_ASKMORE)) |
7 | 2352 { |
2353 # ifdef FEAT_GUI | |
87 | 2354 int x, y; |
2355 gui_mch_getmouse(&x, &y); | |
2356 if (Y_2_ROW(y) == Rows - 1) | |
7 | 2357 return SHAPE_IDX_MOREL; |
2358 # endif | |
2359 return SHAPE_IDX_MORE; | |
2360 } | |
2361 if (mouse && drag_status_line) | |
2362 return SHAPE_IDX_SDRAG; | |
2363 if (mouse && drag_sep_line) | |
2364 return SHAPE_IDX_VDRAG; | |
2365 #endif | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
2366 if (!mouse && State == MODE_SHOWMATCH) |
7 | 2367 return SHAPE_IDX_SM; |
2368 if (State & VREPLACE_FLAG) | |
2369 return SHAPE_IDX_R; | |
2370 if (State & REPLACE_FLAG) | |
2371 return SHAPE_IDX_R; | |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
2372 if (State & MODE_INSERT) |
7 | 2373 return SHAPE_IDX_I; |
28773
d770568e6c98
patch 8.2.4911: the mode #defines are not clearly named
Bram Moolenaar <Bram@vim.org>
parents:
28668
diff
changeset
|
2374 if (State & MODE_CMDLINE) |
7 | 2375 { |
2376 if (cmdline_at_end()) | |
2377 return SHAPE_IDX_C; | |
2378 if (cmdline_overstrike()) | |
2379 return SHAPE_IDX_CR; | |
2380 return SHAPE_IDX_CI; | |
2381 } | |
2382 if (finish_op) | |
2383 return SHAPE_IDX_O; | |
2384 if (VIsual_active) | |
2385 { | |
2386 if (*p_sel == 'e') | |
2387 return SHAPE_IDX_VE; | |
2388 else | |
2389 return SHAPE_IDX_V; | |
2390 } | |
2391 return SHAPE_IDX_N; | |
2392 } | |
500 | 2393 #endif |
7 | 2394 |
2395 # if defined(FEAT_MOUSESHAPE) || defined(PROTO) | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2396 static int current_mouse_shape = 0; |
7 | 2397 |
2398 /* | |
2399 * Set the mouse shape: | |
2400 * If "shape" is -1, use shape depending on the current mode, | |
2401 * depending on the current state. | |
2402 * If "shape" is -2, only update the shape when it's CLINE or STATUS (used | |
2403 * when the mouse moves off the status or command line). | |
2404 */ | |
2405 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2406 update_mouseshape(int shape_idx) |
7 | 2407 { |
2408 int new_mouse_shape; | |
2409 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2410 // Only works in GUI mode. |
227 | 2411 if (!gui.in_use || gui.starting) |
7 | 2412 return; |
2413 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2414 // Postpone the updating when more is to come. Speeds up executing of |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2415 // mappings. |
7 | 2416 if (shape_idx == -1 && char_avail()) |
2417 { | |
2418 postponed_mouseshape = TRUE; | |
2419 return; | |
2420 } | |
2421 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2422 // When ignoring the mouse don't change shape on the statusline. |
864 | 2423 if (*p_mouse == NUL |
2424 && (shape_idx == SHAPE_IDX_CLINE | |
2425 || shape_idx == SHAPE_IDX_STATUS | |
2426 || shape_idx == SHAPE_IDX_VSEP)) | |
2427 shape_idx = -2; | |
2428 | |
7 | 2429 if (shape_idx == -2 |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2430 && current_mouse_shape != shape_table[SHAPE_IDX_CLINE].mshape |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2431 && current_mouse_shape != shape_table[SHAPE_IDX_STATUS].mshape |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2432 && current_mouse_shape != shape_table[SHAPE_IDX_VSEP].mshape) |
7 | 2433 return; |
2434 if (shape_idx < 0) | |
2435 new_mouse_shape = shape_table[get_shape_idx(TRUE)].mshape; | |
2436 else | |
2437 new_mouse_shape = shape_table[shape_idx].mshape; | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2438 if (new_mouse_shape != current_mouse_shape) |
7 | 2439 { |
2440 mch_set_mouse_shape(new_mouse_shape); | |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2441 current_mouse_shape = new_mouse_shape; |
7 | 2442 } |
2443 postponed_mouseshape = FALSE; | |
2444 } | |
2445 # endif | |
2446 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2447 #endif // CURSOR_SHAPE |
7 | 2448 |
31093
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2449 #if defined(FEAT_EVAL) || defined(PROTO) |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2450 /* |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2451 * Mainly for tests: get the name of the current mouse shape. |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2452 */ |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2453 void |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2454 f_getmouseshape(typval_T *argvars UNUSED, typval_T *rettv) |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2455 { |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2456 rettv->v_type = VAR_STRING; |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2457 rettv->vval.v_string = NULL; |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2458 # if defined(FEAT_MOUSESHAPE) || defined(PROTO) |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2459 if (current_mouse_shape >= 0 |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2460 && current_mouse_shape < (int)MSHAPE_NAMES_COUNT) |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2461 rettv->vval.v_string = vim_strsave( |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2462 (char_u *)mshape_names[current_mouse_shape]); |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2463 # endif |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2464 } |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2465 #endif |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2466 |
004aee2845d2
patch 9.0.0881: cannot get the currently showing mouse shape
Bram Moolenaar <Bram@vim.org>
parents:
30833
diff
changeset
|
2467 |
7 | 2468 |
2469 /* | |
29853
31c598083364
patch 9.0.0265: no good reason why the "gf" command isn't in the tiny version
Bram Moolenaar <Bram@vim.org>
parents:
29765
diff
changeset
|
2470 * Change directory to "new_dir". Search 'cdpath' for relative directory |
30205
ed6f3d2593df
patch 9.0.0438: cannot put virtual text above a line
Bram Moolenaar <Bram@vim.org>
parents:
29853
diff
changeset
|
2471 * names. |
7 | 2472 */ |
2473 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2474 vim_chdir(char_u *new_dir) |
7 | 2475 { |
2476 char_u *dir_name; | |
2477 int r; | |
32138
2c09e40ce3da
patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
2478 char_u *file_to_find = NULL; |
2c09e40ce3da
patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
2479 char *search_ctx = NULL; |
7 | 2480 |
2481 dir_name = find_directory_in_path(new_dir, (int)STRLEN(new_dir), | |
32138
2c09e40ce3da
patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
2482 FNAME_MESS, curbuf->b_ffname, &file_to_find, &search_ctx); |
2c09e40ce3da
patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
2483 vim_free(file_to_find); |
2c09e40ce3da
patch 9.0.1400: find_file_in_path() is not reentrant
Bram Moolenaar <Bram@vim.org>
parents:
32098
diff
changeset
|
2484 vim_findfile_cleanup(search_ctx); |
7 | 2485 if (dir_name == NULL) |
2486 return -1; | |
2487 r = mch_chdir((char *)dir_name); | |
2488 vim_free(dir_name); | |
2489 return r; | |
2490 } | |
2491 | |
2492 /* | |
418 | 2493 * Get user name from machine-specific function. |
7 | 2494 * Returns the user name in "buf[len]". |
418 | 2495 * Some systems are quite slow in obtaining the user name (Windows NT), thus |
2496 * cache the result. | |
7 | 2497 * Returns OK or FAIL. |
2498 */ | |
2499 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2500 get_user_name(char_u *buf, int len) |
7 | 2501 { |
359 | 2502 if (username == NULL) |
7 | 2503 { |
2504 if (mch_get_user_name(buf, len) == FAIL) | |
2505 return FAIL; | |
359 | 2506 username = vim_strsave(buf); |
7 | 2507 } |
2508 else | |
418 | 2509 vim_strncpy(buf, username, len - 1); |
7 | 2510 return OK; |
2511 } | |
2512 | |
28893
aa44d5842d6c
patch 8.2.4969: changing text in Visual mode may cause invalid memory access
Bram Moolenaar <Bram@vim.org>
parents:
28809
diff
changeset
|
2513 #if defined(EXITFREE) || defined(PROTO) |
25529
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2514 /* |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2515 * Free the memory allocated by get_user_name() |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2516 */ |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2517 void |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2518 free_username(void) |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2519 { |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2520 vim_free(username); |
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2521 } |
27018
268f6a3511df
patch 8.2.4038: various code not used when features are disabled
Bram Moolenaar <Bram@vim.org>
parents:
26917
diff
changeset
|
2522 #endif |
25529
bb1097899693
patch 8.2.3301: memory allocation functions don't have their own place
Bram Moolenaar <Bram@vim.org>
parents:
25435
diff
changeset
|
2523 |
7 | 2524 #ifndef HAVE_QSORT |
2525 /* | |
2526 * Our own qsort(), for systems that don't have it. | |
2527 * It's simple and slow. From the K&R C book. | |
2528 */ | |
2529 void | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2530 qsort( |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2531 void *base, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2532 size_t elm_count, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2533 size_t elm_size, |
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2534 int (*cmp)(const void *, const void *)) |
7 | 2535 { |
2536 char_u *buf; | |
2537 char_u *p1; | |
2538 char_u *p2; | |
2539 int i, j; | |
2540 int gap; | |
2541 | |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
2542 buf = alloc(elm_size); |
7 | 2543 if (buf == NULL) |
2544 return; | |
2545 | |
2546 for (gap = elm_count / 2; gap > 0; gap /= 2) | |
2547 for (i = gap; i < elm_count; ++i) | |
2548 for (j = i - gap; j >= 0; j -= gap) | |
2549 { | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2550 // Compare the elements. |
7 | 2551 p1 = (char_u *)base + j * elm_size; |
2552 p2 = (char_u *)base + (j + gap) * elm_size; | |
2553 if ((*cmp)((void *)p1, (void *)p2) <= 0) | |
2554 break; | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2555 // Exchange the elements. |
7 | 2556 mch_memmove(buf, p1, elm_size); |
2557 mch_memmove(p1, p2, elm_size); | |
2558 mch_memmove(p2, buf, elm_size); | |
2559 } | |
2560 | |
2561 vim_free(buf); | |
2562 } | |
2563 #endif | |
2564 | |
2565 /* | |
2566 * The putenv() implementation below comes from the "screen" program. | |
2567 * Included with permission from Juergen Weigert. | |
2568 * See pty.c for the copyright notice. | |
2569 */ | |
2570 | |
2571 /* | |
2572 * putenv -- put value into environment | |
2573 * | |
2574 * Usage: i = putenv (string) | |
2575 * int i; | |
2576 * char *string; | |
2577 * | |
2578 * where string is of the form <name>=<value>. | |
2579 * Putenv returns 0 normally, -1 on error (not enough core for malloc). | |
2580 * | |
2581 * Putenv may need to add a new name into the environment, or to | |
2582 * associate a value longer than the current value with a particular | |
2583 * name. So, to make life simpler, putenv() copies your entire | |
2584 * environment into the heap (i.e. malloc()) from the stack | |
2585 * (i.e. where it resides when your process is initiated) the first | |
2586 * time you call it. | |
2587 * | |
2588 * (history removed, not very interesting. See the "screen" sources.) | |
2589 */ | |
2590 | |
2591 #if !defined(HAVE_SETENV) && !defined(HAVE_PUTENV) | |
2592 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2593 #define EXTRASIZE 5 // increment to add to env. size |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2594 |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2595 static int envsize = -1; // current size of environment |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2596 extern char **environ; // the global which is your env. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2597 |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2598 static int findenv(char *name); // look for a name in the env. |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2599 static int newenv(void); // copy env. from stack to heap |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2600 static int moreenv(void); // incr. size of env. |
7 | 2601 |
2602 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2603 putenv(const char *string) |
7 | 2604 { |
2605 int i; | |
2606 char *p; | |
2607 | |
2608 if (envsize < 0) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2609 { // first time putenv called |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2610 if (newenv() < 0) // copy env. to heap |
7 | 2611 return -1; |
2612 } | |
2613 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2614 i = findenv((char *)string); // look for name in environment |
7 | 2615 |
2616 if (i < 0) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2617 { // name must be added |
7 | 2618 for (i = 0; environ[i]; i++); |
2619 if (i >= (envsize - 1)) | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2620 { // need new slot |
7 | 2621 if (moreenv() < 0) |
2622 return -1; | |
2623 } | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
2624 p = alloc(strlen(string) + 1); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2625 if (p == NULL) // not enough core |
7 | 2626 return -1; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2627 environ[i + 1] = 0; // new end of env. |
7 | 2628 } |
2629 else | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2630 { // name already in env. |
7 | 2631 p = vim_realloc(environ[i], strlen(string) + 1); |
2632 if (p == NULL) | |
2633 return -1; | |
2634 } | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2635 sprintf(p, "%s", string); // copy into env. |
7 | 2636 environ[i] = p; |
2637 | |
2638 return 0; | |
2639 } | |
2640 | |
2641 static int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2642 findenv(char *name) |
7 | 2643 { |
2644 char *namechar, *envchar; | |
2645 int i, found; | |
2646 | |
2647 found = 0; | |
2648 for (i = 0; environ[i] && !found; i++) | |
2649 { | |
2650 envchar = environ[i]; | |
2651 namechar = name; | |
2652 while (*namechar && *namechar != '=' && (*namechar == *envchar)) | |
2653 { | |
2654 namechar++; | |
2655 envchar++; | |
2656 } | |
2657 found = ((*namechar == '\0' || *namechar == '=') && *envchar == '='); | |
2658 } | |
2659 return found ? i - 1 : -1; | |
2660 } | |
2661 | |
2662 static int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2663 newenv(void) |
7 | 2664 { |
2665 char **env, *elem; | |
2666 int i, esize; | |
2667 | |
2668 for (i = 0; environ[i]; i++) | |
2669 ; | |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12672
diff
changeset
|
2670 |
7 | 2671 esize = i + EXTRASIZE + 1; |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
2672 env = ALLOC_MULT(char *, esize); |
7 | 2673 if (env == NULL) |
2674 return -1; | |
2675 | |
2676 for (i = 0; environ[i]; i++) | |
2677 { | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
2678 elem = alloc(strlen(environ[i]) + 1); |
7 | 2679 if (elem == NULL) |
2680 return -1; | |
2681 env[i] = elem; | |
2682 strcpy(elem, environ[i]); | |
2683 } | |
2684 | |
2685 env[i] = 0; | |
2686 environ = env; | |
2687 envsize = esize; | |
2688 return 0; | |
2689 } | |
2690 | |
2691 static int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2692 moreenv(void) |
7 | 2693 { |
2694 int esize; | |
2695 char **env; | |
2696 | |
2697 esize = envsize + EXTRASIZE; | |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
2698 env = vim_realloc((char *)environ, esize * sizeof (*env)); |
7 | 2699 if (env == 0) |
2700 return -1; | |
2701 environ = env; | |
2702 envsize = esize; | |
2703 return 0; | |
2704 } | |
2705 | |
2706 # ifdef USE_VIMPTY_GETENV | |
11737
7791a15353dc
patch 8.0.0751: OpenPTY missing with some combination of features
Christian Brabandt <cb@256bit.org>
parents:
11557
diff
changeset
|
2707 /* |
7791a15353dc
patch 8.0.0751: OpenPTY missing with some combination of features
Christian Brabandt <cb@256bit.org>
parents:
11557
diff
changeset
|
2708 * Used for mch_getenv() for Mac. |
7791a15353dc
patch 8.0.0751: OpenPTY missing with some combination of features
Christian Brabandt <cb@256bit.org>
parents:
11557
diff
changeset
|
2709 */ |
7 | 2710 char_u * |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2711 vimpty_getenv(const char_u *string) |
7 | 2712 { |
2713 int i; | |
2714 char_u *p; | |
2715 | |
2716 if (envsize < 0) | |
2717 return NULL; | |
2718 | |
2719 i = findenv((char *)string); | |
2720 | |
2721 if (i < 0) | |
2722 return NULL; | |
2723 | |
2724 p = vim_strchr((char_u *)environ[i], '='); | |
2725 return (p + 1); | |
2726 } | |
2727 # endif | |
2728 | |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2729 #endif // !defined(HAVE_SETENV) && !defined(HAVE_PUTENV) |
313 | 2730 |
741 | 2731 #if defined(FEAT_EVAL) || defined(FEAT_SPELL) || defined(PROTO) |
313 | 2732 /* |
2733 * Return 0 for not writable, 1 for writable file, 2 for a dir which we have | |
2734 * rights to write into. | |
2735 */ | |
2736 int | |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2737 filewritable(char_u *fname) |
313 | 2738 { |
2739 int retval = 0; | |
2740 #if defined(UNIX) || defined(VMS) | |
2741 int perm = 0; | |
2742 #endif | |
2743 | |
2744 #if defined(UNIX) || defined(VMS) | |
2745 perm = mch_getperm(fname); | |
2746 #endif | |
2747 if ( | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15814
diff
changeset
|
2748 # ifdef MSWIN |
313 | 2749 mch_writable(fname) && |
2750 # else | |
2751 # if defined(UNIX) || defined(VMS) | |
2752 (perm & 0222) && | |
2753 # endif | |
2754 # endif | |
2755 mch_access((char *)fname, W_OK) == 0 | |
2756 ) | |
2757 { | |
2758 ++retval; | |
2759 if (mch_isdir(fname)) | |
2760 ++retval; | |
2761 } | |
2762 return retval; | |
2763 } | |
2764 #endif | |
332 | 2765 |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2766 #if defined(FEAT_SPELL) || defined(FEAT_PERSISTENT_UNDO) || defined(PROTO) |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2767 /* |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2768 * Read 2 bytes from "fd" and turn them into an int, MSB first. |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2769 * Returns -1 when encountering EOF. |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2770 */ |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2771 int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2772 get2c(FILE *fd) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2773 { |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2774 int c, n; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2775 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2776 n = getc(fd); |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2777 if (n == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2778 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2779 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2780 return (n << 8) + c; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2781 } |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2782 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2783 /* |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2784 * Read 3 bytes from "fd" and turn them into an int, MSB first. |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2785 * Returns -1 when encountering EOF. |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2786 */ |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2787 int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2788 get3c(FILE *fd) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2789 { |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2790 int c, n; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2791 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2792 n = getc(fd); |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2793 if (n == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2794 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2795 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2796 n = (n << 8) + c; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2797 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2798 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2799 return (n << 8) + c; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2800 } |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2801 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2802 /* |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2803 * Read 4 bytes from "fd" and turn them into an int, MSB first. |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2804 * Returns -1 when encountering EOF. |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2805 */ |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2806 int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2807 get4c(FILE *fd) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2808 { |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2809 int c; |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2810 // Use unsigned rather than int otherwise result is undefined |
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2811 // when left-shift sets the MSB. |
5347 | 2812 unsigned n; |
2813 | |
13493
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2814 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2815 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2816 n = (unsigned)c; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2817 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2818 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2819 n = (n << 8) + (unsigned)c; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2820 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2821 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2822 n = (n << 8) + (unsigned)c; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2823 c = getc(fd); |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2824 if (c == EOF) return -1; |
96de13023cad
patch 8.0.1620: reading spell file has no good EOF detection
Christian Brabandt <cb@256bit.org>
parents:
13380
diff
changeset
|
2825 n = (n << 8) + (unsigned)c; |
5347 | 2826 return (int)n; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2827 } |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2828 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2829 /* |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2830 * Read a string of length "cnt" from "fd" into allocated memory. |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2831 * Returns NULL when out of memory or unable to read that many bytes. |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2832 */ |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2833 char_u * |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2834 read_string(FILE *fd, int cnt) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2835 { |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2836 char_u *str; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2837 int i; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2838 int c; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2839 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2840 // allocate memory |
16764
ef00b6bc186b
patch 8.1.1384: using "int" for alloc() often results in compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
16706
diff
changeset
|
2841 str = alloc(cnt + 1); |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2842 if (str == NULL) |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2843 return NULL; |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2844 |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2845 // Read the string. Quit when running into the EOF. |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2846 for (i = 0; i < cnt; ++i) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2847 { |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2848 c = getc(fd); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2849 if (c == EOF) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2850 { |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2851 vim_free(str); |
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2852 return NULL; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2853 } |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2854 str[i] = c; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2855 } |
31728
238ca27dbfd2
patch 9.0.1196: code is indented more than necessary
Bram Moolenaar <Bram@vim.org>
parents:
31722
diff
changeset
|
2856 str[i] = NUL; |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2857 return str; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2858 } |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2859 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2860 /* |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2861 * Write a number to file "fd", MSB first, in "len" bytes. |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2862 */ |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2863 int |
7829
2a8d6b2dd925
commit https://github.com/vim/vim/commit/9b57814db13c29ecb08260b36923c0e1c8a373a9
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2864 put_bytes(FILE *fd, long_u nr, int len) |
2229
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2865 { |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2866 int i; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2867 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2868 for (i = len - 1; i >= 0; --i) |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2869 if (putc((int)(nr >> (i * 8)), fd) == EOF) |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2870 return FAIL; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2871 return OK; |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2872 } |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2873 |
d45902a5c61c
Fix a few more things for persistent undo.
Bram Moolenaar <bram@vim.org>
parents:
2215
diff
changeset
|
2874 #endif |
3257 | 2875 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2876 #ifndef PROTO // proto is defined in vim.h |
10449
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2877 # ifdef ELAPSED_TIMEVAL |
10406
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2878 /* |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2879 * Return time in msec since "start_tv". |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2880 */ |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2881 long |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2882 elapsed(struct timeval *start_tv) |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2883 { |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2884 struct timeval now_tv; |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2885 |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2886 gettimeofday(&now_tv, NULL); |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2887 return (now_tv.tv_sec - start_tv->tv_sec) * 1000L |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2888 + (now_tv.tv_usec - start_tv->tv_usec) / 1000L; |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2889 } |
10449
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2890 # endif |
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2891 |
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2892 # ifdef ELAPSED_TICKCOUNT |
10406
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2893 /* |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2894 * Return time in msec since "start_tick". |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2895 */ |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2896 long |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2897 elapsed(DWORD start_tick) |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2898 { |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2899 DWORD now = GetTickCount(); |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2900 |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2901 return (long)now - (long)start_tick; |
42911b233245
commit https://github.com/vim/vim/commit/833eb1d752426689051bf2001083359899536939
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
2902 } |
10449
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2903 # endif |
222b1432814e
commit https://github.com/vim/vim/commit/5162822914372fc916a93f85848c0c82209e7cec
Christian Brabandt <cb@256bit.org>
parents:
10430
diff
changeset
|
2904 #endif |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2905 |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2906 #if defined(FEAT_JOB_CHANNEL) \ |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2907 || (defined(UNIX) && (!defined(USE_SYSTEM) \ |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2908 || (defined(FEAT_GUI) && defined(FEAT_TERMINAL)))) \ |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2909 || defined(PROTO) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2910 /* |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2911 * Parse "cmd" and put the white-separated parts in "argv". |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2912 * "argv" is an allocated array with "argc" entries and room for 4 more. |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2913 * Returns FAIL when out of memory. |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2914 */ |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2915 int |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2916 mch_parse_cmd(char_u *cmd, int use_shcf, char ***argv, int *argc) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2917 { |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2918 int i; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2919 char_u *p, *d; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2920 int inquote; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2921 |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2922 /* |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2923 * Do this loop twice: |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2924 * 1: find number of arguments |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2925 * 2: separate them and build argv[] |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2926 */ |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2927 for (i = 1; i <= 2; ++i) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2928 { |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2929 p = skipwhite(cmd); |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2930 inquote = FALSE; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2931 *argc = 0; |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2932 while (*p != NUL) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2933 { |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2934 if (i == 2) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2935 (*argv)[*argc] = (char *)p; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2936 ++*argc; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2937 d = p; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2938 while (*p != NUL && (inquote || (*p != ' ' && *p != TAB))) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2939 { |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2940 if (p[0] == '"') |
14905
c1e94bb0f004
patch 8.1.0464: MS-Windows: job_info() has cmd without backslashes
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2941 // quotes surrounding an argument and are dropped |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2942 inquote = !inquote; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2943 else |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2944 { |
14905
c1e94bb0f004
patch 8.1.0464: MS-Windows: job_info() has cmd without backslashes
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2945 if (rem_backslash(p)) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2946 { |
14905
c1e94bb0f004
patch 8.1.0464: MS-Windows: job_info() has cmd without backslashes
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2947 // First pass: skip over "\ " and "\"". |
c1e94bb0f004
patch 8.1.0464: MS-Windows: job_info() has cmd without backslashes
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
2948 // Second pass: Remove the backslash. |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2949 ++p; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2950 } |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2951 if (i == 2) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2952 *d++ = *p; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2953 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2954 ++p; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2955 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2956 if (*p == NUL) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2957 { |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2958 if (i == 2) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2959 *d++ = NUL; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2960 break; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2961 } |
19793
607e5d7968b9
patch 8.2.0453: trailing space in job_start() command causes empty argument
Bram Moolenaar <Bram@vim.org>
parents:
19396
diff
changeset
|
2962 if (i == 2) |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2963 *d++ = NUL; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2964 p = skipwhite(p + 1); |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2965 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2966 if (*argv == NULL) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2967 { |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2968 if (use_shcf) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2969 { |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2970 // Account for possible multiple args in p_shcf. |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2971 p = p_shcf; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2972 for (;;) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2973 { |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2974 p = skiptowhite(p); |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2975 if (*p == NUL) |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2976 break; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2977 ++*argc; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2978 p = skipwhite(p); |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2979 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2980 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2981 |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
2982 *argv = ALLOC_MULT(char *, *argc + 4); |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
2983 if (*argv == NULL) // out of memory |
13746
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2984 return FAIL; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2985 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2986 } |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2987 return OK; |
260256caac38
patch 8.0.1745: build failure on MS-Windows
Christian Brabandt <cb@256bit.org>
parents:
13575
diff
changeset
|
2988 } |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2989 |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2990 /* |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2991 * Build "argv[argc]" from the string "cmd". |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2992 * "argv[argc]" is set to NULL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2993 * Return FAIL when out of memory. |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2994 */ |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2995 int |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2996 build_argv_from_string(char_u *cmd, char ***argv, int *argc) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2997 { |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2998 char_u *cmd_copy; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
2999 int i; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3000 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
3001 // Make a copy, parsing will modify "cmd". |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3002 cmd_copy = vim_strsave(cmd); |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3003 if (cmd_copy == NULL |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3004 || mch_parse_cmd(cmd_copy, FALSE, argv, argc) == FAIL) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3005 { |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3006 vim_free(cmd_copy); |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3007 return FAIL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3008 } |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3009 for (i = 0; i < *argc; i++) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3010 (*argv)[i] = (char *)vim_strsave((char_u *)(*argv)[i]); |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3011 (*argv)[*argc] = NULL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3012 vim_free(cmd_copy); |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3013 return OK; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3014 } |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3015 |
27181
f9f1e76957a6
patch 8.2.4119: build failure when disabling the channel feature
Bram Moolenaar <Bram@vim.org>
parents:
27140
diff
changeset
|
3016 # if defined(FEAT_JOB_CHANNEL) || defined(PROTO) |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3017 /* |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3018 * Build "argv[argc]" from the list "l". |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3019 * "argv[argc]" is set to NULL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3020 * Return FAIL when out of memory. |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3021 */ |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3022 int |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3023 build_argv_from_list(list_T *l, char ***argv, int *argc) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3024 { |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3025 listitem_T *li; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3026 char_u *s; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3027 |
18931
80b40bd5ec1a
patch 8.2.0026: still some /* */ comments
Bram Moolenaar <Bram@vim.org>
parents:
18886
diff
changeset
|
3028 // Pass argv[] to mch_call_shell(). |
16825
ce04ebdf26b8
patch 8.1.1414: alloc() returning "char_u *" causes a lot of type casts
Bram Moolenaar <Bram@vim.org>
parents:
16782
diff
changeset
|
3029 *argv = ALLOC_MULT(char *, l->lv_len + 1); |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3030 if (*argv == NULL) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3031 return FAIL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3032 *argc = 0; |
19888
435726a03481
patch 8.2.0500: using the same loop in many places
Bram Moolenaar <Bram@vim.org>
parents:
19793
diff
changeset
|
3033 FOR_ALL_LIST_ITEMS(l, li) |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3034 { |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
15209
diff
changeset
|
3035 s = tv_get_string_chk(&li->li_tv); |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3036 if (s == NULL) |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3037 { |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3038 int i; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3039 |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3040 for (i = 0; i < *argc; ++i) |
20033
2e5e86ff7596
patch 8.2.0572: using two lines for free and reset
Bram Moolenaar <Bram@vim.org>
parents:
20031
diff
changeset
|
3041 VIM_CLEAR((*argv)[i]); |
25891
58b1c9d96ec6
patch 8.2.3479: crash when calling job_start with an invalid argument
Bram Moolenaar <Bram@vim.org>
parents:
25642
diff
changeset
|
3042 (*argv)[0] = NULL; |
13750
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3043 return FAIL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3044 } |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3045 (*argv)[*argc] = (char *)vim_strsave(s); |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3046 *argc += 1; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3047 } |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3048 (*argv)[*argc] = NULL; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3049 return OK; |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3050 } |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3051 # endif |
3ab6198c1f9a
patch 8.0.1747: MS-Windows: term_start() does not set job_info() cmd
Christian Brabandt <cb@256bit.org>
parents:
13746
diff
changeset
|
3052 #endif |
18064
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3053 |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3054 /* |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3055 * Change the behavior of vterm. |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3056 * 0: As usual. |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3057 * 1: Windows 10 version 1809 |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3058 * The bug causes unstable handling of ambiguous width character. |
18611
6a7ebc2ee528
patch 8.1.2299: ConPTY in MS-Windows 1909 is still wrong
Bram Moolenaar <Bram@vim.org>
parents:
18301
diff
changeset
|
3059 * 2: Windows 10 version 1903 & 1909 |
18064
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3060 * Use the wrong result because each result is different. |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3061 * 3: Windows 10 insider preview (current latest logic) |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3062 */ |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3063 int |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3064 get_special_pty_type(void) |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3065 { |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3066 #ifdef MSWIN |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3067 return get_conpty_type(); |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3068 #else |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3069 return 0; |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3070 #endif |
8b4f9be5db73
patch 8.1.2027: MS-Windows: problem with ambiwidth characters
Bram Moolenaar <Bram@vim.org>
parents:
17978
diff
changeset
|
3071 } |