diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 3e1e8d9613..6e4087062f 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -3878,7 +3878,6 @@ set_one_cmd_context( case CMD_cfdo: case CMD_confirm: case CMD_debug: - case CMD_filter: case CMD_folddoclosed: case CMD_folddoopen: case CMD_hide: @@ -3903,6 +3902,16 @@ set_one_cmd_context( case CMD_windo: return arg; + case CMD_filter: + if (*arg != NUL) + arg = skip_vimgrep_pat(arg, NULL, NULL); + if (arg == NULL || *arg == NUL) + { + xp->xp_context = EXPAND_NOTHING; + return NULL; + } + return skipwhite(arg); + #ifdef FEAT_CMDL_COMPL # ifdef FEAT_SEARCH_EXTRA case CMD_match: diff --git a/src/misc1.c b/src/misc1.c index 09b7bec173..5ceb951e00 100644 --- a/src/misc1.c +++ b/src/misc1.c @@ -5428,7 +5428,6 @@ static int skip_label(linenr_T, char_u **pp); static int cin_first_id_amount(void); static int cin_get_equal_amount(linenr_T lnum); static int cin_ispreproc(char_u *); -static int cin_ispreproc_cont(char_u **pp, linenr_T *lnump); static int cin_iscomment(char_u *); static int cin_islinecomment(char_u *); static int cin_isterminated(char_u *, int, int); @@ -6008,13 +6007,18 @@ cin_ispreproc(char_u *s) * Return TRUE if line "*pp" at "*lnump" is a preprocessor statement or a * continuation line of a preprocessor statement. Decrease "*lnump" to the * start and return the line in "*pp". + * Put the amount of indent in "*amount". */ static int -cin_ispreproc_cont(char_u **pp, linenr_T *lnump) +cin_ispreproc_cont(char_u **pp, linenr_T *lnump, int *amount) { char_u *line = *pp; linenr_T lnum = *lnump; int retval = FALSE; + int candidate_amount = *amount; + + if (*line != NUL && line[STRLEN(line) - 1] == '\\') + candidate_amount = get_indent_lnum(lnum); for (;;) { @@ -6033,6 +6037,8 @@ cin_ispreproc_cont(char_u **pp, linenr_T *lnump) if (lnum != *lnump) *pp = ml_get(*lnump); + if (retval) + *amount = candidate_amount; return retval; } @@ -7396,7 +7402,7 @@ get_c_indent(void) l = skipwhite(ml_get(lnum)); if (cin_nocode(l)) /* skip comment lines */ continue; - if (cin_ispreproc_cont(&l, &lnum)) + if (cin_ispreproc_cont(&l, &lnum, &amount)) continue; /* ignore #define, #if, etc. */ curwin->w_cursor.lnum = lnum; @@ -7809,10 +7815,10 @@ get_c_indent(void) */ if (curwin->w_cursor.lnum <= ourscope) { - /* we reached end of scope: - * if looking for a enum or structure initialization + /* We reached end of scope: + * If looking for a enum or structure initialization * go further back: - * if it is an initializer (enum xxx or xxx =), then + * If it is an initializer (enum xxx or xxx =), then * don't add ind_continuation, otherwise it is a variable * declaration: * int x, @@ -7851,7 +7857,8 @@ get_c_indent(void) /* * Skip preprocessor directives and blank lines. */ - if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) continue; if (cin_nocode(l)) @@ -7968,7 +7975,8 @@ get_c_indent(void) } /* Skip preprocessor directives and blank lines. */ - if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, + &amount)) continue; /* Finally the actual check for "namespace". */ @@ -8144,7 +8152,7 @@ get_c_indent(void) * unlocked it) */ l = ml_get_curline(); - if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum) + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount) || cin_nocode(l)) continue; @@ -8865,7 +8873,7 @@ term_again: /* * Skip preprocessor directives and blank lines. */ - if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum)) + if (cin_ispreproc_cont(&l, &curwin->w_cursor.lnum, &amount)) continue; if (cin_nocode(l)) @@ -8966,7 +8974,7 @@ term_again: { look = ml_get(--curwin->w_cursor.lnum); if (!(cin_nocode(look) || cin_ispreproc_cont( - &look, &curwin->w_cursor.lnum))) + &look, &curwin->w_cursor.lnum, &amount))) break; } if (curwin->w_cursor.lnum > 0 diff --git a/src/testdir/test3.in b/src/testdir/test3.in index 096f15219d..e8648d382c 100644 --- a/src/testdir/test3.in +++ b/src/testdir/test3.in @@ -2317,6 +2317,25 @@ h, i; JSEND +STARTTEST +:set cin cino& +/start of define +=/end of define +ENDTEST + +/* start of define */ +{ +} +#define AAA \ +BBB\ +CCC + +#define CNT \ +1 + \ +2 + \ +4 +/* end of define */ + STARTTEST :g/^STARTTEST/.,/^ENDTEST/d :1;/start of AUTO/,$wq! test.out diff --git a/src/testdir/test3.ok b/src/testdir/test3.ok index 2f9572cc13..cfb519bdf4 100644 --- a/src/testdir/test3.ok +++ b/src/testdir/test3.ok @@ -2080,3 +2080,17 @@ var a, i; JSEND + +/* start of define */ +{ +} +#define AAA \ + BBB\ + CCC + +#define CNT \ + 1 + \ + 2 + \ + 4 +/* end of define */ + diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim index 0bbd905c85..5aa5fa64df 100644 --- a/src/testdir/test_filter_cmd.vim +++ b/src/testdir/test_filter_cmd.vim @@ -52,3 +52,25 @@ func Test_filter_fails() call assert_fails('filter! /pat/', 'E476:') call assert_fails('filter! /pat/ asdf', 'E492:') endfunc + +function s:complete_filter_cmd(filtcmd) + let keystroke = "\\=execute('let cmdline = getcmdline()')\\" + let cmdline = '' + call feedkeys(':' . a:filtcmd . keystroke, 'ntx') + return cmdline +endfunction + +func Test_filter_cmd_completion() + " Do not complete pattern + call assert_equal("filter \t", s:complete_filter_cmd('filter ')) + call assert_equal("filter pat\t", s:complete_filter_cmd('filter pat')) + call assert_equal("filter /pat\t", s:complete_filter_cmd('filter /pat')) + call assert_equal("filter /pat/\t", s:complete_filter_cmd('filter /pat/')) + + " Complete after string pattern + call assert_equal('filter pat print', s:complete_filter_cmd('filter pat pri')) + + " Complete after regexp pattern + call assert_equal('filter /pat/ print', s:complete_filter_cmd('filter /pat/ pri')) + call assert_equal('filter #pat# print', s:complete_filter_cmd('filter #pat# pri')) +endfunc diff --git a/src/testdir/test_undo.vim b/src/testdir/test_undo.vim index fb1cdc836a..f2ac6a8eab 100644 --- a/src/testdir/test_undo.vim +++ b/src/testdir/test_undo.vim @@ -235,3 +235,31 @@ func Test_insert_expr() close! endfunc + +func Test_undofile_earlier() + " Issue #1254 + " create undofile with timestamps older than Vim startup time. + let t0 = localtime() - 43200 + call test_settime(t0) + new Xfile + call feedkeys("ione\", 'xt') + set ul=100 + call test_settime(t0 + 1) + call feedkeys("otwo\", 'xt') + set ul=100 + call test_settime(t0 + 2) + call feedkeys("othree\", 'xt') + set ul=100 + w + wundo Xundofile + bwipe! + " restore normal timestamps. + call test_settime(0) + new Xfile + rundo Xundofile + earlier 1d + call assert_equal('', getline(1)) + bwipe! + call delete('Xfile') + call delete('Xundofile') +endfunc diff --git a/src/undo.c b/src/undo.c index 5a3a5a8fd6..abbfc23f6c 100644 --- a/src/undo.c +++ b/src/undo.c @@ -2298,10 +2298,8 @@ undo_time( } else { - /* When doing computations with time_t subtract starttime, because - * time_t converted to a long may result in a wrong number. */ if (dosec) - target = (long)(curbuf->b_u_time_cur - starttime) + step; + target = (long)(curbuf->b_u_time_cur) + step; else if (dofile) { if (step < 0) @@ -2350,7 +2348,7 @@ undo_time( else { if (dosec) - closest = (long)(vim_time() - starttime + 1); + closest = (long)(vim_time() + 1); else if (dofile) closest = curbuf->b_u_save_nr_last + 2; else @@ -2388,7 +2386,7 @@ undo_time( { uhp->uh_walk = mark; if (dosec) - val = (long)(uhp->uh_time - starttime); + val = (long)(uhp->uh_time); else if (dofile) val = uhp->uh_save_nr; else diff --git a/src/version.c b/src/version.c index 698f2dce88..242f4b5677 100644 --- a/src/version.c +++ b/src/version.c @@ -779,6 +779,12 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 150, +/**/ + 149, +/**/ + 148, /**/ 147, /**/