Mercurial > vim
annotate src/message.c @ 16150:b23048205589 v8.1.1080
patch 8.1.1080: when a screendump test fails, moving the file is a hassle
commit https://github.com/vim/vim/commit/ef7f0e367eeaf6fb31b1caa0e3de1a4b07e86af3
Author: Bram Moolenaar <Bram@vim.org>
Date: Sat Mar 30 15:59:51 2019 +0100
patch 8.1.1080: when a screendump test fails, moving the file is a hassle
Problem: When a screendump test fails, moving the file is a hassle.
Solution: Instead of appending ".failed" to the file name, keep the same
file name but put the screendump in the "failed" directory.
Then the file name only needs to be typed once when moving a
screendump.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 30 Mar 2019 16:00:06 +0100 |
parents | 78faa25f9698 |
children | c1c25e2523a6 |
rev | line source |
---|---|
10042
4aead6a9b7a9
commit https://github.com/vim/vim/commit/edf3f97ae2af024708ebb4ac614227327033ca47
Christian Brabandt <cb@256bit.org>
parents:
10040
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 * message.c: functions for displaying messages on the command line | |
12 */ | |
13 | |
14 #define MESSAGE_FILE /* don't include prototype for smsg() */ | |
9988
cafe247c949a
commit https://github.com/vim/vim/commit/44ca54aeb9a0eca41aea203786e33d82e69d0615
Christian Brabandt <cb@256bit.org>
parents:
9986
diff
changeset
|
15 #define USING_FLOAT_STUFF |
7 | 16 |
17 #include "vim.h" | |
18 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
19 static void add_msg_hist(char_u *s, int len, int attr); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
20 static void hit_return_msg(void); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
21 static void msg_home_replace_attr(char_u *fname, int attr); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
22 static void msg_puts_attr_len(char *str, int maxlen, int attr); |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
23 static void msg_puts_display(char_u *str, int maxlen, int attr, int recurse); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
24 static void msg_scroll_up(void); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
25 static void inc_msg_scrolled(void); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
26 static void store_sb_text(char_u **sb_str, char_u *s, int attr, int *sb_col, int finish); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
27 static void t_puts(int *t_col, char_u *t_s, char_u *s, int attr); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
28 static void msg_puts_printf(char_u *str, int maxlen); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
29 static int do_more_prompt(int typed_char); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
30 static void msg_screen_putchar(int c, int attr); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
31 static int msg_check_screen(void); |
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
32 static void redir_write(char_u *s, int maxlen); |
7 | 33 #ifdef FEAT_CON_DIALOG |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
34 static char_u *msg_show_console_dialog(char_u *message, char_u *buttons, int dfltbutton); |
7 | 35 static int confirm_msg_used = FALSE; /* displaying confirm_msg */ |
36 static char_u *confirm_msg = NULL; /* ":confirm" message */ | |
37 static char_u *confirm_msg_tail; /* tail of confirm_msg */ | |
38 #endif | |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
39 #ifdef FEAT_JOB_CHANNEL |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
40 static int emsg_to_channel_log = FALSE; |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
41 #endif |
7 | 42 |
43 struct msg_hist | |
44 { | |
45 struct msg_hist *next; | |
46 char_u *msg; | |
47 int attr; | |
48 }; | |
49 | |
50 static struct msg_hist *first_msg_hist = NULL; | |
51 static struct msg_hist *last_msg_hist = NULL; | |
52 static int msg_hist_len = 0; | |
53 | |
3072 | 54 static FILE *verbose_fd = NULL; |
55 static int verbose_did_open = FALSE; | |
56 | |
7 | 57 /* |
58 * When writing messages to the screen, there are many different situations. | |
59 * A number of variables is used to remember the current state: | |
60 * msg_didany TRUE when messages were written since the last time the | |
61 * user reacted to a prompt. | |
62 * Reset: After hitting a key for the hit-return prompt, | |
63 * hitting <CR> for the command line or input(). | |
64 * Set: When any message is written to the screen. | |
65 * msg_didout TRUE when something was written to the current line. | |
66 * Reset: When advancing to the next line, when the current | |
67 * text can be overwritten. | |
68 * Set: When any message is written to the screen. | |
69 * msg_nowait No extra delay for the last drawn message. | |
70 * Used in normal_cmd() before the mode message is drawn. | |
71 * emsg_on_display There was an error message recently. Indicates that there | |
72 * should be a delay before redrawing. | |
73 * msg_scroll The next message should not overwrite the current one. | |
74 * msg_scrolled How many lines the screen has been scrolled (because of | |
75 * messages). Used in update_screen() to scroll the screen | |
76 * back. Incremented each time the screen scrolls a line. | |
77 * msg_scrolled_ign TRUE when msg_scrolled is non-zero and msg_puts_attr() | |
78 * writes something without scrolling should not make | |
79 * need_wait_return to be set. This is a hack to make ":ts" | |
80 * work without an extra prompt. | |
81 * lines_left Number of lines available for messages before the | |
3240 | 82 * more-prompt is to be given. -1 when not set. |
7 | 83 * need_wait_return TRUE when the hit-return prompt is needed. |
84 * Reset: After giving the hit-return prompt, when the user | |
85 * has answered some other prompt. | |
86 * Set: When the ruler or typeahead display is overwritten, | |
87 * scrolling the screen for some message. | |
88 * keep_msg Message to be displayed after redrawing the screen, in | |
89 * main_loop(). | |
90 * This is an allocated string or NULL when not used. | |
91 */ | |
92 | |
93 /* | |
94 * msg(s) - displays the string 's' on the status line | |
95 * When terminal not initialized (yet) mch_errmsg(..) is used. | |
96 * return TRUE if wait_return not called | |
97 */ | |
98 int | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
99 msg(char *s) |
7 | 100 { |
101 return msg_attr_keep(s, 0, FALSE); | |
102 } | |
103 | |
291 | 104 #if defined(FEAT_EVAL) || defined(FEAT_X11) || defined(USE_XSMP) \ |
1924 | 105 || defined(FEAT_GUI_GTK) || defined(PROTO) |
291 | 106 /* |
107 * Like msg() but keep it silent when 'verbosefile' is set. | |
108 */ | |
109 int | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
110 verb_msg(char *s) |
291 | 111 { |
112 int n; | |
113 | |
114 verbose_enter(); | |
115 n = msg_attr_keep(s, 0, FALSE); | |
116 verbose_leave(); | |
117 | |
118 return n; | |
119 } | |
120 #endif | |
121 | |
7 | 122 int |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
123 msg_attr(char *s, int attr) |
7 | 124 { |
125 return msg_attr_keep(s, attr, FALSE); | |
126 } | |
127 | |
128 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
129 msg_attr_keep( |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
130 char *s, |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
131 int attr, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
132 int keep) /* TRUE: set keep_msg if it doesn't scroll */ |
7 | 133 { |
134 static int entered = 0; | |
135 int retval; | |
136 char_u *buf = NULL; | |
137 | |
9941
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
138 /* Skip messages not matching ":filter pattern". |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
139 * Don't filter when there is an error. */ |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
140 if (!emsg_on_display && message_filtered((char_u *)s)) |
9941
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
141 return TRUE; |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
142 |
7 | 143 #ifdef FEAT_EVAL |
144 if (attr == 0) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
145 set_vim_var_string(VV_STATUSMSG, (char_u *)s, -1); |
7 | 146 #endif |
147 | |
148 /* | |
149 * It is possible that displaying a messages causes a problem (e.g., | |
150 * when redrawing the window), which causes another message, etc.. To | |
151 * break this loop, limit the recursiveness to 3 levels. | |
152 */ | |
153 if (entered >= 3) | |
154 return TRUE; | |
155 ++entered; | |
156 | |
157 /* Add message to history (unless it's a repeated kept message or a | |
158 * truncated message) */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
159 if ((char_u *)s != keep_msg |
7 | 160 || (*s != '<' |
161 && last_msg_hist != NULL | |
162 && last_msg_hist->msg != NULL | |
163 && STRCMP(s, last_msg_hist->msg))) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
164 add_msg_hist((char_u *)s, -1, attr); |
7 | 165 |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
166 #ifdef FEAT_JOB_CHANNEL |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
167 if (emsg_to_channel_log) |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
168 /* Write message in the channel log. */ |
11937
c893d6c00497
patch 8.0.0848: using multiple ch_log functions is clumsy
Christian Brabandt <cb@256bit.org>
parents:
11653
diff
changeset
|
169 ch_log(NULL, "ERROR: %s", (char *)s); |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
170 #endif |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
171 |
7 | 172 /* When displaying keep_msg, don't let msg_start() free it, caller must do |
173 * that. */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
174 if ((char_u *)s == keep_msg) |
7 | 175 keep_msg = NULL; |
176 | |
177 /* Truncate the message if needed. */ | |
513 | 178 msg_start(); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
179 buf = msg_strtrunc((char_u *)s, FALSE); |
7 | 180 if (buf != NULL) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
181 s = (char *)buf; |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
182 |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
183 msg_outtrans_attr((char_u *)s, attr); |
7 | 184 msg_clr_eos(); |
185 retval = msg_end(); | |
186 | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
187 if (keep && retval && vim_strsize((char_u *)s) |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
188 < (int)(Rows - cmdline_row - 1) * Columns + sc_col) |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
189 set_keep_msg((char_u *)s, 0); |
7 | 190 |
191 vim_free(buf); | |
192 --entered; | |
193 return retval; | |
194 } | |
195 | |
196 /* | |
197 * Truncate a string such that it can be printed without causing a scroll. | |
198 * Returns an allocated string or NULL when no truncating is done. | |
199 */ | |
200 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
201 msg_strtrunc( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
202 char_u *s, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
203 int force) /* always truncate */ |
7 | 204 { |
205 char_u *buf = NULL; | |
206 int len; | |
207 int room; | |
208 | |
209 /* May truncate message to avoid a hit-return prompt */ | |
513 | 210 if ((!msg_scroll && !need_wait_return && shortmess(SHM_TRUNCALL) |
211 && !exmode_active && msg_silent == 0) || force) | |
7 | 212 { |
213 len = vim_strsize(s); | |
539 | 214 if (msg_scrolled != 0) |
513 | 215 /* Use all the columns. */ |
216 room = (int)(Rows - msg_row) * Columns - 1; | |
217 else | |
218 /* Use up to 'showcmd' column. */ | |
219 room = (int)(Rows - msg_row - 1) * Columns + sc_col - 1; | |
7 | 220 if (len > room && room > 0) |
221 { | |
222 if (enc_utf8) | |
223 /* may have up to 18 bytes per cell (6 per char, up to two | |
224 * composing chars) */ | |
3277 | 225 len = (room + 2) * 18; |
7 | 226 else if (enc_dbcs == DBCS_JPNU) |
227 /* may have up to 2 bytes per cell for euc-jp */ | |
3277 | 228 len = (room + 2) * 2; |
7 | 229 else |
3277 | 230 len = room + 2; |
231 buf = alloc(len); | |
7 | 232 if (buf != NULL) |
3277 | 233 trunc_string(s, buf, room, len); |
7 | 234 } |
235 } | |
236 return buf; | |
237 } | |
238 | |
239 /* | |
240 * Truncate a string "s" to "buf" with cell width "room". | |
241 * "s" and "buf" may be equal. | |
242 */ | |
243 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
244 trunc_string( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
245 char_u *s, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
246 char_u *buf, |
9640
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
247 int room_in, |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
248 int buflen) |
7 | 249 { |
9640
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
250 size_t room = room_in - 3; /* "..." takes 3 chars */ |
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
251 size_t half; |
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
252 size_t len = 0; |
7 | 253 int e; |
254 int i; | |
255 int n; | |
256 | |
9640
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
257 if (room_in < 3) |
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
258 room = 0; |
7 | 259 half = room / 2; |
260 | |
261 /* First part: Start of the string. */ | |
3277 | 262 for (e = 0; len < half && e < buflen; ++e) |
7 | 263 { |
264 if (s[e] == NUL) | |
265 { | |
266 /* text fits without truncating! */ | |
267 buf[e] = NUL; | |
268 return; | |
269 } | |
270 n = ptr2cells(s + e); | |
9542
00ee8d8c2e0c
commit https://github.com/vim/vim/commit/502ae4ba63561c98ac69af26cd9883bfd18d225f
Christian Brabandt <cb@256bit.org>
parents:
9538
diff
changeset
|
271 if (len + n > half) |
7 | 272 break; |
273 len += n; | |
274 buf[e] = s[e]; | |
275 if (has_mbyte) | |
474 | 276 for (n = (*mb_ptr2len)(s + e); --n > 0; ) |
7 | 277 { |
3277 | 278 if (++e == buflen) |
279 break; | |
7 | 280 buf[e] = s[e]; |
281 } | |
282 } | |
283 | |
284 /* Last part: End of the string. */ | |
285 i = e; | |
286 if (enc_dbcs != 0) | |
287 { | |
288 /* For DBCS going backwards in a string is slow, but | |
289 * computing the cell width isn't too slow: go forward | |
290 * until the rest fits. */ | |
291 n = vim_strsize(s + i); | |
292 while (len + n > room) | |
293 { | |
294 n -= ptr2cells(s + i); | |
474 | 295 i += (*mb_ptr2len)(s + i); |
7 | 296 } |
297 } | |
298 else if (enc_utf8) | |
299 { | |
300 /* For UTF-8 we can go backwards easily. */ | |
714 | 301 half = i = (int)STRLEN(s); |
7 | 302 for (;;) |
303 { | |
714 | 304 do |
11269
121d29004998
patch 8.0.0520: using a function pointer while the function is known
Christian Brabandt <cb@256bit.org>
parents:
11163
diff
changeset
|
305 half = half - utf_head_off(s, s + half - 1) - 1; |
9581
716382aaa0c0
commit https://github.com/vim/vim/commit/b9644433d2728e99fab874e5e33147ad95d23a31
Christian Brabandt <cb@256bit.org>
parents:
9542
diff
changeset
|
306 while (half > 0 && utf_iscomposing(utf_ptr2char(s + half))); |
7 | 307 n = ptr2cells(s + half); |
9581
716382aaa0c0
commit https://github.com/vim/vim/commit/b9644433d2728e99fab874e5e33147ad95d23a31
Christian Brabandt <cb@256bit.org>
parents:
9542
diff
changeset
|
308 if (len + n > room || half == 0) |
7 | 309 break; |
310 len += n; | |
9698
a1b1405a33ca
commit https://github.com/vim/vim/commit/a5c0cc11330157c721748e317e8ff54b649610ca
Christian Brabandt <cb@256bit.org>
parents:
9640
diff
changeset
|
311 i = (int)half; |
7 | 312 } |
313 } | |
314 else | |
315 { | |
316 for (i = (int)STRLEN(s); len + (n = ptr2cells(s + i - 1)) <= room; --i) | |
317 len += n; | |
318 } | |
319 | |
9538
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
320 |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
321 if (i <= e + 3) |
3277 | 322 { |
9538
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
323 /* text fits without truncating */ |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
324 if (s != buf) |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
325 { |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
326 len = STRLEN(s); |
9640
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
327 if (len >= (size_t)buflen) |
9538
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
328 len = buflen - 1; |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
329 len = len - e + 1; |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
330 if (len < 1) |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
331 buf[e - 1] = NUL; |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
332 else |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
333 mch_memmove(buf + e, s + e, len); |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
334 } |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
335 } |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
336 else if (e + 3 < buflen) |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
337 { |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
338 /* set the middle and copy the last part */ |
3277 | 339 mch_memmove(buf + e, "...", (size_t)3); |
9640
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
340 len = STRLEN(s + i) + 1; |
bc0a6d9a9a07
commit https://github.com/vim/vim/commit/d4f31dc45482e8db527ca044b9c3436b1e750006
Christian Brabandt <cb@256bit.org>
parents:
9605
diff
changeset
|
341 if (len >= (size_t)buflen - e - 3) |
3277 | 342 len = buflen - e - 3 - 1; |
343 mch_memmove(buf + e + 3, s + i, len); | |
344 buf[e + 3 + len - 1] = NUL; | |
345 } | |
346 else | |
347 { | |
9538
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
348 /* can't fit in the "...", just truncate it */ |
26da1efa9e46
commit https://github.com/vim/vim/commit/f6acffbe83e622542d9fdf3066f51933e46e4954
Christian Brabandt <cb@256bit.org>
parents:
9497
diff
changeset
|
349 buf[e - 1] = NUL; |
3277 | 350 } |
7 | 351 } |
352 | |
353 /* | |
354 * Automatic prototype generation does not understand this function. | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
355 * Note: Caller of smsg() and smsg_attr() must check the resulting string is |
7 | 356 * shorter than IOSIZE!!! |
357 */ | |
358 #ifndef PROTO | |
359 | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
360 int vim_snprintf(char *str, size_t str_m, const char *fmt, ...); |
272 | 361 |
7 | 362 int |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
363 # ifdef __BORLANDC__ |
7 | 364 _RTLENTRYF |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
365 # endif |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
366 smsg(const char *s, ...) |
7 | 367 { |
368 va_list arglist; | |
369 | |
370 va_start(arglist, s); | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
371 vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); |
7 | 372 va_end(arglist); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
373 return msg((char *)IObuff); |
7 | 374 } |
375 | |
376 int | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
377 # ifdef __BORLANDC__ |
7 | 378 _RTLENTRYF |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
379 # endif |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
380 smsg_attr(int attr, const char *s, ...) |
7 | 381 { |
382 va_list arglist; | |
383 | |
384 va_start(arglist, s); | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
385 vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); |
7 | 386 va_end(arglist); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
387 return msg_attr((char *)IObuff, attr); |
7 | 388 } |
389 | |
14237
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
390 int |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
391 # ifdef __BORLANDC__ |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
392 _RTLENTRYF |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
393 # endif |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
394 smsg_attr_keep(int attr, const char *s, ...) |
14237
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
395 { |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
396 va_list arglist; |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
397 |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
398 va_start(arglist, s); |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
399 vim_vsnprintf((char *)IObuff, IOSIZE, s, arglist); |
14237
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
400 va_end(arglist); |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
401 return msg_attr_keep((char *)IObuff, attr, TRUE); |
14237
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
402 } |
487d7bda80ea
patch 8.1.0135: undo message delays screen update for CTRL-O u
Christian Brabandt <cb@256bit.org>
parents:
14210
diff
changeset
|
403 |
7 | 404 #endif |
405 | |
406 /* | |
407 * Remember the last sourcing name/lnum used in an error message, so that it | |
408 * isn't printed each time when it didn't change. | |
409 */ | |
410 static int last_sourcing_lnum = 0; | |
411 static char_u *last_sourcing_name = NULL; | |
412 | |
413 /* | |
414 * Reset the last used sourcing name/lnum. Makes sure it is displayed again | |
415 * for the next error message; | |
416 */ | |
360 | 417 void |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
418 reset_last_sourcing(void) |
7 | 419 { |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
420 VIM_CLEAR(last_sourcing_name); |
7 | 421 last_sourcing_lnum = 0; |
422 } | |
423 | |
424 /* | |
16 | 425 * Return TRUE if "sourcing_name" differs from "last_sourcing_name". |
426 */ | |
427 static int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
428 other_sourcing_name(void) |
16 | 429 { |
430 if (sourcing_name != NULL) | |
431 { | |
432 if (last_sourcing_name != NULL) | |
433 return STRCMP(sourcing_name, last_sourcing_name) != 0; | |
434 return TRUE; | |
435 } | |
436 return FALSE; | |
437 } | |
438 | |
439 /* | |
7 | 440 * Get the message about the source, as used for an error message. |
441 * Returns an allocated string with room for one more character. | |
442 * Returns NULL when no message is to be given. | |
443 */ | |
444 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
445 get_emsg_source(void) |
7 | 446 { |
447 char_u *Buf, *p; | |
448 | |
16 | 449 if (sourcing_name != NULL && other_sourcing_name()) |
7 | 450 { |
451 p = (char_u *)_("Error detected while processing %s:"); | |
452 Buf = alloc((unsigned)(STRLEN(sourcing_name) + STRLEN(p))); | |
453 if (Buf != NULL) | |
454 sprintf((char *)Buf, (char *)p, sourcing_name); | |
455 return Buf; | |
456 } | |
457 return NULL; | |
458 } | |
459 | |
460 /* | |
461 * Get the message about the source lnum, as used for an error message. | |
462 * Returns an allocated string with room for one more character. | |
463 * Returns NULL when no message is to be given. | |
464 */ | |
465 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
466 get_emsg_lnum(void) |
7 | 467 { |
468 char_u *Buf, *p; | |
469 | |
470 /* lnum is 0 when executing a command from the command line | |
471 * argument, we don't want a line number then */ | |
472 if (sourcing_name != NULL | |
16 | 473 && (other_sourcing_name() || sourcing_lnum != last_sourcing_lnum) |
7 | 474 && sourcing_lnum != 0) |
475 { | |
476 p = (char_u *)_("line %4ld:"); | |
477 Buf = alloc((unsigned)(STRLEN(p) + 20)); | |
478 if (Buf != NULL) | |
479 sprintf((char *)Buf, (char *)p, (long)sourcing_lnum); | |
480 return Buf; | |
481 } | |
482 return NULL; | |
483 } | |
484 | |
485 /* | |
16 | 486 * Display name and line number for the source of an error. |
487 * Remember the file name and line number, so that for the next error the info | |
488 * is only displayed if it changed. | |
489 */ | |
490 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
491 msg_source(int attr) |
16 | 492 { |
493 char_u *p; | |
494 | |
495 ++no_wait_return; | |
496 p = get_emsg_source(); | |
497 if (p != NULL) | |
498 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
499 msg_attr((char *)p, attr); |
16 | 500 vim_free(p); |
501 } | |
502 p = get_emsg_lnum(); | |
503 if (p != NULL) | |
504 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
505 msg_attr((char *)p, HL_ATTR(HLF_N)); |
16 | 506 vim_free(p); |
507 last_sourcing_lnum = sourcing_lnum; /* only once for each line */ | |
508 } | |
509 | |
510 /* remember the last sourcing name printed, also when it's empty */ | |
36 | 511 if (sourcing_name == NULL || other_sourcing_name()) |
16 | 512 { |
513 vim_free(last_sourcing_name); | |
514 if (sourcing_name == NULL) | |
515 last_sourcing_name = NULL; | |
516 else | |
517 last_sourcing_name = vim_strsave(sourcing_name); | |
518 } | |
519 --no_wait_return; | |
520 } | |
521 | |
522 /* | |
840 | 523 * Return TRUE if not giving error messages right now: |
524 * If "emsg_off" is set: no error messages at the moment. | |
525 * If "msg" is in 'debug': do error message but without side effects. | |
526 * If "emsg_skip" is set: never do error messages. | |
527 */ | |
528 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
529 emsg_not_now(void) |
840 | 530 { |
531 if ((emsg_off > 0 && vim_strchr(p_debug, 'm') == NULL | |
532 && vim_strchr(p_debug, 't') == NULL) | |
533 #ifdef FEAT_EVAL | |
534 || emsg_skip > 0 | |
535 #endif | |
536 ) | |
537 return TRUE; | |
538 return FALSE; | |
539 } | |
540 | |
11016
4e7308525fe7
patch 8.0.0397: can't build with +viminfo but without +eval
Christian Brabandt <cb@256bit.org>
parents:
11012
diff
changeset
|
541 #if defined(FEAT_EVAL) || defined(PROTO) |
11006
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
542 static garray_T ignore_error_list = GA_EMPTY; |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
543 |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
544 void |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
545 ignore_error_for_testing(char_u *error) |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
546 { |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
547 if (ignore_error_list.ga_itemsize == 0) |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
548 ga_init2(&ignore_error_list, sizeof(char_u *), 1); |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
549 |
15219
dada0b389d4f
patch 8.1.0619: :echomsg and :echoerr do not handle List and Dict
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
550 if (STRCMP("RESET", error) == 0) |
dada0b389d4f
patch 8.1.0619: :echomsg and :echoerr do not handle List and Dict
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
551 ga_clear_strings(&ignore_error_list); |
dada0b389d4f
patch 8.1.0619: :echomsg and :echoerr do not handle List and Dict
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
552 else |
dada0b389d4f
patch 8.1.0619: :echomsg and :echoerr do not handle List and Dict
Bram Moolenaar <Bram@vim.org>
parents:
15211
diff
changeset
|
553 ga_add_string(&ignore_error_list, error); |
11006
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
554 } |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
555 |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
556 static int |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
557 ignore_error(char_u *msg) |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
558 { |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
559 int i; |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
560 |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
561 for (i = 0; i < ignore_error_list.ga_len; ++i) |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
562 if (strstr((char *)msg, |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
563 (char *)((char_u **)(ignore_error_list.ga_data))[i]) != NULL) |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
564 return TRUE; |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
565 return FALSE; |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
566 } |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
567 #endif |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
568 |
9605
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
569 #if !defined(HAVE_STRERROR) || defined(PROTO) |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
570 /* |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
571 * Replacement for perror() that behaves more or less like emsg() was called. |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
572 * v:errmsg will be set and called_emsg will be set. |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
573 */ |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
574 void |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
575 do_perror(char *msg) |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
576 { |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
577 perror(msg); |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
578 ++emsg_silent; |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
579 emsg(msg); |
9605
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
580 --emsg_silent; |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
581 } |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
582 #endif |
846d4bad2df7
commit https://github.com/vim/vim/commit/b869c0da31716ff14bbfd63346d140d0a1d68af7
Christian Brabandt <cb@256bit.org>
parents:
9581
diff
changeset
|
583 |
840 | 584 /* |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
585 * emsg_core() - display an error message |
7 | 586 * |
587 * Rings the bell, if appropriate, and calls message() to do the real work | |
588 * When terminal not initialized (yet) mch_errmsg(..) is used. | |
589 * | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
590 * Return TRUE if wait_return not called. |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
591 * Note: caller must check 'emsg_not_now()' before calling this. |
7 | 592 */ |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
593 static int |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
594 emsg_core(char_u *s) |
7 | 595 { |
596 int attr; | |
597 char_u *p; | |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
598 int r; |
7 | 599 #ifdef FEAT_EVAL |
600 int ignore = FALSE; | |
601 int severe; | |
602 #endif | |
603 | |
11006
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
604 #ifdef FEAT_EVAL |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
605 /* When testing some errors are turned into a normal message. */ |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
606 if (ignore_error(s)) |
11012
ae2de10e8398
patch 8.0.0395: testing the + register fails with Motif
Christian Brabandt <cb@256bit.org>
parents:
11006
diff
changeset
|
607 /* don't call msg() if it results in a dialog */ |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
608 return msg_use_printf() ? FALSE : msg((char *)s); |
11006
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
609 #endif |
b3601a8eb679
patch 8.0.0392: GUI test fails with Athena and Motif
Christian Brabandt <cb@256bit.org>
parents:
10589
diff
changeset
|
610 |
7 | 611 called_emsg = TRUE; |
612 | |
613 #ifdef FEAT_EVAL | |
12375
ab0d827151a1
patch 8.0.1067: try/catch in timer does not prevent it from being stopped
Christian Brabandt <cb@256bit.org>
parents:
12152
diff
changeset
|
614 /* If "emsg_severe" is TRUE: When an error exception is to be thrown, |
ab0d827151a1
patch 8.0.1067: try/catch in timer does not prevent it from being stopped
Christian Brabandt <cb@256bit.org>
parents:
12152
diff
changeset
|
615 * prefer this message over previous messages for the same command. */ |
7 | 616 severe = emsg_severe; |
617 emsg_severe = FALSE; | |
618 #endif | |
619 | |
839 | 620 if (!emsg_off || vim_strchr(p_debug, 't') != NULL) |
7 | 621 { |
622 #ifdef FEAT_EVAL | |
623 /* | |
624 * Cause a throw of an error exception if appropriate. Don't display | |
625 * the error message in this case. (If no matching catch clause will | |
626 * be found, the message will be displayed later on.) "ignore" is set | |
627 * when the message should be ignored completely (used for the | |
628 * interrupt message). | |
629 */ | |
630 if (cause_errthrow(s, severe, &ignore) == TRUE) | |
631 { | |
632 if (!ignore) | |
15079
a527110d5f56
patch 8.1.0550: expression evaluation may repeat an error message
Bram Moolenaar <Bram@vim.org>
parents:
14909
diff
changeset
|
633 ++did_emsg; |
7 | 634 return TRUE; |
635 } | |
636 | |
637 /* set "v:errmsg", also when using ":silent! cmd" */ | |
638 set_vim_var_string(VV_ERRMSG, s, -1); | |
639 #endif | |
640 | |
641 /* | |
1619 | 642 * When using ":silent! cmd" ignore error messages. |
7 | 643 * But do write it to the redirection file. |
644 */ | |
645 if (emsg_silent != 0) | |
646 { | |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
647 if (emsg_noredir == 0) |
7 | 648 { |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
649 msg_start(); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
650 p = get_emsg_source(); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
651 if (p != NULL) |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
652 { |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
653 STRCAT(p, "\n"); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
654 redir_write(p, -1); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
655 vim_free(p); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
656 } |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
657 p = get_emsg_lnum(); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
658 if (p != NULL) |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
659 { |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
660 STRCAT(p, "\n"); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
661 redir_write(p, -1); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
662 vim_free(p); |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
663 } |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
664 redir_write(s, -1); |
7 | 665 } |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
666 #ifdef FEAT_JOB_CHANNEL |
11937
c893d6c00497
patch 8.0.0848: using multiple ch_log functions is clumsy
Christian Brabandt <cb@256bit.org>
parents:
11653
diff
changeset
|
667 ch_log(NULL, "ERROR: %s", (char *)s); |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
668 #endif |
7 | 669 return TRUE; |
670 } | |
671 | |
10589
b0c9c1a05054
patch 8.0.0184: when an error is caught Vim still exits with non-zero result
Christian Brabandt <cb@256bit.org>
parents:
10426
diff
changeset
|
672 ex_exitval = 1; |
b0c9c1a05054
patch 8.0.0184: when an error is caught Vim still exits with non-zero result
Christian Brabandt <cb@256bit.org>
parents:
10426
diff
changeset
|
673 |
12674
e769c912fcd9
patch 8.0.1215: newer gcc warns for implicit fallthrough
Christian Brabandt <cb@256bit.org>
parents:
12375
diff
changeset
|
674 /* Reset msg_silent, an error causes messages to be switched back on. |
e769c912fcd9
patch 8.0.1215: newer gcc warns for implicit fallthrough
Christian Brabandt <cb@256bit.org>
parents:
12375
diff
changeset
|
675 */ |
7 | 676 msg_silent = 0; |
677 cmd_silent = FALSE; | |
678 | |
679 if (global_busy) /* break :global command */ | |
680 ++global_busy; | |
681 | |
682 if (p_eb) | |
683 beep_flush(); /* also includes flush_buffers() */ | |
684 else | |
14909
c97b4b537572
patch 8.1.0466: autocmd test fails
Bram Moolenaar <Bram@vim.org>
parents:
14862
diff
changeset
|
685 flush_buffers(FLUSH_MINIMAL); // flush internal buffers |
15079
a527110d5f56
patch 8.1.0550: expression evaluation may repeat an error message
Bram Moolenaar <Bram@vim.org>
parents:
14909
diff
changeset
|
686 ++did_emsg; // flag for DoOneCmd() |
12375
ab0d827151a1
patch 8.0.1067: try/catch in timer does not prevent it from being stopped
Christian Brabandt <cb@256bit.org>
parents:
12152
diff
changeset
|
687 #ifdef FEAT_EVAL |
ab0d827151a1
patch 8.0.1067: try/catch in timer does not prevent it from being stopped
Christian Brabandt <cb@256bit.org>
parents:
12152
diff
changeset
|
688 did_uncaught_emsg = TRUE; |
ab0d827151a1
patch 8.0.1067: try/catch in timer does not prevent it from being stopped
Christian Brabandt <cb@256bit.org>
parents:
12152
diff
changeset
|
689 #endif |
7 | 690 } |
691 | |
692 emsg_on_display = TRUE; /* remember there is an error message */ | |
693 ++msg_scroll; /* don't overwrite a previous message */ | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
694 attr = HL_ATTR(HLF_E); /* set highlight mode for error messages */ |
539 | 695 if (msg_scrolled != 0) |
7 | 696 need_wait_return = TRUE; /* needed in case emsg() is called after |
697 * wait_return has reset need_wait_return | |
698 * and a redraw is expected because | |
699 * msg_scrolled is non-zero */ | |
700 | |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
701 #ifdef FEAT_JOB_CHANNEL |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
702 emsg_to_channel_log = TRUE; |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
703 #endif |
7 | 704 /* |
705 * Display name and line number for the source of the error. | |
706 */ | |
16 | 707 msg_source(attr); |
7 | 708 |
709 /* | |
710 * Display the error message itself. | |
711 */ | |
16 | 712 msg_nowait = FALSE; /* wait for this msg */ |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
713 r = msg_attr((char *)s, attr); |
10426
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
714 |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
715 #ifdef FEAT_JOB_CHANNEL |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
716 emsg_to_channel_log = FALSE; |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
717 #endif |
acfc83aca8ee
commit https://github.com/vim/vim/commit/958dc6923d341390531888058495569d73c356c3
Christian Brabandt <cb@256bit.org>
parents:
10359
diff
changeset
|
718 return r; |
7 | 719 } |
720 | |
721 /* | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
722 * Print an error message. |
7 | 723 */ |
724 int | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
725 emsg(char *s) |
7 | 726 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
727 /* Skip this if not giving error messages at the moment. */ |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
728 if (!emsg_not_now()) |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
729 return emsg_core((char_u *)s); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
730 return TRUE; /* no error messages at the moment */ |
7 | 731 } |
732 | |
15896
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
733 #ifndef PROTO // manual proto with __attribute__ |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
734 /* |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
735 * Print an error message with format string and variable arguments. |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
736 * Note: caller must not pass 'IObuff' as 1st argument. |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
737 */ |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
738 int |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
739 semsg(const char *s, ...) |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
740 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
741 /* Skip this if not giving error messages at the moment. */ |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
742 if (!emsg_not_now()) |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
743 { |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
744 va_list ap; |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
745 |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
746 va_start(ap, s); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
747 vim_vsnprintf((char *)IObuff, IOSIZE, s, ap); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
748 va_end(ap); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
749 return emsg_core(IObuff); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
750 } |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
751 return TRUE; /* no error messages at the moment */ |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
752 } |
15896
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
753 #endif |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
754 |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
755 /* |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
756 * Same as emsg(...), but abort on error when ABORT_ON_INTERNAL_ERROR is |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
757 * defined. It is used for internal errors only, so that they can be |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
758 * detected when fuzzing vim. |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
759 */ |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
760 void |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
761 iemsg(char *s) |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
762 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
763 if (!emsg_not_now()) |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
764 emsg_core((char_u *)s); |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
765 #ifdef ABORT_ON_INTERNAL_ERROR |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
766 abort(); |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
767 #endif |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
768 } |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
769 |
15896
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
770 #ifndef PROTO // manual proto with __attribute__ |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
771 /* |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
772 * Same as semsg(...) but abort on error when ABORT_ON_INTERNAL_ERROR is |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
773 * defined. It is used for internal errors only, so that they can be |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
774 * detected when fuzzing vim. |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
775 * Note: caller must not pass 'IObuff' as 1st argument. |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
776 */ |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
777 void |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
778 siemsg(const char *s, ...) |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
779 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
780 if (!emsg_not_now()) |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
781 { |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
782 va_list ap; |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
783 |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
784 va_start(ap, s); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
785 vim_vsnprintf((char *)IObuff, IOSIZE, s, ap); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
786 va_end(ap); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
787 emsg_core(IObuff); |
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
788 } |
15896
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
789 # ifdef ABORT_ON_INTERNAL_ERROR |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
790 abort(); |
15896
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
791 # endif |
ac080f6a4db8
patch 8.1.0954: arguments of semsg() and siemsg() are not checked
Bram Moolenaar <Bram@vim.org>
parents:
15868
diff
changeset
|
792 } |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
793 #endif |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
794 |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
795 /* |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
796 * Give an "Internal error" message. |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
797 */ |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
798 void |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
799 internal_error(char *where) |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
800 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
801 siemsg(_(e_intern2), where); |
10359
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
802 } |
66f1b5bf3fa6
commit https://github.com/vim/vim/commit/95f096030ed1a8afea028f2ea295d6f6a70f466f
Christian Brabandt <cb@256bit.org>
parents:
10158
diff
changeset
|
803 |
330 | 804 /* emsg3() and emsgn() are in misc2.c to avoid warnings for the prototypes. */ |
7 | 805 |
167 | 806 void |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
807 emsg_invreg(int name) |
167 | 808 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
809 semsg(_("E354: Invalid register name: '%s'"), transchar(name)); |
167 | 810 } |
811 | |
7 | 812 /* |
813 * Like msg(), but truncate to a single line if p_shm contains 't', or when | |
814 * "force" is TRUE. This truncates in another way as for normal messages. | |
815 * Careful: The string may be changed by msg_may_trunc()! | |
816 * Returns a pointer to the printed message, if wait_return() not called. | |
817 */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
818 char * |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
819 msg_trunc_attr(char *s, int force, int attr) |
7 | 820 { |
821 int n; | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
822 char *ts; |
7 | 823 |
824 /* Add message to history before truncating */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
825 add_msg_hist((char_u *)s, -1, attr); |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
826 |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
827 ts = (char *)msg_may_trunc(force, (char_u *)s); |
7 | 828 |
829 msg_hist_off = TRUE; | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
830 n = msg_attr(ts, attr); |
7 | 831 msg_hist_off = FALSE; |
832 | |
833 if (n) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
834 return ts; |
7 | 835 return NULL; |
836 } | |
837 | |
838 /* | |
839 * Check if message "s" should be truncated at the start (for filenames). | |
840 * Return a pointer to where the truncated message starts. | |
841 * Note: May change the message by replacing a character with '<'. | |
842 */ | |
843 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
844 msg_may_trunc(int force, char_u *s) |
7 | 845 { |
846 int n; | |
847 int room; | |
848 | |
849 room = (int)(Rows - cmdline_row - 1) * Columns + sc_col - 1; | |
850 if ((force || (shortmess(SHM_TRUNC) && !exmode_active)) | |
851 && (n = (int)STRLEN(s) - room) > 0) | |
852 { | |
853 if (has_mbyte) | |
854 { | |
855 int size = vim_strsize(s); | |
856 | |
615 | 857 /* There may be room anyway when there are multibyte chars. */ |
858 if (size <= room) | |
859 return s; | |
860 | |
7 | 861 for (n = 0; size >= room; ) |
862 { | |
863 size -= (*mb_ptr2cells)(s + n); | |
474 | 864 n += (*mb_ptr2len)(s + n); |
7 | 865 } |
866 --n; | |
867 } | |
868 s += n; | |
869 *s = '<'; | |
870 } | |
871 return s; | |
872 } | |
873 | |
874 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
875 add_msg_hist( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
876 char_u *s, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
877 int len, /* -1 for undetermined length */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
878 int attr) |
7 | 879 { |
880 struct msg_hist *p; | |
881 | |
882 if (msg_hist_off || msg_silent != 0) | |
883 return; | |
884 | |
885 /* Don't let the message history get too big */ | |
625 | 886 while (msg_hist_len > MAX_MSG_HIST_LEN) |
355 | 887 (void)delete_first_msg(); |
888 | |
7 | 889 /* allocate an entry and add the message at the end of the history */ |
890 p = (struct msg_hist *)alloc((int)sizeof(struct msg_hist)); | |
891 if (p != NULL) | |
892 { | |
893 if (len < 0) | |
894 len = (int)STRLEN(s); | |
895 /* remove leading and trailing newlines */ | |
896 while (len > 0 && *s == '\n') | |
897 { | |
898 ++s; | |
899 --len; | |
900 } | |
901 while (len > 0 && s[len - 1] == '\n') | |
902 --len; | |
903 p->msg = vim_strnsave(s, len); | |
904 p->next = NULL; | |
905 p->attr = attr; | |
906 if (last_msg_hist != NULL) | |
907 last_msg_hist->next = p; | |
908 last_msg_hist = p; | |
909 if (first_msg_hist == NULL) | |
910 first_msg_hist = last_msg_hist; | |
911 ++msg_hist_len; | |
912 } | |
913 } | |
914 | |
915 /* | |
355 | 916 * Delete the first (oldest) message from the history. |
917 * Returns FAIL if there are no messages. | |
918 */ | |
919 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
920 delete_first_msg(void) |
355 | 921 { |
922 struct msg_hist *p; | |
923 | |
924 if (msg_hist_len <= 0) | |
925 return FAIL; | |
926 p = first_msg_hist; | |
927 first_msg_hist = p->next; | |
1619 | 928 if (first_msg_hist == NULL) |
2311
ccda151dde4e
Support completion for ":find". (Nazri Ramliy)
Bram Moolenaar <bram@vim.org>
parents:
2280
diff
changeset
|
929 last_msg_hist = NULL; /* history is empty */ |
355 | 930 vim_free(p->msg); |
931 vim_free(p); | |
932 --msg_hist_len; | |
933 return OK; | |
934 } | |
935 | |
936 /* | |
7 | 937 * ":messages" command. |
938 */ | |
939 void | |
8901
b4dad96ade29
commit https://github.com/vim/vim/commit/52196b2dbe3b64b5054e1df3d3aa8fc65e30addc
Christian Brabandt <cb@256bit.org>
parents:
8897
diff
changeset
|
940 ex_messages(exarg_T *eap) |
7 | 941 { |
942 struct msg_hist *p; | |
943 char_u *s; | |
8897
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
944 int c = 0; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
945 |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
946 if (STRCMP(eap->arg, "clear") == 0) |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
947 { |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
948 int keep = eap->addr_count == 0 ? 0 : eap->line2; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
949 |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
950 while (msg_hist_len > keep) |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
951 (void)delete_first_msg(); |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
952 return; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
953 } |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
954 |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
955 if (*eap->arg != NUL) |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
956 { |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
957 emsg(_(e_invarg)); |
8897
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
958 return; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
959 } |
7 | 960 |
961 msg_hist_off = TRUE; | |
962 | |
8897
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
963 p = first_msg_hist; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
964 if (eap->addr_count != 0) |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
965 { |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
966 /* Count total messages */ |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
967 for (; p != NULL && !got_int; p = p->next) |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
968 c++; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
969 |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
970 c -= eap->line2; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
971 |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
972 /* Skip without number of messages specified */ |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
973 for (p = first_msg_hist; p != NULL && !got_int && c > 0; |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
974 p = p->next, c--); |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
975 } |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
976 |
8905
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
977 if (p == first_msg_hist) |
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
978 { |
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
979 s = mch_getenv((char_u *)"LANG"); |
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
980 if (s != NULL && *s != NUL) |
14210
1681178c4434
patch 8.1.0122: translators don't always understand the maintainer message
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
981 // The next comment is extracted by xgettext and put in po file for |
1681178c4434
patch 8.1.0122: translators don't always understand the maintainer message
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
982 // translators to read. |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
983 msg_attr( |
14210
1681178c4434
patch 8.1.0122: translators don't always understand the maintainer message
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
984 // Translator: Please replace the name and email address |
1681178c4434
patch 8.1.0122: translators don't always understand the maintainer message
Christian Brabandt <cb@256bit.org>
parents:
14175
diff
changeset
|
985 // with the appropriate text for your translation. |
8905
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
986 _("Messages maintainer: Bram Moolenaar <Bram@vim.org>"), |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
987 HL_ATTR(HLF_T)); |
8905
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
988 } |
9200836eee15
commit https://github.com/vim/vim/commit/bea1ede1c59a11ca5bf9d91cd30b7b2937b9fb41
Christian Brabandt <cb@256bit.org>
parents:
8901
diff
changeset
|
989 |
8897
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
990 /* Display what was not skipped. */ |
a410390e340b
commit https://github.com/vim/vim/commit/451f849fd6282a4facd4f0f58af62837443fb5a6
Christian Brabandt <cb@256bit.org>
parents:
8627
diff
changeset
|
991 for (; p != NULL && !got_int; p = p->next) |
7 | 992 if (p->msg != NULL) |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
993 msg_attr((char *)p->msg, p->attr); |
7 | 994 |
995 msg_hist_off = FALSE; | |
996 } | |
997 | |
28 | 998 #if defined(FEAT_CON_DIALOG) || defined(FIND_REPLACE_DIALOG) || defined(PROTO) |
7 | 999 /* |
1000 * Call this after prompting the user. This will avoid a hit-return message | |
1001 * and a delay. | |
1002 */ | |
28 | 1003 void |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1004 msg_end_prompt(void) |
7 | 1005 { |
1006 need_wait_return = FALSE; | |
1007 emsg_on_display = FALSE; | |
1008 cmdline_row = msg_row; | |
1009 msg_col = 0; | |
1010 msg_clr_eos(); | |
3240 | 1011 lines_left = -1; |
7 | 1012 } |
1013 #endif | |
1014 | |
1015 /* | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1016 * Wait for the user to hit a key (normally Enter). |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1017 * If "redraw" is TRUE, clear and redraw the screen. |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1018 * If "redraw" is FALSE, just redraw the screen. |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1019 * If "redraw" is -1, don't redraw at all. |
7 | 1020 */ |
1021 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1022 wait_return(int redraw) |
7 | 1023 { |
1024 int c; | |
1025 int oldState; | |
1026 int tmpState; | |
1027 int had_got_int; | |
14004
e124262d435e
patch 8.1.0020: cannot tell whether a register is executing or recording
Christian Brabandt <cb@256bit.org>
parents:
13802
diff
changeset
|
1028 int save_reg_recording; |
5430 | 1029 FILE *save_scriptout; |
7 | 1030 |
1031 if (redraw == TRUE) | |
1032 must_redraw = CLEAR; | |
1033 | |
1034 /* If using ":silent cmd", don't wait for a return. Also don't set | |
1035 * need_wait_return to do it later. */ | |
1036 if (msg_silent != 0) | |
1037 return; | |
1038 | |
2723 | 1039 /* |
1040 * When inside vgetc(), we can't wait for a typed character at all. | |
1041 * With the global command (and some others) we only need one return at | |
1042 * the end. Adjust cmdline_row to avoid the next message overwriting the | |
1043 * last one. | |
1044 */ | |
822 | 1045 if (vgetc_busy > 0) |
7 | 1046 return; |
2723 | 1047 need_wait_return = TRUE; |
7 | 1048 if (no_wait_return) |
1049 { | |
1050 if (!exmode_active) | |
1051 cmdline_row = msg_row; | |
1052 return; | |
1053 } | |
1054 | |
1055 redir_off = TRUE; /* don't redirect this message */ | |
1056 oldState = State; | |
1057 if (quit_more) | |
1058 { | |
1059 c = CAR; /* just pretend CR was hit */ | |
1060 quit_more = FALSE; | |
1061 got_int = FALSE; | |
1062 } | |
1063 else if (exmode_active) | |
1064 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1065 msg_puts(" "); /* make sure the cursor is on the right line */ |
7 | 1066 c = CAR; /* no need for a return in ex mode */ |
1067 got_int = FALSE; | |
1068 } | |
1069 else | |
1070 { | |
1071 /* Make sure the hit-return prompt is on screen when 'guioptions' was | |
1072 * just changed. */ | |
1073 screenalloc(FALSE); | |
1074 | |
1075 State = HITRETURN; | |
1076 #ifdef FEAT_MOUSE | |
1077 setmouse(); | |
1078 #endif | |
1079 #ifdef USE_ON_FLY_SCROLL | |
1080 dont_scroll = TRUE; /* disallow scrolling here */ | |
1081 #endif | |
8627
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
1082 cmdline_row = msg_row; |
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
1083 |
4325 | 1084 /* Avoid the sequence that the user types ":" at the hit-return prompt |
1085 * to start an Ex command, but the file-changed dialog gets in the | |
1086 * way. */ | |
1087 if (need_check_timestamps) | |
1088 check_timestamps(FALSE); | |
1089 | |
7 | 1090 hit_return_msg(); |
1091 | |
1092 do | |
1093 { | |
1094 /* Remember "got_int", if it is set vgetc() probably returns a | |
1095 * CTRL-C, but we need to loop then. */ | |
1096 had_got_int = got_int; | |
280 | 1097 |
1098 /* Don't do mappings here, we put the character back in the | |
1099 * typeahead buffer. */ | |
1100 ++no_mapping; | |
1101 ++allow_keys; | |
5430 | 1102 |
1103 /* Temporarily disable Recording. If Recording is active, the | |
1104 * character will be recorded later, since it will be added to the | |
1105 * typebuf after the loop */ | |
14004
e124262d435e
patch 8.1.0020: cannot tell whether a register is executing or recording
Christian Brabandt <cb@256bit.org>
parents:
13802
diff
changeset
|
1106 save_reg_recording = reg_recording; |
5430 | 1107 save_scriptout = scriptout; |
14004
e124262d435e
patch 8.1.0020: cannot tell whether a register is executing or recording
Christian Brabandt <cb@256bit.org>
parents:
13802
diff
changeset
|
1108 reg_recording = 0; |
5430 | 1109 scriptout = NULL; |
7 | 1110 c = safe_vgetc(); |
216 | 1111 if (had_got_int && !global_busy) |
7 | 1112 got_int = FALSE; |
280 | 1113 --no_mapping; |
1114 --allow_keys; | |
14004
e124262d435e
patch 8.1.0020: cannot tell whether a register is executing or recording
Christian Brabandt <cb@256bit.org>
parents:
13802
diff
changeset
|
1115 reg_recording = save_reg_recording; |
5430 | 1116 scriptout = save_scriptout; |
280 | 1117 |
7 | 1118 #ifdef FEAT_CLIPBOARD |
1119 /* Strange way to allow copying (yanking) a modeless selection at | |
1120 * the hit-enter prompt. Use CTRL-Y, because the same is used in | |
1121 * Cmdline-mode and it's harmless when there is no selection. */ | |
1122 if (c == Ctrl_Y && clip_star.state == SELECT_DONE) | |
1123 { | |
1124 clip_copy_modeless_selection(TRUE); | |
1125 c = K_IGNORE; | |
1126 } | |
1127 #endif | |
1381 | 1128 |
698 | 1129 /* |
1130 * Allow scrolling back in the messages. | |
1131 * Also accept scroll-down commands when messages fill the screen, | |
1132 * to avoid that typing one 'j' too many makes the messages | |
1133 * disappear. | |
1134 */ | |
1135 if (p_more && !p_cp) | |
446 | 1136 { |
4234 | 1137 if (c == 'b' || c == 'k' || c == 'u' || c == 'g' |
1138 || c == K_UP || c == K_PAGEUP) | |
446 | 1139 { |
4234 | 1140 if (msg_scrolled > Rows) |
1141 /* scroll back to show older messages */ | |
1142 do_more_prompt(c); | |
1143 else | |
1144 { | |
1145 msg_didout = FALSE; | |
1146 c = K_IGNORE; | |
1147 msg_col = | |
1148 #ifdef FEAT_RIGHTLEFT | |
1149 cmdmsg_rl ? Columns - 1 : | |
1150 #endif | |
1151 0; | |
1152 } | |
698 | 1153 if (quit_more) |
1154 { | |
1155 c = CAR; /* just pretend CR was hit */ | |
1156 quit_more = FALSE; | |
1157 got_int = FALSE; | |
1158 } | |
5290
059c8a4b103f
updated for version 7.4b.021
Bram Moolenaar <bram@vim.org>
parents:
5245
diff
changeset
|
1159 else if (c != K_IGNORE) |
698 | 1160 { |
1161 c = K_IGNORE; | |
1162 hit_return_msg(); | |
1163 } | |
446 | 1164 } |
698 | 1165 else if (msg_scrolled > Rows - 2 |
4234 | 1166 && (c == 'j' || c == 'd' || c == 'f' |
1167 || c == K_DOWN || c == K_PAGEDOWN)) | |
446 | 1168 c = K_IGNORE; |
1169 } | |
7 | 1170 } while ((had_got_int && c == Ctrl_C) |
1171 || c == K_IGNORE | |
1172 #ifdef FEAT_GUI | |
1173 || c == K_VER_SCROLLBAR || c == K_HOR_SCROLLBAR | |
1174 #endif | |
1175 #ifdef FEAT_MOUSE | |
1176 || c == K_LEFTDRAG || c == K_LEFTRELEASE | |
1177 || c == K_MIDDLEDRAG || c == K_MIDDLERELEASE | |
1178 || c == K_RIGHTDRAG || c == K_RIGHTRELEASE | |
2409
0ca06a92adfb
Add support for horizontal scroll wheel. (Bjorn Winckler)
Bram Moolenaar <bram@vim.org>
parents:
2311
diff
changeset
|
1179 || c == K_MOUSELEFT || c == K_MOUSERIGHT |
7 | 1180 || c == K_MOUSEDOWN || c == K_MOUSEUP |
12865
ebb4f6c93598
patch 8.0.1309: cannot use 'balloonexpr' in a terminal
Christian Brabandt <cb@256bit.org>
parents:
12716
diff
changeset
|
1181 || c == K_MOUSEMOVE |
7 | 1182 || (!mouse_has(MOUSE_RETURN) |
1183 && mouse_row < msg_row | |
1184 && (c == K_LEFTMOUSE | |
1185 || c == K_MIDDLEMOUSE | |
1186 || c == K_RIGHTMOUSE | |
1187 || c == K_X1MOUSE | |
1188 || c == K_X2MOUSE)) | |
1189 #endif | |
1190 ); | |
1191 ui_breakcheck(); | |
1192 #ifdef FEAT_MOUSE | |
1193 /* | |
1194 * Avoid that the mouse-up event causes visual mode to start. | |
1195 */ | |
1196 if (c == K_LEFTMOUSE || c == K_MIDDLEMOUSE || c == K_RIGHTMOUSE | |
1197 || c == K_X1MOUSE || c == K_X2MOUSE) | |
1198 (void)jump_to_mouse(MOUSE_SETPOS, NULL, 0); | |
1199 else | |
1200 #endif | |
1201 if (vim_strchr((char_u *)"\r\n ", c) == NULL && c != Ctrl_C) | |
1202 { | |
280 | 1203 /* Put the character back in the typeahead buffer. Don't use the |
1204 * stuff buffer, because lmaps wouldn't work. */ | |
852 | 1205 ins_char_typebuf(c); |
7 | 1206 do_redraw = TRUE; /* need a redraw even though there is |
280 | 1207 typeahead */ |
7 | 1208 } |
1209 } | |
1210 redir_off = FALSE; | |
1211 | |
1212 /* | |
1213 * If the user hits ':', '?' or '/' we get a command line from the next | |
1214 * line. | |
1215 */ | |
1216 if (c == ':' || c == '?' || c == '/') | |
1217 { | |
1218 if (!exmode_active) | |
1219 cmdline_row = msg_row; | |
1220 skip_redraw = TRUE; /* skip redraw once */ | |
1221 do_redraw = FALSE; | |
14129
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
1222 #ifdef FEAT_TERMINAL |
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
1223 skip_term_loop = TRUE; |
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
1224 #endif |
7 | 1225 } |
1226 | |
1227 /* | |
1228 * If the window size changed set_shellsize() will redraw the screen. | |
1229 * Otherwise the screen is only redrawn if 'redraw' is set and no ':' | |
1230 * typed. | |
1231 */ | |
1232 tmpState = State; | |
1233 State = oldState; /* restore State before set_shellsize */ | |
1234 #ifdef FEAT_MOUSE | |
1235 setmouse(); | |
1236 #endif | |
1237 msg_check(); | |
1238 | |
1239 #if defined(UNIX) || defined(VMS) | |
1240 /* | |
1241 * When switching screens, we need to output an extra newline on exit. | |
1242 */ | |
1243 if (swapping_screen() && !termcap_active) | |
1244 newline_on_exit = TRUE; | |
1245 #endif | |
1246 | |
1247 need_wait_return = FALSE; | |
1248 did_wait_return = TRUE; | |
1249 emsg_on_display = FALSE; /* can delete error message now */ | |
1250 lines_left = -1; /* reset lines_left at next msg_start() */ | |
1251 reset_last_sourcing(); | |
1252 if (keep_msg != NULL && vim_strsize(keep_msg) >= | |
1253 (Rows - cmdline_row - 1) * Columns + sc_col) | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
1254 VIM_CLEAR(keep_msg); /* don't redisplay message, it's too long */ |
7 | 1255 |
1256 if (tmpState == SETWSIZE) /* got resize event while in vgetc() */ | |
1257 { | |
1258 starttermcap(); /* start termcap before redrawing */ | |
1259 shell_resized(); | |
1260 } | |
1261 else if (!skip_redraw | |
1262 && (redraw == TRUE || (msg_scrolled != 0 && redraw != -1))) | |
1263 { | |
1264 starttermcap(); /* start termcap before redrawing */ | |
1265 redraw_later(VALID); | |
1266 } | |
1267 } | |
1268 | |
1269 /* | |
1270 * Write the hit-return prompt. | |
1271 */ | |
1272 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1273 hit_return_msg(void) |
7 | 1274 { |
446 | 1275 int save_p_more = p_more; |
1276 | |
1277 p_more = FALSE; /* don't want see this message when scrolling back */ | |
1278 if (msg_didout) /* start on a new line */ | |
7 | 1279 msg_putchar('\n'); |
1280 if (got_int) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1281 msg_puts(_("Interrupt: ")); |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1282 |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1283 msg_puts_attr(_("Press ENTER or type command to continue"), HL_ATTR(HLF_R)); |
7 | 1284 if (!msg_use_printf()) |
1285 msg_clr_eos(); | |
446 | 1286 p_more = save_p_more; |
7 | 1287 } |
1288 | |
1289 /* | |
1290 * Set "keep_msg" to "s". Free the old value and check for NULL pointer. | |
1291 */ | |
1292 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1293 set_keep_msg(char_u *s, int attr) |
7 | 1294 { |
1295 vim_free(keep_msg); | |
1296 if (s != NULL && msg_silent == 0) | |
1297 keep_msg = vim_strsave(s); | |
1298 else | |
1299 keep_msg = NULL; | |
127 | 1300 keep_msg_more = FALSE; |
678 | 1301 keep_msg_attr = attr; |
7 | 1302 } |
1303 | |
678 | 1304 #if defined(FEAT_TERMRESPONSE) || defined(PROTO) |
1305 /* | |
1306 * If there currently is a message being displayed, set "keep_msg" to it, so | |
1307 * that it will be displayed again after redraw. | |
1308 */ | |
1309 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1310 set_keep_msg_from_hist(void) |
678 | 1311 { |
1312 if (keep_msg == NULL && last_msg_hist != NULL && msg_scrolled == 0 | |
1313 && (State & NORMAL)) | |
1314 set_keep_msg(last_msg_hist->msg, last_msg_hist->attr); | |
1315 } | |
1316 #endif | |
1317 | |
7 | 1318 /* |
1319 * Prepare for outputting characters in the command line. | |
1320 */ | |
1321 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1322 msg_start(void) |
7 | 1323 { |
1324 int did_return = FALSE; | |
1325 | |
2491
904cd1c26a1e
After entering a crypt key would need to hit return to continue.
Bram Moolenaar <bram@vim.org>
parents:
2409
diff
changeset
|
1326 if (!msg_silent) |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
1327 VIM_CLEAR(keep_msg); |
1619 | 1328 |
1329 #ifdef FEAT_EVAL | |
1330 if (need_clr_eos) | |
1331 { | |
1332 /* Halfway an ":echo" command and getting an (error) message: clear | |
1333 * any text from the command. */ | |
1334 need_clr_eos = FALSE; | |
1335 msg_clr_eos(); | |
1336 } | |
1337 #endif | |
1338 | |
7 | 1339 if (!msg_scroll && full_screen) /* overwrite last message */ |
1340 { | |
1341 msg_row = cmdline_row; | |
1342 msg_col = | |
1343 #ifdef FEAT_RIGHTLEFT | |
1344 cmdmsg_rl ? Columns - 1 : | |
1345 #endif | |
1346 0; | |
1347 } | |
1348 else if (msg_didout) /* start message on next line */ | |
1349 { | |
1350 msg_putchar('\n'); | |
1351 did_return = TRUE; | |
1352 if (exmode_active != EXMODE_NORMAL) | |
1353 cmdline_row = msg_row; | |
1354 } | |
1355 if (!msg_didany || lines_left < 0) | |
1356 msg_starthere(); | |
1357 if (msg_silent == 0) | |
1358 { | |
1359 msg_didout = FALSE; /* no output on current line yet */ | |
1360 cursor_off(); | |
1361 } | |
1362 | |
1363 /* when redirecting, may need to start a new line. */ | |
1364 if (!did_return) | |
1365 redir_write((char_u *)"\n", -1); | |
1366 } | |
1367 | |
1368 /* | |
1369 * Note that the current msg position is where messages start. | |
1370 */ | |
1371 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1372 msg_starthere(void) |
7 | 1373 { |
1374 lines_left = cmdline_row; | |
1375 msg_didany = FALSE; | |
1376 } | |
1377 | |
1378 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1379 msg_putchar(int c) |
7 | 1380 { |
1381 msg_putchar_attr(c, 0); | |
1382 } | |
1383 | |
1384 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1385 msg_putchar_attr(int c, int attr) |
7 | 1386 { |
15551
b069a878bbeb
patch 8.1.0783: compiler warning for signed/unsigned
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1387 char_u buf[MB_MAXBYTES + 1]; |
7 | 1388 |
1389 if (IS_SPECIAL(c)) | |
1390 { | |
1391 buf[0] = K_SPECIAL; | |
1392 buf[1] = K_SECOND(c); | |
1393 buf[2] = K_THIRD(c); | |
1394 buf[3] = NUL; | |
1395 } | |
1396 else | |
15551
b069a878bbeb
patch 8.1.0783: compiler warning for signed/unsigned
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1397 buf[(*mb_char2bytes)(c, buf)] = NUL; |
b069a878bbeb
patch 8.1.0783: compiler warning for signed/unsigned
Bram Moolenaar <Bram@vim.org>
parents:
15543
diff
changeset
|
1398 msg_puts_attr((char *)buf, attr); |
7 | 1399 } |
1400 | |
1401 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1402 msg_outnum(long n) |
7 | 1403 { |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1404 char buf[20]; |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1405 |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1406 sprintf(buf, "%ld", n); |
7 | 1407 msg_puts(buf); |
1408 } | |
1409 | |
1410 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1411 msg_home_replace(char_u *fname) |
7 | 1412 { |
1413 msg_home_replace_attr(fname, 0); | |
1414 } | |
1415 | |
1416 #if defined(FEAT_FIND_ID) || defined(PROTO) | |
1417 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1418 msg_home_replace_hl(char_u *fname) |
7 | 1419 { |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1420 msg_home_replace_attr(fname, HL_ATTR(HLF_D)); |
7 | 1421 } |
1422 #endif | |
1423 | |
1424 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1425 msg_home_replace_attr(char_u *fname, int attr) |
7 | 1426 { |
1427 char_u *name; | |
1428 | |
1429 name = home_replace_save(NULL, fname); | |
1430 if (name != NULL) | |
1431 msg_outtrans_attr(name, attr); | |
1432 vim_free(name); | |
1433 } | |
1434 | |
1435 /* | |
1436 * Output 'len' characters in 'str' (including NULs) with translation | |
1437 * if 'len' is -1, output upto a NUL character. | |
1438 * Use attributes 'attr'. | |
1439 * Return the number of characters it takes on the screen. | |
1440 */ | |
1441 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1442 msg_outtrans(char_u *str) |
7 | 1443 { |
1444 return msg_outtrans_attr(str, 0); | |
1445 } | |
1446 | |
1447 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1448 msg_outtrans_attr(char_u *str, int attr) |
7 | 1449 { |
1450 return msg_outtrans_len_attr(str, (int)STRLEN(str), attr); | |
1451 } | |
1452 | |
1453 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1454 msg_outtrans_len(char_u *str, int len) |
7 | 1455 { |
1456 return msg_outtrans_len_attr(str, len, 0); | |
1457 } | |
1458 | |
1459 /* | |
1460 * Output one character at "p". Return pointer to the next character. | |
1461 * Handles multi-byte characters. | |
1462 */ | |
1463 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1464 msg_outtrans_one(char_u *p, int attr) |
7 | 1465 { |
1466 int l; | |
1467 | |
474 | 1468 if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1) |
7 | 1469 { |
1470 msg_outtrans_len_attr(p, l, attr); | |
1471 return p + l; | |
1472 } | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1473 msg_puts_attr((char *)transchar_byte(*p), attr); |
7 | 1474 return p + 1; |
1475 } | |
1476 | |
1477 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1478 msg_outtrans_len_attr(char_u *msgstr, int len, int attr) |
7 | 1479 { |
1480 int retval = 0; | |
1481 char_u *str = msgstr; | |
1482 char_u *plain_start = msgstr; | |
1483 char_u *s; | |
1484 int mb_l; | |
1485 int c; | |
1486 | |
1487 /* if MSG_HIST flag set, add message to history */ | |
1488 if (attr & MSG_HIST) | |
1489 { | |
1490 add_msg_hist(str, len, attr); | |
1491 attr &= ~MSG_HIST; | |
1492 } | |
1493 | |
1494 /* If the string starts with a composing character first draw a space on | |
1495 * which the composing char can be drawn. */ | |
1496 if (enc_utf8 && utf_iscomposing(utf_ptr2char(msgstr))) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1497 msg_puts_attr(" ", attr); |
7 | 1498 |
1499 /* | |
1500 * Go over the string. Special characters are translated and printed. | |
1501 * Normal characters are printed several at a time. | |
1502 */ | |
1503 while (--len >= 0) | |
1504 { | |
1505 if (enc_utf8) | |
1506 /* Don't include composing chars after the end. */ | |
474 | 1507 mb_l = utfc_ptr2len_len(str, len + 1); |
7 | 1508 else if (has_mbyte) |
474 | 1509 mb_l = (*mb_ptr2len)(str); |
7 | 1510 else |
1511 mb_l = 1; | |
1512 if (has_mbyte && mb_l > 1) | |
1513 { | |
1514 c = (*mb_ptr2char)(str); | |
1515 if (vim_isprintc(c)) | |
1516 /* printable multi-byte char: count the cells. */ | |
1517 retval += (*mb_ptr2cells)(str); | |
1518 else | |
1519 { | |
1520 /* unprintable multi-byte char: print the printable chars so | |
1521 * far and the translation of the unprintable char. */ | |
1522 if (str > plain_start) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1523 msg_puts_attr_len((char *)plain_start, |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1524 (int)(str - plain_start), attr); |
7 | 1525 plain_start = str + mb_l; |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1526 msg_puts_attr((char *)transchar(c), |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1527 attr == 0 ? HL_ATTR(HLF_8) : attr); |
7 | 1528 retval += char2cells(c); |
1529 } | |
1530 len -= mb_l - 1; | |
1531 str += mb_l; | |
1532 } | |
1533 else | |
1534 { | |
1535 s = transchar_byte(*str); | |
1536 if (s[1] != NUL) | |
1537 { | |
1538 /* unprintable char: print the printable chars so far and the | |
1539 * translation of the unprintable char. */ | |
1540 if (str > plain_start) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1541 msg_puts_attr_len((char *)plain_start, |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1542 (int)(str - plain_start), attr); |
7 | 1543 plain_start = str + 1; |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1544 msg_puts_attr((char *)s, attr == 0 ? HL_ATTR(HLF_8) : attr); |
1668 | 1545 retval += (int)STRLEN(s); |
7 | 1546 } |
1663 | 1547 else |
1548 ++retval; | |
7 | 1549 ++str; |
1550 } | |
1551 } | |
1552 | |
1553 if (str > plain_start) | |
1554 /* print the printable chars at the end */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1555 msg_puts_attr_len((char *)plain_start, (int)(str - plain_start), attr); |
7 | 1556 |
1557 return retval; | |
1558 } | |
1559 | |
1560 #if defined(FEAT_QUICKFIX) || defined(PROTO) | |
1561 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1562 msg_make(char_u *arg) |
7 | 1563 { |
1564 int i; | |
1565 static char_u *str = (char_u *)"eeffoc", *rs = (char_u *)"Plon#dqg#vxjduB"; | |
1566 | |
1567 arg = skipwhite(arg); | |
1568 for (i = 5; *arg && i >= 0; --i) | |
1569 if (*arg++ != str[i]) | |
1570 break; | |
1571 if (i < 0) | |
1572 { | |
1573 msg_putchar('\n'); | |
1574 for (i = 0; rs[i]; ++i) | |
1575 msg_putchar(rs[i] - 3); | |
1576 } | |
1577 } | |
1578 #endif | |
1579 | |
1580 /* | |
1581 * Output the string 'str' upto a NUL character. | |
1582 * Return the number of characters it takes on the screen. | |
1583 * | |
1584 * If K_SPECIAL is encountered, then it is taken in conjunction with the | |
1585 * following character and shown as <F1>, <S-Up> etc. Any other character | |
1586 * which is not printable shown in <> form. | |
1587 * If 'from' is TRUE (lhs of a mapping), a space is shown as <Space>. | |
1588 * If a character is displayed in one of these special ways, is also | |
1589 * highlighted (its highlight name is '8' in the p_hl variable). | |
1590 * Otherwise characters are not highlighted. | |
1591 * This function is used to show mappings, where we want to see how to type | |
1592 * the character/string -- webb | |
1593 */ | |
1594 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1595 msg_outtrans_special( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1596 char_u *strstart, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1597 int from) /* TRUE for lhs of a mapping */ |
7 | 1598 { |
1599 char_u *str = strstart; | |
1600 int retval = 0; | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1601 char *text; |
7 | 1602 int attr; |
1603 int len; | |
1604 | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1605 attr = HL_ATTR(HLF_8); |
7 | 1606 while (*str != NUL) |
1607 { | |
1608 /* Leading and trailing spaces need to be displayed in <> form. */ | |
1609 if ((str == strstart || str[1] == NUL) && *str == ' ') | |
1610 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1611 text = "<Space>"; |
7 | 1612 ++str; |
1613 } | |
1614 else | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1615 text = (char *)str2special(&str, from); |
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1616 len = vim_strsize((char_u *)text); |
7 | 1617 /* Highlight special keys */ |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1618 msg_puts_attr(text, len > 1 |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
1619 && (*mb_ptr2len)((char_u *)text) <= 1 ? attr : 0); |
7 | 1620 retval += len; |
1621 } | |
1622 return retval; | |
1623 } | |
1624 | |
2610 | 1625 #if defined(FEAT_EVAL) || defined(PROTO) |
1626 /* | |
1627 * Return the lhs or rhs of a mapping, with the key codes turned into printable | |
1628 * strings, in an allocated string. | |
1629 */ | |
1630 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1631 str2special_save( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1632 char_u *str, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1633 int is_lhs) /* TRUE for lhs, FALSE for rhs */ |
2610 | 1634 { |
1635 garray_T ga; | |
1636 char_u *p = str; | |
1637 | |
1638 ga_init2(&ga, 1, 40); | |
1639 while (*p != NUL) | |
1640 ga_concat(&ga, str2special(&p, is_lhs)); | |
1641 ga_append(&ga, NUL); | |
1642 return (char_u *)ga.ga_data; | |
1643 } | |
1644 #endif | |
1645 | |
7 | 1646 /* |
1647 * Return the printable string for the key codes at "*sp". | |
1648 * Used for translating the lhs or rhs of a mapping to printable chars. | |
1649 * Advances "sp" to the next code. | |
1650 */ | |
1651 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1652 str2special( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1653 char_u **sp, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1654 int from) /* TRUE for lhs of mapping */ |
7 | 1655 { |
1656 int c; | |
1657 static char_u buf[7]; | |
1658 char_u *str = *sp; | |
1659 int modifiers = 0; | |
1660 int special = FALSE; | |
1661 | |
1662 if (has_mbyte) | |
1663 { | |
1664 char_u *p; | |
1665 | |
1666 /* Try to un-escape a multi-byte character. Return the un-escaped | |
1667 * string if it is a multi-byte character. */ | |
1668 p = mb_unescape(sp); | |
1669 if (p != NULL) | |
1670 return p; | |
1671 } | |
1672 | |
1673 c = *str; | |
1674 if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) | |
1675 { | |
1676 if (str[1] == KS_MODIFIER) | |
1677 { | |
1678 modifiers = str[2]; | |
1679 str += 3; | |
1680 c = *str; | |
1681 } | |
1682 if (c == K_SPECIAL && str[1] != NUL && str[2] != NUL) | |
1683 { | |
1684 c = TO_SPECIAL(str[1], str[2]); | |
1685 str += 2; | |
1686 } | |
1687 if (IS_SPECIAL(c) || modifiers) /* special key */ | |
1688 special = TRUE; | |
1689 } | |
1690 | |
3024 | 1691 if (has_mbyte && !IS_SPECIAL(c)) |
7 | 1692 { |
3072 | 1693 int len = (*mb_ptr2len)(str); |
3024 | 1694 |
1695 /* For multi-byte characters check for an illegal byte. */ | |
1696 if (has_mbyte && MB_BYTE2LEN(*str) > len) | |
1697 { | |
1698 transchar_nonprint(buf, c); | |
1699 *sp = str + 1; | |
1700 return buf; | |
1701 } | |
3072 | 1702 /* Since 'special' is TRUE the multi-byte character 'c' will be |
1703 * processed by get_special_key_name() */ | |
1704 c = (*mb_ptr2char)(str); | |
1705 *sp = str + len; | |
7 | 1706 } |
3024 | 1707 else |
1708 *sp = str + 1; | |
7 | 1709 |
1710 /* Make unprintable characters in <> form, also <M-Space> and <Tab>. | |
1711 * Use <Space> only for lhs of a mapping. */ | |
1712 if (special || char2cells(c) > 1 || (from && c == ' ')) | |
1713 return get_special_key_name(c, modifiers); | |
1714 buf[0] = c; | |
1715 buf[1] = NUL; | |
1716 return buf; | |
1717 } | |
1718 | |
1719 /* | |
1720 * Translate a key sequence into special key names. | |
1721 */ | |
1722 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1723 str2specialbuf(char_u *sp, char_u *buf, int len) |
7 | 1724 { |
1725 char_u *s; | |
1726 | |
1727 *buf = NUL; | |
1728 while (*sp) | |
1729 { | |
1730 s = str2special(&sp, FALSE); | |
1731 if ((int)(STRLEN(s) + STRLEN(buf)) < len) | |
1732 STRCAT(buf, s); | |
1733 } | |
1734 } | |
1735 | |
1736 /* | |
1737 * print line for :print or :list command | |
1738 */ | |
1739 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1740 msg_prt_line(char_u *s, int list) |
7 | 1741 { |
1742 int c; | |
1743 int col = 0; | |
1744 int n_extra = 0; | |
1745 int c_extra = 0; | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1746 int c_final = 0; |
7 | 1747 char_u *p_extra = NULL; /* init to make SASC shut up */ |
1748 int n; | |
1059 | 1749 int attr = 0; |
7 | 1750 char_u *trail = NULL; |
1751 int l; | |
1752 char_u buf[MB_MAXBYTES + 1]; | |
1753 | |
167 | 1754 if (curwin->w_p_list) |
1755 list = TRUE; | |
1756 | |
7 | 1757 /* find start of trailing whitespace */ |
167 | 1758 if (list && lcs_trail) |
7 | 1759 { |
1760 trail = s + STRLEN(s); | |
11129
f4ea50924c6d
patch 8.0.0452: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11127
diff
changeset
|
1761 while (trail > s && VIM_ISWHITE(trail[-1])) |
7 | 1762 --trail; |
1763 } | |
1764 | |
1765 /* output a space for an empty line, otherwise the line will be | |
1766 * overwritten */ | |
167 | 1767 if (*s == NUL && !(list && lcs_eol != NUL)) |
7 | 1768 msg_putchar(' '); |
1769 | |
446 | 1770 while (!got_int) |
7 | 1771 { |
1059 | 1772 if (n_extra > 0) |
7 | 1773 { |
1774 --n_extra; | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1775 if (n_extra == 0 && c_final) |
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1776 c = c_final; |
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1777 else if (c_extra) |
7 | 1778 c = c_extra; |
1779 else | |
1780 c = *p_extra++; | |
1781 } | |
474 | 1782 else if (has_mbyte && (l = (*mb_ptr2len)(s)) > 1) |
7 | 1783 { |
1784 col += (*mb_ptr2cells)(s); | |
6801 | 1785 if (lcs_nbsp != NUL && list |
1786 && (mb_ptr2char(s) == 160 | |
1787 || mb_ptr2char(s) == 0x202f)) | |
2692 | 1788 { |
1789 mb_char2bytes(lcs_nbsp, buf); | |
1790 buf[(*mb_ptr2len)(buf)] = NUL; | |
1791 } | |
1792 else | |
1793 { | |
1794 mch_memmove(buf, s, (size_t)l); | |
1795 buf[l] = NUL; | |
1796 } | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1797 msg_puts((char *)buf); |
7 | 1798 s += l; |
1799 continue; | |
1800 } | |
1801 else | |
1802 { | |
1803 attr = 0; | |
1804 c = *s++; | |
167 | 1805 if (c == TAB && (!list || lcs_tab1)) |
7 | 1806 { |
1807 /* tab amount depends on current column */ | |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14129
diff
changeset
|
1808 #ifdef FEAT_VARTABS |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14129
diff
changeset
|
1809 n_extra = tabstop_padding(col, curbuf->b_p_ts, |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14129
diff
changeset
|
1810 curbuf->b_p_vts_array) - 1; |
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14129
diff
changeset
|
1811 #else |
7 | 1812 n_extra = curbuf->b_p_ts - col % curbuf->b_p_ts - 1; |
14175
2ad722003b36
patch 8.1.0105: all tab stops are the same
Christian Brabandt <cb@256bit.org>
parents:
14129
diff
changeset
|
1813 #endif |
167 | 1814 if (!list) |
7 | 1815 { |
1816 c = ' '; | |
1817 c_extra = ' '; | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1818 c_final = NUL; |
7 | 1819 } |
1820 else | |
1821 { | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1822 c = (n_extra == 0 && lcs_tab3) ? lcs_tab3 : lcs_tab1; |
7 | 1823 c_extra = lcs_tab2; |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1824 c_final = lcs_tab3; |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1825 attr = HL_ATTR(HLF_8); |
7 | 1826 } |
1827 } | |
2692 | 1828 else if (c == 160 && list && lcs_nbsp != NUL) |
1829 { | |
1830 c = lcs_nbsp; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1831 attr = HL_ATTR(HLF_8); |
2692 | 1832 } |
167 | 1833 else if (c == NUL && list && lcs_eol != NUL) |
7 | 1834 { |
1835 p_extra = (char_u *)""; | |
1836 c_extra = NUL; | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1837 c_final = NUL; |
7 | 1838 n_extra = 1; |
1839 c = lcs_eol; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1840 attr = HL_ATTR(HLF_AT); |
7 | 1841 --s; |
1842 } | |
1843 else if (c != NUL && (n = byte2cells(c)) > 1) | |
1844 { | |
1845 n_extra = n - 1; | |
1846 p_extra = transchar_byte(c); | |
1847 c_extra = NUL; | |
15502
bc17a9d37810
patch 8.1.0759: showing two characters for tab is limited
Bram Moolenaar <Bram@vim.org>
parents:
15470
diff
changeset
|
1848 c_final = NUL; |
7 | 1849 c = *p_extra++; |
1059 | 1850 /* Use special coloring to be able to distinguish <hex> from |
1851 * the same in plain text. */ | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1852 attr = HL_ATTR(HLF_8); |
7 | 1853 } |
1854 else if (c == ' ' && trail != NULL && s > trail) | |
1855 { | |
1856 c = lcs_trail; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1857 attr = HL_ATTR(HLF_8); |
7 | 1858 } |
6781 | 1859 else if (c == ' ' && list && lcs_space != NUL) |
1860 { | |
1861 c = lcs_space; | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1862 attr = HL_ATTR(HLF_8); |
6781 | 1863 } |
7 | 1864 } |
1865 | |
1866 if (c == NUL) | |
1867 break; | |
1868 | |
1869 msg_putchar_attr(c, attr); | |
1870 col++; | |
1871 } | |
1872 msg_clr_eos(); | |
1873 } | |
1874 | |
1875 /* | |
1876 * Use screen_puts() to output one multi-byte character. | |
1877 * Return the pointer "s" advanced to the next character. | |
1878 */ | |
1879 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
1880 screen_puts_mbyte(char_u *s, int l, int attr) |
7 | 1881 { |
1882 int cw; | |
1883 | |
1884 msg_didout = TRUE; /* remember that line is not empty */ | |
1885 cw = (*mb_ptr2cells)(s); | |
1886 if (cw > 1 && ( | |
1887 #ifdef FEAT_RIGHTLEFT | |
1888 cmdmsg_rl ? msg_col <= 1 : | |
1889 #endif | |
1890 msg_col == Columns - 1)) | |
1891 { | |
1892 /* Doesn't fit, print a highlighted '>' to fill it up. */ | |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1893 msg_screen_putchar('>', HL_ATTR(HLF_AT)); |
7 | 1894 return s; |
1895 } | |
1896 | |
1897 screen_puts_len(s, l, msg_row, msg_col, attr); | |
1898 #ifdef FEAT_RIGHTLEFT | |
1899 if (cmdmsg_rl) | |
1900 { | |
1901 msg_col -= cw; | |
1902 if (msg_col == 0) | |
1903 { | |
1904 msg_col = Columns; | |
1905 ++msg_row; | |
1906 } | |
1907 } | |
1908 else | |
1909 #endif | |
1910 { | |
1911 msg_col += cw; | |
1912 if (msg_col >= Columns) | |
1913 { | |
1914 msg_col = 0; | |
1915 ++msg_row; | |
1916 } | |
1917 } | |
1918 return s + l; | |
1919 } | |
1920 | |
1921 /* | |
1922 * Output a string to the screen at position msg_row, msg_col. | |
1923 * Update msg_row and msg_col for the next message. | |
1924 */ | |
1925 void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1926 msg_puts(char *s) |
7 | 1927 { |
10141
b67088aae933
commit https://github.com/vim/vim/commit/aeac9006d5d14910f214f09df52c026a5936e737
Christian Brabandt <cb@256bit.org>
parents:
10042
diff
changeset
|
1928 msg_puts_attr(s, 0); |
7 | 1929 } |
1930 | |
1931 void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1932 msg_puts_title(char *s) |
7 | 1933 { |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
1934 msg_puts_attr(s, HL_ATTR(HLF_T)); |
7 | 1935 } |
1936 | |
1937 /* | |
1938 * Show a message in such a way that it always fits in the line. Cut out a | |
1939 * part in the middle and replace it with "..." when necessary. | |
1940 * Does not handle multi-byte characters! | |
1941 */ | |
1942 void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1943 msg_outtrans_long_attr(char_u *longstr, int attr) |
7 | 1944 { |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1945 msg_outtrans_long_len_attr(longstr, (int)STRLEN(longstr), attr); |
7 | 1946 } |
1947 | |
1948 void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1949 msg_outtrans_long_len_attr(char_u *longstr, int len, int attr) |
7 | 1950 { |
1951 int slen = len; | |
1952 int room; | |
1953 | |
1954 room = Columns - msg_col; | |
1955 if (len > room && room >= 20) | |
1956 { | |
1957 slen = (room - 3) / 2; | |
1958 msg_outtrans_len_attr(longstr, slen, attr); | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1959 msg_puts_attr("...", HL_ATTR(HLF_8)); |
7 | 1960 } |
1961 msg_outtrans_len_attr(longstr + len - slen, slen, attr); | |
1962 } | |
1963 | |
1964 /* | |
1965 * Basic function for writing a message with highlight attributes. | |
1966 */ | |
1967 void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1968 msg_puts_attr(char *s, int attr) |
7 | 1969 { |
1970 msg_puts_attr_len(s, -1, attr); | |
1971 } | |
1972 | |
1973 /* | |
1974 * Like msg_puts_attr(), but with a maximum length "maxlen" (in bytes). | |
1975 * When "maxlen" is -1 there is no maximum length. | |
1976 * When "maxlen" is >= 0 the message is not put in the history. | |
1977 */ | |
1978 static void | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1979 msg_puts_attr_len(char *str, int maxlen, int attr) |
7 | 1980 { |
1981 /* | |
1982 * If redirection is on, also write to the redirection file. | |
1983 */ | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1984 redir_write((char_u *)str, maxlen); |
7 | 1985 |
1986 /* | |
1987 * Don't print anything when using ":silent cmd". | |
1988 */ | |
1989 if (msg_silent != 0) | |
1990 return; | |
1991 | |
1992 /* if MSG_HIST flag set, add message to history */ | |
1993 if ((attr & MSG_HIST) && maxlen < 0) | |
1994 { | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
1995 add_msg_hist((char_u *)str, -1, attr); |
7 | 1996 attr &= ~MSG_HIST; |
1997 } | |
1998 | |
1999 /* | |
2000 * When writing something to the screen after it has scrolled, requires a | |
2001 * wait-return prompt later. Needed when scrolling, resetting | |
2002 * need_wait_return after some prompt, and then outputting something | |
2003 * without scrolling | |
2004 */ | |
539 | 2005 if (msg_scrolled != 0 && !msg_scrolled_ign) |
7 | 2006 need_wait_return = TRUE; |
2007 msg_didany = TRUE; /* remember that something was outputted */ | |
2008 | |
2009 /* | |
2010 * If there is no valid screen, use fprintf so we can see error messages. | |
2011 * If termcap is not active, we may be writing in an alternate console | |
2012 * window, cursor positioning may not work correctly (window size may be | |
2013 * different, e.g. for Win32 console) or we just don't know where the | |
2014 * cursor is. | |
2015 */ | |
2016 if (msg_use_printf()) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
2017 msg_puts_printf((char_u *)str, maxlen); |
446 | 2018 else |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
2019 msg_puts_display((char_u *)str, maxlen, attr, FALSE); |
446 | 2020 } |
2021 | |
2022 /* | |
2023 * The display part of msg_puts_attr_len(). | |
2024 * May be called recursively to display scroll-back text. | |
2025 */ | |
2026 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2027 msg_puts_display( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2028 char_u *str, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2029 int maxlen, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2030 int attr, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2031 int recurse) |
446 | 2032 { |
2033 char_u *s = str; | |
2034 char_u *t_s = str; /* string from "t_s" to "s" is still todo */ | |
2035 int t_col = 0; /* screen cells todo, 0 when "t_s" not used */ | |
2036 int l; | |
2037 int cw; | |
2038 char_u *sb_str = str; | |
2039 int sb_col = msg_col; | |
2040 int wrap; | |
1381 | 2041 int did_last_char; |
7 | 2042 |
2043 did_wait_return = FALSE; | |
1339 | 2044 while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL) |
7 | 2045 { |
2046 /* | |
446 | 2047 * We are at the end of the screen line when: |
2048 * - When outputting a newline. | |
2049 * - When outputting a character in the last column. | |
7 | 2050 */ |
446 | 2051 if (!recurse && msg_row >= Rows - 1 && (*s == '\n' || ( |
7 | 2052 #ifdef FEAT_RIGHTLEFT |
2053 cmdmsg_rl | |
2054 ? ( | |
2055 msg_col <= 1 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2056 || (*s == TAB && msg_col <= 7) |
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2057 || (has_mbyte && (*mb_ptr2cells)(s) > 1 && msg_col <= 2)) |
7 | 2058 : |
2059 #endif | |
2060 (msg_col + t_col >= Columns - 1 | |
2061 || (*s == TAB && msg_col + t_col >= ((Columns - 1) & ~7)) | |
2062 || (has_mbyte && (*mb_ptr2cells)(s) > 1 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2063 && msg_col + t_col >= Columns - 2))))) |
7 | 2064 { |
446 | 2065 /* |
2066 * The screen is scrolled up when at the last row (some terminals | |
2067 * scroll automatically, some don't. To avoid problems we scroll | |
2068 * ourselves). | |
2069 */ | |
7 | 2070 if (t_col > 0) |
2071 /* output postponed text */ | |
446 | 2072 t_puts(&t_col, t_s, s, attr); |
7 | 2073 |
1342 | 2074 /* When no more prompt and no more room, truncate here */ |
7 | 2075 if (msg_no_more && lines_left == 0) |
2076 break; | |
446 | 2077 |
2078 /* Scroll the screen up one line. */ | |
2079 msg_scroll_up(); | |
7 | 2080 |
2081 msg_row = Rows - 2; | |
2082 if (msg_col >= Columns) /* can happen after screen resize */ | |
2083 msg_col = Columns - 1; | |
2084 | |
446 | 2085 /* Display char in last column before showing more-prompt. */ |
2086 if (*s >= ' ' | |
2087 #ifdef FEAT_RIGHTLEFT | |
2088 && !cmdmsg_rl | |
2089 #endif | |
2090 ) | |
2091 { | |
2092 if (has_mbyte) | |
2093 { | |
2094 if (enc_utf8 && maxlen >= 0) | |
2095 /* avoid including composing chars after the end */ | |
474 | 2096 l = utfc_ptr2len_len(s, (int)((str + maxlen) - s)); |
446 | 2097 else |
474 | 2098 l = (*mb_ptr2len)(s); |
446 | 2099 s = screen_puts_mbyte(s, l, attr); |
2100 } | |
2101 else | |
2102 msg_screen_putchar(*s++, attr); | |
1381 | 2103 did_last_char = TRUE; |
446 | 2104 } |
1381 | 2105 else |
2106 did_last_char = FALSE; | |
446 | 2107 |
2108 if (p_more) | |
2109 /* store text for scrolling back */ | |
2110 store_sb_text(&sb_str, s, attr, &sb_col, TRUE); | |
2111 | |
539 | 2112 inc_msg_scrolled(); |
446 | 2113 need_wait_return = TRUE; /* may need wait_return in main() */ |
7 | 2114 redraw_cmdline = TRUE; |
2115 if (cmdline_row > 0 && !exmode_active) | |
2116 --cmdline_row; | |
2117 | |
2118 /* | |
446 | 2119 * If screen is completely filled and 'more' is set then wait |
2120 * for a character. | |
7 | 2121 */ |
1342 | 2122 if (lines_left > 0) |
2123 --lines_left; | |
957 | 2124 if (p_more && lines_left == 0 && State != HITRETURN |
7 | 2125 && !msg_no_more && !exmode_active) |
2126 { | |
2127 #ifdef FEAT_CON_DIALOG | |
446 | 2128 if (do_more_prompt(NUL)) |
2129 s = confirm_msg_tail; | |
2130 #else | |
2131 (void)do_more_prompt(NUL); | |
7 | 2132 #endif |
2133 if (quit_more) | |
446 | 2134 return; |
7 | 2135 } |
539 | 2136 |
2137 /* When we displayed a char in last column need to check if there | |
2138 * is still more. */ | |
1381 | 2139 if (did_last_char) |
539 | 2140 continue; |
7 | 2141 } |
2142 | |
446 | 2143 wrap = *s == '\n' |
7 | 2144 || msg_col + t_col >= Columns |
2145 || (has_mbyte && (*mb_ptr2cells)(s) > 1 | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2146 && msg_col + t_col >= Columns - 1); |
446 | 2147 if (t_col > 0 && (wrap || *s == '\r' || *s == '\b' |
2148 || *s == '\t' || *s == BELL)) | |
7 | 2149 /* output any postponed text */ |
446 | 2150 t_puts(&t_col, t_s, s, attr); |
2151 | |
2152 if (wrap && p_more && !recurse) | |
2153 /* store text for scrolling back */ | |
2154 store_sb_text(&sb_str, s, attr, &sb_col, TRUE); | |
7 | 2155 |
2156 if (*s == '\n') /* go to next line */ | |
2157 { | |
2158 msg_didout = FALSE; /* remember that line is empty */ | |
474 | 2159 #ifdef FEAT_RIGHTLEFT |
2160 if (cmdmsg_rl) | |
2161 msg_col = Columns - 1; | |
2162 else | |
2163 #endif | |
2164 msg_col = 0; | |
7 | 2165 if (++msg_row >= Rows) /* safety check */ |
2166 msg_row = Rows - 1; | |
2167 } | |
2168 else if (*s == '\r') /* go to column 0 */ | |
2169 { | |
2170 msg_col = 0; | |
2171 } | |
2172 else if (*s == '\b') /* go to previous char */ | |
2173 { | |
2174 if (msg_col) | |
2175 --msg_col; | |
2176 } | |
446 | 2177 else if (*s == TAB) /* translate Tab into spaces */ |
7 | 2178 { |
2179 do | |
2180 msg_screen_putchar(' ', attr); | |
2181 while (msg_col & 7); | |
2182 } | |
6949 | 2183 else if (*s == BELL) /* beep (from ":sh") */ |
2184 vim_beep(BO_SH); | |
7 | 2185 else |
2186 { | |
2187 if (has_mbyte) | |
2188 { | |
2189 cw = (*mb_ptr2cells)(s); | |
2190 if (enc_utf8 && maxlen >= 0) | |
2191 /* avoid including composing chars after the end */ | |
474 | 2192 l = utfc_ptr2len_len(s, (int)((str + maxlen) - s)); |
7 | 2193 else |
474 | 2194 l = (*mb_ptr2len)(s); |
7 | 2195 } |
2196 else | |
2197 { | |
2198 cw = 1; | |
2199 l = 1; | |
2200 } | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2201 |
7 | 2202 /* When drawing from right to left or when a double-wide character |
2203 * doesn't fit, draw a single character here. Otherwise collect | |
2204 * characters and draw them all at once later. */ | |
2205 if ( | |
2206 # ifdef FEAT_RIGHTLEFT | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2207 cmdmsg_rl || |
7 | 2208 # endif |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
2209 (cw > 1 && msg_col + t_col >= Columns - 1)) |
7 | 2210 { |
2211 if (l > 1) | |
2212 s = screen_puts_mbyte(s, l, attr) - 1; | |
2213 else | |
2214 msg_screen_putchar(*s, attr); | |
2215 } | |
2216 else | |
2217 { | |
2218 /* postpone this character until later */ | |
2219 if (t_col == 0) | |
2220 t_s = s; | |
2221 t_col += cw; | |
2222 s += l - 1; | |
2223 } | |
2224 } | |
2225 ++s; | |
2226 } | |
2227 | |
2228 /* output any postponed text */ | |
2229 if (t_col > 0) | |
446 | 2230 t_puts(&t_col, t_s, s, attr); |
2231 if (p_more && !recurse) | |
2232 store_sb_text(&sb_str, s, attr, &sb_col, FALSE); | |
7 | 2233 |
2234 msg_check(); | |
2235 } | |
2236 | |
2237 /* | |
9941
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2238 * Return TRUE when ":filter pattern" was used and "msg" does not match |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2239 * "pattern". |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2240 */ |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2241 int |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2242 message_filtered(char_u *msg) |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2243 { |
9980
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2244 int match; |
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2245 |
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2246 if (cmdmod.filter_regmatch.regprog == NULL) |
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2247 return FALSE; |
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2248 match = vim_regexec(&cmdmod.filter_regmatch, msg, (colnr_T)0); |
b222552cf0c4
commit https://github.com/vim/vim/commit/d29459baa61819e59961804ed258efac5733ec70
Christian Brabandt <cb@256bit.org>
parents:
9941
diff
changeset
|
2249 return cmdmod.filter_force ? match : !match; |
9941
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2250 } |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2251 |
e975914c17e9
commit https://github.com/vim/vim/commit/7b668e83d0635d082b7ec90d7d2aa30a9d7d8928
Christian Brabandt <cb@256bit.org>
parents:
9894
diff
changeset
|
2252 /* |
446 | 2253 * Scroll the screen up one line for displaying the next message line. |
2254 */ | |
2255 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2256 msg_scroll_up(void) |
446 | 2257 { |
2258 #ifdef FEAT_GUI | |
2259 /* Remove the cursor before scrolling, ScreenLines[] is going | |
2260 * to become invalid. */ | |
2261 if (gui.in_use) | |
2262 gui_undraw_cursor(); | |
2263 #endif | |
2264 /* scrolling up always works */ | |
13150
808625d4b71b
patch 8.0.1449: slow redrawing with DirectX
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
2265 mch_disable_flush(); |
12152
69af108df70e
patch 8.0.0956: scrolling in a terminal window has flicker
Christian Brabandt <cb@256bit.org>
parents:
12015
diff
changeset
|
2266 screen_del_lines(0, 0, 1, (int)Rows, TRUE, 0, NULL); |
13150
808625d4b71b
patch 8.0.1449: slow redrawing with DirectX
Christian Brabandt <cb@256bit.org>
parents:
12865
diff
changeset
|
2267 mch_enable_flush(); |
446 | 2268 |
2269 if (!can_clear((char_u *)" ")) | |
2270 { | |
2271 /* Scrolling up doesn't result in the right background. Set the | |
2272 * background here. It's not efficient, but avoids that we have to do | |
2273 * it all over the code. */ | |
2274 screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); | |
2275 | |
2276 /* Also clear the last char of the last but one line if it was not | |
2277 * cleared before to avoid a scroll-up. */ | |
2278 if (ScreenAttrs[LineOffset[Rows - 2] + Columns - 1] == (sattr_T)-1) | |
2279 screen_fill((int)Rows - 2, (int)Rows - 1, | |
2280 (int)Columns - 1, (int)Columns, ' ', ' ', 0); | |
2281 } | |
2282 } | |
2283 | |
2284 /* | |
539 | 2285 * Increment "msg_scrolled". |
2286 */ | |
2287 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2288 inc_msg_scrolled(void) |
539 | 2289 { |
2290 #ifdef FEAT_EVAL | |
2291 if (*get_vim_var_str(VV_SCROLLSTART) == NUL) | |
2292 { | |
2293 char_u *p = sourcing_name; | |
2294 char_u *tofree = NULL; | |
2295 int len; | |
2296 | |
2297 /* v:scrollstart is empty, set it to the script/function name and line | |
2298 * number */ | |
2299 if (p == NULL) | |
2300 p = (char_u *)_("Unknown"); | |
2301 else | |
2302 { | |
835 | 2303 len = (int)STRLEN(p) + 40; |
539 | 2304 tofree = alloc(len); |
2305 if (tofree != NULL) | |
2306 { | |
2307 vim_snprintf((char *)tofree, len, _("%s line %ld"), | |
2308 p, (long)sourcing_lnum); | |
2309 p = tofree; | |
2310 } | |
2311 } | |
2312 set_vim_var_string(VV_SCROLLSTART, p, -1); | |
2313 vim_free(tofree); | |
2314 } | |
2315 #endif | |
2316 ++msg_scrolled; | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2317 if (must_redraw < VALID) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2318 must_redraw = VALID; |
539 | 2319 } |
2320 | |
2321 /* | |
446 | 2322 * To be able to scroll back at the "more" and "hit-enter" prompts we need to |
2323 * store the displayed text and remember where screen lines start. | |
2324 */ | |
2325 typedef struct msgchunk_S msgchunk_T; | |
2326 struct msgchunk_S | |
2327 { | |
2328 msgchunk_T *sb_next; | |
2329 msgchunk_T *sb_prev; | |
2330 char sb_eol; /* TRUE when line ends after this text */ | |
2331 int sb_msg_col; /* column in which text starts */ | |
2332 int sb_attr; /* text attributes */ | |
2333 char_u sb_text[1]; /* text to be displayed, actually longer */ | |
2334 }; | |
2335 | |
2336 static msgchunk_T *last_msgchunk = NULL; /* last displayed text */ | |
2337 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
2338 static msgchunk_T *msg_sb_start(msgchunk_T *mps); |
446 | 2339 |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2340 typedef enum { |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2341 SB_CLEAR_NONE = 0, |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2342 SB_CLEAR_ALL, |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2343 SB_CLEAR_CMDLINE_BUSY, |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2344 SB_CLEAR_CMDLINE_DONE |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2345 } sb_clear_T; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2346 |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2347 /* When to clear text on next msg. */ |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2348 static sb_clear_T do_clear_sb_text = SB_CLEAR_NONE; |
447 | 2349 |
446 | 2350 /* |
2351 * Store part of a printed message for displaying when scrolling back. | |
2352 */ | |
2353 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2354 store_sb_text( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2355 char_u **sb_str, /* start of string */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2356 char_u *s, /* just after string */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2357 int attr, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2358 int *sb_col, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2359 int finish) /* line ends */ |
446 | 2360 { |
2361 msgchunk_T *mp; | |
2362 | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2363 if (do_clear_sb_text == SB_CLEAR_ALL |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2364 || do_clear_sb_text == SB_CLEAR_CMDLINE_DONE) |
447 | 2365 { |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2366 clear_sb_text(do_clear_sb_text == SB_CLEAR_ALL); |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2367 do_clear_sb_text = SB_CLEAR_NONE; |
447 | 2368 } |
2369 | |
446 | 2370 if (s > *sb_str) |
2371 { | |
2372 mp = (msgchunk_T *)alloc((int)(sizeof(msgchunk_T) + (s - *sb_str))); | |
2373 if (mp != NULL) | |
2374 { | |
2375 mp->sb_eol = finish; | |
2376 mp->sb_msg_col = *sb_col; | |
2377 mp->sb_attr = attr; | |
2378 vim_strncpy(mp->sb_text, *sb_str, s - *sb_str); | |
2379 | |
2380 if (last_msgchunk == NULL) | |
2381 { | |
2382 last_msgchunk = mp; | |
2383 mp->sb_prev = NULL; | |
2384 } | |
2385 else | |
2386 { | |
2387 mp->sb_prev = last_msgchunk; | |
2388 last_msgchunk->sb_next = mp; | |
2389 last_msgchunk = mp; | |
2390 } | |
2391 mp->sb_next = NULL; | |
2392 } | |
2393 } | |
2394 else if (finish && last_msgchunk != NULL) | |
2395 last_msgchunk->sb_eol = TRUE; | |
2396 | |
2397 *sb_str = s; | |
2398 *sb_col = 0; | |
2399 } | |
2400 | |
2401 /* | |
447 | 2402 * Finished showing messages, clear the scroll-back text on the next message. |
2403 */ | |
2404 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2405 may_clear_sb_text(void) |
447 | 2406 { |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2407 do_clear_sb_text = SB_CLEAR_ALL; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2408 } |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2409 |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2410 /* |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2411 * Starting to edit the command line, do not clear messages now. |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2412 */ |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2413 void |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2414 sb_text_start_cmdline(void) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2415 { |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2416 do_clear_sb_text = SB_CLEAR_CMDLINE_BUSY; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2417 msg_sb_eol(); |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2418 } |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2419 |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2420 /* |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2421 * Ending to edit the command line. Clear old lines but the last one later. |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2422 */ |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2423 void |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2424 sb_text_end_cmdline(void) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2425 { |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2426 do_clear_sb_text = SB_CLEAR_CMDLINE_DONE; |
447 | 2427 } |
2428 | |
2429 /* | |
446 | 2430 * Clear any text remembered for scrolling back. |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2431 * When "all" is FALSE keep the last line. |
446 | 2432 * Called when redrawing the screen. |
2433 */ | |
2434 void | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2435 clear_sb_text(int all) |
446 | 2436 { |
2437 msgchunk_T *mp; | |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2438 msgchunk_T **lastp; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2439 |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2440 if (all) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2441 lastp = &last_msgchunk; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2442 else |
446 | 2443 { |
11163
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2444 if (last_msgchunk == NULL) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2445 return; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2446 lastp = &last_msgchunk->sb_prev; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2447 } |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2448 |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2449 while (*lastp != NULL) |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2450 { |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2451 mp = (*lastp)->sb_prev; |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2452 vim_free(*lastp); |
f4d1fad4ac00
patch 8.0.0468: after aborting an Ex command g< does not work
Christian Brabandt <cb@256bit.org>
parents:
11158
diff
changeset
|
2453 *lastp = mp; |
446 | 2454 } |
2455 } | |
2456 | |
2457 /* | |
447 | 2458 * "g<" command. |
2459 */ | |
2460 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2461 show_sb_text(void) |
447 | 2462 { |
2463 msgchunk_T *mp; | |
2464 | |
1342 | 2465 /* Only show something if there is more than one line, otherwise it looks |
447 | 2466 * weird, typing a command without output results in one line. */ |
2467 mp = msg_sb_start(last_msgchunk); | |
2468 if (mp == NULL || mp->sb_prev == NULL) | |
6949 | 2469 vim_beep(BO_MESS); |
447 | 2470 else |
2471 { | |
2472 do_more_prompt('G'); | |
2473 wait_return(FALSE); | |
2474 } | |
2475 } | |
2476 | |
2477 /* | |
446 | 2478 * Move to the start of screen line in already displayed text. |
2479 */ | |
2480 static msgchunk_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2481 msg_sb_start(msgchunk_T *mps) |
446 | 2482 { |
2483 msgchunk_T *mp = mps; | |
2484 | |
2485 while (mp != NULL && mp->sb_prev != NULL && !mp->sb_prev->sb_eol) | |
2486 mp = mp->sb_prev; | |
2487 return mp; | |
2488 } | |
2489 | |
2490 /* | |
3435 | 2491 * Mark the last message chunk as finishing the line. |
2492 */ | |
2493 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2494 msg_sb_eol(void) |
3435 | 2495 { |
2496 if (last_msgchunk != NULL) | |
2497 last_msgchunk->sb_eol = TRUE; | |
2498 } | |
2499 | |
2500 /* | |
446 | 2501 * Display a screen line from previously displayed text at row "row". |
2502 * Returns a pointer to the text for the next line (can be NULL). | |
2503 */ | |
2504 static msgchunk_T * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2505 disp_sb_line(int row, msgchunk_T *smp) |
446 | 2506 { |
2507 msgchunk_T *mp = smp; | |
2508 char_u *p; | |
2509 | |
2510 for (;;) | |
2511 { | |
2512 msg_row = row; | |
2513 msg_col = mp->sb_msg_col; | |
2514 p = mp->sb_text; | |
2515 if (*p == '\n') /* don't display the line break */ | |
2516 ++p; | |
2517 msg_puts_display(p, -1, mp->sb_attr, TRUE); | |
2518 if (mp->sb_eol || mp->sb_next == NULL) | |
2519 break; | |
2520 mp = mp->sb_next; | |
2521 } | |
2522 return mp->sb_next; | |
2523 } | |
2524 | |
2525 /* | |
7 | 2526 * Output any postponed text for msg_puts_attr_len(). |
2527 */ | |
2528 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2529 t_puts( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2530 int *t_col, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2531 char_u *t_s, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2532 char_u *s, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2533 int attr) |
7 | 2534 { |
2535 /* output postponed text */ | |
2536 msg_didout = TRUE; /* remember that line is not empty */ | |
2537 screen_puts_len(t_s, (int)(s - t_s), msg_row, msg_col, attr); | |
446 | 2538 msg_col += *t_col; |
2539 *t_col = 0; | |
7 | 2540 /* If the string starts with a composing character don't increment the |
2541 * column position for it. */ | |
2542 if (enc_utf8 && utf_iscomposing(utf_ptr2char(t_s))) | |
2543 --msg_col; | |
2544 if (msg_col >= Columns) | |
2545 { | |
2546 msg_col = 0; | |
2547 ++msg_row; | |
2548 } | |
2549 } | |
2550 | |
2551 /* | |
2552 * Returns TRUE when messages should be printed with mch_errmsg(). | |
2553 * This is used when there is no valid screen, so we can see error messages. | |
2554 * If termcap is not active, we may be writing in an alternate console | |
2555 * window, cursor positioning may not work correctly (window size may be | |
2556 * different, e.g. for Win32 console) or we just don't know where the | |
2557 * cursor is. | |
2558 */ | |
2559 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2560 msg_use_printf(void) |
7 | 2561 { |
2562 return (!msg_check_screen() | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
2563 #if defined(MSWIN) && !defined(FEAT_GUI_MSWIN) |
7 | 2564 || !termcap_active |
2565 #endif | |
2566 || (swapping_screen() && !termcap_active) | |
2567 ); | |
2568 } | |
2569 | |
446 | 2570 /* |
2571 * Print a message when there is no valid screen. | |
2572 */ | |
2573 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2574 msg_puts_printf(char_u *str, int maxlen) |
446 | 2575 { |
2576 char_u *s = str; | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2577 char_u *buf = NULL; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2578 char_u *p = s; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2579 |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
2580 #ifdef MSWIN |
446 | 2581 if (!(silent_mode && p_verbose == 0)) |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2582 mch_settmode(TMODE_COOK); /* handle CR and NL correctly */ |
446 | 2583 #endif |
10158
dd0531938cb6
commit https://github.com/vim/vim/commit/2321ca2a78286bc026fa7f407281ddbeb04114bb
Christian Brabandt <cb@256bit.org>
parents:
10141
diff
changeset
|
2584 while ((maxlen < 0 || (int)(s - str) < maxlen) && *s != NUL) |
446 | 2585 { |
2586 if (!(silent_mode && p_verbose == 0)) | |
2587 { | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2588 // NL --> CR NL translation (for Unix, not for "--version") |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2589 if (*s == NL) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2590 { |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2591 int n = (int)(s - p); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2592 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2593 buf = alloc(n + 3); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2594 memcpy(buf, p, n); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2595 if (!info_message) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2596 buf[n++] = CAR; |
15840
734b1928a5aa
patch 8.1.0927: USE_CR is never defined
Bram Moolenaar <Bram@vim.org>
parents:
15824
diff
changeset
|
2597 buf[n++] = NL; |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2598 buf[n++] = NUL; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2599 if (info_message) // informative message, not an error |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2600 mch_msg((char *)buf); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2601 else |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2602 mch_errmsg((char *)buf); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2603 vim_free(buf); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2604 p = s + 1; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2605 } |
446 | 2606 } |
2607 | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2608 // primitive way to compute the current column |
446 | 2609 #ifdef FEAT_RIGHTLEFT |
2610 if (cmdmsg_rl) | |
2611 { | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2612 if (*s == CAR || *s == NL) |
446 | 2613 msg_col = Columns - 1; |
2614 else | |
2615 --msg_col; | |
2616 } | |
2617 else | |
2618 #endif | |
2619 { | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2620 if (*s == CAR || *s == NL) |
446 | 2621 msg_col = 0; |
2622 else | |
2623 ++msg_col; | |
2624 } | |
2625 ++s; | |
2626 } | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2627 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2628 if (*p != NUL && !(silent_mode && p_verbose == 0)) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2629 { |
15926
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2630 int c = -1; |
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2631 |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2632 if (maxlen > 0 && STRLEN(p) > (size_t)maxlen) |
15926
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2633 { |
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2634 c = p[maxlen]; |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2635 p[maxlen] = 0; |
15926
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2636 } |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2637 if (info_message) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2638 mch_msg((char *)p); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2639 else |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2640 mch_errmsg((char *)p); |
15926
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2641 if (c != -1) |
ca0a0b64809c
patch 8.1.0969: message written during startup is truncated
Bram Moolenaar <Bram@vim.org>
parents:
15896
diff
changeset
|
2642 p[maxlen] = c; |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2643 } |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2644 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2645 msg_didout = TRUE; // assume that line is not empty |
446 | 2646 |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
2647 #ifdef MSWIN |
446 | 2648 if (!(silent_mode && p_verbose == 0)) |
2649 mch_settmode(TMODE_RAW); | |
2650 #endif | |
2651 } | |
2652 | |
2653 /* | |
2654 * Show the more-prompt and handle the user response. | |
2655 * This takes care of scrolling back and displaying previously displayed text. | |
447 | 2656 * When at hit-enter prompt "typed_char" is the already typed character, |
2657 * otherwise it's NUL. | |
446 | 2658 * Returns TRUE when jumping ahead to "confirm_msg_tail". |
2659 */ | |
2660 static int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2661 do_more_prompt(int typed_char) |
446 | 2662 { |
8627
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2663 static int entered = FALSE; |
446 | 2664 int used_typed_char = typed_char; |
2665 int oldState = State; | |
2666 int c; | |
2667 #ifdef FEAT_CON_DIALOG | |
2668 int retval = FALSE; | |
2669 #endif | |
3263 | 2670 int toscroll; |
446 | 2671 msgchunk_T *mp_last = NULL; |
2672 msgchunk_T *mp; | |
2673 int i; | |
2674 | |
8627
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2675 /* We get called recursively when a timer callback outputs a message. In |
9185
70d3337ff173
commit https://github.com/vim/vim/commit/a0055ad3a789b8eeb0c983d8a18d4bcaeaf456b8
Christian Brabandt <cb@256bit.org>
parents:
8905
diff
changeset
|
2676 * that case don't show another prompt. Also when at the hit-Enter prompt |
70d3337ff173
commit https://github.com/vim/vim/commit/a0055ad3a789b8eeb0c983d8a18d4bcaeaf456b8
Christian Brabandt <cb@256bit.org>
parents:
8905
diff
changeset
|
2677 * and nothing was typed. */ |
70d3337ff173
commit https://github.com/vim/vim/commit/a0055ad3a789b8eeb0c983d8a18d4bcaeaf456b8
Christian Brabandt <cb@256bit.org>
parents:
8905
diff
changeset
|
2678 if (entered || (State == HITRETURN && typed_char == 0)) |
8627
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2679 return FALSE; |
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2680 entered = TRUE; |
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2681 |
447 | 2682 if (typed_char == 'G') |
2683 { | |
2684 /* "g<": Find first line on the last page. */ | |
2685 mp_last = msg_sb_start(last_msgchunk); | |
2686 for (i = 0; i < Rows - 2 && mp_last != NULL | |
2687 && mp_last->sb_prev != NULL; ++i) | |
2688 mp_last = msg_sb_start(mp_last->sb_prev); | |
2689 } | |
2690 | |
446 | 2691 State = ASKMORE; |
2692 #ifdef FEAT_MOUSE | |
2693 setmouse(); | |
2694 #endif | |
447 | 2695 if (typed_char == NUL) |
2696 msg_moremsg(FALSE); | |
446 | 2697 for (;;) |
2698 { | |
2699 /* | |
2700 * Get a typed character directly from the user. | |
2701 */ | |
2702 if (used_typed_char != NUL) | |
2703 { | |
2704 c = used_typed_char; /* was typed at hit-enter prompt */ | |
2705 used_typed_char = NUL; | |
2706 } | |
2707 else | |
2708 c = get_keystroke(); | |
2709 | |
2710 #if defined(FEAT_MENU) && defined(FEAT_GUI) | |
2711 if (c == K_MENU) | |
2712 { | |
2713 int idx = get_menu_index(current_menu, ASKMORE); | |
2714 | |
2715 /* Used a menu. If it starts with CTRL-Y, it must | |
2716 * be a "Copy" for the clipboard. Otherwise | |
2717 * assume that we end */ | |
2718 if (idx == MENU_INDEX_INVALID) | |
2719 continue; | |
2720 c = *current_menu->strings[idx]; | |
2721 if (c != NUL && current_menu->strings[idx][1] != NUL) | |
2722 ins_typebuf(current_menu->strings[idx] + 1, | |
2723 current_menu->noremap[idx], 0, TRUE, | |
2724 current_menu->silent[idx]); | |
2725 } | |
2726 #endif | |
2727 | |
3263 | 2728 toscroll = 0; |
446 | 2729 switch (c) |
2730 { | |
2731 case BS: /* scroll one line back */ | |
2732 case K_BS: | |
2733 case 'k': | |
2734 case K_UP: | |
3263 | 2735 toscroll = -1; |
446 | 2736 break; |
2737 | |
2738 case CAR: /* one extra line */ | |
2739 case NL: | |
2740 case 'j': | |
2741 case K_DOWN: | |
3263 | 2742 toscroll = 1; |
446 | 2743 break; |
2744 | |
2745 case 'u': /* Up half a page */ | |
3263 | 2746 toscroll = -(Rows / 2); |
446 | 2747 break; |
2748 | |
2749 case 'd': /* Down half a page */ | |
3263 | 2750 toscroll = Rows / 2; |
446 | 2751 break; |
2752 | |
2753 case 'b': /* one page back */ | |
1820 | 2754 case K_PAGEUP: |
3263 | 2755 toscroll = -(Rows - 1); |
446 | 2756 break; |
2757 | |
2758 case ' ': /* one extra page */ | |
1820 | 2759 case 'f': |
446 | 2760 case K_PAGEDOWN: |
2761 case K_LEFTMOUSE: | |
3263 | 2762 toscroll = Rows - 1; |
446 | 2763 break; |
2764 | |
447 | 2765 case 'g': /* all the way back to the start */ |
3263 | 2766 toscroll = -999999; |
447 | 2767 break; |
2768 | |
2769 case 'G': /* all the way to the end */ | |
3263 | 2770 toscroll = 999999; |
447 | 2771 lines_left = 999999; |
2772 break; | |
2773 | |
446 | 2774 case ':': /* start new command line */ |
2775 #ifdef FEAT_CON_DIALOG | |
2776 if (!confirm_msg_used) | |
2777 #endif | |
2778 { | |
2779 /* Since got_int is set all typeahead will be flushed, but we | |
2780 * want to keep this ':', remember that in a special way. */ | |
2781 typeahead_noflush(':'); | |
14129
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
2782 #ifdef FEAT_TERMINAL |
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
2783 skip_term_loop = TRUE; |
cb731d098241
patch 8.1.0082: in terminal window, typing : at more prompt, inserts ':'
Christian Brabandt <cb@256bit.org>
parents:
14004
diff
changeset
|
2784 #endif |
446 | 2785 cmdline_row = Rows - 1; /* put ':' on this line */ |
2786 skip_redraw = TRUE; /* skip redraw once */ | |
2787 need_wait_return = FALSE; /* don't wait in main() */ | |
2788 } | |
12674
e769c912fcd9
patch 8.0.1215: newer gcc warns for implicit fallthrough
Christian Brabandt <cb@256bit.org>
parents:
12375
diff
changeset
|
2789 /* FALLTHROUGH */ |
446 | 2790 case 'q': /* quit */ |
2791 case Ctrl_C: | |
2792 case ESC: | |
2793 #ifdef FEAT_CON_DIALOG | |
2794 if (confirm_msg_used) | |
2795 { | |
2796 /* Jump to the choices of the dialog. */ | |
2797 retval = TRUE; | |
2798 } | |
2799 else | |
2800 #endif | |
2801 { | |
2802 got_int = TRUE; | |
2803 quit_more = TRUE; | |
2804 } | |
1829 | 2805 /* When there is some more output (wrapping line) display that |
2806 * without another prompt. */ | |
2807 lines_left = Rows - 1; | |
446 | 2808 break; |
2809 | |
2810 #ifdef FEAT_CLIPBOARD | |
2811 case Ctrl_Y: | |
2812 /* Strange way to allow copying (yanking) a modeless | |
2813 * selection at the more prompt. Use CTRL-Y, | |
2814 * because the same is used in Cmdline-mode and at the | |
2815 * hit-enter prompt. However, scrolling one line up | |
2816 * might be expected... */ | |
2817 if (clip_star.state == SELECT_DONE) | |
2818 clip_copy_modeless_selection(TRUE); | |
2819 continue; | |
2820 #endif | |
2821 default: /* no valid response */ | |
2822 msg_moremsg(TRUE); | |
2823 continue; | |
2824 } | |
2825 | |
3263 | 2826 if (toscroll != 0) |
446 | 2827 { |
3263 | 2828 if (toscroll < 0) |
446 | 2829 { |
2830 /* go to start of last line */ | |
2831 if (mp_last == NULL) | |
2832 mp = msg_sb_start(last_msgchunk); | |
2833 else if (mp_last->sb_prev != NULL) | |
2834 mp = msg_sb_start(mp_last->sb_prev); | |
2835 else | |
2836 mp = NULL; | |
2837 | |
2838 /* go to start of line at top of the screen */ | |
2839 for (i = 0; i < Rows - 2 && mp != NULL && mp->sb_prev != NULL; | |
2840 ++i) | |
2841 mp = msg_sb_start(mp->sb_prev); | |
2842 | |
2843 if (mp != NULL && mp->sb_prev != NULL) | |
2844 { | |
2845 /* Find line to be displayed at top. */ | |
3263 | 2846 for (i = 0; i > toscroll; --i) |
446 | 2847 { |
2848 if (mp == NULL || mp->sb_prev == NULL) | |
2849 break; | |
2850 mp = msg_sb_start(mp->sb_prev); | |
2851 if (mp_last == NULL) | |
2852 mp_last = msg_sb_start(last_msgchunk); | |
2853 else | |
2854 mp_last = msg_sb_start(mp_last->sb_prev); | |
2855 } | |
2856 | |
3263 | 2857 if (toscroll == -1 && screen_ins_lines(0, 0, 1, |
12152
69af108df70e
patch 8.0.0956: scrolling in a terminal window has flicker
Christian Brabandt <cb@256bit.org>
parents:
12015
diff
changeset
|
2858 (int)Rows, 0, NULL) == OK) |
446 | 2859 { |
447 | 2860 /* display line at top */ |
446 | 2861 (void)disp_sb_line(0, mp); |
2862 } | |
2863 else | |
2864 { | |
447 | 2865 /* redisplay all lines */ |
446 | 2866 screenclear(); |
870 | 2867 for (i = 0; mp != NULL && i < Rows - 1; ++i) |
2868 { | |
446 | 2869 mp = disp_sb_line(i, mp); |
870 | 2870 ++msg_scrolled; |
2871 } | |
446 | 2872 } |
3263 | 2873 toscroll = 0; |
446 | 2874 } |
2875 } | |
2876 else | |
2877 { | |
2878 /* First display any text that we scrolled back. */ | |
3263 | 2879 while (toscroll > 0 && mp_last != NULL) |
446 | 2880 { |
2881 /* scroll up, display line at bottom */ | |
2882 msg_scroll_up(); | |
539 | 2883 inc_msg_scrolled(); |
446 | 2884 screen_fill((int)Rows - 2, (int)Rows - 1, 0, |
2885 (int)Columns, ' ', ' ', 0); | |
2886 mp_last = disp_sb_line((int)Rows - 2, mp_last); | |
3263 | 2887 --toscroll; |
446 | 2888 } |
2889 } | |
2890 | |
3263 | 2891 if (toscroll <= 0) |
446 | 2892 { |
2893 /* displayed the requested text, more prompt again */ | |
447 | 2894 screen_fill((int)Rows - 1, (int)Rows, 0, |
2895 (int)Columns, ' ', ' ', 0); | |
446 | 2896 msg_moremsg(FALSE); |
2897 continue; | |
2898 } | |
2899 | |
2900 /* display more text, return to caller */ | |
3263 | 2901 lines_left = toscroll; |
446 | 2902 } |
2903 | |
2904 break; | |
2905 } | |
2906 | |
2907 /* clear the --more-- message */ | |
2908 screen_fill((int)Rows - 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); | |
2909 State = oldState; | |
2910 #ifdef FEAT_MOUSE | |
2911 setmouse(); | |
2912 #endif | |
2913 if (quit_more) | |
2914 { | |
2915 msg_row = Rows - 1; | |
2916 msg_col = 0; | |
2917 } | |
2918 #ifdef FEAT_RIGHTLEFT | |
2919 else if (cmdmsg_rl) | |
2920 msg_col = Columns - 1; | |
2921 #endif | |
2922 | |
8627
7c98c5d0298c
commit https://github.com/vim/vim/commit/bfb96c047b79b2aab5fd57a2472871508819f3ef
Christian Brabandt <cb@256bit.org>
parents:
8289
diff
changeset
|
2923 entered = FALSE; |
446 | 2924 #ifdef FEAT_CON_DIALOG |
2925 return retval; | |
2926 #else | |
2927 return FALSE; | |
2928 #endif | |
2929 } | |
2930 | |
7 | 2931 #if defined(USE_MCH_ERRMSG) || defined(PROTO) |
2932 | |
2933 #ifdef mch_errmsg | |
2934 # undef mch_errmsg | |
2935 #endif | |
2936 #ifdef mch_msg | |
2937 # undef mch_msg | |
2938 #endif | |
2939 | |
2940 /* | |
2941 * Give an error message. To be used when the screen hasn't been initialized | |
2942 * yet. When stderr can't be used, collect error messages until the GUI has | |
2943 * started and they can be displayed in a message box. | |
2944 */ | |
2945 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
2946 mch_errmsg(char *str) |
7 | 2947 { |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
2948 #if defined(MSWIN) && !defined(FEAT_GUI_MSWIN) |
15824
6733b8b1caf3
patch 8.1.0919: compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
15822
diff
changeset
|
2949 int len = (int)STRLEN(str); |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2950 DWORD nwrite = 0; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2951 DWORD mode = 0; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2952 HANDLE h = GetStdHandle(STD_ERROR_HANDLE); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2953 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2954 if (GetConsoleMode(h, &mode) && enc_codepage >= 0 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2955 && (int)GetConsoleCP() != enc_codepage) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2956 { |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2957 WCHAR *w = enc_to_utf16((char_u *)str, &len); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2958 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2959 WriteConsoleW(h, w, len, &nwrite, NULL); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2960 vim_free(w); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2961 } |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2962 else |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2963 { |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2964 fprintf(stderr, "%s", str); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2965 } |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2966 #else |
7 | 2967 int len; |
2968 | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2969 # if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) |
7 | 2970 /* On Unix use stderr if it's a tty. |
2971 * When not going to start the GUI also use stderr. | |
2972 * On Mac, when started from Finder, stderr is the console. */ | |
2973 if ( | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2974 # ifdef UNIX |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2975 # ifdef MACOS_X |
7 | 2976 (isatty(2) && strcmp("/dev/console", ttyname(2)) != 0) |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2977 # else |
7 | 2978 isatty(2) |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2979 # endif |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2980 # ifdef FEAT_GUI |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2981 || |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2982 # endif |
7 | 2983 # endif |
2984 # ifdef FEAT_GUI | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2985 !(gui.in_use || gui.starting) |
7 | 2986 # endif |
2987 ) | |
2988 { | |
2989 fprintf(stderr, "%s", str); | |
2990 return; | |
2991 } | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
2992 # endif |
7 | 2993 |
2994 /* avoid a delay for a message that isn't there */ | |
2995 emsg_on_display = FALSE; | |
2996 | |
2997 len = (int)STRLEN(str) + 1; | |
2998 if (error_ga.ga_growsize == 0) | |
2999 { | |
3000 error_ga.ga_growsize = 80; | |
3001 error_ga.ga_itemsize = 1; | |
3002 } | |
3003 if (ga_grow(&error_ga, len) == OK) | |
3004 { | |
3005 mch_memmove((char_u *)error_ga.ga_data + error_ga.ga_len, | |
3006 (char_u *)str, len); | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3007 # ifdef UNIX |
7 | 3008 /* remove CR characters, they are displayed */ |
3009 { | |
3010 char_u *p; | |
3011 | |
3012 p = (char_u *)error_ga.ga_data + error_ga.ga_len; | |
3013 for (;;) | |
3014 { | |
3015 p = vim_strchr(p, '\r'); | |
3016 if (p == NULL) | |
3017 break; | |
3018 *p = ' '; | |
3019 } | |
3020 } | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3021 # endif |
7 | 3022 --len; /* don't count the NUL at the end */ |
3023 error_ga.ga_len += len; | |
3024 } | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3025 #endif |
7 | 3026 } |
3027 | |
3028 /* | |
3029 * Give a message. To be used when the screen hasn't been initialized yet. | |
3030 * When there is no tty, collect messages until the GUI has started and they | |
3031 * can be displayed in a message box. | |
3032 */ | |
3033 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3034 mch_msg(char *str) |
7 | 3035 { |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
3036 #if defined(MSWIN) && !defined(FEAT_GUI_MSWIN) |
15824
6733b8b1caf3
patch 8.1.0919: compiler warnings
Bram Moolenaar <Bram@vim.org>
parents:
15822
diff
changeset
|
3037 int len = (int)STRLEN(str); |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3038 DWORD nwrite = 0; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3039 DWORD mode; |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3040 HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3041 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3042 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3043 if (GetConsoleMode(h, &mode) && enc_codepage >= 0 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3044 && (int)GetConsoleCP() != enc_codepage) |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3045 { |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3046 WCHAR *w = enc_to_utf16((char_u *)str, &len); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3047 |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3048 WriteConsoleW(h, w, len, &nwrite, NULL); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3049 vim_free(w); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3050 } |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3051 else |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3052 { |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3053 printf("%s", str); |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3054 } |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3055 #else |
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3056 # if (defined(UNIX) || defined(FEAT_GUI)) && !defined(ALWAYS_USE_GUI) |
7 | 3057 /* On Unix use stdout if we have a tty. This allows "vim -h | more" and |
3058 * uses mch_errmsg() when started from the desktop. | |
3059 * When not going to start the GUI also use stdout. | |
3060 * On Mac, when started from Finder, stderr is the console. */ | |
3061 if ( | |
3062 # ifdef UNIX | |
12716
351cf7c67bbe
patch 8.0.1236: Mac features are confusing
Christian Brabandt <cb@256bit.org>
parents:
12674
diff
changeset
|
3063 # ifdef MACOS_X |
7 | 3064 (isatty(2) && strcmp("/dev/console", ttyname(2)) != 0) |
3065 # else | |
3066 isatty(2) | |
3067 # endif | |
3068 # ifdef FEAT_GUI | |
3069 || | |
3070 # endif | |
3071 # endif | |
3072 # ifdef FEAT_GUI | |
3073 !(gui.in_use || gui.starting) | |
3074 # endif | |
3075 ) | |
3076 { | |
3077 printf("%s", str); | |
3078 return; | |
3079 } | |
3080 # endif | |
3081 mch_errmsg(str); | |
15822
9745c25da3bc
patch 8.1.0918: MS-Windows: startup messages are not converted
Bram Moolenaar <Bram@vim.org>
parents:
15607
diff
changeset
|
3082 #endif |
7 | 3083 } |
3084 #endif /* USE_MCH_ERRMSG */ | |
3085 | |
3086 /* | |
3087 * Put a character on the screen at the current message position and advance | |
3088 * to the next position. Only for printable ASCII! | |
3089 */ | |
3090 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3091 msg_screen_putchar(int c, int attr) |
7 | 3092 { |
3093 msg_didout = TRUE; /* remember that line is not empty */ | |
3094 screen_putchar(c, msg_row, msg_col, attr); | |
3095 #ifdef FEAT_RIGHTLEFT | |
3096 if (cmdmsg_rl) | |
3097 { | |
3098 if (--msg_col == 0) | |
3099 { | |
3100 msg_col = Columns; | |
3101 ++msg_row; | |
3102 } | |
3103 } | |
3104 else | |
3105 #endif | |
3106 { | |
3107 if (++msg_col >= Columns) | |
3108 { | |
3109 msg_col = 0; | |
3110 ++msg_row; | |
3111 } | |
3112 } | |
3113 } | |
3114 | |
3115 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3116 msg_moremsg(int full) |
7 | 3117 { |
446 | 3118 int attr; |
3119 char_u *s = (char_u *)_("-- More --"); | |
7 | 3120 |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
3121 attr = HL_ATTR(HLF_M); |
446 | 3122 screen_puts(s, (int)Rows - 1, 0, attr); |
7 | 3123 if (full) |
446 | 3124 screen_puts((char_u *) |
3125 _(" SPACE/d/j: screen/page/line down, b/u/k: up, q: quit "), | |
3126 (int)Rows - 1, vim_strsize(s), attr); | |
7 | 3127 } |
3128 | |
3129 /* | |
3130 * Repeat the message for the current mode: ASKMORE, EXTERNCMD, CONFIRM or | |
3131 * exmode_active. | |
3132 */ | |
3133 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3134 repeat_message(void) |
7 | 3135 { |
3136 if (State == ASKMORE) | |
3137 { | |
3138 msg_moremsg(TRUE); /* display --more-- message again */ | |
3139 msg_row = Rows - 1; | |
3140 } | |
3141 #ifdef FEAT_CON_DIALOG | |
3142 else if (State == CONFIRM) | |
3143 { | |
3144 display_confirm_msg(); /* display ":confirm" message again */ | |
3145 msg_row = Rows - 1; | |
3146 } | |
3147 #endif | |
3148 else if (State == EXTERNCMD) | |
3149 { | |
3150 windgoto(msg_row, msg_col); /* put cursor back */ | |
3151 } | |
3152 else if (State == HITRETURN || State == SETWSIZE) | |
3153 { | |
1445 | 3154 if (msg_row == Rows - 1) |
3155 { | |
3156 /* Avoid drawing the "hit-enter" prompt below the previous one, | |
3157 * overwrite it. Esp. useful when regaining focus and a | |
3158 * FocusGained autocmd exists but didn't draw anything. */ | |
3159 msg_didout = FALSE; | |
3160 msg_col = 0; | |
3161 msg_clr_eos(); | |
3162 } | |
7 | 3163 hit_return_msg(); |
3164 msg_row = Rows - 1; | |
3165 } | |
3166 } | |
3167 | |
3168 /* | |
3169 * msg_check_screen - check if the screen is initialized. | |
3170 * Also check msg_row and msg_col, if they are too big it may cause a crash. | |
3171 * While starting the GUI the terminal codes will be set for the GUI, but the | |
3172 * output goes to the terminal. Don't use the terminal codes then. | |
3173 */ | |
3174 static int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3175 msg_check_screen(void) |
7 | 3176 { |
3177 if (!full_screen || !screen_valid(FALSE)) | |
3178 return FALSE; | |
3179 | |
3180 if (msg_row >= Rows) | |
3181 msg_row = Rows - 1; | |
3182 if (msg_col >= Columns) | |
3183 msg_col = Columns - 1; | |
3184 return TRUE; | |
3185 } | |
3186 | |
3187 /* | |
3188 * Clear from current message position to end of screen. | |
3189 * Skip this when ":silent" was used, no need to clear for redirection. | |
3190 */ | |
3191 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3192 msg_clr_eos(void) |
7 | 3193 { |
3194 if (msg_silent == 0) | |
3195 msg_clr_eos_force(); | |
3196 } | |
3197 | |
3198 /* | |
3199 * Clear from current message position to end of screen. | |
3200 * Note: msg_col is not updated, so we remember the end of the message | |
3201 * for msg_check(). | |
3202 */ | |
3203 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3204 msg_clr_eos_force(void) |
7 | 3205 { |
3206 if (msg_use_printf()) | |
3207 { | |
3208 if (full_screen) /* only when termcap codes are valid */ | |
3209 { | |
3210 if (*T_CD) | |
3211 out_str(T_CD); /* clear to end of display */ | |
3212 else if (*T_CE) | |
3213 out_str(T_CE); /* clear to end of line */ | |
3214 } | |
3215 } | |
3216 else | |
3217 { | |
3218 #ifdef FEAT_RIGHTLEFT | |
3219 if (cmdmsg_rl) | |
3220 { | |
3221 screen_fill(msg_row, msg_row + 1, 0, msg_col + 1, ' ', ' ', 0); | |
3222 screen_fill(msg_row + 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); | |
3223 } | |
3224 else | |
3225 #endif | |
3226 { | |
3227 screen_fill(msg_row, msg_row + 1, msg_col, (int)Columns, | |
3228 ' ', ' ', 0); | |
3229 screen_fill(msg_row + 1, (int)Rows, 0, (int)Columns, ' ', ' ', 0); | |
3230 } | |
3231 } | |
3232 } | |
3233 | |
3234 /* | |
3235 * Clear the command line. | |
3236 */ | |
3237 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3238 msg_clr_cmdline(void) |
7 | 3239 { |
3240 msg_row = cmdline_row; | |
3241 msg_col = 0; | |
3242 msg_clr_eos_force(); | |
3243 } | |
3244 | |
3245 /* | |
3246 * end putting a message on the screen | |
3247 * call wait_return if the message does not fit in the available space | |
3248 * return TRUE if wait_return not called. | |
3249 */ | |
3250 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3251 msg_end(void) |
7 | 3252 { |
3253 /* | |
5245
8c6615a30951
updated for version 7.4a.047
Bram Moolenaar <bram@vim.org>
parents:
4793
diff
changeset
|
3254 * If the string is larger than the window, |
7 | 3255 * or the ruler option is set and we run into it, |
3256 * we have to redraw the window. | |
3257 * Do not do this if we are abandoning the file or editing the command line. | |
3258 */ | |
3259 if (!exiting && need_wait_return && !(State & CMDLINE)) | |
3260 { | |
3261 wait_return(FALSE); | |
3262 return FALSE; | |
3263 } | |
3264 out_flush(); | |
3265 return TRUE; | |
3266 } | |
3267 | |
3268 /* | |
3269 * If the written message runs into the shown command or ruler, we have to | |
3270 * wait for hit-return and redraw the window later. | |
3271 */ | |
3272 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3273 msg_check(void) |
7 | 3274 { |
3275 if (msg_row == Rows - 1 && msg_col >= sc_col) | |
3276 { | |
3277 need_wait_return = TRUE; | |
3278 redraw_cmdline = TRUE; | |
3279 } | |
3280 } | |
3281 | |
3282 /* | |
3283 * May write a string to the redirection file. | |
3284 * When "maxlen" is -1 write the whole string, otherwise up to "maxlen" bytes. | |
3285 */ | |
3286 static void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3287 redir_write(char_u *str, int maxlen) |
7 | 3288 { |
3289 char_u *s = str; | |
3290 static int cur_col = 0; | |
3291 | |
291 | 3292 /* Don't do anything for displaying prompts and the like. */ |
3293 if (redir_off) | |
3294 return; | |
3295 | |
3072 | 3296 /* If 'verbosefile' is set prepare for writing in that file. */ |
3297 if (*p_vfile != NUL && verbose_fd == NULL) | |
3298 verbose_open(); | |
291 | 3299 |
1854 | 3300 if (redirecting()) |
7 | 3301 { |
3302 /* If the string doesn't start with CR or NL, go to msg_col */ | |
3303 if (*s != '\n' && *s != '\r') | |
3304 { | |
3305 while (cur_col < msg_col) | |
3306 { | |
3307 #ifdef FEAT_EVAL | |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3308 if (redir_execute) |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3309 execute_redir_str((char_u *)" ", -1); |
9436
f048e5a27253
commit https://github.com/vim/vim/commit/bc5d6dd1dd1dc3a06e4e655fc9479529db288365
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
3310 else if (redir_reg) |
7 | 3311 write_reg_contents(redir_reg, (char_u *)" ", -1, TRUE); |
167 | 3312 else if (redir_vname) |
3313 var_redir_str((char_u *)" ", -1); | |
3072 | 3314 else |
7 | 3315 #endif |
3072 | 3316 if (redir_fd != NULL) |
7 | 3317 fputs(" ", redir_fd); |
3072 | 3318 if (verbose_fd != NULL) |
3319 fputs(" ", verbose_fd); | |
7 | 3320 ++cur_col; |
3321 } | |
3322 } | |
3323 | |
3324 #ifdef FEAT_EVAL | |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3325 if (redir_execute) |
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3326 execute_redir_str(s, maxlen); |
9436
f048e5a27253
commit https://github.com/vim/vim/commit/bc5d6dd1dd1dc3a06e4e655fc9479529db288365
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
3327 else if (redir_reg) |
7 | 3328 write_reg_contents(redir_reg, s, maxlen, TRUE); |
9436
f048e5a27253
commit https://github.com/vim/vim/commit/bc5d6dd1dd1dc3a06e4e655fc9479529db288365
Christian Brabandt <cb@256bit.org>
parents:
9389
diff
changeset
|
3329 else if (redir_vname) |
167 | 3330 var_redir_str(s, maxlen); |
7 | 3331 #endif |
3332 | |
3072 | 3333 /* Write and adjust the current column. */ |
7 | 3334 while (*s != NUL && (maxlen < 0 || (int)(s - str) < maxlen)) |
3335 { | |
3336 #ifdef FEAT_EVAL | |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3337 if (!redir_reg && !redir_vname && !redir_execute) |
7 | 3338 #endif |
3072 | 3339 if (redir_fd != NULL) |
3340 putc(*s, redir_fd); | |
3341 if (verbose_fd != NULL) | |
3342 putc(*s, verbose_fd); | |
7 | 3343 if (*s == '\r' || *s == '\n') |
3344 cur_col = 0; | |
3345 else if (*s == '\t') | |
3346 cur_col += (8 - cur_col % 8); | |
3347 else | |
3348 ++cur_col; | |
3349 ++s; | |
3350 } | |
3351 | |
3352 if (msg_silent != 0) /* should update msg_col */ | |
3353 msg_col = cur_col; | |
3354 } | |
3355 } | |
3356 | |
1854 | 3357 int |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3358 redirecting(void) |
1854 | 3359 { |
3072 | 3360 return redir_fd != NULL || *p_vfile != NUL |
1854 | 3361 #ifdef FEAT_EVAL |
9454
9da0cb39cbee
commit https://github.com/vim/vim/commit/79815f1ec77406f2f21a618c053e5793b597db7a
Christian Brabandt <cb@256bit.org>
parents:
9436
diff
changeset
|
3362 || redir_reg || redir_vname || redir_execute |
1854 | 3363 #endif |
3364 ; | |
3365 } | |
3366 | |
7 | 3367 /* |
1189 | 3368 * Before giving verbose message. |
291 | 3369 * Must always be called paired with verbose_leave()! |
3370 */ | |
3371 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3372 verbose_enter(void) |
291 | 3373 { |
3374 if (*p_vfile != NUL) | |
3375 ++msg_silent; | |
3376 } | |
3377 | |
3378 /* | |
3379 * After giving verbose message. | |
3380 * Must always be called paired with verbose_enter()! | |
3381 */ | |
3382 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3383 verbose_leave(void) |
291 | 3384 { |
3385 if (*p_vfile != NUL) | |
3386 if (--msg_silent < 0) | |
3387 msg_silent = 0; | |
3388 } | |
3389 | |
3390 /* | |
3391 * Like verbose_enter() and set msg_scroll when displaying the message. | |
3392 */ | |
3393 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3394 verbose_enter_scroll(void) |
291 | 3395 { |
3396 if (*p_vfile != NUL) | |
3397 ++msg_silent; | |
3398 else | |
3399 /* always scroll up, don't overwrite */ | |
3400 msg_scroll = TRUE; | |
3401 } | |
3402 | |
3403 /* | |
3404 * Like verbose_leave() and set cmdline_row when displaying the message. | |
3405 */ | |
3406 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3407 verbose_leave_scroll(void) |
291 | 3408 { |
3409 if (*p_vfile != NUL) | |
3410 { | |
3411 if (--msg_silent < 0) | |
3412 msg_silent = 0; | |
3413 } | |
3414 else | |
3415 cmdline_row = msg_row; | |
3416 } | |
3417 | |
3418 /* | |
3419 * Called when 'verbosefile' is set: stop writing to the file. | |
3420 */ | |
3421 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3422 verbose_stop(void) |
291 | 3423 { |
3424 if (verbose_fd != NULL) | |
3425 { | |
3426 fclose(verbose_fd); | |
3427 verbose_fd = NULL; | |
3428 } | |
3429 verbose_did_open = FALSE; | |
3430 } | |
3431 | |
3432 /* | |
3433 * Open the file 'verbosefile'. | |
3434 * Return FAIL or OK. | |
3435 */ | |
3436 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3437 verbose_open(void) |
291 | 3438 { |
3439 if (verbose_fd == NULL && !verbose_did_open) | |
3440 { | |
3441 /* Only give the error message once. */ | |
3442 verbose_did_open = TRUE; | |
3443 | |
531 | 3444 verbose_fd = mch_fopen((char *)p_vfile, "a"); |
291 | 3445 if (verbose_fd == NULL) |
3446 { | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
3447 semsg(_(e_notopen), p_vfile); |
291 | 3448 return FAIL; |
3449 } | |
3450 } | |
3451 return OK; | |
3452 } | |
3453 | |
3454 /* | |
7 | 3455 * Give a warning message (for searching). |
3456 * Use 'w' highlighting and may repeat the message after redrawing | |
3457 */ | |
3458 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3459 give_warning(char_u *message, int hl) |
7 | 3460 { |
3461 /* Don't do this for ":silent". */ | |
3462 if (msg_silent != 0) | |
3463 return; | |
3464 | |
3465 /* Don't want a hit-enter prompt here. */ | |
3466 ++no_wait_return; | |
8 | 3467 |
7 | 3468 #ifdef FEAT_EVAL |
3469 set_vim_var_string(VV_WARNINGMSG, message, -1); | |
3470 #endif | |
13244
ac42c4b11dbc
patch 8.0.1496: clearing a pointer takes two lines
Christian Brabandt <cb@256bit.org>
parents:
13188
diff
changeset
|
3471 VIM_CLEAR(keep_msg); |
7 | 3472 if (hl) |
11158
501f46f7644c
patch 8.0.0466: still macros that should be all-caps
Christian Brabandt <cb@256bit.org>
parents:
11129
diff
changeset
|
3473 keep_msg_attr = HL_ATTR(HLF_W); |
7 | 3474 else |
3475 keep_msg_attr = 0; | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
3476 if (msg_attr((char *)message, keep_msg_attr) && msg_scrolled == 0) |
678 | 3477 set_keep_msg(message, keep_msg_attr); |
7 | 3478 msg_didout = FALSE; /* overwrite this message */ |
3479 msg_nowait = TRUE; /* don't wait for this message */ | |
3480 msg_col = 0; | |
8 | 3481 |
7 | 3482 --no_wait_return; |
3483 } | |
3484 | |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15551
diff
changeset
|
3485 #if defined(FEAT_EVAL) || defined(PROTO) |
11561
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3486 void |
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3487 give_warning2(char_u *message, char_u *a1, int hl) |
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3488 { |
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3489 vim_snprintf((char *)IObuff, IOSIZE, (char *)message, a1); |
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3490 give_warning(IObuff, hl); |
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3491 } |
15555
d89c5b339c2a
patch 8.1.0785: depending on the configuration some functions are unused
Bram Moolenaar <Bram@vim.org>
parents:
15551
diff
changeset
|
3492 #endif |
11561
7ad79766365a
patch 8.0.0663: unexpected error message only when 'verbose' is set
Christian Brabandt <cb@256bit.org>
parents:
11269
diff
changeset
|
3493 |
7 | 3494 /* |
3495 * Advance msg cursor to column "col". | |
3496 */ | |
3497 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3498 msg_advance(int col) |
7 | 3499 { |
3500 if (msg_silent != 0) /* nothing to advance to */ | |
3501 { | |
3502 msg_col = col; /* for redirection, may fill it up later */ | |
3503 return; | |
3504 } | |
3505 if (col >= Columns) /* not enough room */ | |
3506 col = Columns - 1; | |
474 | 3507 #ifdef FEAT_RIGHTLEFT |
3508 if (cmdmsg_rl) | |
3509 while (msg_col > Columns - col) | |
3510 msg_putchar(' '); | |
3511 else | |
3512 #endif | |
3513 while (msg_col < col) | |
3514 msg_putchar(' '); | |
7 | 3515 } |
3516 | |
3517 #if defined(FEAT_CON_DIALOG) || defined(PROTO) | |
3518 /* | |
3519 * Used for "confirm()" function, and the :confirm command prefix. | |
3520 * Versions which haven't got flexible dialogs yet, and console | |
3521 * versions, get this generic handler which uses the command line. | |
3522 * | |
3523 * type = one of: | |
3524 * VIM_QUESTION, VIM_INFO, VIM_WARNING, VIM_ERROR or VIM_GENERIC | |
3525 * title = title string (can be NULL for default) | |
3526 * (neither used in console dialogs at the moment) | |
3527 * | |
3528 * Format of the "buttons" string: | |
3529 * "Button1Name\nButton2Name\nButton3Name" | |
3530 * The first button should normally be the default/accept | |
3531 * The second button should be the 'Cancel' button | |
3532 * Other buttons- use your imagination! | |
3533 * A '&' in a button name becomes a shortcut, so each '&' should be before a | |
3534 * different letter. | |
3535 */ | |
3536 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3537 do_dialog( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3538 int type UNUSED, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3539 char_u *title UNUSED, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3540 char_u *message, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3541 char_u *buttons, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3542 int dfltbutton, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3543 char_u *textfield UNUSED, /* IObuff for inputdialog(), NULL |
1883 | 3544 otherwise */ |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3545 int ex_cmd) /* when TRUE pressing : accepts default and starts |
2684 | 3546 Ex command */ |
7 | 3547 { |
3548 int oldState; | |
3549 int retval = 0; | |
3550 char_u *hotkeys; | |
3551 int c; | |
3552 int i; | |
3553 | |
3554 #ifndef NO_CONSOLE | |
3555 /* Don't output anything in silent mode ("ex -s") */ | |
3556 if (silent_mode) | |
3557 return dfltbutton; /* return default option */ | |
3558 #endif | |
3559 | |
3560 #ifdef FEAT_GUI_DIALOG | |
3561 /* When GUI is running and 'c' not in 'guioptions', use the GUI dialog */ | |
3562 if (gui.in_use && vim_strchr(p_go, GO_CONDIALOG) == NULL) | |
3563 { | |
3564 c = gui_mch_dialog(type, title, message, buttons, dfltbutton, | |
2684 | 3565 textfield, ex_cmd); |
1809 | 3566 /* avoid a hit-enter prompt without clearing the cmdline */ |
3567 need_wait_return = FALSE; | |
3568 emsg_on_display = FALSE; | |
3569 cmdline_row = msg_row; | |
7 | 3570 |
3571 /* Flush output to avoid that further messages and redrawing is done | |
3572 * in the wrong order. */ | |
3573 out_flush(); | |
3574 gui_mch_update(); | |
3575 | |
3576 return c; | |
3577 } | |
3578 #endif | |
3579 | |
3580 oldState = State; | |
3581 State = CONFIRM; | |
3582 #ifdef FEAT_MOUSE | |
3583 setmouse(); | |
3584 #endif | |
3585 | |
3586 /* | |
3587 * Since we wait for a keypress, don't make the | |
3588 * user press RETURN as well afterwards. | |
3589 */ | |
3590 ++no_wait_return; | |
3591 hotkeys = msg_show_console_dialog(message, buttons, dfltbutton); | |
3592 | |
3593 if (hotkeys != NULL) | |
3594 { | |
3595 for (;;) | |
3596 { | |
3597 /* Get a typed character directly from the user. */ | |
3598 c = get_keystroke(); | |
3599 switch (c) | |
3600 { | |
3601 case CAR: /* User accepts default option */ | |
3602 case NL: | |
3603 retval = dfltbutton; | |
3604 break; | |
3605 case Ctrl_C: /* User aborts/cancels */ | |
3606 case ESC: | |
3607 retval = 0; | |
3608 break; | |
3609 default: /* Could be a hotkey? */ | |
3610 if (c < 0) /* special keys are ignored here */ | |
3611 continue; | |
2684 | 3612 if (c == ':' && ex_cmd) |
3613 { | |
3614 retval = dfltbutton; | |
3615 ins_char_typebuf(':'); | |
3616 break; | |
3617 } | |
3618 | |
7 | 3619 /* Make the character lowercase, as chars in "hotkeys" are. */ |
3620 c = MB_TOLOWER(c); | |
3621 retval = 1; | |
3622 for (i = 0; hotkeys[i]; ++i) | |
3623 { | |
3624 if (has_mbyte) | |
3625 { | |
3626 if ((*mb_ptr2char)(hotkeys + i) == c) | |
3627 break; | |
474 | 3628 i += (*mb_ptr2len)(hotkeys + i) - 1; |
7 | 3629 } |
3630 else | |
3631 if (hotkeys[i] == c) | |
3632 break; | |
3633 ++retval; | |
3634 } | |
3635 if (hotkeys[i]) | |
3636 break; | |
3637 /* No hotkey match, so keep waiting */ | |
3638 continue; | |
3639 } | |
3640 break; | |
3641 } | |
3642 | |
3643 vim_free(hotkeys); | |
3644 } | |
3645 | |
3646 State = oldState; | |
3647 #ifdef FEAT_MOUSE | |
3648 setmouse(); | |
3649 #endif | |
3650 --no_wait_return; | |
3651 msg_end_prompt(); | |
3652 | |
3653 return retval; | |
3654 } | |
3655 | |
3656 /* | |
3657 * Copy one character from "*from" to "*to", taking care of multi-byte | |
3658 * characters. Return the length of the character in bytes. | |
3659 */ | |
3660 static int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3661 copy_char( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3662 char_u *from, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3663 char_u *to, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3664 int lowercase) /* make character lower case */ |
7 | 3665 { |
3666 int len; | |
3667 int c; | |
3668 | |
3669 if (has_mbyte) | |
3670 { | |
3671 if (lowercase) | |
3672 { | |
3673 c = MB_TOLOWER((*mb_ptr2char)(from)); | |
3674 return (*mb_char2bytes)(c, to); | |
3675 } | |
3676 else | |
3677 { | |
474 | 3678 len = (*mb_ptr2len)(from); |
7 | 3679 mch_memmove(to, from, (size_t)len); |
3680 return len; | |
3681 } | |
3682 } | |
3683 else | |
3684 { | |
3685 if (lowercase) | |
3686 *to = (char_u)TOLOWER_LOC(*from); | |
3687 else | |
3688 *to = *from; | |
3689 return 1; | |
3690 } | |
3691 } | |
3692 | |
3693 /* | |
3694 * Format the dialog string, and display it at the bottom of | |
3695 * the screen. Return a string of hotkey chars (if defined) for | |
3696 * each 'button'. If a button has no hotkey defined, the first character of | |
3697 * the button is used. | |
3698 * The hotkeys can be multi-byte characters, but without combining chars. | |
3699 * | |
3700 * Returns an allocated string with hotkeys, or NULL for error. | |
3701 */ | |
3702 static char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3703 msg_show_console_dialog( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3704 char_u *message, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3705 char_u *buttons, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3706 int dfltbutton) |
7 | 3707 { |
3708 int len = 0; | |
15597
536dd2bc5ac9
patch 8.1.0806: too many #ifdefs
Bram Moolenaar <Bram@vim.org>
parents:
15555
diff
changeset
|
3709 #define HOTK_LEN (has_mbyte ? MB_MAXBYTES : 1) |
7 | 3710 int lenhotkey = HOTK_LEN; /* count first button */ |
3711 char_u *hotk = NULL; | |
3712 char_u *msgp = NULL; | |
3713 char_u *hotkp = NULL; | |
3714 char_u *r; | |
3715 int copy; | |
3716 #define HAS_HOTKEY_LEN 30 | |
3717 char_u has_hotkey[HAS_HOTKEY_LEN]; | |
3718 int first_hotkey = FALSE; /* first char of button is hotkey */ | |
3719 int idx; | |
3720 | |
3721 has_hotkey[0] = FALSE; | |
3722 | |
3723 /* | |
3724 * First loop: compute the size of memory to allocate. | |
3725 * Second loop: copy to the allocated memory. | |
3726 */ | |
3727 for (copy = 0; copy <= 1; ++copy) | |
3728 { | |
3729 r = buttons; | |
3730 idx = 0; | |
3731 while (*r) | |
3732 { | |
3733 if (*r == DLG_BUTTON_SEP) | |
3734 { | |
3735 if (copy) | |
3736 { | |
3737 *msgp++ = ','; | |
3738 *msgp++ = ' '; /* '\n' -> ', ' */ | |
3739 | |
3740 /* advance to next hotkey and set default hotkey */ | |
3741 if (has_mbyte) | |
1306 | 3742 hotkp += STRLEN(hotkp); |
7 | 3743 else |
3744 ++hotkp; | |
1306 | 3745 hotkp[copy_char(r + 1, hotkp, TRUE)] = NUL; |
7 | 3746 if (dfltbutton) |
3747 --dfltbutton; | |
3748 | |
3749 /* If no hotkey is specified first char is used. */ | |
3750 if (idx < HAS_HOTKEY_LEN - 1 && !has_hotkey[++idx]) | |
3751 first_hotkey = TRUE; | |
3752 } | |
3753 else | |
3754 { | |
3755 len += 3; /* '\n' -> ', '; 'x' -> '(x)' */ | |
3756 lenhotkey += HOTK_LEN; /* each button needs a hotkey */ | |
3757 if (idx < HAS_HOTKEY_LEN - 1) | |
3758 has_hotkey[++idx] = FALSE; | |
3759 } | |
3760 } | |
3761 else if (*r == DLG_HOTKEY_CHAR || first_hotkey) | |
3762 { | |
3763 if (*r == DLG_HOTKEY_CHAR) | |
3764 ++r; | |
3765 first_hotkey = FALSE; | |
3766 if (copy) | |
3767 { | |
3768 if (*r == DLG_HOTKEY_CHAR) /* '&&a' -> '&a' */ | |
3769 *msgp++ = *r; | |
3770 else | |
3771 { | |
3772 /* '&a' -> '[a]' */ | |
3773 *msgp++ = (dfltbutton == 1) ? '[' : '('; | |
3774 msgp += copy_char(r, msgp, FALSE); | |
3775 *msgp++ = (dfltbutton == 1) ? ']' : ')'; | |
3776 | |
3777 /* redefine hotkey */ | |
1306 | 3778 hotkp[copy_char(r, hotkp, TRUE)] = NUL; |
7 | 3779 } |
3780 } | |
3781 else | |
3782 { | |
3783 ++len; /* '&a' -> '[a]' */ | |
3784 if (idx < HAS_HOTKEY_LEN - 1) | |
3785 has_hotkey[idx] = TRUE; | |
3786 } | |
3787 } | |
3788 else | |
3789 { | |
3790 /* everything else copy literally */ | |
3791 if (copy) | |
3792 msgp += copy_char(r, msgp, FALSE); | |
3793 } | |
3794 | |
3795 /* advance to the next character */ | |
11127
506f5d8b7d8b
patch 8.0.0451: some macros are in lower case
Christian Brabandt <cb@256bit.org>
parents:
11016
diff
changeset
|
3796 MB_PTR_ADV(r); |
7 | 3797 } |
3798 | |
3799 if (copy) | |
3800 { | |
3801 *msgp++ = ':'; | |
3802 *msgp++ = ' '; | |
3803 *msgp = NUL; | |
3804 } | |
3805 else | |
3806 { | |
835 | 3807 len += (int)(STRLEN(message) |
856 | 3808 + 2 /* for the NL's */ |
3809 + STRLEN(buttons) | |
3810 + 3); /* for the ": " and NUL */ | |
835 | 3811 lenhotkey++; /* for the NUL */ |
7 | 3812 |
3813 /* If no hotkey is specified first char is used. */ | |
3814 if (!has_hotkey[0]) | |
3815 { | |
3816 first_hotkey = TRUE; | |
3817 len += 2; /* "x" -> "[x]" */ | |
3818 } | |
3819 | |
3820 /* | |
3821 * Now allocate and load the strings | |
3822 */ | |
3823 vim_free(confirm_msg); | |
3824 confirm_msg = alloc(len); | |
3825 if (confirm_msg == NULL) | |
3826 return NULL; | |
3827 *confirm_msg = NUL; | |
3828 hotk = alloc(lenhotkey); | |
3829 if (hotk == NULL) | |
3830 return NULL; | |
3831 | |
3832 *confirm_msg = '\n'; | |
3833 STRCPY(confirm_msg + 1, message); | |
3834 | |
3835 msgp = confirm_msg + 1 + STRLEN(message); | |
3836 hotkp = hotk; | |
3837 | |
1306 | 3838 /* Define first default hotkey. Keep the hotkey string NUL |
3839 * terminated to avoid reading past the end. */ | |
3840 hotkp[copy_char(buttons, hotkp, TRUE)] = NUL; | |
7 | 3841 |
3842 /* Remember where the choices start, displaying starts here when | |
3843 * "hotkp" typed at the more prompt. */ | |
3844 confirm_msg_tail = msgp; | |
3845 *msgp++ = '\n'; | |
3846 } | |
3847 } | |
3848 | |
3849 display_confirm_msg(); | |
3850 return hotk; | |
3851 } | |
3852 | |
3853 /* | |
3854 * Display the ":confirm" message. Also called when screen resized. | |
3855 */ | |
3856 void | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3857 display_confirm_msg(void) |
7 | 3858 { |
3859 /* avoid that 'q' at the more prompt truncates the message here */ | |
3860 ++confirm_msg_used; | |
3861 if (confirm_msg != NULL) | |
15543
dd725a8ab112
patch 8.1.0779: argument for message functions is inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15502
diff
changeset
|
3862 msg_puts_attr((char *)confirm_msg, HL_ATTR(HLF_M)); |
7 | 3863 --confirm_msg_used; |
3864 } | |
3865 | |
3866 #endif /* FEAT_CON_DIALOG */ | |
3867 | |
3868 #if defined(FEAT_CON_DIALOG) || defined(FEAT_GUI_DIALOG) | |
3869 | |
3870 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3871 vim_dialog_yesno( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3872 int type, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3873 char_u *title, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3874 char_u *message, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3875 int dflt) |
7 | 3876 { |
3877 if (do_dialog(type, | |
3878 title == NULL ? (char_u *)_("Question") : title, | |
3879 message, | |
2684 | 3880 (char_u *)_("&Yes\n&No"), dflt, NULL, FALSE) == 1) |
7 | 3881 return VIM_YES; |
3882 return VIM_NO; | |
3883 } | |
3884 | |
3885 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3886 vim_dialog_yesnocancel( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3887 int type, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3888 char_u *title, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3889 char_u *message, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3890 int dflt) |
7 | 3891 { |
3892 switch (do_dialog(type, | |
3893 title == NULL ? (char_u *)_("Question") : title, | |
3894 message, | |
2684 | 3895 (char_u *)_("&Yes\n&No\n&Cancel"), dflt, NULL, FALSE)) |
7 | 3896 { |
3897 case 1: return VIM_YES; | |
3898 case 2: return VIM_NO; | |
3899 } | |
3900 return VIM_CANCEL; | |
3901 } | |
3902 | |
3903 int | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3904 vim_dialog_yesnoallcancel( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3905 int type, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3906 char_u *title, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3907 char_u *message, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3908 int dflt) |
7 | 3909 { |
3910 switch (do_dialog(type, | |
3911 title == NULL ? (char_u *)"Question" : title, | |
3912 message, | |
3913 (char_u *)_("&Yes\n&No\nSave &All\n&Discard All\n&Cancel"), | |
2684 | 3914 dflt, NULL, FALSE)) |
7 | 3915 { |
3916 case 1: return VIM_YES; | |
3917 case 2: return VIM_NO; | |
3918 case 3: return VIM_ALL; | |
3919 case 4: return VIM_DISCARDALL; | |
3920 } | |
3921 return VIM_CANCEL; | |
3922 } | |
3923 | |
3924 #endif /* FEAT_GUI_DIALOG || FEAT_CON_DIALOG */ | |
3925 | |
3926 #if defined(FEAT_BROWSE) || defined(PROTO) | |
3927 /* | |
3928 * Generic browse function. Calls gui_mch_browse() when possible. | |
3929 * Later this may pop-up a non-GUI file selector (external command?). | |
3930 */ | |
3931 char_u * | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3932 do_browse( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3933 int flags, /* BROWSE_SAVE and BROWSE_DIR */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3934 char_u *title, /* title for the window */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3935 char_u *dflt, /* default file name (may include directory) */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3936 char_u *ext, /* extension added */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3937 char_u *initdir, /* initial directory, NULL for current dir or |
7 | 3938 when using path from "dflt" */ |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3939 char_u *filter, /* file name filter */ |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
3940 buf_T *buf) /* buffer to read/write for */ |
7 | 3941 { |
3942 char_u *fname; | |
3943 static char_u *last_dir = NULL; /* last used directory */ | |
3944 char_u *tofree = NULL; | |
3945 int save_browse = cmdmod.browse; | |
3946 | |
3947 /* Must turn off browse to avoid that autocommands will get the | |
3948 * flag too! */ | |
3949 cmdmod.browse = FALSE; | |
3950 | |
28 | 3951 if (title == NULL || *title == NUL) |
7 | 3952 { |
28 | 3953 if (flags & BROWSE_DIR) |
3954 title = (char_u *)_("Select Directory dialog"); | |
3955 else if (flags & BROWSE_SAVE) | |
7 | 3956 title = (char_u *)_("Save File dialog"); |
3957 else | |
3958 title = (char_u *)_("Open File dialog"); | |
3959 } | |
3960 | |
3961 /* When no directory specified, use default file name, default dir, buffer | |
3962 * dir, last dir or current dir */ | |
3963 if ((initdir == NULL || *initdir == NUL) && dflt != NULL && *dflt != NUL) | |
3964 { | |
3965 if (mch_isdir(dflt)) /* default file name is a directory */ | |
3966 { | |
3967 initdir = dflt; | |
3968 dflt = NULL; | |
3969 } | |
3970 else if (gettail(dflt) != dflt) /* default file name includes a path */ | |
3971 { | |
3972 tofree = vim_strsave(dflt); | |
3973 if (tofree != NULL) | |
3974 { | |
3975 initdir = tofree; | |
3976 *gettail(initdir) = NUL; | |
3977 dflt = gettail(dflt); | |
3978 } | |
3979 } | |
3980 } | |
3981 | |
3982 if (initdir == NULL || *initdir == NUL) | |
3983 { | |
3984 /* When 'browsedir' is a directory, use it */ | |
28 | 3985 if (STRCMP(p_bsdir, "last") != 0 |
3986 && STRCMP(p_bsdir, "buffer") != 0 | |
3987 && STRCMP(p_bsdir, "current") != 0 | |
3988 && mch_isdir(p_bsdir)) | |
7 | 3989 initdir = p_bsdir; |
3990 /* When saving or 'browsedir' is "buffer", use buffer fname */ | |
28 | 3991 else if (((flags & BROWSE_SAVE) || *p_bsdir == 'b') |
7 | 3992 && buf != NULL && buf->b_ffname != NULL) |
3993 { | |
3994 if (dflt == NULL || *dflt == NUL) | |
3995 dflt = gettail(curbuf->b_ffname); | |
3996 tofree = vim_strsave(curbuf->b_ffname); | |
3997 if (tofree != NULL) | |
3998 { | |
3999 initdir = tofree; | |
4000 *gettail(initdir) = NUL; | |
4001 } | |
4002 } | |
4003 /* When 'browsedir' is "last", use dir from last browse */ | |
4004 else if (*p_bsdir == 'l') | |
4005 initdir = last_dir; | |
4006 /* When 'browsedir is "current", use current directory. This is the | |
4007 * default already, leave initdir empty. */ | |
4008 } | |
4009 | |
4010 # ifdef FEAT_GUI | |
4011 if (gui.in_use) /* when this changes, also adjust f_has()! */ | |
4012 { | |
4013 if (filter == NULL | |
4014 # ifdef FEAT_EVAL | |
4015 && (filter = get_var_value((char_u *)"b:browsefilter")) == NULL | |
4016 && (filter = get_var_value((char_u *)"g:browsefilter")) == NULL | |
4017 # endif | |
4018 ) | |
4019 filter = BROWSE_FILTER_DEFAULT; | |
28 | 4020 if (flags & BROWSE_DIR) |
4021 { | |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
4022 # if defined(FEAT_GUI_GTK) || defined(MSWIN) |
28 | 4023 /* For systems that have a directory dialog. */ |
4024 fname = gui_mch_browsedir(title, initdir); | |
4025 # else | |
4026 /* Generic solution for selecting a directory: select a file and | |
4027 * remove the file name. */ | |
4028 fname = gui_mch_browse(0, title, dflt, ext, initdir, (char_u *)""); | |
4029 # endif | |
2277
f42e0b5ff9e9
Change remaining HAVE_GTK2 to FEAT_GUI_GTK.
Bram Moolenaar <bram@vim.org>
parents:
1924
diff
changeset
|
4030 # if !defined(FEAT_GUI_GTK) |
28 | 4031 /* Win32 adds a dummy file name, others return an arbitrary file |
4032 * name. GTK+ 2 returns only the directory, */ | |
4033 if (fname != NULL && *fname != NUL && !mch_isdir(fname)) | |
4034 { | |
4035 /* Remove the file name. */ | |
39 | 4036 char_u *tail = gettail_sep(fname); |
28 | 4037 |
4038 if (tail == fname) | |
4039 *tail++ = '.'; /* use current dir */ | |
4040 *tail = NUL; | |
4041 } | |
4042 # endif | |
4043 } | |
4044 else | |
4045 fname = gui_mch_browse(flags & BROWSE_SAVE, | |
13802
378f9f8e6d8f
patch 8.0.1773: dialog messages are not translated
Christian Brabandt <cb@256bit.org>
parents:
13712
diff
changeset
|
4046 title, dflt, ext, initdir, (char_u *)_(filter)); |
7 | 4047 |
4048 /* We hang around in the dialog for a while, the user might do some | |
4049 * things to our files. The Win32 dialog allows deleting or renaming | |
4050 * a file, check timestamps. */ | |
4051 need_check_timestamps = TRUE; | |
4052 did_check_timestamps = FALSE; | |
4053 } | |
4054 else | |
4055 # endif | |
4056 { | |
4057 /* TODO: non-GUI file selector here */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4058 emsg(_("E338: Sorry, no file browser in console mode")); |
7 | 4059 fname = NULL; |
4060 } | |
4061 | |
4062 /* keep the directory for next time */ | |
4063 if (fname != NULL) | |
4064 { | |
4065 vim_free(last_dir); | |
4066 last_dir = vim_strsave(fname); | |
28 | 4067 if (last_dir != NULL && !(flags & BROWSE_DIR)) |
7 | 4068 { |
4069 *gettail(last_dir) = NUL; | |
4070 if (*last_dir == NUL) | |
4071 { | |
4072 /* filename only returned, must be in current dir */ | |
4073 vim_free(last_dir); | |
4074 last_dir = alloc(MAXPATHL); | |
4075 if (last_dir != NULL) | |
4076 mch_dirname(last_dir, MAXPATHL); | |
4077 } | |
4078 } | |
4079 } | |
4080 | |
4081 vim_free(tofree); | |
4082 cmdmod.browse = save_browse; | |
4083 | |
4084 return fname; | |
4085 } | |
4086 #endif | |
272 | 4087 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4088 #if defined(FEAT_EVAL) |
449 | 4089 static char *e_printf = N_("E766: Insufficient arguments for printf()"); |
4090 | |
4091 /* | |
4092 * Get number argument from "idxp" entry in "tvs". First entry is 1. | |
4093 */ | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4094 static varnumber_T |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4095 tv_nr(typval_T *tvs, int *idxp) |
449 | 4096 { |
4097 int idx = *idxp - 1; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4098 varnumber_T n = 0; |
449 | 4099 int err = FALSE; |
4100 | |
4101 if (tvs[idx].v_type == VAR_UNKNOWN) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4102 emsg(_(e_printf)); |
449 | 4103 else |
4104 { | |
4105 ++*idxp; | |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
15079
diff
changeset
|
4106 n = tv_get_number_chk(&tvs[idx], &err); |
449 | 4107 if (err) |
4108 n = 0; | |
4109 } | |
4110 return n; | |
4111 } | |
4112 | |
4113 /* | |
4114 * Get string argument from "idxp" entry in "tvs". First entry is 1. | |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
15079
diff
changeset
|
4115 * If "tofree" is NULL tv_get_string_chk() is used. Some types (e.g. List) |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4116 * are not converted to a string. |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4117 * If "tofree" is not NULL echo_string() is used. All types are converted to |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4118 * a string with the same format as ":echo". The caller must free "*tofree". |
532 | 4119 * Returns NULL for an error. |
449 | 4120 */ |
4121 static char * | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4122 tv_str(typval_T *tvs, int *idxp, char_u **tofree) |
449 | 4123 { |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4124 int idx = *idxp - 1; |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4125 char *s = NULL; |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4126 static char_u numbuf[NUMBUFLEN]; |
449 | 4127 |
4128 if (tvs[idx].v_type == VAR_UNKNOWN) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4129 emsg(_(e_printf)); |
449 | 4130 else |
4131 { | |
4132 ++*idxp; | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4133 if (tofree != NULL) |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4134 s = (char *)echo_string(&tvs[idx], tofree, numbuf, get_copyID()); |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4135 else |
15211
de63593896b3
patch 8.1.0615: get_tv function names are not consistent
Bram Moolenaar <Bram@vim.org>
parents:
15079
diff
changeset
|
4136 s = (char *)tv_get_string_chk(&tvs[idx]); |
449 | 4137 } |
4138 return s; | |
4139 } | |
1619 | 4140 |
4141 # ifdef FEAT_FLOAT | |
4142 /* | |
4143 * Get float argument from "idxp" entry in "tvs". First entry is 1. | |
4144 */ | |
4145 static double | |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4146 tv_float(typval_T *tvs, int *idxp) |
1619 | 4147 { |
4148 int idx = *idxp - 1; | |
4149 double f = 0; | |
4150 | |
4151 if (tvs[idx].v_type == VAR_UNKNOWN) | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4152 emsg(_(e_printf)); |
1619 | 4153 else |
4154 { | |
4155 ++*idxp; | |
4156 if (tvs[idx].v_type == VAR_FLOAT) | |
4157 f = tvs[idx].vval.v_float; | |
1656 | 4158 else if (tvs[idx].v_type == VAR_NUMBER) |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4159 f = (double)tvs[idx].vval.v_number; |
1619 | 4160 else |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4161 emsg(_("E807: Expected Float argument for printf()")); |
1619 | 4162 } |
4163 return f; | |
4164 } | |
4165 # endif | |
449 | 4166 #endif |
4167 | |
10036
ab6320d74331
commit https://github.com/vim/vim/commit/7f7bd297d6d989254f71c694f1c72d07cbc5c306
Christian Brabandt <cb@256bit.org>
parents:
10015
diff
changeset
|
4168 #ifdef FEAT_FLOAT |
272 | 4169 /* |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4170 * Return the representation of infinity for printf() function: |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4171 * "-inf", "inf", "+inf", " inf", "-INF", "INF", "+INF" or " INF". |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4172 */ |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4173 static const char * |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4174 infinity_str(int positive, |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4175 char fmt_spec, |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4176 int force_sign, |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4177 int space_for_positive) |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4178 { |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4179 static const char *table[] = |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4180 { |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4181 "-inf", "inf", "+inf", " inf", |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4182 "-INF", "INF", "+INF", " INF" |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4183 }; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4184 int idx = positive * (1 + force_sign + force_sign * space_for_positive); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4185 |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4186 if (ASCII_ISUPPER(fmt_spec)) |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4187 idx += 4; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4188 return table[idx]; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4189 } |
10036
ab6320d74331
commit https://github.com/vim/vim/commit/7f7bd297d6d989254f71c694f1c72d07cbc5c306
Christian Brabandt <cb@256bit.org>
parents:
10015
diff
changeset
|
4190 #endif |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4191 |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4192 /* |
272 | 4193 * This code was included to provide a portable vsnprintf() and snprintf(). |
715 | 4194 * Some systems may provide their own, but we always use this one for |
272 | 4195 * consistency. |
4196 * | |
4197 * This code is based on snprintf.c - a portable implementation of snprintf | |
4198 * by Mark Martinec <mark.martinec@ijs.si>, Version 2.2, 2000-10-06. | |
1189 | 4199 * Included with permission. It was heavily modified to fit in Vim. |
272 | 4200 * The original code, including useful comments, can be found here: |
4201 * http://www.ijs.si/software/snprintf/ | |
4202 * | |
4203 * This snprintf() only supports the following conversion specifiers: | |
4204 * s, c, d, u, o, x, X, p (and synonyms: i, D, U, O - see below) | |
4205 * with flags: '-', '+', ' ', '0' and '#'. | |
4206 * An asterisk is supported for field width as well as precision. | |
4207 * | |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4208 * Limited support for floating point was added: 'f', 'F', 'e', 'E', 'g', 'G'. |
1619 | 4209 * |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4210 * Length modifiers 'h' (short int) and 'l' (long int) and 'll' (long long int) |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4211 * are supported. |
272 | 4212 * |
437 | 4213 * The locale is not used, the string is used as a byte string. This is only |
4214 * relevant for double-byte encodings where the second byte may be '%'. | |
4215 * | |
715 | 4216 * It is permitted for "str_m" to be zero, and it is permitted to specify NULL |
4217 * pointer for resulting string argument if "str_m" is zero (as per ISO C99). | |
272 | 4218 * |
4219 * The return value is the number of characters which would be generated | |
6448 | 4220 * for the given input, excluding the trailing NUL. If this value |
715 | 4221 * is greater or equal to "str_m", not all characters from the result |
4222 * have been stored in str, output bytes beyond the ("str_m"-1) -th character | |
4223 * are discarded. If "str_m" is greater than zero it is guaranteed | |
6448 | 4224 * the resulting string will be NUL-terminated. |
272 | 4225 */ |
4226 | |
4227 /* | |
4228 * When va_list is not supported we only define vim_snprintf(). | |
449 | 4229 * |
11653
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4230 * vim_vsnprintf_typval() can be invoked with either "va_list" or a list of |
482 | 4231 * "typval_T". When the latter is not used it must be NULL. |
272 | 4232 */ |
4233 | |
4234 /* When generating prototypes all of this is skipped, cproto doesn't | |
4235 * understand this. */ | |
4236 #ifndef PROTO | |
2280
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4237 |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4238 /* Like vim_vsnprintf() but append to the string. */ |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4239 int |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4240 vim_snprintf_add(char *str, size_t str_m, const char *fmt, ...) |
2280
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4241 { |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4242 va_list ap; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4243 int str_l; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4244 size_t len = STRLEN(str); |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4245 size_t space; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4246 |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4247 if (str_m <= len) |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4248 space = 0; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4249 else |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4250 space = str_m - len; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4251 va_start(ap, fmt); |
11653
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4252 str_l = vim_vsnprintf(str + len, space, fmt, ap); |
2280
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4253 va_end(ap); |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4254 return str_l; |
941ff1cd317a
Add file save counter to undo information. Add undotree() function.
Bram Moolenaar <bram@vim.org>
parents:
2277
diff
changeset
|
4255 } |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4256 |
272 | 4257 int |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4258 vim_snprintf(char *str, size_t str_m, const char *fmt, ...) |
272 | 4259 { |
4260 va_list ap; | |
4261 int str_l; | |
4262 | |
4263 va_start(ap, fmt); | |
11653
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4264 str_l = vim_vsnprintf(str, str_m, fmt, ap); |
272 | 4265 va_end(ap); |
4266 return str_l; | |
4267 } | |
4268 | |
449 | 4269 int |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4270 vim_vsnprintf( |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4271 char *str, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4272 size_t str_m, |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4273 const char *fmt, |
11653
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4274 va_list ap) |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4275 { |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4276 return vim_vsnprintf_typval(str, str_m, fmt, ap, NULL); |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4277 } |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4278 |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4279 int |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4280 vim_vsnprintf_typval( |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4281 char *str, |
67cf0d45b006
patch 8.0.0709: libvterm cannot use vsnprintf()
Christian Brabandt <cb@256bit.org>
parents:
11561
diff
changeset
|
4282 size_t str_m, |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4283 const char *fmt, |
7827
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4284 va_list ap, |
41789f16d6b2
commit https://github.com/vim/vim/commit/52ea13da0fe86df1abf34de52841e367035170c0
Christian Brabandt <cb@256bit.org>
parents:
7803
diff
changeset
|
4285 typval_T *tvs) |
272 | 4286 { |
4287 size_t str_l = 0; | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4288 const char *p = fmt; |
272 | 4289 int arg_idx = 1; |
4290 | |
4291 if (p == NULL) | |
4292 p = ""; | |
4293 while (*p != NUL) | |
4294 { | |
4295 if (*p != '%') | |
4296 { | |
4297 char *q = strchr(p + 1, '%'); | |
1883 | 4298 size_t n = (q == NULL) ? STRLEN(p) : (size_t)(q - p); |
272 | 4299 |
437 | 4300 /* Copy up to the next '%' or NUL without any changes. */ |
272 | 4301 if (str_l < str_m) |
4302 { | |
4303 size_t avail = str_m - str_l; | |
4304 | |
4305 mch_memmove(str + str_l, p, n > avail ? avail : n); | |
4306 } | |
4307 p += n; | |
4308 str_l += n; | |
4309 } | |
4310 else | |
4311 { | |
4312 size_t min_field_width = 0, precision = 0; | |
4313 int zero_padding = 0, precision_specified = 0, justify_left = 0; | |
4314 int alternate_form = 0, force_sign = 0; | |
4315 | |
4316 /* If both the ' ' and '+' flags appear, the ' ' flag should be | |
4317 * ignored. */ | |
4318 int space_for_positive = 1; | |
4319 | |
4320 /* allowed values: \0, h, l, L */ | |
4321 char length_modifier = '\0'; | |
4322 | |
4323 /* temporary buffer for simple numeric->string conversion */ | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4324 # if defined(FEAT_FLOAT) |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4325 # define TMP_LEN 350 /* On my system 1e308 is the biggest number possible. |
1619 | 4326 * That sounds reasonable to use as the maximum |
4327 * printable. */ | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4328 # elif defined(FEAT_NUM64) |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4329 # define TMP_LEN 66 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4330 # else |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4331 # define TMP_LEN 34 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4332 # endif |
1619 | 4333 char tmp[TMP_LEN]; |
272 | 4334 |
4335 /* string address in case of string argument */ | |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
4336 const char *str_arg = NULL; |
272 | 4337 |
4338 /* natural field width of arg without padding and sign */ | |
4339 size_t str_arg_l; | |
4340 | |
4341 /* unsigned char argument value - only defined for c conversion. | |
4342 * N.B. standard explicitly states the char argument for the c | |
4343 * conversion is unsigned */ | |
4344 unsigned char uchar_arg; | |
4345 | |
4346 /* number of zeros to be inserted for numeric conversions as | |
4347 * required by the precision or minimal field width */ | |
4348 size_t number_of_zeros_to_pad = 0; | |
4349 | |
4350 /* index into tmp where zero padding is to be inserted */ | |
4351 size_t zero_padding_insertion_ind = 0; | |
4352 | |
4353 /* current conversion specifier character */ | |
4354 char fmt_spec = '\0'; | |
4355 | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4356 /* buffer for 's' and 'S' specs */ |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4357 char_u *tofree = NULL; |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4358 |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4359 |
272 | 4360 p++; /* skip '%' */ |
4361 | |
4362 /* parse flags */ | |
4363 while (*p == '0' || *p == '-' || *p == '+' || *p == ' ' | |
4364 || *p == '#' || *p == '\'') | |
4365 { | |
4366 switch (*p) | |
4367 { | |
4368 case '0': zero_padding = 1; break; | |
4369 case '-': justify_left = 1; break; | |
4370 case '+': force_sign = 1; space_for_positive = 0; break; | |
4371 case ' ': force_sign = 1; | |
4372 /* If both the ' ' and '+' flags appear, the ' ' | |
4373 * flag should be ignored */ | |
4374 break; | |
4375 case '#': alternate_form = 1; break; | |
4376 case '\'': break; | |
4377 } | |
4378 p++; | |
4379 } | |
4380 /* If the '0' and '-' flags both appear, the '0' flag should be | |
4381 * ignored. */ | |
4382 | |
4383 /* parse field width */ | |
4384 if (*p == '*') | |
4385 { | |
4386 int j; | |
4387 | |
4388 p++; | |
449 | 4389 j = |
4390 # if defined(FEAT_EVAL) | |
482 | 4391 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
449 | 4392 # endif |
4393 va_arg(ap, int); | |
272 | 4394 if (j >= 0) |
4395 min_field_width = j; | |
4396 else | |
4397 { | |
4398 min_field_width = -j; | |
4399 justify_left = 1; | |
4400 } | |
4401 } | |
4402 else if (VIM_ISDIGIT((int)(*p))) | |
4403 { | |
4404 /* size_t could be wider than unsigned int; make sure we treat | |
4405 * argument like common implementations do */ | |
4406 unsigned int uj = *p++ - '0'; | |
4407 | |
4408 while (VIM_ISDIGIT((int)(*p))) | |
4409 uj = 10 * uj + (unsigned int)(*p++ - '0'); | |
4410 min_field_width = uj; | |
4411 } | |
4412 | |
4413 /* parse precision */ | |
4414 if (*p == '.') | |
4415 { | |
4416 p++; | |
4417 precision_specified = 1; | |
4418 if (*p == '*') | |
4419 { | |
4420 int j; | |
4421 | |
449 | 4422 j = |
4423 # if defined(FEAT_EVAL) | |
482 | 4424 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
449 | 4425 # endif |
4426 va_arg(ap, int); | |
272 | 4427 p++; |
4428 if (j >= 0) | |
4429 precision = j; | |
4430 else | |
4431 { | |
4432 precision_specified = 0; | |
4433 precision = 0; | |
4434 } | |
4435 } | |
4436 else if (VIM_ISDIGIT((int)(*p))) | |
4437 { | |
4438 /* size_t could be wider than unsigned int; make sure we | |
4439 * treat argument like common implementations do */ | |
4440 unsigned int uj = *p++ - '0'; | |
4441 | |
4442 while (VIM_ISDIGIT((int)(*p))) | |
4443 uj = 10 * uj + (unsigned int)(*p++ - '0'); | |
4444 precision = uj; | |
4445 } | |
4446 } | |
4447 | |
4448 /* parse 'h', 'l' and 'll' length modifiers */ | |
4449 if (*p == 'h' || *p == 'l') | |
4450 { | |
4451 length_modifier = *p; | |
4452 p++; | |
4453 if (length_modifier == 'l' && *p == 'l') | |
4454 { | |
4455 /* double l = long long */ | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4456 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4457 length_modifier = 'L'; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4458 # else |
272 | 4459 length_modifier = 'l'; /* treat it as a single 'l' */ |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4460 # endif |
272 | 4461 p++; |
4462 } | |
4463 } | |
4464 fmt_spec = *p; | |
4465 | |
4466 /* common synonyms: */ | |
4467 switch (fmt_spec) | |
4468 { | |
4469 case 'i': fmt_spec = 'd'; break; | |
4470 case 'D': fmt_spec = 'd'; length_modifier = 'l'; break; | |
4471 case 'U': fmt_spec = 'u'; length_modifier = 'l'; break; | |
4472 case 'O': fmt_spec = 'o'; length_modifier = 'l'; break; | |
4473 default: break; | |
4474 } | |
4475 | |
9497
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4476 # if defined(FEAT_EVAL) && defined(FEAT_NUM64) |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4477 switch (fmt_spec) |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4478 { |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4479 case 'd': case 'u': case 'o': case 'x': case 'X': |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4480 if (tvs != NULL && length_modifier == '\0') |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4481 length_modifier = 'L'; |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4482 } |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4483 # endif |
d18d71ae21e5
commit https://github.com/vim/vim/commit/38ee6b041e73ad31c3b6b99d56d20833b59b2b57
Christian Brabandt <cb@256bit.org>
parents:
9454
diff
changeset
|
4484 |
272 | 4485 /* get parameter value, do initial processing */ |
4486 switch (fmt_spec) | |
4487 { | |
4488 /* '%' and 'c' behave similar to 's' regarding flags and field | |
4489 * widths */ | |
4490 case '%': | |
4491 case 'c': | |
4492 case 's': | |
3914 | 4493 case 'S': |
272 | 4494 str_arg_l = 1; |
4495 switch (fmt_spec) | |
4496 { | |
4497 case '%': | |
4498 str_arg = p; | |
4499 break; | |
4500 | |
4501 case 'c': | |
4502 { | |
4503 int j; | |
449 | 4504 |
4505 j = | |
4506 # if defined(FEAT_EVAL) | |
482 | 4507 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
449 | 4508 # endif |
4509 va_arg(ap, int); | |
272 | 4510 /* standard demands unsigned char */ |
4511 uchar_arg = (unsigned char)j; | |
4512 str_arg = (char *)&uchar_arg; | |
4513 break; | |
4514 } | |
4515 | |
4516 case 's': | |
3914 | 4517 case 'S': |
449 | 4518 str_arg = |
4519 # if defined(FEAT_EVAL) | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4520 tvs != NULL ? tv_str(tvs, &arg_idx, &tofree) : |
449 | 4521 # endif |
4522 va_arg(ap, char *); | |
272 | 4523 if (str_arg == NULL) |
4524 { | |
4525 str_arg = "[NULL]"; | |
4526 str_arg_l = 6; | |
4527 } | |
4528 /* make sure not to address string beyond the specified | |
4529 * precision !!! */ | |
4530 else if (!precision_specified) | |
4531 str_arg_l = strlen(str_arg); | |
4532 /* truncate string if necessary as requested by precision */ | |
4533 else if (precision == 0) | |
4534 str_arg_l = 0; | |
4535 else | |
4536 { | |
881 | 4537 /* Don't put the #if inside memchr(), it can be a |
4538 * macro. */ | |
272 | 4539 /* memchr on HP does not like n > 2^31 !!! */ |
4540 char *q = memchr(str_arg, '\0', | |
881 | 4541 precision <= (size_t)0x7fffffffL ? precision |
4542 : (size_t)0x7fffffffL); | |
1883 | 4543 str_arg_l = (q == NULL) ? precision |
4544 : (size_t)(q - str_arg); | |
272 | 4545 } |
3914 | 4546 if (fmt_spec == 'S') |
4547 { | |
4548 if (min_field_width != 0) | |
4549 min_field_width += STRLEN(str_arg) | |
4550 - mb_string2cells((char_u *)str_arg, -1); | |
4551 if (precision) | |
4552 { | |
4553 char_u *p1 = (char_u *)str_arg; | |
4554 size_t i; | |
4555 | |
4556 for (i = 0; i < precision && *p1; i++) | |
4557 p1 += mb_ptr2len(p1); | |
4558 | |
4559 str_arg_l = precision = p1 - (char_u *)str_arg; | |
4560 } | |
4561 } | |
272 | 4562 break; |
4563 | |
4564 default: | |
4565 break; | |
4566 } | |
4567 break; | |
4568 | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4569 case 'd': case 'u': |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4570 case 'b': case 'B': |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4571 case 'o': |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4572 case 'x': case 'X': |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4573 case 'p': |
272 | 4574 { |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4575 /* NOTE: the u, b, o, x, X and p conversion specifiers |
272 | 4576 * imply the value is unsigned; d implies a signed |
4577 * value */ | |
4578 | |
4579 /* 0 if numeric argument is zero (or if pointer is | |
4580 * NULL for 'p'), +1 if greater than zero (or nonzero | |
4581 * for unsigned arguments), -1 if negative (unsigned | |
4582 * argument is never negative) */ | |
4583 int arg_sign = 0; | |
4584 | |
4585 /* only defined for length modifier h, or for no | |
4586 * length modifiers */ | |
4587 int int_arg = 0; | |
4588 unsigned int uint_arg = 0; | |
4589 | |
4590 /* only defined for length modifier l */ | |
4591 long int long_arg = 0; | |
4592 unsigned long int ulong_arg = 0; | |
4593 | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4594 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4595 /* only defined for length modifier ll */ |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4596 varnumber_T llong_arg = 0; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4597 uvarnumber_T ullong_arg = 0; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4598 # endif |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4599 |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4600 /* only defined for b conversion */ |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4601 uvarnumber_T bin_arg = 0; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4602 |
272 | 4603 /* pointer argument value -only defined for p |
4604 * conversion */ | |
4605 void *ptr_arg = NULL; | |
4606 | |
4607 if (fmt_spec == 'p') | |
4608 { | |
4609 length_modifier = '\0'; | |
449 | 4610 ptr_arg = |
4611 # if defined(FEAT_EVAL) | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4612 tvs != NULL ? (void *)tv_str(tvs, &arg_idx, |
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
4613 NULL) : |
449 | 4614 # endif |
4615 va_arg(ap, void *); | |
272 | 4616 if (ptr_arg != NULL) |
4617 arg_sign = 1; | |
4618 } | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4619 else if (fmt_spec == 'b' || fmt_spec == 'B') |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4620 { |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4621 bin_arg = |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4622 # if defined(FEAT_EVAL) |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4623 tvs != NULL ? |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4624 (uvarnumber_T)tv_nr(tvs, &arg_idx) : |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4625 # endif |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4626 va_arg(ap, uvarnumber_T); |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4627 if (bin_arg != 0) |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4628 arg_sign = 1; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4629 } |
272 | 4630 else if (fmt_spec == 'd') |
4631 { | |
4632 /* signed */ | |
4633 switch (length_modifier) | |
4634 { | |
4635 case '\0': | |
4636 case 'h': | |
449 | 4637 /* char and short arguments are passed as int. */ |
4638 int_arg = | |
4639 # if defined(FEAT_EVAL) | |
482 | 4640 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
449 | 4641 # endif |
4642 va_arg(ap, int); | |
272 | 4643 if (int_arg > 0) |
4644 arg_sign = 1; | |
4645 else if (int_arg < 0) | |
4646 arg_sign = -1; | |
4647 break; | |
4648 case 'l': | |
449 | 4649 long_arg = |
4650 # if defined(FEAT_EVAL) | |
482 | 4651 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
449 | 4652 # endif |
4653 va_arg(ap, long int); | |
272 | 4654 if (long_arg > 0) |
4655 arg_sign = 1; | |
4656 else if (long_arg < 0) | |
4657 arg_sign = -1; | |
4658 break; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4659 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4660 case 'L': |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4661 llong_arg = |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4662 # if defined(FEAT_EVAL) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4663 tvs != NULL ? tv_nr(tvs, &arg_idx) : |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4664 # endif |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4665 va_arg(ap, varnumber_T); |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4666 if (llong_arg > 0) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4667 arg_sign = 1; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4668 else if (llong_arg < 0) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4669 arg_sign = -1; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4670 break; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4671 # endif |
272 | 4672 } |
4673 } | |
4674 else | |
4675 { | |
4676 /* unsigned */ | |
4677 switch (length_modifier) | |
4678 { | |
4679 case '\0': | |
4680 case 'h': | |
449 | 4681 uint_arg = |
4682 # if defined(FEAT_EVAL) | |
1883 | 4683 tvs != NULL ? (unsigned) |
4684 tv_nr(tvs, &arg_idx) : | |
449 | 4685 # endif |
4686 va_arg(ap, unsigned int); | |
272 | 4687 if (uint_arg != 0) |
4688 arg_sign = 1; | |
4689 break; | |
4690 case 'l': | |
449 | 4691 ulong_arg = |
4692 # if defined(FEAT_EVAL) | |
1883 | 4693 tvs != NULL ? (unsigned long) |
4694 tv_nr(tvs, &arg_idx) : | |
449 | 4695 # endif |
4696 va_arg(ap, unsigned long int); | |
272 | 4697 if (ulong_arg != 0) |
4698 arg_sign = 1; | |
4699 break; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4700 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4701 case 'L': |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4702 ullong_arg = |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4703 # if defined(FEAT_EVAL) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4704 tvs != NULL ? (uvarnumber_T) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4705 tv_nr(tvs, &arg_idx) : |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4706 # endif |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4707 va_arg(ap, uvarnumber_T); |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4708 if (ullong_arg != 0) |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4709 arg_sign = 1; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4710 break; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4711 # endif |
272 | 4712 } |
4713 } | |
4714 | |
4715 str_arg = tmp; | |
4716 str_arg_l = 0; | |
4717 | |
4718 /* NOTE: | |
4719 * For d, i, u, o, x, and X conversions, if precision is | |
4720 * specified, the '0' flag should be ignored. This is so | |
4721 * with Solaris 2.6, Digital UNIX 4.0, HPUX 10, Linux, | |
4722 * FreeBSD, NetBSD; but not with Perl. | |
4723 */ | |
4724 if (precision_specified) | |
4725 zero_padding = 0; | |
4726 if (fmt_spec == 'd') | |
4727 { | |
4728 if (force_sign && arg_sign >= 0) | |
4729 tmp[str_arg_l++] = space_for_positive ? ' ' : '+'; | |
4730 /* leave negative numbers for sprintf to handle, to | |
4731 * avoid handling tricky cases like (short int)-32768 */ | |
4732 } | |
4733 else if (alternate_form) | |
4734 { | |
4735 if (arg_sign != 0 | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4736 && (fmt_spec == 'b' || fmt_spec == 'B' |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4737 || fmt_spec == 'x' || fmt_spec == 'X') ) |
272 | 4738 { |
4739 tmp[str_arg_l++] = '0'; | |
4740 tmp[str_arg_l++] = fmt_spec; | |
4741 } | |
4742 /* alternate form should have no effect for p | |
4743 * conversion, but ... */ | |
4744 } | |
4745 | |
4746 zero_padding_insertion_ind = str_arg_l; | |
4747 if (!precision_specified) | |
4748 precision = 1; /* default precision is 1 */ | |
4749 if (precision == 0 && arg_sign == 0) | |
4750 { | |
4751 /* When zero value is formatted with an explicit | |
4752 * precision 0, the resulting formatted string is | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4753 * empty (d, i, u, b, B, o, x, X, p). */ |
272 | 4754 } |
4755 else | |
4756 { | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4757 char f[6]; |
272 | 4758 int f_l = 0; |
4759 | |
4760 /* construct a simple format string for sprintf */ | |
4761 f[f_l++] = '%'; | |
4762 if (!length_modifier) | |
4763 ; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4764 else if (length_modifier == 'L') |
272 | 4765 { |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4766 # ifdef FEAT_NUM64 |
15868
7fad90423bd2
patch 8.1.0941: macros for MS-Windows are inconsistent
Bram Moolenaar <Bram@vim.org>
parents:
15840
diff
changeset
|
4767 # ifdef MSWIN |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4768 f[f_l++] = 'I'; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4769 f[f_l++] = '6'; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4770 f[f_l++] = '4'; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4771 # else |
272 | 4772 f[f_l++] = 'l'; |
4773 f[f_l++] = 'l'; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4774 # endif |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4775 # else |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4776 f[f_l++] = 'l'; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4777 # endif |
272 | 4778 } |
4779 else | |
4780 f[f_l++] = length_modifier; | |
4781 f[f_l++] = fmt_spec; | |
4782 f[f_l++] = '\0'; | |
4783 | |
4784 if (fmt_spec == 'p') | |
4785 str_arg_l += sprintf(tmp + str_arg_l, f, ptr_arg); | |
9894
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4786 else if (fmt_spec == 'b' || fmt_spec == 'B') |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4787 { |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4788 char b[8 * sizeof(uvarnumber_T)]; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4789 size_t b_l = 0; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4790 uvarnumber_T bn = bin_arg; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4791 |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4792 do |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4793 { |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4794 b[sizeof(b) - ++b_l] = '0' + (bn & 0x1); |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4795 bn >>= 1; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4796 } |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4797 while (bn != 0); |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4798 |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4799 memcpy(tmp + str_arg_l, b + sizeof(b) - b_l, b_l); |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4800 str_arg_l += b_l; |
b01afb4e8f66
commit https://github.com/vim/vim/commit/91984b9034d3b698459622be277d963e0c6df60e
Christian Brabandt <cb@256bit.org>
parents:
9892
diff
changeset
|
4801 } |
272 | 4802 else if (fmt_spec == 'd') |
4803 { | |
4804 /* signed */ | |
4805 switch (length_modifier) | |
4806 { | |
4807 case '\0': | |
4808 case 'h': str_arg_l += sprintf( | |
4809 tmp + str_arg_l, f, int_arg); | |
4810 break; | |
4811 case 'l': str_arg_l += sprintf( | |
4812 tmp + str_arg_l, f, long_arg); | |
4813 break; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4814 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4815 case 'L': str_arg_l += sprintf( |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4816 tmp + str_arg_l, f, llong_arg); |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4817 break; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4818 # endif |
272 | 4819 } |
4820 } | |
4821 else | |
4822 { | |
4823 /* unsigned */ | |
4824 switch (length_modifier) | |
4825 { | |
4826 case '\0': | |
4827 case 'h': str_arg_l += sprintf( | |
4828 tmp + str_arg_l, f, uint_arg); | |
4829 break; | |
4830 case 'l': str_arg_l += sprintf( | |
4831 tmp + str_arg_l, f, ulong_arg); | |
4832 break; | |
9389
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4833 # ifdef FEAT_NUM64 |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4834 case 'L': str_arg_l += sprintf( |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4835 tmp + str_arg_l, f, ullong_arg); |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4836 break; |
32e34e574716
commit https://github.com/vim/vim/commit/22fcfad29276bd5f317faf516637dcd491b96a12
Christian Brabandt <cb@256bit.org>
parents:
9185
diff
changeset
|
4837 # endif |
272 | 4838 } |
4839 } | |
4840 | |
4841 /* include the optional minus sign and possible | |
4842 * "0x" in the region before the zero padding | |
4843 * insertion point */ | |
4844 if (zero_padding_insertion_ind < str_arg_l | |
4845 && tmp[zero_padding_insertion_ind] == '-') | |
4846 zero_padding_insertion_ind++; | |
4847 if (zero_padding_insertion_ind + 1 < str_arg_l | |
4848 && tmp[zero_padding_insertion_ind] == '0' | |
4849 && (tmp[zero_padding_insertion_ind + 1] == 'x' | |
4850 || tmp[zero_padding_insertion_ind + 1] == 'X')) | |
4851 zero_padding_insertion_ind += 2; | |
4852 } | |
4853 | |
4854 { | |
4855 size_t num_of_digits = str_arg_l | |
4856 - zero_padding_insertion_ind; | |
4857 | |
4858 if (alternate_form && fmt_spec == 'o' | |
4859 /* unless zero is already the first | |
4860 * character */ | |
4861 && !(zero_padding_insertion_ind < str_arg_l | |
4862 && tmp[zero_padding_insertion_ind] == '0')) | |
4863 { | |
4864 /* assure leading zero for alternate-form | |
4865 * octal numbers */ | |
4866 if (!precision_specified | |
4867 || precision < num_of_digits + 1) | |
4868 { | |
4869 /* precision is increased to force the | |
4870 * first character to be zero, except if a | |
4871 * zero value is formatted with an | |
4872 * explicit precision of zero */ | |
4873 precision = num_of_digits + 1; | |
4874 } | |
4875 } | |
4876 /* zero padding to specified precision? */ | |
4877 if (num_of_digits < precision) | |
4878 number_of_zeros_to_pad = precision - num_of_digits; | |
4879 } | |
4880 /* zero padding to specified minimal field width? */ | |
4881 if (!justify_left && zero_padding) | |
4882 { | |
835 | 4883 int n = (int)(min_field_width - (str_arg_l |
4884 + number_of_zeros_to_pad)); | |
272 | 4885 if (n > 0) |
4886 number_of_zeros_to_pad += n; | |
4887 } | |
4888 break; | |
4889 } | |
4890 | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4891 # ifdef FEAT_FLOAT |
1619 | 4892 case 'f': |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4893 case 'F': |
1619 | 4894 case 'e': |
4895 case 'E': | |
4896 case 'g': | |
4897 case 'G': | |
4898 { | |
4899 /* Floating point. */ | |
4900 double f; | |
4901 double abs_f; | |
4902 char format[40]; | |
4903 int l; | |
4904 int remove_trailing_zeroes = FALSE; | |
4905 | |
4906 f = | |
4907 # if defined(FEAT_EVAL) | |
4908 tvs != NULL ? tv_float(tvs, &arg_idx) : | |
4909 # endif | |
4910 va_arg(ap, double); | |
4911 abs_f = f < 0 ? -f : f; | |
4912 | |
4913 if (fmt_spec == 'g' || fmt_spec == 'G') | |
4914 { | |
4915 /* Would be nice to use %g directly, but it prints | |
4916 * "1.0" as "1", we don't want that. */ | |
4917 if ((abs_f >= 0.001 && abs_f < 10000000.0) | |
4918 || abs_f == 0.0) | |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4919 fmt_spec = ASCII_ISUPPER(fmt_spec) ? 'F' : 'f'; |
1619 | 4920 else |
4921 fmt_spec = fmt_spec == 'g' ? 'e' : 'E'; | |
4922 remove_trailing_zeroes = TRUE; | |
4923 } | |
4924 | |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4925 if ((fmt_spec == 'f' || fmt_spec == 'F') && |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4926 # ifdef VAX |
1783 | 4927 abs_f > 1.0e38 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4928 # else |
1783 | 4929 abs_f > 1.0e307 |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
4930 # endif |
1783 | 4931 ) |
1619 | 4932 { |
4933 /* Avoid a buffer overflow */ | |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4934 STRCPY(tmp, infinity_str(f > 0.0, fmt_spec, |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4935 force_sign, space_for_positive)); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4936 str_arg_l = STRLEN(tmp); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4937 zero_padding = 0; |
1619 | 4938 } |
4939 else | |
4940 { | |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4941 if (isnan(f)) |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4942 { |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4943 /* Not a number: nan or NAN */ |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4944 STRCPY(tmp, ASCII_ISUPPER(fmt_spec) ? "NAN" |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4945 : "nan"); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4946 str_arg_l = 3; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4947 zero_padding = 0; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4948 } |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4949 else if (isinf(f)) |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4950 { |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4951 STRCPY(tmp, infinity_str(f > 0.0, fmt_spec, |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4952 force_sign, space_for_positive)); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4953 str_arg_l = STRLEN(tmp); |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4954 zero_padding = 0; |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4955 } |
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4956 else |
13188
a49a5419a83f
patch 8.0.1468: illegal memory access in del_bytes()
Christian Brabandt <cb@256bit.org>
parents:
13150
diff
changeset
|
4957 { |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4958 /* Regular float number */ |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4959 format[0] = '%'; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4960 l = 1; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4961 if (force_sign) |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4962 format[l++] = space_for_positive ? ' ' : '+'; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4963 if (precision_specified) |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4964 { |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4965 size_t max_prec = TMP_LEN - 10; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4966 |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4967 /* Make sure we don't get more digits than we |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4968 * have room for. */ |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4969 if ((fmt_spec == 'f' || fmt_spec == 'F') |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4970 && abs_f > 1.0) |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4971 max_prec -= (size_t)log10(abs_f); |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4972 if (precision > max_prec) |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4973 precision = max_prec; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4974 l += sprintf(format + l, ".%d", (int)precision); |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4975 } |
10040
48f70e0c696a
commit https://github.com/vim/vim/commit/965ed14973fd3f1b2aace7bae4d4722b71ca04f9
Christian Brabandt <cb@256bit.org>
parents:
10038
diff
changeset
|
4976 format[l] = fmt_spec == 'F' ? 'f' : fmt_spec; |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4977 format[l + 1] = NUL; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4978 |
10015
5ac2dd61ca8f
commit https://github.com/vim/vim/commit/e999782e369999539a1783a7ebe4eadcc6da28a8
Christian Brabandt <cb@256bit.org>
parents:
9988
diff
changeset
|
4979 str_arg_l = sprintf(tmp, format, f); |
13188
a49a5419a83f
patch 8.0.1468: illegal memory access in del_bytes()
Christian Brabandt <cb@256bit.org>
parents:
13150
diff
changeset
|
4980 } |
9986
9bef7b5d02cb
commit https://github.com/vim/vim/commit/9992237a3e791fbc0c1ebf743ece1b75e1488410
Christian Brabandt <cb@256bit.org>
parents:
9980
diff
changeset
|
4981 |
1619 | 4982 if (remove_trailing_zeroes) |
4983 { | |
4984 int i; | |
1757 | 4985 char *tp; |
1619 | 4986 |
4987 /* Using %g or %G: remove superfluous zeroes. */ | |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
4988 if (fmt_spec == 'f' || fmt_spec == 'F') |
1757 | 4989 tp = tmp + str_arg_l - 1; |
1619 | 4990 else |
4991 { | |
1757 | 4992 tp = (char *)vim_strchr((char_u *)tmp, |
1619 | 4993 fmt_spec == 'e' ? 'e' : 'E'); |
1757 | 4994 if (tp != NULL) |
1619 | 4995 { |
4996 /* Remove superfluous '+' and leading | |
4997 * zeroes from the exponent. */ | |
1757 | 4998 if (tp[1] == '+') |
1619 | 4999 { |
5000 /* Change "1.0e+07" to "1.0e07" */ | |
1757 | 5001 STRMOVE(tp + 1, tp + 2); |
1619 | 5002 --str_arg_l; |
5003 } | |
1757 | 5004 i = (tp[1] == '-') ? 2 : 1; |
5005 while (tp[i] == '0') | |
1619 | 5006 { |
5007 /* Change "1.0e07" to "1.0e7" */ | |
1757 | 5008 STRMOVE(tp + i, tp + i + 1); |
1619 | 5009 --str_arg_l; |
5010 } | |
1757 | 5011 --tp; |
1619 | 5012 } |
5013 } | |
5014 | |
1757 | 5015 if (tp != NULL && !precision_specified) |
1619 | 5016 /* Remove trailing zeroes, but keep the one |
5017 * just after a dot. */ | |
1757 | 5018 while (tp > tmp + 2 && *tp == '0' |
5019 && tp[-1] != '.') | |
1619 | 5020 { |
1757 | 5021 STRMOVE(tp, tp + 1); |
5022 --tp; | |
1619 | 5023 --str_arg_l; |
5024 } | |
5025 } | |
5026 else | |
5027 { | |
1757 | 5028 char *tp; |
1619 | 5029 |
5030 /* Be consistent: some printf("%e") use 1.0e+12 | |
5031 * and some 1.0e+012. Remove one zero in the last | |
5032 * case. */ | |
1757 | 5033 tp = (char *)vim_strchr((char_u *)tmp, |
1619 | 5034 fmt_spec == 'e' ? 'e' : 'E'); |
1757 | 5035 if (tp != NULL && (tp[1] == '+' || tp[1] == '-') |
5036 && tp[2] == '0' | |
5037 && vim_isdigit(tp[3]) | |
5038 && vim_isdigit(tp[4])) | |
1619 | 5039 { |
1757 | 5040 STRMOVE(tp + 2, tp + 3); |
1619 | 5041 --str_arg_l; |
5042 } | |
5043 } | |
5044 } | |
10038
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5045 if (zero_padding && min_field_width > str_arg_l |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5046 && (tmp[0] == '-' || force_sign)) |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5047 { |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5048 /* padding 0's should be inserted after the sign */ |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5049 number_of_zeros_to_pad = min_field_width - str_arg_l; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5050 zero_padding_insertion_ind = 1; |
7cf4e210cf3c
commit https://github.com/vim/vim/commit/04186095346daa60e82e981dad114de2b641d672
Christian Brabandt <cb@256bit.org>
parents:
10036
diff
changeset
|
5051 } |
1619 | 5052 str_arg = tmp; |
5053 break; | |
5054 } | |
7803
37c929c4a073
commit https://github.com/vim/vim/commit/92b8b2d307e34117f146319872010b0ccc9d2713
Christian Brabandt <cb@256bit.org>
parents:
6949
diff
changeset
|
5055 # endif |
1619 | 5056 |
272 | 5057 default: |
5058 /* unrecognized conversion specifier, keep format string | |
5059 * as-is */ | |
5060 zero_padding = 0; /* turn zero padding off for non-numeric | |
1189 | 5061 conversion */ |
272 | 5062 justify_left = 1; |
856 | 5063 min_field_width = 0; /* reset flags */ |
272 | 5064 |
5065 /* discard the unrecognized conversion, just keep * | |
856 | 5066 * the unrecognized conversion character */ |
272 | 5067 str_arg = p; |
5068 str_arg_l = 0; | |
5069 if (*p != NUL) | |
5070 str_arg_l++; /* include invalid conversion specifier | |
5071 unchanged if not at end-of-string */ | |
5072 break; | |
5073 } | |
5074 | |
5075 if (*p != NUL) | |
5076 p++; /* step over the just processed conversion specifier */ | |
5077 | |
5078 /* insert padding to the left as requested by min_field_width; | |
5079 * this does not include the zero padding in case of numerical | |
5080 * conversions*/ | |
5081 if (!justify_left) | |
5082 { | |
5083 /* left padding with blank or zero */ | |
835 | 5084 int pn = (int)(min_field_width - (str_arg_l + number_of_zeros_to_pad)); |
275 | 5085 |
5086 if (pn > 0) | |
272 | 5087 { |
5088 if (str_l < str_m) | |
5089 { | |
5090 size_t avail = str_m - str_l; | |
5091 | |
5092 vim_memset(str + str_l, zero_padding ? '0' : ' ', | |
1883 | 5093 (size_t)pn > avail ? avail |
5094 : (size_t)pn); | |
272 | 5095 } |
275 | 5096 str_l += pn; |
272 | 5097 } |
5098 } | |
5099 | |
5100 /* zero padding as requested by the precision or by the minimal | |
5101 * field width for numeric conversions required? */ | |
330 | 5102 if (number_of_zeros_to_pad == 0) |
272 | 5103 { |
5104 /* will not copy first part of numeric right now, * | |
5105 * force it to be copied later in its entirety */ | |
5106 zero_padding_insertion_ind = 0; | |
5107 } | |
5108 else | |
5109 { | |
5110 /* insert first part of numerics (sign or '0x') before zero | |
5111 * padding */ | |
835 | 5112 int zn = (int)zero_padding_insertion_ind; |
275 | 5113 |
5114 if (zn > 0) | |
272 | 5115 { |
5116 if (str_l < str_m) | |
5117 { | |
5118 size_t avail = str_m - str_l; | |
5119 | |
5120 mch_memmove(str + str_l, str_arg, | |
1883 | 5121 (size_t)zn > avail ? avail |
5122 : (size_t)zn); | |
272 | 5123 } |
275 | 5124 str_l += zn; |
272 | 5125 } |
5126 | |
5127 /* insert zero padding as requested by the precision or min | |
5128 * field width */ | |
835 | 5129 zn = (int)number_of_zeros_to_pad; |
275 | 5130 if (zn > 0) |
272 | 5131 { |
5132 if (str_l < str_m) | |
5133 { | |
11937
c893d6c00497
patch 8.0.0848: using multiple ch_log functions is clumsy
Christian Brabandt <cb@256bit.org>
parents:
11653
diff
changeset
|
5134 size_t avail = str_m - str_l; |
272 | 5135 |
275 | 5136 vim_memset(str + str_l, '0', |
1883 | 5137 (size_t)zn > avail ? avail |
5138 : (size_t)zn); | |
272 | 5139 } |
275 | 5140 str_l += zn; |
272 | 5141 } |
5142 } | |
5143 | |
5144 /* insert formatted string | |
5145 * (or as-is conversion specifier for unknown conversions) */ | |
5146 { | |
835 | 5147 int sn = (int)(str_arg_l - zero_padding_insertion_ind); |
275 | 5148 |
5149 if (sn > 0) | |
272 | 5150 { |
5151 if (str_l < str_m) | |
5152 { | |
5153 size_t avail = str_m - str_l; | |
5154 | |
5155 mch_memmove(str + str_l, | |
5156 str_arg + zero_padding_insertion_ind, | |
1883 | 5157 (size_t)sn > avail ? avail : (size_t)sn); |
272 | 5158 } |
275 | 5159 str_l += sn; |
272 | 5160 } |
5161 } | |
5162 | |
5163 /* insert right padding */ | |
5164 if (justify_left) | |
5165 { | |
5166 /* right blank padding to the field width */ | |
1619 | 5167 int pn = (int)(min_field_width |
5168 - (str_arg_l + number_of_zeros_to_pad)); | |
275 | 5169 |
5170 if (pn > 0) | |
272 | 5171 { |
5172 if (str_l < str_m) | |
5173 { | |
5174 size_t avail = str_m - str_l; | |
5175 | |
275 | 5176 vim_memset(str + str_l, ' ', |
1883 | 5177 (size_t)pn > avail ? avail |
5178 : (size_t)pn); | |
272 | 5179 } |
275 | 5180 str_l += pn; |
272 | 5181 } |
5182 } | |
9892
41c5d59e7e10
commit https://github.com/vim/vim/commit/e5a8f35b4286135f3469f3b00a6c2220553d9658
Christian Brabandt <cb@256bit.org>
parents:
9698
diff
changeset
|
5183 vim_free(tofree); |
272 | 5184 } |
5185 } | |
5186 | |
5187 if (str_m > 0) | |
5188 { | |
437 | 5189 /* make sure the string is nul-terminated even at the expense of |
272 | 5190 * overwriting the last character (shouldn't happen, but just in case) |
5191 * */ | |
5192 str[str_l <= str_m - 1 ? str_l : str_m - 1] = '\0'; | |
5193 } | |
5194 | |
482 | 5195 if (tvs != NULL && tvs[arg_idx - 1].v_type != VAR_UNKNOWN) |
15470
55ccc2d353bd
patch 8.1.0743: giving error messages is not flexible
Bram Moolenaar <Bram@vim.org>
parents:
15219
diff
changeset
|
5196 emsg(_("E767: Too many arguments to printf()")); |
449 | 5197 |
437 | 5198 /* Return the number of characters formatted (excluding trailing nul |
272 | 5199 * character), that is, the number of characters that would have been |
5200 * written to the buffer if it were large enough. */ | |
5201 return (int)str_l; | |
5202 } | |
5203 | |
5204 #endif /* PROTO */ |