Merge #7855 from ckelsel/vim-8.0.0398

This commit is contained in:
Justin M. Keyes
2018-01-15 22:10:05 +01:00
committed by GitHub
7 changed files with 73 additions and 18 deletions

View File

@@ -3366,6 +3366,10 @@ set_context_in_map_cmd (
arg = skipwhite(arg + 8); arg = skipwhite(arg + 8);
continue; continue;
} }
if (STRNCMP(arg, "<special>", 9) == 0) {
arg = skipwhite(arg + 9);
continue;
}
if (STRNCMP(arg, "<script>", 8) == 0) { if (STRNCMP(arg, "<script>", 8) == 0) {
arg = skipwhite(arg + 8); arg = skipwhite(arg + 8);
continue; continue;
@@ -3408,21 +3412,24 @@ int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file)
for (round = 1; round <= 2; ++round) { for (round = 1; round <= 2; ++round) {
count = 0; count = 0;
for (i = 0; i < 6; ++i) { for (i = 0; i < 7; i++) {
if (i == 0) if (i == 0) {
p = (char_u *)"<silent>"; p = (char_u *)"<silent>";
else if (i == 1) } else if (i == 1) {
p = (char_u *)"<unique>"; p = (char_u *)"<unique>";
else if (i == 2) } else if (i == 2) {
p = (char_u *)"<script>"; p = (char_u *)"<script>";
else if (i == 3) } else if (i == 3) {
p = (char_u *)"<expr>"; p = (char_u *)"<expr>";
else if (i == 4 && !expand_buffer) } else if (i == 4 && !expand_buffer) {
p = (char_u *)"<buffer>"; p = (char_u *)"<buffer>";
else if (i == 5) } else if (i == 5) {
p = (char_u *)"<nowait>"; p = (char_u *)"<nowait>";
else } else if (i == 6) {
p = (char_u *)"<special>";
} else {
continue; continue;
}
if (vim_regexec(regmatch, p, (colnr_T)0)) { if (vim_regexec(regmatch, p, (colnr_T)0)) {
if (round == 1) if (round == 1)

View File

@@ -749,8 +749,9 @@ open_line (
// Postpone calling changed_lines(), because it would mess up folding // Postpone calling changed_lines(), because it would mess up folding
// with markers. // with markers.
// Skip mark_adjust when adding a line after the last one, there can't // Skip mark_adjust when adding a line after the last one, there can't
// be marks there. // be marks there. But still needed in diff mode.
if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count) { if (curwin->w_cursor.lnum + 1 < curbuf->b_ml.ml_line_count
|| curwin->w_p_diff) {
mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false); mark_adjust(curwin->w_cursor.lnum + 1, (linenr_T)MAXLNUM, 1L, 0L, false);
} }
did_append = true; did_append = true;
@@ -1864,8 +1865,8 @@ void appended_lines(linenr_T lnum, long count)
void appended_lines_mark(linenr_T lnum, long count) void appended_lines_mark(linenr_T lnum, long count)
{ {
// Skip mark_adjust when adding a line after the last one, there can't // Skip mark_adjust when adding a line after the last one, there can't
// be marks there. // be marks there. But it's still needed in diff mode.
if (lnum + count < curbuf->b_ml.ml_line_count) { if (lnum + count < curbuf->b_ml.ml_line_count || curwin->w_p_diff) {
mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L, false); mark_adjust(lnum + 1, (linenr_T)MAXLNUM, count, 0L, false);
} }
changed_lines(lnum + 1, 0, lnum + 1, count); changed_lines(lnum + 1, 0, lnum + 1, count);

View File

@@ -3177,9 +3177,9 @@ error:
curbuf->b_op_start.lnum++; curbuf->b_op_start.lnum++;
} }
// Skip mark_adjust when adding lines after the last one, there // Skip mark_adjust when adding lines after the last one, there
// can't be marks there. // can't be marks there. But still needed in diff mode.
if (curbuf->b_op_start.lnum + (y_type == kMTCharWise) - 1 + nr_lines if (curbuf->b_op_start.lnum + (y_type == kMTCharWise) - 1 + nr_lines
< curbuf->b_ml.ml_line_count) { < curbuf->b_ml.ml_line_count || curwin->w_p_diff) {
mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise), mark_adjust(curbuf->b_op_start.lnum + (y_type == kMTCharWise),
(linenr_T)MAXLNUM, nr_lines, 0L, false); (linenr_T)MAXLNUM, nr_lines, 0L, false);
} }

View File

@@ -1382,13 +1382,13 @@ int searchc(cmdarg_T *cap, int t_cmd)
col -= (*mb_head_off)(p, p + col - 1) + 1; col -= (*mb_head_off)(p, p + col - 1) + 1;
} }
if (lastc_bytelen == 1) { if (lastc_bytelen == 1) {
if (p[col] == c && stop) if (p[col] == c && stop) {
break; break;
} else { }
if (memcmp(p + col, lastc_bytes, lastc_bytelen) == 0 && stop) } else if (STRNCMP(p + col, lastc_bytes, lastc_bytelen) == 0 && stop) {
break; break;
} }
stop = TRUE; stop = true;
} }
} else { } else {
for (;; ) { for (;; ) {

View File

@@ -25,6 +25,26 @@ func Test_complete_wildmenu()
set nowildmenu set nowildmenu
endfunc endfunc
func Test_map_completion()
if !has('cmdline_compl')
return
endif
call feedkeys(":map <unique> <si\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <unique> <silent>', getreg(':'))
call feedkeys(":map <script> <un\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <script> <unique>', getreg(':'))
call feedkeys(":map <expr> <sc\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <expr> <script>', getreg(':'))
call feedkeys(":map <buffer> <e\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <buffer> <expr>', getreg(':'))
call feedkeys(":map <nowait> <b\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <nowait> <buffer>', getreg(':'))
call feedkeys(":map <special> <no\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <special> <nowait>', getreg(':'))
call feedkeys(":map <silent> <sp\<Tab>\<Home>\"\<CR>", 'xt')
call assert_equal('"map <silent> <special>', getreg(':'))
endfunc
func Test_expr_completion() func Test_expr_completion()
if !(has('cmdline_compl') && has('eval')) if !(has('cmdline_compl') && has('eval'))
return return

View File

@@ -272,3 +272,23 @@ func Test_setting_cursor()
call delete('Xtest1') call delete('Xtest1')
call delete('Xtest2') call delete('Xtest2')
endfunc endfunc
func Test_diff_lastline()
enew!
only!
call setline(1, ['This is a ', 'line with five ', 'rows'])
diffthis
botright vert new
call setline(1, ['This is', 'a line with ', 'four rows'])
diffthis
1
call feedkeys("Je a\<CR>", 'tx')
call feedkeys("Je a\<CR>", 'tx')
let w1lines = winline()
wincmd w
$
let w2lines = winline()
call assert_equal(w2lines, w1lines)
bwipe!
bwipe!
endfunc

View File

@@ -298,3 +298,10 @@ func Test_searchpair()
q! q!
endfunc endfunc
func Test_searchc()
" These commands used to cause memory overflow in searchc().
new
norm ixx
exe "norm 0t\u93cf"
bw!
endfunc