Compare commits

...

17 Commits

Author SHA1 Message Date
Bram Moolenaar
6b40f30329 patch 8.0.0299: a window resize is sometimes not taking effect
Problem:    When the GUI window is resized Vim does not always take over the
            new size. (Luchr)
Solution:   Reset new_p_guifont in gui_resize_shell().  Call
            gui_may_resize_shell() in the main loop.
2017-02-03 22:01:47 +01:00
Bram Moolenaar
cbf20fbcd3 patch 8.0.0298: Ex command range with repeated search does not work
Problem:    Ex command range with repeated search does not work. (Bruce
            DeVisser)
Solution:   Skip over \/, \? and \&.
2017-02-03 21:19:04 +01:00
Bram Moolenaar
03ff9bcbc9 patch 8.0.0297: double free on exit when using a closure
Problem:    Double free on exit when using a closure. (James McCoy)
Solution:   Split free_al_functions in two parts. (closes #1428)
2017-02-02 22:59:27 +01:00
Bram Moolenaar
fd8983b09c patch 8.0.0296: bracketed paste can only append, not insert
Problem:    Bracketed paste can only append, not insert.
Solution:   When the cursor is in the first column insert the text.
2017-02-02 22:21:29 +01:00
Bram Moolenaar
7a073549a3 patch 8.0.0295: test_viml hangs
Problem:    test_viml hangs.
Solution:   Put resetting 'more' before sourcing the script.
2017-02-01 23:17:36 +01:00
Bram Moolenaar
79da563cf9 patch 8.0.0294: argument list is not stored correctly in a session file
Problem:    Argument list is not stored correctly in a session file.
            (lgpasquale)
Solution:   Use "$argadd" instead of "argadd". (closes #1434)
2017-02-01 22:52:44 +01:00
Bram Moolenaar
e5f2a075e3 patch 8.0.0293: some tests have a one or three second wait
Problem:    Some tests have a one or three second wait.
Solution:   Reset the 'showmode' option.  Use a test time of one to disable
            sleep after an error or warning message.
2017-02-01 22:31:49 +01:00
Bram Moolenaar
a2f28859bf patch 8.0.0292: the stat test is a bit slow
Problem:    The stat test is a bit slow.
Solution:   Remove a couple of sleep comments and reduce another.
2017-02-01 22:05:28 +01:00
Bram Moolenaar
23fa81d222 patch 8.0.0291: Visual block insertion does not insert in all lines
Problem:    Visual block insertion does not insert in all lines.
Solution:   Don't bail out of insert too early. Add a test. (Christian
            Brabandt, closes #1290)
2017-02-01 21:50:21 +01:00
Bram Moolenaar
04e87b72c5 patch 8.0.0290: cursor positioning wrong if wide character wraps
Problem:    If a wide character doesn't fit at the end of the screen line, and
            the line doesn't fit on the screen, then the cursor position may
            be wrong. (anliting)
Solution:   Don't skip over wide character. (Christian Brabandt, closes #1408)
2017-02-01 21:23:10 +01:00
Bram Moolenaar
21d7c9b601 patch 8.0.0289: no test for "ga" and :ascii
Problem:    No test for "ga" and :ascii.
Solution:   Add a test. (Dominique Pelle, closes #1429)
2017-02-01 20:53:38 +01:00
Bram Moolenaar
4e032e1b17 patch 8.0.0288: errors reported while running tests
Problem:    Errors reported while running tests.
Solution:   Put comma in the right place.
2017-02-01 20:48:13 +01:00
Bram Moolenaar
c7d9eacefa patch 8.0.0287: debug mode: cannot access function arguments
Problem:    Cannot access the arguments of the current function in debug mode.
            (Luc Hermitte)
Solution:   use get_funccal(). (Lemonboy, closes #1432, closes #1352)
2017-02-01 20:26:51 +01:00
Bram Moolenaar
c10f0e7cb0 patch 8.0.0286: not always redrawing after screen resize
Problem:    When concealing is active and the screen is resized in the GUI it
            is not immediately redrawn.
Solution:   Use update_prepare() and update_finish() from
            update_single_line().
2017-02-01 18:37:14 +01:00
Bram Moolenaar
c386267ffe patch 8.0.0285: tests fail with tiny build on Unix
Problem:    Tests fail with tiny build on Unix.
Solution:   Only set g:tester_HOME when build with the +eval feature.
2017-02-01 18:07:38 +01:00
Bram Moolenaar
b245559fa9 patch 8.0.0284: collapse buffers test failed once
Problem:    The Test_collapse_buffers() test failed once, looks like it is
            flaky.
Solution:   Add it to the list of flaky tests.
2017-02-01 18:00:13 +01:00
Bram Moolenaar
e90858d022 patch 8.0.0283: mode() does not indicate Insert mode completion
Problem:    The return value of mode() does not indicate that completion is
            active in Replace and Insert mode. (Zhen-Huan (Kenny) Hu)
Solution:   Add "c" or "x" for two kinds of completion. (Yegappan Lakshmanan,
            closes #1397)  Test some more modes.
2017-02-01 17:24:34 +01:00
26 changed files with 479 additions and 151 deletions

View File

@@ -5848,9 +5848,13 @@ mode([expr]) Return a string that indicates the current mode.
S Select by line
CTRL-S Select blockwise
i Insert
ic Insert mode completion |compl-generic|
ix Insert mode |i_CTRL-X| completion
R Replace |R|
Rc Replace mode completion |compl-generic|
Rv Virtual Replace |gR|
c Command-line
Rx Replace mode |i_CTRL-X| completion
c Command-line editing
cv Vim Ex mode |gQ|
ce Normal Ex mode |Q|
r Hit-enter prompt

View File

@@ -1,4 +1,4 @@
*term.txt* For Vim version 8.0. Last change: 2017 Jan 27
*term.txt* For Vim version 8.0. Last change: 2017 Feb 02
VIM REFERENCE MANUAL by Bram Moolenaar
@@ -95,7 +95,12 @@ terminal when entering "raw" mode and 't_BD' when leaving "raw" mode. The
terminal is then expected to put 't_PS' before pasted text and 't_PE' after
pasted text. This way Vim can separate text that is pasted from characters
that are typed. The pasted text is handled like when the middle mouse button
is used.
is used, it is inserted literally and not interpreted as commands.
When the cursor is in the first column, the pasted text will be inserted
before it. Otherwise the pasted text is appended after the cursor position.
This means one cannot paste after the first column. Unfortunately Vim does
not have a way to tell where the mouse pointer was.
Note that in some situations Vim will not recognize the bracketed paste and
you will get the raw text. In other situations Vim will only get the first

View File

@@ -2127,8 +2127,9 @@ test_arglist \
test_fnameescape \
test_fnamemodify \
test_fold \
test_glob2regpat \
test_ga \
test_gf \
test_glob2regpat \
test_gn \
test_goto \
test_gui \

View File

@@ -7783,20 +7783,25 @@ f_mode(typval_T *argvars, typval_T *rettv)
}
else
#endif
{
if (State & REPLACE_FLAG)
buf[0] = 'R';
else
buf[0] = 'i';
#ifdef FEAT_INS_EXPAND
if (ins_compl_active())
buf[1] = 'c';
else if (ctrl_x_mode == 1)
buf[1] = 'x';
#endif
}
else if (State & CMDLINE)
}
else if ((State & CMDLINE) || exmode_active)
{
buf[0] = 'c';
if (exmode_active)
if (exmode_active == EXMODE_VIM)
buf[1] = 'v';
}
else if (exmode_active)
{
buf[0] = 'c';
else if (exmode_active == EXMODE_NORMAL)
buf[1] = 'e';
}
else

View File

@@ -4357,9 +4357,16 @@ skip_range(
{
unsigned delim;
while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;", *cmd) != NULL)
while (vim_strchr((char_u *)" \t0123456789.$%'/?-+,;\\", *cmd) != NULL)
{
if (*cmd == '\'')
if (*cmd == '\\')
{
if (cmd[1] == '?' || cmd[1] == '/' || cmd[1] == '&')
++cmd;
else
break;
}
else if (*cmd == '\'')
{
if (*++cmd == NUL && ctx != NULL)
*ctx = EXPAND_NOTHING;
@@ -11790,7 +11797,7 @@ ses_arglist(
s = buf;
}
}
if (fputs("argadd ", fd) < 0
if (fputs("$argadd ", fd) < 0
|| ses_put_fname(fd, s, flagp) == FAIL
|| put_eol(fd) == FAIL)
{

View File

@@ -1459,6 +1459,8 @@ gui_resize_shell(int pixel_width, int pixel_height)
}
again:
new_pixel_width = 0;
new_pixel_height = 0;
busy = TRUE;
/* Flush pending output before redrawing */
@@ -1468,8 +1470,8 @@ again:
gui.num_rows = (pixel_height - gui_get_base_height()) / gui.char_height;
gui_position_components(pixel_width);
gui_reset_scroll_region();
/*
* At the "more" and ":confirm" prompt there is no redraw, put the cursor
* at the last line here (why does it have to be one row too low?).
@@ -1491,18 +1493,23 @@ again:
busy = FALSE;
/*
* We could have been called again while redrawing the screen.
* Need to do it all again with the latest size then.
*/
/* We may have been called again while redrawing the screen.
* Need to do it all again with the latest size then. But only if the size
* actually changed. */
if (new_pixel_height)
{
if (pixel_width == new_pixel_width && pixel_height == new_pixel_height)
{
new_pixel_width = 0;
new_pixel_height = 0;
}
else
{
pixel_width = new_pixel_width;
pixel_height = new_pixel_height;
new_pixel_width = 0;
new_pixel_height = 0;
goto again;
}
}
}
/*
@@ -1511,18 +1518,10 @@ again:
void
gui_may_resize_shell(void)
{
int h, w;
if (new_pixel_height)
{
/* careful: gui_resize_shell() may postpone the resize again if we
* were called indirectly by it */
w = new_pixel_width;
h = new_pixel_height;
new_pixel_width = 0;
new_pixel_height = 0;
gui_resize_shell(w, h);
}
gui_resize_shell(new_pixel_width, new_pixel_height);
}
int

View File

@@ -1118,6 +1118,10 @@ main_loop(
skip_redraw = FALSE;
else if (do_redraw || stuff_empty())
{
# ifdef FEAT_GUI
/* If ui_breakcheck() was used a resize may have been postponed. */
gui_may_resize_shell();
# endif
#if defined(FEAT_AUTOCMD) || defined(FEAT_CONCEAL)
/* Trigger CursorMoved if the cursor moved. */
if (!finish_op && (

View File

@@ -3264,7 +3264,11 @@ change_warning(
#endif
msg_clr_eos();
(void)msg_end();
if (msg_silent == 0 && !silent_mode)
if (msg_silent == 0 && !silent_mode
#ifdef FEAT_EVAL
&& time_for_testing != 1
#endif
)
{
out_flush();
ui_delay(1000L, TRUE); /* give the user time to think about it */

View File

@@ -9079,8 +9079,13 @@ nv_edit(cmdarg_T *cap)
beginline(BL_WHITE|BL_FIX);
break;
case K_PS: /* Bracketed paste works like "a"ppend, unless the
cursor is in the first column, then it inserts. */
if (curwin->w_cursor.col == 0)
break;
/*FALLTHROUGH*/
case 'a': /* "a"ppend is like "i"nsert on the next character. */
case K_PS: /* bracketed paste works like "a"ppend */
#ifdef FEAT_VIRTUALEDIT
/* increment coladd when in virtual space, increment the
* column otherwise, also to append after an unprintable char */

View File

@@ -2571,8 +2571,7 @@ op_insert(oparg_T *oap, long count1)
}
t1 = oap->start;
if (edit(NUL, FALSE, (linenr_T)count1))
return;
(void)edit(NUL, FALSE, (linenr_T)count1);
/* When a tab was inserted, and the characters in front of the tab
* have been converted to a tab as well, the column of the cursor

View File

@@ -777,6 +777,57 @@ update_screen(int type)
#endif
}
#if defined(FEAT_SIGNS) || defined(FEAT_GUI) || defined(FEAT_CONCEAL)
/*
* Prepare for updating one or more windows.
* Caller must check for "updating_screen" already set to avoid recursiveness.
*/
static void
update_prepare(void)
{
cursor_off();
updating_screen = TRUE;
#ifdef FEAT_GUI
/* Remove the cursor before starting to do anything, because scrolling may
* make it difficult to redraw the text under it. */
if (gui.in_use)
gui_undraw_cursor();
#endif
#ifdef FEAT_SEARCH_EXTRA
start_search_hl();
#endif
}
/*
* Finish updating one or more windows.
*/
static void
update_finish(void)
{
if (redraw_cmdline)
showmode();
# ifdef FEAT_SEARCH_EXTRA
end_search_hl();
# endif
updating_screen = FALSE;
# ifdef FEAT_GUI
gui_may_resize_shell();
/* Redraw the cursor and update the scrollbars when all screen updating is
* done. */
if (gui.in_use)
{
out_flush(); /* required before updating the cursor */
gui_update_cursor(FALSE, FALSE);
gui_update_scrollbars(FALSE);
}
# endif
}
#endif
#if defined(FEAT_CONCEAL) || defined(PROTO)
/*
* Return TRUE if the cursor line in window "wp" may be concealed, according
@@ -826,17 +877,12 @@ update_single_line(win_T *wp, linenr_T lnum)
/* Don't do anything if the screen structures are (not yet) valid. */
if (!screen_valid(TRUE) || updating_screen)
return;
updating_screen = TRUE;
if (lnum >= wp->w_topline && lnum < wp->w_botline
&& foldedCount(wp, lnum, &win_foldinfo) == 0)
{
# ifdef FEAT_GUI
/* Remove the cursor before starting to do anything, because scrolling
* may make it difficult to redraw the text under it. */
if (gui.in_use)
gui_undraw_cursor();
# endif
update_prepare();
row = 0;
for (j = 0; j < wp->w_lines_valid; ++j)
{
@@ -856,68 +902,10 @@ update_single_line(win_T *wp, linenr_T lnum)
}
row += wp->w_lines[j].wl_size;
}
# ifdef FEAT_GUI
/* Redraw the cursor */
if (gui.in_use)
{
out_flush(); /* required before updating the cursor */
gui_update_cursor(FALSE, FALSE);
}
# endif
update_finish();
}
need_cursor_line_redraw = FALSE;
updating_screen = FALSE;
}
#endif
#if defined(FEAT_SIGNS) || defined(FEAT_GUI)
/*
* Prepare for updating one or more windows.
* Caller must check for "updating_screen" already set to avoid recursiveness.
*/
static void
update_prepare(void)
{
cursor_off();
updating_screen = TRUE;
#ifdef FEAT_GUI
/* Remove the cursor before starting to do anything, because scrolling may
* make it difficult to redraw the text under it. */
if (gui.in_use)
gui_undraw_cursor();
#endif
#ifdef FEAT_SEARCH_EXTRA
start_search_hl();
#endif
}
/*
* Finish updating one or more windows.
*/
static void
update_finish(void)
{
if (redraw_cmdline)
showmode();
# ifdef FEAT_SEARCH_EXTRA
end_search_hl();
# endif
updating_screen = FALSE;
# ifdef FEAT_GUI
gui_may_resize_shell();
/* Redraw the cursor and update the scrollbars when all screen updating is
* done. */
if (gui.in_use)
{
out_flush(); /* required before updating the cursor */
gui_update_cursor(FALSE, FALSE);
gui_update_scrollbars(FALSE);
}
# endif
}
#endif
@@ -2915,7 +2903,7 @@ win_line(
int endrow,
int nochange UNUSED) /* not updating for changed text */
{
int col; /* visual column on screen */
int col = 0; /* visual column on screen */
unsigned off; /* offset in ScreenLines/ScreenAttrs */
int c = 0; /* init for GCC */
long vcol = 0; /* virtual column (for tabs) */
@@ -3440,6 +3428,10 @@ win_line(
ptr = prev_ptr;
#else
--ptr;
#endif
#ifdef FEAT_MBYTE
/* character fits on the screen, don't need to skip it */
if ((*mb_ptr2cells)(ptr) >= c && col == 0)
#endif
n_skip = v - vcol;
}

View File

@@ -1337,6 +1337,7 @@ typedef struct
int uf_varargs; /* variable nr of arguments */
int uf_flags;
int uf_calls; /* nr of active calls */
int uf_cleared; /* func_clear() was already called */
garray_T uf_args; /* arguments */
garray_T uf_lines; /* function lines */
#ifdef FEAT_PROFILE

View File

@@ -88,6 +88,14 @@ endfunc
function RunTheTest(test)
echo 'Executing ' . a:test
" Avoid stopping at the "hit enter" prompt
set nomore
" Avoid a three second wait when a message is about to be overwritten by the
" mode message.
set noshowmode
if exists("*SetUp")
try
call SetUp()
@@ -153,16 +161,16 @@ endif
" Names of flaky tests.
let s:flaky = [
\ 'Test_reltime()',
\ 'Test_nb_basic()',
\ 'Test_communicate()',
\ 'Test_close_and_exit_cb()',
\ 'Test_collapse_buffers()',
\ 'Test_communicate()',
\ 'Test_nb_basic()',
\ 'Test_pipe_through_sort_all()',
\ 'Test_pipe_through_sort_some()'
\ 'Test_pipe_through_sort_some()',
\ 'Test_reltime()',
\ ]
" Locate Test_ functions and execute them.
set nomore
redir @q
silent function /^Test_
redir END

View File

@@ -19,6 +19,7 @@ source test_float_func.vim
source test_fnamemodify.vim
source test_functions.vim
source test_glob2regpat.vim
source test_ga.vim
source test_goto.vim
source test_help_tagjump.vim
source test_join.vim

View File

@@ -306,3 +306,28 @@ func Test_cmdline_complete_wildoptions()
call assert_equal(a, b)
bw!
endfunc
" using a leading backslash here
set cpo+=C
func Test_cmdline_search_range()
new
call setline(1, ['a', 'b', 'c', 'd'])
/d
1,\/s/b/B/
call assert_equal('B', getline(2))
/a
$
\?,4s/c/C/
call assert_equal('C', getline(3))
call setline(1, ['a', 'b', 'c', 'd'])
%s/c/c/
1,\&s/b/B/
call assert_equal('B', getline(2))
bwipe!
endfunc
set cpo&

View File

@@ -304,4 +304,89 @@ func Test_toupper()
call assert_equal("Ⱥ Ⱦ", toupper("ⱥ ⱦ"))
endfunc
" Tests for the mode() function
let current_modes = ''
func! Save_mode()
let g:current_modes = mode(0) . '-' . mode(1)
return ''
endfunc
func! Test_mode()
new
call append(0, ["Blue Ball Black", "Brown Band Bowl", ""])
inoremap <F2> <C-R>=Save_mode()<CR>
normal! 3G
exe "normal i\<F2>\<Esc>"
call assert_equal('i-i', g:current_modes)
exe "normal i\<C-G>uBa\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBa\<C-X>\<F2>\<Esc>u"
call assert_equal('i-ix', g:current_modes)
exe "normal iBa\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iCom\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal iCom\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('i-ic', g:current_modes)
exe "normal RBa\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBa\<C-X>\<F2>\<Esc>u"
call assert_equal('R-Rx', g:current_modes)
exe "normal RBa\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RBro\<C-X>\<C-P>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RCom\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
exe "normal RCom\<C-X>\<C-P>\<F2>\<Esc>u"
call assert_equal('R-Rc', g:current_modes)
call assert_equal('n', mode(0))
call assert_equal('n', mode(1))
" How to test operator-pending mode?
call feedkeys("v", 'xt')
call assert_equal('v', mode())
call assert_equal('v', mode(1))
call feedkeys("\<Esc>V", 'xt')
call assert_equal('V', mode())
call assert_equal('V', mode(1))
call feedkeys("\<Esc>\<C-V>", 'xt')
call assert_equal("\<C-V>", mode())
call assert_equal("\<C-V>", mode(1))
call feedkeys("\<Esc>", 'xt')
call feedkeys("gh", 'xt')
call assert_equal('s', mode())
call assert_equal('s', mode(1))
call feedkeys("\<Esc>gH", 'xt')
call assert_equal('S', mode())
call assert_equal('S', mode(1))
call feedkeys("\<Esc>g\<C-H>", 'xt')
call assert_equal("\<C-S>", mode())
call assert_equal("\<C-S>", mode(1))
call feedkeys("\<Esc>", 'xt')
call feedkeys(":echo \<C-R>=Save_mode()\<C-U>\<CR>", 'xt')
call assert_equal('c-c', g:current_modes)
call feedkeys("gQecho \<C-R>=Save_mode()\<CR>\<CR>vi\<CR>", 'xt')
call assert_equal('c-cv', g:current_modes)
" How to test Ex mode?
bwipe!
iunmap <F2>
endfunc

37
src/testdir/test_ga.vim Normal file
View File

@@ -0,0 +1,37 @@
" Test ga normal command, and :ascii Ex command.
func Do_ga(c)
call setline(1, a:c)
let l:a = execute("norm 1goga")
let l:b = execute("ascii")
call assert_equal(l:a, l:b)
return l:a
endfunc
func Test_ga_command()
new
set display=uhex
call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<<01>> 1, Hex 01, Octal 001", Do_ga("\x01"))
call assert_equal("\n<<09>> 9, Hex 09, Octal 011", Do_ga("\t"))
set display=
call assert_equal("\nNUL", Do_ga(''))
call assert_equal("\n<^A> 1, Hex 01, Octal 001", Do_ga("\x01"))
call assert_equal("\n<^I> 9, Hex 09, Octal 011", Do_ga("\t"))
call assert_equal("\n<e> 101, Hex 65, Octal 145", Do_ga('e'))
if !has('multi_byte')
return
endif
" Test a few multi-bytes characters.
call assert_equal("\n<é> 233, Hex 00e9, Octal 351", Do_ga('é'))
call assert_equal("\n<ẻ> 7867, Hex 1ebb, Octal 17273", Do_ga('ẻ'))
" Test with combining characters.
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401", Do_ga("e\u0301"))
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461", Do_ga("e\u0301\u0331"))
call assert_equal("\n<e> 101, Hex 65, Octal 145 < ́> 769, Hex 0301, Octal 1401 < ̱> 817, Hex 0331, Octal 1461 < ̸> 824, Hex 0338, Octal 1470", Do_ga("e\u0301\u0331\u0338"))
bwipe!
endfunc

View File

@@ -110,6 +110,8 @@ func Test_map_langmap()
call feedkeys(":call append(line('$'), '+')\<CR>", "xt")
call assert_equal('+', getline('$'))
iunmap a
iunmap c
set nomodified
endfunc
@@ -120,7 +122,7 @@ func Test_map_feedkeys()
$-1
call feedkeys("0qqdw.ifoo\<Esc>qj0@q\<Esc>", "xt")
call assert_equal(['fooc d', 'fooc d'], getline(line('$') - 1, line('$')))
unmap .
nunmap .
set nomodified
endfunc

View File

@@ -110,4 +110,16 @@ func Test_mksession_winheight()
call delete('Xtest_mks.out')
endfunc
func Test_mksession_arglist()
argdel *
next file1 file2 file3 file4
mksession! Xtest_mks.out
source Xtest_mks.out
call assert_equal(['file1', 'file2', 'file3', 'file4'], argv())
call delete('Xtest_mks.out')
argdel *
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@@ -2193,6 +2193,8 @@ func! Test_normal51_FileChangedRO()
if !has("autocmd")
return
endif
" Don't sleep after the warning message.
call test_settime(1)
call writefile(['foo'], 'Xreadonly.log')
new Xreadonly.log
setl ro
@@ -2202,6 +2204,7 @@ func! Test_normal51_FileChangedRO()
call assert_equal('Xreadonly.log', bufname(''))
" cleanup
call test_settime(0)
bw!
call delete("Xreadonly.log")
endfunc

View File

@@ -8,18 +8,36 @@ set term=xterm
func Test_paste_normal_mode()
new
" In first column text is inserted
call setline(1, ['a', 'b', 'c'])
2
call cursor(2, 1)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bfoo', getline(2))
call assert_equal('bar', getline(3))
call assert_equal('foo', getline(2))
call assert_equal('barb', getline(3))
call assert_equal('c', getline(4))
" When repeating text is appended
normal .
call assert_equal('barfoo', getline(3))
call assert_equal('bar', getline(4))
call assert_equal('barb', getline(4))
call assert_equal('c', getline(5))
bwipe!
" In second column text is appended
call setline(1, ['a', 'bbb', 'c'])
call cursor(2, 2)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bbfoo', getline(2))
call assert_equal('barb', getline(3))
call assert_equal('c', getline(4))
" In last column text is appended
call setline(1, ['a', 'bbb', 'c'])
call cursor(2, 3)
call feedkeys("\<Esc>[200~foo\<CR>bar\<Esc>[201~", 'xt')
call assert_equal('bbbfoo', getline(2))
call assert_equal('bar', getline(3))
call assert_equal('c', getline(4))
endfunc
func Test_paste_insert_mode()

View File

@@ -1,24 +1,24 @@
" Tests for stat functions and checktime
func Test_existent_file()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
let ts=localtime()
sleep 1
let fl=['Hello World!']
let ts = localtime()
let fl = ['Hello World!']
call writefile(fl, fname)
let tf=getftime(fname)
sleep 1
let te=localtime()
let tf = getftime(fname)
let te = localtime()
call assert_true(ts <= tf && tf <= te)
call assert_equal(strlen(fl[0] . "\n"), getfsize(fname))
call assert_equal('file', getftype(fname))
call assert_equal('rw-', getfperm(fname)[0:2])
call delete(fname)
endfunc
func Test_existent_directory()
let dname='.'
let dname = '.'
call assert_equal(0, getfsize(dname))
call assert_equal('dir', getftype(dname))
@@ -26,22 +26,29 @@ func Test_existent_directory()
endfunc
func Test_checktime()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
let fl=['Hello World!']
let fl = ['Hello World!']
call writefile(fl, fname)
set autoread
exec 'e' fname
" FAT has a granularity of 2 seconds, otherwise it's usually 1 second
if has('win32')
sleep 2
let fl=readfile(fname)
else
sleep 1
endif
let fl = readfile(fname)
let fl[0] .= ' - checktime'
call writefile(fl, fname)
checktime
call assert_equal(fl[0], getline(1))
call delete(fname)
endfunc
func Test_nonexistent_file()
let fname='Xtest.tmp'
let fname = 'Xtest.tmp'
call delete(fname)
call assert_equal(-1, getftime(fname))
@@ -55,7 +62,7 @@ func Test_win32_symlink_dir()
" So we use an existing symlink for this test.
if has('win32')
" Check if 'C:\Users\All Users' is a symlink to a directory.
let res=system('dir C:\Users /a')
let res = system('dir C:\Users /a')
if match(res, '\C<SYMLINKD> *All Users') >= 0
" Get the filetype of the symlink.
call assert_equal('dir', getftype('C:\Users\All Users'))

View File

@@ -23,3 +23,16 @@ func Test_dotregister_paste()
call assert_equal('hello world world', getline(1))
q!
endfunc
func Test_Visual_ctrl_o()
new
call setline(1, ['one', 'two', 'three'])
call cursor(1,2)
set noshowmode
set tw=0
call feedkeys("\<c-v>jjlIa\<c-\>\<c-o>:set tw=88\<cr>\<esc>", 'tx')
call assert_equal(['oane', 'tawo', 'tahree'], getline(1, 3))
call assert_equal(88, &tw)
set tw&
bw!
endfu

View File

@@ -2,9 +2,12 @@
" Always use "sh", don't use the value of "$SHELL".
set shell=sh
" While some tests overwrite $HOME to prevent them from polluting user files,
" we need to remember the original value so that we can tell external systems
" where to ask about their own user settings.
let g:tester_HOME = $HOME
" Only when the +eval feature is present.
if 1
" While some tests overwrite $HOME to prevent them from polluting user files,
" we need to remember the original value so that we can tell external systems
" where to ask about their own user settings.
let g:tester_HOME = $HOME
endif
source setup.vim

View File

@@ -1075,12 +1075,17 @@ func_remove(ufunc_T *fp)
}
/*
* Free a function and remove it from the list of functions.
* Free all things that a function contains. Does not free the function
* itself, use func_free() for that.
* When "force" is TRUE we are exiting.
*/
static void
func_free(ufunc_T *fp, int force)
func_clear(ufunc_T *fp, int force)
{
if (fp->uf_cleared)
return;
fp->uf_cleared = TRUE;
/* clear this function */
ga_clear_strings(&(fp->uf_args));
ga_clear_strings(&(fp->uf_lines));
@@ -1089,16 +1094,35 @@ func_free(ufunc_T *fp, int force)
vim_free(fp->uf_tml_total);
vim_free(fp->uf_tml_self);
#endif
funccal_unref(fp->uf_scoped, fp, force);
}
/*
* Free a function and remove it from the list of functions. Does not free
* what a function contains, call func_clear() first.
*/
static void
func_free(ufunc_T *fp)
{
/* only remove it when not done already, otherwise we would remove a newer
* version of the function */
if ((fp->uf_flags & (FC_DELETED | FC_REMOVED)) == 0)
func_remove(fp);
funccal_unref(fp->uf_scoped, fp, force);
vim_free(fp);
}
/*
* Free all things that a function contains and free the function itself.
* When "force" is TRUE we are exiting.
*/
static void
func_clear_free(ufunc_T *fp, int force)
{
func_clear(fp, force);
func_free(fp);
}
/*
* There are two kinds of function names:
* 1. ordinary names, function defined with :function
@@ -1120,10 +1144,40 @@ free_all_functions(void)
hashitem_T *hi;
ufunc_T *fp;
long_u skipped = 0;
long_u todo;
long_u todo = 1;
long_u used;
/* Need to start all over every time, because func_free() may change the
* hash table. */
/* First clear what the functions contain. Since this may lower the
* reference count of a function, it may also free a function and change
* the hash table. Restart if that happens. */
while (todo > 0)
{
todo = func_hashtab.ht_used;
for (hi = func_hashtab.ht_array; todo > 0; ++hi)
if (!HASHITEM_EMPTY(hi))
{
/* Only free functions that are not refcounted, those are
* supposed to be freed when no longer referenced. */
fp = HI2UF(hi);
if (func_name_refcount(fp->uf_name))
++skipped;
else
{
used = func_hashtab.ht_used;
func_clear(fp, TRUE);
if (used != func_hashtab.ht_used)
{
skipped = 0;
break;
}
}
--todo;
}
}
/* Now actually free the functions. Need to start all over every time,
* because func_free() may change the hash table. */
skipped = 0;
while (func_hashtab.ht_used > skipped)
{
todo = func_hashtab.ht_used;
@@ -1138,7 +1192,7 @@ free_all_functions(void)
++skipped;
else
{
func_free(fp, TRUE);
func_free(fp);
skipped = 0;
break;
}
@@ -1356,7 +1410,7 @@ call_func(
if (--fp->uf_calls <= 0 && fp->uf_refcount <= 0)
/* Function was unreferenced while being used, free it
* now. */
func_free(fp, FALSE);
func_clear_free(fp, FALSE);
if (did_save_redo)
restoreRedobuff();
restore_search_patterns();
@@ -2756,7 +2810,7 @@ ex_delfunction(exarg_T *eap)
fp->uf_flags |= FC_DELETED;
}
else
func_free(fp, FALSE);
func_clear_free(fp, FALSE);
}
}
}
@@ -2785,7 +2839,7 @@ func_unref(char_u *name)
/* Only delete it when it's not being used. Otherwise it's done
* when "uf_calls" becomes zero. */
if (fp->uf_calls == 0)
func_free(fp, FALSE);
func_clear_free(fp, FALSE);
}
}
@@ -2801,7 +2855,7 @@ func_ptr_unref(ufunc_T *fp)
/* Only delete it when it's not being used. Otherwise it's done
* when "uf_calls" becomes zero. */
if (fp->uf_calls == 0)
func_free(fp, FALSE);
func_clear_free(fp, FALSE);
}
}
@@ -3556,7 +3610,7 @@ get_funccal_args_var()
{
if (current_funccal == NULL)
return NULL;
return &current_funccal->l_avars_var;
return &get_funccal()->l_avars_var;
}
/*

View File

@@ -764,6 +764,40 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
299,
/**/
298,
/**/
297,
/**/
296,
/**/
295,
/**/
294,
/**/
293,
/**/
292,
/**/
291,
/**/
290,
/**/
289,
/**/
288,
/**/
287,
/**/
286,
/**/
285,
/**/
284,
/**/
283,
/**/
282,
/**/