Merge #8930 'vim-patch:8.1.0022'

This commit is contained in:
Justin M. Keyes 2018-08-29 08:11:16 +02:00
commit 17ce06d1c9
6 changed files with 68 additions and 51 deletions

View File

@ -11235,7 +11235,7 @@ void get_user_input(const typval_T *const argvars,
} }
} }
int cmd_silent_save = cmd_silent; const bool cmd_silent_save = cmd_silent;
cmd_silent = false; // Want to see the prompt. cmd_silent = false; // Want to see the prompt.
// Only the part of the message after the last NL is considered as // Only the part of the message after the last NL is considered as

View File

@ -123,7 +123,7 @@ void do_debug(char_u *cmd)
int save_msg_scroll = msg_scroll; int save_msg_scroll = msg_scroll;
int save_State = State; int save_State = State;
int save_did_emsg = did_emsg; int save_did_emsg = did_emsg;
int save_cmd_silent = cmd_silent; const bool save_cmd_silent = cmd_silent;
int save_msg_silent = msg_silent; int save_msg_silent = msg_silent;
int save_emsg_silent = emsg_silent; int save_emsg_silent = emsg_silent;
int save_redir_off = redir_off; int save_redir_off = redir_off;

View File

@ -448,7 +448,7 @@ void flush_buffers(int flush_typeahead)
} }
typebuf.tb_maplen = 0; typebuf.tb_maplen = 0;
typebuf.tb_silent = 0; typebuf.tb_silent = 0;
cmd_silent = FALSE; cmd_silent = false;
typebuf.tb_no_abbr_cnt = 0; typebuf.tb_no_abbr_cnt = 0;
} }
@ -652,15 +652,13 @@ void stuffnumReadbuff(long n)
add_num_buff(&readbuf1, n); add_num_buff(&readbuf1, n);
} }
/* // Read a character from the redo buffer. Translates K_SPECIAL, CSI and
* Read a character from the redo buffer. Translates K_SPECIAL, CSI and // multibyte characters.
* multibyte characters. // The redo buffer is left as it is.
* The redo buffer is left as it is. // If init is true, prepare for redo, return FAIL if nothing to redo, OK
* If init is TRUE, prepare for redo, return FAIL if nothing to redo, OK // otherwise.
* otherwise. // If old_redo is true, use old_redobuff instead of redobuff.
* If old is TRUE, use old_redobuff instead of redobuff. static int read_redo(bool init, bool old_redo)
*/
static int read_redo(int init, int old_redo)
{ {
static buffblock_T *bp; static buffblock_T *bp;
static char_u *p; static char_u *p;
@ -713,38 +711,35 @@ static int read_redo(int init, int old_redo)
return c; return c;
} }
/* // Copy the rest of the redo buffer into the stuff buffer (in a slow way).
* Copy the rest of the redo buffer into the stuff buffer (in a slow way). // If old_redo is true, use old_redobuff instead of redobuff.
* If old_redo is TRUE, use old_redobuff instead of redobuff. // The escaped K_SPECIAL and CSI are copied without translation.
* The escaped K_SPECIAL and CSI are copied without translation. static void copy_redo(bool old_redo)
*/
static void copy_redo(int old_redo)
{ {
int c; int c;
while ((c = read_redo(FALSE, old_redo)) != NUL) { while ((c = read_redo(false, old_redo)) != NUL) {
add_char_buff(&readbuf2, c); add_char_buff(&readbuf2, c);
} }
} }
/* // Stuff the redo buffer into readbuf2.
* Stuff the redo buffer into readbuf2. // Insert the redo count into the command.
* Insert the redo count into the command. // If "old_redo" is true, the last but one command is repeated
* If "old_redo" is TRUE, the last but one command is repeated // instead of the last command (inserting text). This is used for
* instead of the last command (inserting text). This is used for // CTRL-O <.> in insert mode
* CTRL-O <.> in insert mode //
* // return FAIL for failure, OK otherwise
* return FAIL for failure, OK otherwise int start_redo(long count, bool old_redo)
*/
int start_redo(long count, int old_redo)
{ {
int c; int c;
/* init the pointers; return if nothing to redo */ // init the pointers; return if nothing to redo
if (read_redo(TRUE, old_redo) == FAIL) if (read_redo(true, old_redo) == FAIL) {
return FAIL; return FAIL;
}
c = read_redo(FALSE, old_redo); c = read_redo(false, old_redo);
/* copy the buffer name, if present */ /* copy the buffer name, if present */
if (c == '"') { if (c == '"') {
@ -755,22 +750,30 @@ int start_redo(long count, int old_redo)
if (c >= '1' && c < '9') if (c >= '1' && c < '9')
++c; ++c;
add_char_buff(&readbuf2, c); add_char_buff(&readbuf2, c);
c = read_redo(FALSE, old_redo);
// the expression register should be re-evaluated
if (c == '=') {
add_char_buff(&readbuf2, CAR);
cmd_silent = true;
}
c = read_redo(false, old_redo);
} }
if (c == 'v') { /* redo Visual */ if (c == 'v') { /* redo Visual */
VIsual = curwin->w_cursor; VIsual = curwin->w_cursor;
VIsual_active = TRUE; VIsual_active = true;
VIsual_select = FALSE; VIsual_select = false;
VIsual_reselect = TRUE; VIsual_reselect = true;
redo_VIsual_busy = TRUE; redo_VIsual_busy = true;
c = read_redo(FALSE, old_redo); c = read_redo(false, old_redo);
} }
/* try to enter the count (in place of a previous count) */ // try to enter the count (in place of a previous count)
if (count) { if (count) {
while (ascii_isdigit(c)) /* skip "old" count */ while (ascii_isdigit(c)) { // skip "old" count
c = read_redo(FALSE, old_redo); c = read_redo(false, old_redo);
}
add_num_buff(&readbuf2, count); add_num_buff(&readbuf2, count);
} }
@ -789,12 +792,13 @@ int start_redo_ins(void)
{ {
int c; int c;
if (read_redo(TRUE, FALSE) == FAIL) if (read_redo(true, false) == FAIL) {
return FAIL; return FAIL;
}
start_stuff(); start_stuff();
/* skip the count and the command character */ // skip the count and the command character
while ((c = read_redo(FALSE, FALSE)) != NUL) { while ((c = read_redo(false, false)) != NUL) {
if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL) { if (vim_strchr((char_u *)"AaIiRrOo", c) != NULL) {
if (c == 'O' || c == 'o') { if (c == 'O' || c == 'o') {
add_buff(&readbuf2, NL_STR, -1L); add_buff(&readbuf2, NL_STR, -1L);
@ -803,9 +807,9 @@ int start_redo_ins(void)
} }
} }
/* copy the typed text from the redo buffer into the stuff buffer */ // copy the typed text from the redo buffer into the stuff buffer
copy_redo(FALSE); copy_redo(false);
block_redo = TRUE; block_redo = true;
return OK; return OK;
} }
@ -952,7 +956,7 @@ int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, bool silent)
typebuf.tb_maplen += addlen; typebuf.tb_maplen += addlen;
if (silent || typebuf.tb_silent > offset) { if (silent || typebuf.tb_silent > offset) {
typebuf.tb_silent += addlen; typebuf.tb_silent += addlen;
cmd_silent = TRUE; cmd_silent = true;
} }
if (typebuf.tb_no_abbr_cnt && offset == 0) /* and not used for abbrev.s */ if (typebuf.tb_no_abbr_cnt && offset == 0) /* and not used for abbrev.s */
typebuf.tb_no_abbr_cnt += addlen; typebuf.tb_no_abbr_cnt += addlen;
@ -1716,7 +1720,7 @@ static int vgetorpeek(int advance)
*typebuf.tb_buf = (char_u)c; *typebuf.tb_buf = (char_u)c;
gotchars(typebuf.tb_buf, 1); gotchars(typebuf.tb_buf, 1);
} }
cmd_silent = FALSE; cmd_silent = false;
break; break;
} else if (typebuf.tb_len > 0) { } else if (typebuf.tb_len > 0) {

View File

@ -751,7 +751,7 @@ EXTERN cmdmod_T cmdmod; /* Ex command modifiers */
EXTERN int msg_silent INIT(= 0); // don't print messages EXTERN int msg_silent INIT(= 0); // don't print messages
EXTERN int emsg_silent INIT(= 0); // don't print error messages EXTERN int emsg_silent INIT(= 0); // don't print error messages
EXTERN bool emsg_noredir INIT(= false); // don't redirect error messages EXTERN bool emsg_noredir INIT(= false); // don't redirect error messages
EXTERN int cmd_silent INIT(= false); // don't echo the command line EXTERN bool cmd_silent INIT(= false); // don't echo the command line
/* Values for swap_exists_action: what to do when swap file already exists */ /* Values for swap_exists_action: what to do when swap file already exists */
#define SEA_NONE 0 /* don't use dialog */ #define SEA_NONE 0 /* don't use dialog */

View File

@ -541,7 +541,7 @@ int emsg(const char_u *s_)
// Reset msg_silent, an error causes messages to be switched back on. // Reset msg_silent, an error causes messages to be switched back on.
msg_silent = 0; msg_silent = 0;
cmd_silent = FALSE; cmd_silent = false;
if (global_busy) { // break :global command if (global_busy) { // break :global command
global_busy++; global_busy++;

View File

@ -34,3 +34,16 @@ func Test_put_char_block2()
bw! bw!
call setreg('a', a[0], a[1]) call setreg('a', a[0], a[1])
endfunc endfunc
func Test_put_expr()
new
call setline(1, repeat(['A'], 6))
exec "1norm! \"=line('.')\<cr>p"
norm! j0.
norm! j0.
exec "4norm! \"=\<cr>P"
norm! j0.
norm! j0.
call assert_equal(['A1','A2','A3','4A','5A','6A'], getline(1,'$'))
bw!
endfunc