diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 75bb5eb70a..062d0f82e6 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -2360,7 +2360,6 @@ tempname() String name for a temporary file test_alloc_fail({id}, {countdown}, {repeat}) none make memory allocation fail test_autochdir() none enable 'autochdir' during startup -test_disable_char_avail({expr}) none test without typeahead test_garbagecollect_now() none free memory right now for testing test_ignore_error({expr}) none ignore a specific error test_null_channel() Channel null value for testing @@ -2369,6 +2368,7 @@ test_null_job() Job null value for testing test_null_list() List null value for testing test_null_partial() Funcref null value for testing test_null_string() String null value for testing +test_override({expr}, {val}) none test with Vim internal overrides test_settime({expr}) none set current time for testing timer_info([{id}]) List information about timers timer_pause({id}, {pause}) none pause or unpause a timer diff --git a/src/Makefile b/src/Makefile index 341e2e7940..fbff5f8805 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2128,6 +2128,7 @@ test_arglist \ test_digraph \ test_functions \ test_display \ + test_edit \ test_ex_undo \ test_execute_func \ test_expand \ diff --git a/src/auto/configure b/src/auto/configure index 9bafc897d2..3a73d5a351 100755 --- a/src/auto/configure +++ b/src/auto/configure @@ -4124,9 +4124,9 @@ if test "$GCC" = yes; then fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for recent clang version" >&5 -$as_echo_n "checking for recent clang version... " >&6; } -CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang.*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'` +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clang version" >&5 +$as_echo_n "checking for clang version... " >&6; } +CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang[^0-9]*\([0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\).*$/\1/p'` if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_MAJOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/\([0-9][0-9]*\)\.[0-9][0-9]*\.[0-9][0-9]*/\1/p'` CLANG_MINOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/[0-9][0-9]*\.\([0-9][0-9]*\)\.[0-9][0-9]*/\1/p'` @@ -4134,12 +4134,19 @@ if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_VERSION=`expr $CLANG_MAJOR '*' 1000000 '+' $CLANG_MINOR '*' 1000 '+' $CLANG_REVISION` { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CLANG_VERSION" >&5 $as_echo "$CLANG_VERSION" >&6; } - if test "$CLANG_VERSION" -ge 500002075 ; then - CFLAGS=`echo "$CFLAGS" | sed -n -e 's/-fno-strength-reduce/ /p'` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if clang supports -fno-strength-reduce" >&5 +$as_echo_n "checking if clang supports -fno-strength-reduce... " >&6; } + if test "$CLANG_VERSION" -ge 500002075 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } fi else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } + { $as_echo "$as_me:${as_lineno-$LINENO}: result: N/A" >&5 +$as_echo "N/A" >&6; } fi CROSS_COMPILING= @@ -10218,6 +10225,18 @@ fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for /proc/self/exe" >&5 +$as_echo_n "checking for /proc/self/exe... " >&6; } +if test -L "/proc/self/exe"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAVE_PROC_SELF_EXE 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for CYGWIN or MSYS environment" >&5 $as_echo_n "checking for CYGWIN or MSYS environment... " >&6; } case `uname` in diff --git a/src/configure.ac b/src/configure.ac index a875bf1c8d..72ca52e62e 100644 --- a/src/configure.ac +++ b/src/configure.ac @@ -67,8 +67,8 @@ dnl clang-500.2.75 or around has abandoned -f[no-]strength-reduce and issues a dnl warning when that flag is passed to. Accordingly, adjust CFLAGS based on dnl the version number of the clang in use. dnl Note that this does not work to get the version of clang 3.1 or 3.2. -AC_MSG_CHECKING(for recent clang version) -CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang.*\([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\).*$/\1/p'` +AC_MSG_CHECKING(for clang version) +CLANG_VERSION_STRING=`$CC --version 2>/dev/null | sed -n -e 's/^.*clang[[^0-9]]*\([[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*\).*$/\1/p'` if test x"$CLANG_VERSION_STRING" != x"" ; then CLANG_MAJOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/\([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*\.[[0-9]][[0-9]]*/\1/p'` CLANG_MINOR=`echo "$CLANG_VERSION_STRING" | sed -n -e 's/[[0-9]][[0-9]]*\.\([[0-9]][[0-9]]*\)\.[[0-9]][[0-9]]*/\1/p'` @@ -79,11 +79,15 @@ if test x"$CLANG_VERSION_STRING" != x"" ; then dnl change the constant 500002075 below appropriately. To get the dnl integer corresponding to a version number, refer to the dnl definition of CLANG_VERSION above. + AC_MSG_CHECKING(if clang supports -fno-strength-reduce) if test "$CLANG_VERSION" -ge 500002075 ; then - CFLAGS=`echo "$CFLAGS" | sed -n -e 's/-fno-strength-reduce/ /p'` + AC_MSG_RESULT(no) + CFLAGS=`echo "$CFLAGS" | sed -e 's/-fno-strength-reduce/ /'` + else + AC_MSG_RESULT(yes) fi else - AC_MSG_RESULT(no) + AC_MSG_RESULT(N/A) fi dnl If configure thinks we are cross compiling, there might be something @@ -3101,6 +3105,14 @@ dnl --------------------------------------------------------------------------- dnl end of GUI-checking dnl --------------------------------------------------------------------------- +AC_MSG_CHECKING([for /proc/self/exe]) +if test -L "/proc/self/exe"; then + AC_MSG_RESULT(yes) + AC_DEFINE(HAVE_PROC_SELF_EXE) +else + AC_MSG_RESULT(no) +fi + dnl Check for Cygwin, which needs an extra source file if not using X11 AC_MSG_CHECKING(for CYGWIN or MSYS environment) case `uname` in diff --git a/src/diff.c b/src/diff.c index b64b45ce96..7b81feba7a 100644 --- a/src/diff.c +++ b/src/diff.c @@ -977,7 +977,12 @@ ex_diffpatch(exarg_T *eap) { /* Build the patch command and execute it. Ignore errors. Switch to * cooked mode to allow the user to respond to prompts. */ - vim_snprintf((char *)buf, buflen, "patch -o %s %s < \"%s\"", + vim_snprintf((char *)buf, buflen, +#ifdef UNIX + "patch -o %s %s < '%s'", +#else + "patch -o %s %s < \"%s\"", +#endif tmp_new, tmp_orig, # ifdef UNIX fullname != NULL ? fullname : diff --git a/src/edit.c b/src/edit.c index f0bf8ecbe2..0f5282f5c8 100644 --- a/src/edit.c +++ b/src/edit.c @@ -2271,7 +2271,10 @@ has_compl_option(int dict_opt) vim_beep(BO_COMPL); setcursor(); out_flush(); - ui_delay(2000L, FALSE); +#ifdef FEAT_EVAL + if (!get_vim_var_nr(VV_TESTING)) +#endif + ui_delay(2000L, FALSE); } return FALSE; } diff --git a/src/evalfunc.c b/src/evalfunc.c index 5d0c46c762..6ec458abb5 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -390,7 +390,7 @@ static void f_tagfiles(typval_T *argvars, typval_T *rettv); static void f_tempname(typval_T *argvars, typval_T *rettv); static void f_test_alloc_fail(typval_T *argvars, typval_T *rettv); static void f_test_autochdir(typval_T *argvars, typval_T *rettv); -static void f_test_disable_char_avail(typval_T *argvars, typval_T *rettv); +static void f_test_override(typval_T *argvars, typval_T *rettv); static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv); static void f_test_ignore_error(typval_T *argvars, typval_T *rettv); #ifdef FEAT_JOB_CHANNEL @@ -828,7 +828,6 @@ static struct fst {"tempname", 0, 0, f_tempname}, {"test_alloc_fail", 3, 3, f_test_alloc_fail}, {"test_autochdir", 0, 0, f_test_autochdir}, - {"test_disable_char_avail", 1, 1, f_test_disable_char_avail}, {"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now}, {"test_ignore_error", 1, 1, f_test_ignore_error}, #ifdef FEAT_JOB_CHANNEL @@ -841,6 +840,7 @@ static struct fst {"test_null_list", 0, 0, f_test_null_list}, {"test_null_partial", 0, 0, f_test_null_partial}, {"test_null_string", 0, 0, f_test_null_string}, + {"test_override", 2, 2, f_test_override}, {"test_settime", 1, 1, f_test_settime}, #ifdef FEAT_TIMERS {"timer_info", 0, 1, f_timer_info}, @@ -12353,12 +12353,34 @@ f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED) } /* - * "test_disable_char_avail({expr})" function + * "test_disable({name}, {val})" function */ static void -f_test_disable_char_avail(typval_T *argvars, typval_T *rettv UNUSED) +f_test_override(typval_T *argvars, typval_T *rettv UNUSED) { - disable_char_avail_for_testing = (int)get_tv_number(&argvars[0]); + char_u *name = (char_u *)""; + int val; + + if (argvars[0].v_type != VAR_STRING + || (argvars[1].v_type) != VAR_NUMBER) + EMSG(_(e_invarg)); + else + { + name = get_tv_string_chk(&argvars[0]); + val = (int)get_tv_number(&argvars[1]); + + if (STRCMP(name, (char_u *)"redraw") == 0) + disable_redraw_for_testing = val; + else if (STRCMP(name, (char_u *)"char_avail") == 0) + disable_char_avail_for_testing = val; + else if (STRCMP(name, (char_u *)"ALL") == 0) + { + disable_char_avail_for_testing = FALSE; + disable_redraw_for_testing = FALSE; + } + else + EMSG2(_(e_invarg2), name); + } } /* diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 0513fe7e12..51356d2b59 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -2905,8 +2905,15 @@ ex_argdelete(exarg_T *eap) if (eap->line2 > ARGCOUNT) eap->line2 = ARGCOUNT; n = eap->line2 - eap->line1 + 1; - if (*eap->arg != NUL || n <= 0) + if (*eap->arg != NUL) + /* Can't have both a range and an argument. */ EMSG(_(e_invarg)); + else if (n <= 0) + { + /* Don't give an error for ":%argdel" if the list is empty. */ + if (eap->line1 != 1 || eap->line2 != 0) + EMSG(_(e_invrange)); + } else { for (i = eap->line1; i <= eap->line2; ++i) diff --git a/src/globals.h b/src/globals.h index d92eca2a81..f89413d612 100644 --- a/src/globals.h +++ b/src/globals.h @@ -1652,7 +1652,9 @@ EXTERN int alloc_fail_countdown INIT(= -1); /* set by alloc_fail(), number of times alloc() returns NULL */ EXTERN int alloc_fail_repeat INIT(= 0); +/* flags set by test_override() */ EXTERN int disable_char_avail_for_testing INIT(= 0); +EXTERN int disable_redraw_for_testing INIT(= 0); EXTERN int in_free_unref_items INIT(= FALSE); #endif diff --git a/src/option.c b/src/option.c index 15472123be..9fcf869d83 100644 --- a/src/option.c +++ b/src/option.c @@ -4240,7 +4240,6 @@ set_init_3(void) options[idx3].def_val[VI_DEFAULT] = p_shcf; } -# ifdef WIN3264 /* Somehow Win32 requires the quotes around the redirection too */ idx3 = findoption((char_u *)"sxq"); if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) @@ -4248,14 +4247,6 @@ set_init_3(void) p_sxq = (char_u *)"\""; options[idx3].def_val[VI_DEFAULT] = p_sxq; } -# else - idx3 = findoption((char_u *)"shq"); - if (idx3 >= 0 && !(options[idx3].flags & P_WAS_SET)) - { - p_shq = (char_u *)"\""; - options[idx3].def_val[VI_DEFAULT] = p_shq; - } -# endif } else if (strstr((char *)gettail(p_sh), "cmd.exe") != NULL) { diff --git a/src/screen.c b/src/screen.c index 0d2a7c309f..1b020007d7 100644 --- a/src/screen.c +++ b/src/screen.c @@ -10609,7 +10609,12 @@ fillchar_vsep(int *attr) int redrawing(void) { - return (!RedrawingDisabled +#ifdef FEAT_EVAL + if (disable_redraw_for_testing) + return 0; + else +#endif + return (!RedrawingDisabled && !(p_lz && char_avail() && !KeyTyped && !do_redraw)); } diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index a0f0036f3c..2642958848 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -151,6 +151,7 @@ NEW_TESTS = test_arabic.res \ test_diffmode.res \ test_digraph.res \ test_display.res \ + test_edit.res \ test_farsi.res \ test_fnameescape.res \ test_fold.res \ diff --git a/src/testdir/gen_opt_test.vim b/src/testdir/gen_opt_test.vim index fa4a7239fb..22aeb6a48c 100644 --- a/src/testdir/gen_opt_test.vim +++ b/src/testdir/gen_opt_test.vim @@ -7,10 +7,13 @@ if 1 set nomore +" The terminal size is restored at the end. +" Clear out t_WS, we don't want to resize the actual terminal. let script = [ \ 'let save_columns = &columns', \ 'let save_lines = &lines', \ 'let save_term = &term', + \ 'set t_WS=', \ ] /#define p_term diff --git a/src/testdir/runtest.vim b/src/testdir/runtest.vim index d750da5693..732cc0e9a5 100644 --- a/src/testdir/runtest.vim +++ b/src/testdir/runtest.vim @@ -49,7 +49,7 @@ source setup.vim " This also enables use of line continuation. set nocp viminfo+=nviminfo -" Use utf-8 or latin1 be default, instead of whatever the system default +" Use utf-8 or latin1 by default, instead of whatever the system default " happens to be. Individual tests can overrule this at the top of the file. if has('multi_byte') set encoding=utf-8 @@ -96,6 +96,9 @@ function RunTheTest(test) " mode message. set noshowmode + " Clear any overrides. + call test_override('ALL', 0) + if exists("*SetUp") try call SetUp() diff --git a/src/testdir/test_arglist.vim b/src/testdir/test_arglist.vim index 0caead8482..d18035b3b4 100644 --- a/src/testdir/test_arglist.vim +++ b/src/testdir/test_arglist.vim @@ -6,6 +6,10 @@ func Test_argidx() call assert_equal(2, argidx()) %argdelete call assert_equal(0, argidx()) + " doing it again doesn't result in an error + %argdelete + call assert_equal(0, argidx()) + call assert_fails('2argdelete', 'E16:') args a b c call assert_equal(0, argidx()) diff --git a/src/testdir/test_assert.vim b/src/testdir/test_assert.vim index 986f0d9a7e..0edcf58839 100644 --- a/src/testdir/test_assert.vim +++ b/src/testdir/test_assert.vim @@ -127,6 +127,14 @@ func Test_assert_with_msg() call remove(v:errors, 0) endfunc +func Test_override() + call test_override('char_avail', 1) + call test_override('redraw', 1) + call test_override('ALL', 0) + call assert_fails("call test_override('xxx', 1)", 'E475') + call assert_fails("call test_override('redraw', 'yes')", 'E474') +endfunc + func Test_user_is_happy() smile sleep 300m diff --git a/src/testdir/test_cursor_func.vim b/src/testdir/test_cursor_func.vim index 4b2a9b8f80..355354198d 100644 --- a/src/testdir/test_cursor_func.vim +++ b/src/testdir/test_cursor_func.vim @@ -44,9 +44,9 @@ func Test_curswant_with_autocommand() new call setline(1, ['func()', '{', '}', '----']) autocmd! CursorMovedI * call s:Highlight_Matching_Pair() - call test_disable_char_avail(1) + call test_override("char_avail", 1) exe "normal! 3Ga\X\" - call test_disable_char_avail(0) + call test_override("char_avail", 0) call assert_equal('-X---', getline(4)) autocmd! CursorMovedI * quit! diff --git a/src/testdir/test_diffmode.vim b/src/testdir/test_diffmode.vim index 73f944bcea..c23e8a1da5 100644 --- a/src/testdir/test_diffmode.vim +++ b/src/testdir/test_diffmode.vim @@ -318,9 +318,20 @@ func Test_diffpatch() bwipe! new call assert_fails('diffpatch Xpatch', 'E816:') - call setline(1, ['1', '2', '3']) - diffpatch Xpatch - call assert_equal(['1', '2x', '3', '4'], getline(1, '$')) + + for name in ['Xpatch', 'Xpatch$HOME'] + call setline(1, ['1', '2', '3']) + if name != 'Xpatch' + call rename('Xpatch', name) + endif + exe 'diffpatch ' . escape(name, '$') + call assert_equal(['1', '2x', '3', '4'], getline(1, '$')) + if name != 'Xpatch' + call rename(name, 'Xpatch') + endif + bwipe! + endfor + call delete('Xpatch') bwipe! endfunc diff --git a/src/testdir/test_edit.vim b/src/testdir/test_edit.vim new file mode 100644 index 0000000000..086e2e4587 --- /dev/null +++ b/src/testdir/test_edit.vim @@ -0,0 +1,1324 @@ +" Test for edit functions +" +if exists("+t_kD") + let &t_kD="[3;*~" +endif +set belloff= + +" Needed for testing basic rightleft: Test_edit_rightleft +source view_util.vim + +" Needs to come first until the bug in getchar() is +" fixed: https://groups.google.com/d/msg/vim_dev/fXL9yme4H4c/bOR-U6_bAQAJ +func! Test_edit_00b() + new + call setline(1, ['abc ']) + inoreabbr h here some more + call cursor(1, 4) + " expands the abbreviation and ends insertmode + call feedkeys(":set im\ h\:set noim\", 'tix') + call assert_equal(['abc here some more '], getline(1,'$')) + iunabbr h + bw! +endfunc + +func! Test_edit_01() + " set for Travis CI? + " set nocp noesckeys + new + set belloff=backspace + " 1) empty buffer + call assert_equal([''], getline(1,'$')) + " 2) delete in an empty line + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + " 3) delete one character + call setline(1, 'a') + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + " 4) delete a multibyte character + if has("multi_byte") + call setline(1, "\u0401") + call feedkeys("i\\", 'tnix') + call assert_equal([''], getline(1,'$')) + %d + endif + " 5.1) delete linebreak with 'bs' option containing eol + let _bs=&bs + set bs=eol + call setline(1, ["abc def", "ghi jkl"]) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal(['abc defghi jkl'], getline(1, 2)) + %d + " 5.2) delete linebreak with backspace option w/out eol + set bs= + call setline(1, ["abc def", "ghi jkl"]) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal(["abc def", "ghi jkl"], getline(1, 2)) + set belloff= + let &bs=_bs + bw! +endfunc + +func! Test_edit_02() + " Change cursor position in InsertCharPre command + new + call setline(1, 'abc') + call cursor(1, 1) + fu! DoIt(...) + call cursor(1, 4) + if len(a:000) + let v:char=a:1 + endif + endfu + au InsertCharPre :call DoIt('y') + call feedkeys("ix\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + " Setting in InsertCharPre + au! InsertCharPre :call DoIt("\n") + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['abc', ''], getline(1, '$')) + %d + au! InsertCharPre + " Change cursor position in InsertEnter command + " 1) when setting v:char, keeps changed cursor position + au! InsertEnter :call DoIt('y') + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['abxc'], getline(1, '$')) + " 2) when not setting v:char, restores changed cursor position + au! InsertEnter :call DoIt() + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("ix\", 'tnix') + call assert_equal(['xabc'], getline(1, '$')) + au! InsertEnter + delfu DoIt + bw! +endfunc + +func! Test_edit_03() + " Change cursor after command to end of line + new + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\$y\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + %d + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\80|y\", 'tnix') + call assert_equal(['abcy'], getline(1, '$')) + %d + call setline(1, 'abc') + call feedkeys("Ad\:s/$/efg/\hij", 'tnix') + call assert_equal(['hijabcdefg'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_04() + " test for :stopinsert + new + call setline(1, 'abc') + call cursor(1, 1) + call feedkeys("i\:stopinsert\$", 'tnix') + call feedkeys("aX\", 'tnix') + call assert_equal(['abcX'], getline(1, '$')) + %d + bw! +endfunc + +func! Test_edit_05() + " test for folds being opened + new + call setline(1, ['abcX', 'abcX', 'zzzZ']) + call cursor(1, 1) + set foldmethod=manual foldopen+=insert + " create fold for those two lines + norm! Vjzf + call feedkeys("$ay\", 'tnix') + call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) + %d + call setline(1, ['abcX', 'abcX', 'zzzZ']) + call cursor(1, 1) + set foldmethod=manual foldopen-=insert + " create fold for those two lines + norm! Vjzf + call feedkeys("$ay\", 'tnix') + call assert_equal(['abcXy', 'abcX', 'zzzZ'], getline(1, '$')) + %d + bw! +endfunc + +func! Test_edit_06() + " Test in diff mode + if !has("diff") || !executable("diff") + return + endif + new + call setline(1, ['abc', 'xxx', 'yyy']) + vnew + call setline(1, ['abc', 'zzz', 'xxx', 'yyy']) + wincmd p + diffthis + wincmd p + diffthis + wincmd p + call cursor(2, 1) + norm! zt + call feedkeys("Ozzz\", 'tnix') + call assert_equal(['abc', 'zzz', 'xxx', 'yyy'], getline(1,'$')) + bw! + bw! +endfunc + +func! Test_edit_07() + " 1) Test with completion when popupmenu is visible + new + call setline(1, 'J') + + func! ListMonths() + call complete(col('.')-1, ['January', 'February', 'March', + \ 'April', 'May', 'June', 'July', 'August', 'September', + \ 'October', 'November', 'December']) + return '' + endfunc + inoremap =ListMonths() + + call feedkeys("A\\". repeat("\", 6)."\\\\", 'tx') + call assert_equal(['July'], getline(1,'$')) + " 1) Test completion when InsertCharPre kicks in + %d + call setline(1, 'J') + fu! DoIt() + if v:char=='u' + let v:char='an' + endif + endfu + au InsertCharPre :call DoIt() + call feedkeys("A\\u\\\", 'tx') + call assert_equal(["Jan\",''], getline(1,'$')) + %d + call setline(1, 'J') + call feedkeys("A\\u\\\", 'tx') + call assert_equal(["January"], getline(1,'$')) + + delfu ListMonths + delfu DoIt + iunmap + bw! +endfunc + +func! Test_edit_08() + " reset insertmode from i_ctrl-r_= + new + call setline(1, ['abc']) + call cursor(1, 4) + call feedkeys(":set im\ZZZ\=setbufvar(1,'&im', 0)\",'tnix') + call assert_equal(['abZZZc'], getline(1,'$')) + call assert_equal([0, 1, 1, 0], getpos('.')) + call assert_false(0, '&im') + bw! +endfunc + +func! Test_edit_09() + " test i_CTRL-\ combinations + new + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 1) + " 1) CTRL-\ CTLR-N + call feedkeys(":set im\\\ccABC\", 'txin') + call assert_equal(['ABC', 'def', 'ghi'], getline(1,'$')) + call setline(1, ['ABC', 'def', 'ghi']) + " 2) CTRL-\ CTLR-G + call feedkeys("j0\\ZZZ\\", 'txin') + call assert_equal(['ABC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + call feedkeys("I\\YYY\", 'txin') + call assert_equal(['ABC', 'ZZZ', 'YYYdef', 'ghi'], getline(1,'$')) + set noinsertmode + " 3) CTRL-\ CTRL-O + call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) + call cursor(1, 1) + call feedkeys("A\ix", 'txin') + call assert_equal(['ABxC', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + call feedkeys("A\\ix", 'txin') + call assert_equal(['ABxCx', 'ZZZ', 'def', 'ghi'], getline(1,'$')) + " 4) CTRL-\ a (should be inserted literally, not special after + call setline(1, ['ABC', 'ZZZ', 'def', 'ghi']) + call cursor(1, 1) + call feedkeys("A\a", 'txin') + call assert_equal(["ABC\a", 'ZZZ', 'def', 'ghi'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_10() + " Test for starting selectmode + new + set selectmode=key keymodel=startsel + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 4) + call feedkeys("A\start\", 'txin') + call assert_equal(['startdef', 'ghi'], getline(1, '$')) + set selectmode= keymodel= + bw! +endfunc + +func! Test_edit_11() + " Test that indenting kicks in + new + set cindent + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\int c;", "/* comment */"], getline(1, '$')) + " added changed cindentkeys slightly + set cindent cinkeys+=*/ + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\int c;", "\/* comment */"], getline(1, '$')) + set cindent cinkeys+==end + call feedkeys("oend\\", 'tnix') + call assert_equal(['{', "\int c;", "\/* comment */", "\tend", ''], getline(1, '$')) + set cinkeys-==end + %d + " Use indentexpr instead of cindenting + func! Do_Indent() + if v:lnum == 3 + return 3*shiftwidth() + else + return 2*shiftwidth() + endif + endfunc + setl indentexpr=Do_Indent() indentkeys+=*/ + call setline(1, ['{', '', '']) + call cursor(2, 1) + call feedkeys("i\int c;\", 'tnix') + call cursor(3, 1) + call feedkeys("i/* comment */", 'tnix') + call assert_equal(['{', "\\int c;", "\\\/* comment */"], getline(1, '$')) + set cinkeys&vim indentkeys&vim + set nocindent indentexpr= + delfu Do_Indent + bw! +endfunc + +func! Test_edit_12() + " Test changing indent in replace mode + new + call setline(1, ["\tabc", "\tdef"]) + call cursor(2, 4) + call feedkeys("R^\", 'tnix') + call assert_equal(["\tabc", "def"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R^\", 'tnix') + call assert_equal(["\tabc", "def"], getline(1, '$')) + call assert_equal([0, 2, 1, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + bw! + 10vnew + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + set sw=4 + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + %d + call setline(1, ["\tabc", "\t\tdef"]) + call cursor(2, 2) + call feedkeys("R\\", 'tnix') + call assert_equal(["\tabc", "\t\t\tdef"], getline(1, '$')) + call assert_equal([0, 2, 2, 0], getpos('.')) + set et + set sw& et& + %d + call setline(1, ["\t/*"]) + set formatoptions=croql + call cursor(1, 3) + call feedkeys("A\\/", 'tnix') + call assert_equal(["\t/*", " *", " */"], getline(1, '$')) + set formatoptions& + bw! +endfunc + +func! Test_edit_13() + " Test smartindenting + if exists("+smartindent") + new + set smartindent autoindent + call setline(1, ["\tabc"]) + call feedkeys("A {\more\}\", 'tnix') + call assert_equal(["\tabc {", "\t\tmore", "\t}"], getline(1, '$')) + set smartindent& autoindent& + bw! + endif +endfunc + +func! Test_edit_CR() + " Test for in insert mode + " basically only in quickfix mode ist tested, the rest + " has been taken care of by other tests + if !has("quickfix") + return + endif + botright new + call writefile(range(1, 10), 'Xqflist.txt') + call setqflist([{'filename': 'Xqflist.txt', 'lnum': 2}]) + copen + set modifiable + call feedkeys("A\", 'tnix') + call assert_equal('Xqflist.txt', bufname('')) + call assert_equal(2, line('.')) + cclose + botright new + call setloclist(0, [{'filename': 'Xqflist.txt', 'lnum': 10}]) + lopen + set modifiable + call feedkeys("A\", 'tnix') + call assert_equal('Xqflist.txt', bufname('')) + call assert_equal(10, line('.')) + call feedkeys("A\", 'tnix') + call feedkeys("A\", 'tnix') + call feedkeys("A\n", 'tnix') + call feedkeys("A\r", 'tnix') + call assert_equal(map(range(1, 10), 'string(v:val)') + ['', '', '', ''], getline(1, '$')) + bw! + lclose + call delete('Xqflist.txt') +endfunc + +func! Test_edit_CTRL_() + " disabled for Windows builds, why? + if !has("multi_byte") || !has("rightleft") || has("win32") + return + endif + let _encoding=&encoding + set encoding=utf-8 + " Test for CTRL-_ + new + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["\xyzabc"], getline(1, '$')) + call assert_false(&revins) + set ari + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["æèñabc"], getline(1, '$')) + call assert_true(&revins) + call setline(1, ['abc']) + call cursor(1, 1) + call feedkeys("i\xyz\", 'tnix') + call assert_equal(["xyzabc"], getline(1, '$')) + call assert_false(&revins) + set noari + let &encoding=_encoding + bw! +endfunc + +" needs to come first, to have the @. register empty +func! Test_edit_00a_CTRL_A() + " Test pressing CTRL-A + new + call setline(1, repeat([''], 5)) + call cursor(1, 1) + set belloff=all + try + call feedkeys("A\", 'tnix') + catch /^Vim\%((\a\+)\)\=:E29/ + call assert_true(1, 'E29 error caught') + endtry + set belloff= + call cursor(1, 1) + call feedkeys("Afoobar \", 'tnix') + call cursor(2, 1) + call feedkeys("A\more\", 'tnix') + call cursor(3, 1) + call feedkeys("A\and more\", 'tnix') + call assert_equal(['foobar ', 'foobar more', 'foobar morend more', '', ''], getline(1, '$')) + bw! +endfunc + +func! Test_edit_CTRL_EY() + " Ctrl-E/ Ctrl-Y in insert mode completion to scroll + 10new + call setline(1, range(1, 100)) + call cursor(30, 1) + norm! z. + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(30, winsaveview()['topline']) + call assert_equal([0, 30, 2, 0], getpos('.')) + call feedkeys("A\\\\\\", 'tnix') + call feedkeys("A\".repeat("\", 10), 'tnix') + call assert_equal(21, winsaveview()['topline']) + call assert_equal([0, 30, 2, 0], getpos('.')) + bw! +endfunc + +func! Test_edit_CTRL_G() + new + set belloff=all + call setline(1, ['foobar', 'foobar', 'foobar']) + call cursor(2, 4) + call feedkeys("ioooooooo\k\.\", 'tnix') + call assert_equal(['foooooooooobar', 'foooooooooobar', 'foobar'], getline(1, '$')) + call assert_equal([0, 1, 11, 0], getpos('.')) + call feedkeys("i\k\", 'tnix') + call assert_equal([0, 1, 10, 0], getpos('.')) + call cursor(2, 4) + call feedkeys("i\jzzzz\", 'tnix') + call assert_equal(['foooooooooobar', 'foooooooooobar', 'foozzzzbar'], getline(1, '$')) + call assert_equal([0, 3, 7, 0], getpos('.')) + call feedkeys("i\j\", 'tnix') + call assert_equal([0, 3, 6, 0], getpos('.')) + set belloff= + bw! +endfunc + +func! Test_edit_CTRL_I() + " Tab in completion mode + let path=expand("%:p:h") + new + call setline(1, [path."/", '']) + call feedkeys("Ate\\\\\", 'tnix') + call assert_match('test1\.in', getline(1)) + %d + call writefile(['one', 'two', 'three'], 'Xinclude.txt') + let include='#include Xinclude.txt' + call setline(1, [include, '']) + call cursor(2, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal([include, 'one', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\", 'tnix') + call assert_equal([include, 'two', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\\", 'tnix') + call assert_equal([include, 'three', ''], getline(1, '$')) + call feedkeys("2ggC\\\\\\\", 'tnix') + call assert_equal([include, '', ''], getline(1, '$')) + call delete("Xinclude.txt") + bw! +endfunc + +func! Test_edit_CTRL_K() + " Test pressing CTRL-K (basically only dictionary completion and digraphs + " the rest is already covered + call writefile(['A', 'AA', 'AAA', 'AAAA'], 'Xdictionary.txt') + set dictionary=Xdictionary.txt + new + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['AA', ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['AAA'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(['AAAA'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(['A'], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\\\\", 'tnix') + call assert_equal(['AA'], getline(1, '$')) + + " press an unexecpted key after dictionary completion + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['AA', ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(["AA\", ''], getline(1, '$')) + %d + call setline(1, 'A') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(["AA\", ''], getline(1, '$')) + + set dictionary= + %d + call setline(1, 'A') + call cursor(1, 1) + set belloff=all + let v:testing = 1 + try + call feedkeys("A\\\", 'tnix') + catch + " error sleeps 2 seconds, when v:testing is not set + let v:testing = 0 + endtry + set belloff= + call delete('Xdictionary.txt') + + if has("multi_byte") + call test_override("char_avail", 1) + set showcmd + %d + call feedkeys("A\a:\", 'tnix') + call assert_equal(['ä'], getline(1, '$')) + call test_override("char_avail", 0) + set noshowcmd + endif + bw! +endfunc + +func! Test_edit_CTRL_L() + " Test Ctrl-X Ctrl-L (line completion) + new + set complete=. + call setline(1, ['one', 'two', 'three', '', '', '', '']) + call cursor(4, 1) + call feedkeys("A\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'two', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 't', '', '', ''], getline(1, '$')) + call feedkeys("cct\\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', '', '', ''], getline(1, '$')) + set complete= + call cursor(5, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['one', 'two', 'three', 'three', "\\\", '', ''], getline(1, '$')) + set complete& + %d + if has("conceal") && has("syntax") + call setline(1, ['foo', 'bar', 'foobar']) + call test_override("char_avail", 1) + set conceallevel=2 concealcursor=n + syn on + syn match ErrorMsg "^bar" + call matchadd("Conceal", 'oo', 10, -1, {'conceal': 'X'}) + func! DoIt() + let g:change=1 + endfunc + au! TextChangedI :call DoIt() + + call cursor(2, 1) + call assert_false(exists("g:change")) + call feedkeys("A \", 'tnix') + call assert_equal(['foo', 'bar ', 'foobar'], getline(1, '$')) + call assert_equal(1, g:change) + + call test_override("char_avail", 0) + call clearmatches() + syn off + au! TextChangedI + delfu DoIt + unlet! g:change + endif + bw! +endfunc + +func! Test_edit_CTRL_N() + " Check keyword completion + new + set complete=. + call setline(1, ['INFER', 'loWER', '', '', ]) + call cursor(3, 1) + call feedkeys("Ai\\\", "tnix") + call feedkeys("ILO\\\", 'tnix') + call assert_equal(['INFER', 'loWER', 'i', 'LO', '', ''], getline(1, '$')) + %d + call setline(1, ['INFER', 'loWER', '', '', ]) + call cursor(3, 1) + set ignorecase infercase + call feedkeys("Ii\\\", "tnix") + call feedkeys("ILO\\\", 'tnix') + call assert_equal(['INFER', 'loWER', 'infer', 'LOWER', '', ''], getline(1, '$')) + + set noignorecase noinfercase complete& + bw! +endfunc + +func! Test_edit_CTRL_O() + " Check for CTRL-O in insert mode + new + inoreabbr h here some more + call setline(1, ['abc', 'def']) + call cursor(1, 1) + " Ctrl-O after an abbreviation + exe "norm A h\:set nu\ text" + call assert_equal(['abc here some more text', 'def'], getline(1, '$')) + call assert_true(&nu) + set nonu + iunabbr h + " Ctrl-O at end of line with 've'=onemore + call cursor(1, 1) + call feedkeys("A\:let g:a=getpos('.')\\", 'tnix') + call assert_equal([0, 1, 23, 0], g:a) + call cursor(1, 1) + set ve=onemore + call feedkeys("A\:let g:a=getpos('.')\\", 'tnix') + call assert_equal([0, 1, 24, 0], g:a) + set ve= + unlet! g:a + bw! +endfunc + +func! Test_edit_CTRL_R() + " Insert Register + new + call test_override("ALL", 1) + set showcmd + call feedkeys("AFOOBAR eins zwei\", 'tnix') + call feedkeys("O\.", 'tnix') + call feedkeys("O\=10*500\\", 'tnix') + call feedkeys("O\=getreg('=', 1)\\", 'tnix') + call assert_equal(["getreg('=', 1)", '5000', "FOOBAR eins zwei", "FOOBAR eins zwei"], getline(1, '$')) + call test_override("ALL", 0) + set noshowcmd + bw! +endfunc + +func! Test_edit_CTRL_S() + " Test pressing CTRL-S (basically only spellfile completion) + " the rest is already covered + new + if !has("spell") + call setline(1, 'vim') + call feedkeys("A\ss\\", 'tnix') + call assert_equal(['vims', ''], getline(1, '$')) + bw! + return + endif + call setline(1, 'vim') + " spell option not yet set + try + call feedkeys("A\\\\", 'tnix') + catch /^Vim\%((\a\+)\)\=:E756/ + call assert_true(1, 'error caught') + endtry + call assert_equal(['vim', ''], getline(1, '$')) + %d + setl spell spelllang=en + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['Vim', ''], getline(1, '$')) + %d + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['Aim'], getline(1, '$')) + %d + call setline(1, 'vim') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['vim', ''], getline(1, '$')) + %d + " empty buffer + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['', ''], getline(1, '$')) + setl nospell + bw! +endfunc + +func! Test_edit_CTRL_T() + " Check for CTRL-T and CTRL-X CTRL-T in insert mode + " 1) increase indent + new + call setline(1, "abc") + call cursor(1, 1) + call feedkeys("A\xyz", 'tnix') + call assert_equal(["\abcxyz"], getline(1, '$')) + " 2) also when paste option is set + set paste + call setline(1, "abc") + call cursor(1, 1) + call feedkeys("A\xyz", 'tnix') + call assert_equal(["\abcxyz"], getline(1, '$')) + set nopaste + " CTRL-X CTRL-T (thesaurus complete) + call writefile(['angry furious mad enraged'], 'Xthesaurus') + set thesaurus=Xthesaurus + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['angry', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\", 'tnix') + call assert_equal(['furious', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(['enraged', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + " Using when 'complete' is empty + set complete= + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['angry', ''], getline(1, '$')) + %d + call setline(1, 'mad') + call cursor(1, 1) + call feedkeys("A\\\\\", 'tnix') + call assert_equal(['mad', ''], getline(1, '$')) + set complete& + + set thesaurus= + %d + call setline(1, 'mad') + call cursor(1, 1) + set belloff=all + let v:testing = 1 + try + call feedkeys("A\\\", 'tnix') + catch + " error sleeps 2 seconds, when v:testing is not set + let v:testing = 0 + endtry + set belloff= + call assert_equal(['mad'], getline(1, '$')) + call delete('Xthesaurus') + bw! +endfunc + +func! Test_edit_CTRL_U() + " Test 'completefunc' + new + " -1, -2 and -3 are special return values + let g:special=0 + fun! CompleteMonths(findstart, base) + if a:findstart + " locate the start of the word + return g:special + else + " find months matching with "a:base" + let res = [] + for m in split("Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec") + if m =~ '^\c'.a:base + call add(res, {'word': m, 'abbr': m.' Month', 'icase': 0}) + endif + endfor + return {'words': res, 'refresh': 'always'} + endif + endfun + set completefunc=CompleteMonths + call setline(1, ['', '']) + call cursor(1, 1) + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', '', ''], getline(1, '$')) + %d + let g:special=-1 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['XJan', ''], getline(1, '$')) + %d + let g:special=-2 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', ''], getline(1, '$')) + %d + let g:special=-3 + call feedkeys("AX\\\\", 'tnix') + call assert_equal(['X', ''], getline(1, '$')) + %d + let g:special=0 + call feedkeys("AM\\\\", 'tnix') + call assert_equal(['Mar', ''], getline(1, '$')) + %d + call feedkeys("AM\\\\\", 'tnix') + call assert_equal(['May', ''], getline(1, '$')) + %d + call feedkeys("AM\\\\\\", 'tnix') + call assert_equal(['M', ''], getline(1, '$')) + delfu CompleteMonths + %d + try + call feedkeys("A\\", 'tnix') + call assert_fails(1, 'unknown completion function') + catch /^Vim\%((\a\+)\)\=:E117/ + call assert_true(1, 'E117 error caught') + endtry + set completefunc= + bw! +endfunc + +func! Test_edit_CTRL_Z() + " Ctrl-Z when insertmode is not set inserts it literally + new + call setline(1, 'abc') + call feedkeys("A\\", 'tnix') + call assert_equal(["abc\"], getline(1,'$')) + bw! + " TODO: How to Test Ctrl-Z in insert mode, e.g. suspend? +endfunc + +func! Test_edit_DROP() + if !has("dnd") + return + endif + new + call setline(1, ['abc def ghi']) + call cursor(1, 1) + try + call feedkeys("i\\", 'tnix') + call assert_fails(1, 'Invalid register name') + catch /^Vim\%((\a\+)\)\=:E353/ + call assert_true(1, 'error caught') + endtry + bw! +endfunc + +func! Test_edit_CTRL_V() + if has("ebcdic") + return + endif + new + call setline(1, ['abc']) + call cursor(2, 1) + " force some redraws + set showmode showcmd + "call test_override_char_avail(1) + call test_override('ALL', 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) + + if has("rightleft") && exists("+rl") + set rl + call setline(1, ['abc']) + call cursor(2, 1) + call feedkeys("A\\\\\\\", 'tnix') + call assert_equal(["abc\x0e\x0c\x02"], getline(1, '$')) + set norl + endif + + call test_override('ALL', 0) + set noshowmode showcmd + bw! +endfunc + +func! Test_edit_F1() + " Pressing + new + call feedkeys(":set im\\\", 'tnix') + set noinsertmode + call assert_equal('help', &buftype) + bw + bw +endfunc + +func! Test_edit_F21() + " Pressing + " sends a netbeans command + if has("netbeans_intg") + new + " I have no idea what this is supposed to do :) + call feedkeys("A\\\", 'tnix') + bw + endif +endfunc + +func! Test_edit_HOME_END() + " Test Home/End Keys + new + set foldopen+=hor + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("AX\Y\", 'tnix') + call cursor(2, 1) + call feedkeys("iZ\Y\", 'tnix') + call assert_equal(['YabcX', 'ZdefY'], getline(1, '$')) + + set foldopen-=hor + bw! +endfunc + +func! Test_edit_INS() + " Test for Pressing + new + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("i\ZYX>", 'tnix') + call assert_equal(['ZYX>', 'def'], getline(1, '$')) + call setline(1, ['abc', 'def']) + call cursor(1, 1) + call feedkeys("i\Z\YX>", 'tnix') + call assert_equal(['ZYX>bc', 'def'], getline(1, '$')) + bw! +endfunc + +func! Test_edit_LEFT_RIGHT() + " Left, Shift-Left, Right, Shift-Right + new + set belloff=all + call setline(1, ['abc def ghi', 'ABC DEF GHI', 'ZZZ YYY XXX']) + let _ww=&ww + set ww= + call cursor(2, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 2, 1, 0], getpos('.')) + " Is this a bug, does not respect whichwrap option + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 8, 0], getpos('.')) + call feedkeys("i". repeat("\", 3). "\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call feedkeys("i\\\", 'tnix') + call assert_equal([0, 1, 2, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 2, 4, 0], getpos('.')) + call cursor(3, 11) + call feedkeys("A\\", 'tnix') + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 11, 0], getpos('.')) + call cursor(2, 11) + " does not respect 'whichwrap' option + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + " Check motion when 'whichwrap' contains cursor keys for insert mode + set ww+=[,] + call cursor(2, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 1, 11, 0], getpos('.')) + call cursor(2, 11) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + call cursor(2, 11) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 3, 1, 0], getpos('.')) + let &ww = _ww + set belloff= + bw! +endfunc + +func! Test_edit_MOUSE() + " This is a simple test, since we not really using the mouse here + if !has("mouse") + return + endif + 10new + call setline(1, range(1, 100)) + call cursor(1, 1) + set mouse=a + call feedkeys("A\\", 'tnix') + call assert_equal([0, 4, 1, 0], getpos('.')) + " This should move by one pageDown, but only moves + " by one line when the test is run... + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + set nostartofline + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 6, 1, 0], getpos('.')) + call cursor(1, 100) + norm! zt + " this should move by a screen up, but when the test + " is run, it moves up to the top of the buffer... + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call cursor(1, 30) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + call cursor(1, 30) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 1, 1, 0], getpos('.')) + %d + call setline(1, repeat(["12345678901234567890"], 100)) + call cursor(2, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 2, 20, 0], getpos('.')) + set mouse& startofline + bw! +endfunc + +func! Test_edit_PAGEUP_PAGEDOWN() + set belloff=all + 10new + call setline(1, repeat(['abc def ghi'], 30)) + call cursor(1, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 9, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 17, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 25, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + " is the same as + " is the same as + call cursor(1, 1) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 9, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 17, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 25, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("i\\", 'tnix') + call assert_equal([0, 30, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 1, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + set nostartofline + call cursor(30, 11) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 9, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 17, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 25, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + " is the same as + " is the same as + call cursor(30, 11) + norm! zt + call feedkeys("A\\", 'tnix') + call assert_equal([0, 29, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 21, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 13, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 5, 11, 0], getpos('.')) + call cursor(1, 1) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 9, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 17, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 25, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + call feedkeys("A\\", 'tnix') + call assert_equal([0, 30, 11, 0], getpos('.')) + set startofline belloff= + bw! +endfunc + +func! Test_edit_forbidden() + set belloff=error,esc + new + " 1) edit in the sandbox is not allowed + call setline(1, 'a') + com! Sandbox :sandbox call feedkeys("i\\", 'tnix') + call assert_fails(':Sandbox', 'E48:') + com! Sandbox :sandbox exe "norm! i\" + call assert_fails(':Sandbox', 'E48:') + delcom Sandbox + call assert_equal(['a'], getline(1,'$')) + " 2) edit with textlock set + fu! DoIt() + call feedkeys("i\\", 'tnix') + endfu + au InsertCharPre :call DoIt() + try + call feedkeys("ix\", 'tnix') + call assert_fails(1, 'textlock') + catch /^Vim\%((\a\+)\)\=:E523/ " catch E523: not allowed here + endtry + " TODO: Might be a bug: should x really be inserted here + call assert_equal(['xa'], getline(1, '$')) + delfu DoIt + try + call feedkeys("ix\", 'tnix') + call assert_fails(1, 'unknown function') + catch /^Vim\%((\a\+)\)\=:E117/ " catch E117: unknown function + endtry + au! InsertCharPre + " 3) edit when completion is shown + fun! Complete(findstart, base) + if a:findstart + return col('.') + else + call feedkeys("i\\", 'tnix') + return [] + endif + endfun + set completefunc=Complete + try + call feedkeys("i\\\", 'tnix') + call assert_fails(1, 'change in complete function') + catch /^Vim\%((\a\+)\)\=:E523/ " catch E523 + endtry + delfu Complete + set completefunc= + if has("rightleft") && exists("+fkmap") + " 4) 'R' when 'fkmap' and 'revins' is set. + set revins fkmap + try + normal Ri + call assert_fails(1, "R with 'fkmap' and 'ri' set") + catch + finally + set norevins nofkmap + endtry + endif + set belloff= + bw! +endfunc + +func! Test_edit_rightleft() + " Cursor in rightleft mode moves differently + if !exists("+rightleft") + return + endif + call NewWindow(10, 20) + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 2) + set rightleft + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" cba", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + " 2) right moves to the left + call feedkeys("i\\x", 'txin') + call assert_equal(['bc', 'def', 'ghi'], getline(1,'$')) + call cursor(1, 2) + call feedkeys("i\\", 'txin') + call cursor(1, 2) + call feedkeys("i\\", 'txin') + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" cb", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + " 2) left moves to the right + call setline(1, ['abc', 'def', 'ghi']) + call cursor(1, 2) + call feedkeys("i\\x", 'txin') + call assert_equal(['ac', 'def', 'ghi'], getline(1,'$')) + call cursor(1, 2) + call feedkeys("i\\", 'txin') + call cursor(1, 2) + call feedkeys("i\\", 'txin') + " Screen looks as expected + let lines = ScreenLines([1, 4], winwidth(0)) + let expect = [ + \" ca", + \" fed", + \" ihg", + \" ~"] + call assert_equal(join(expect, "\n"), join(lines, "\n")) + set norightleft + bw! +endfunc diff --git a/src/testdir/test_fnamemodify.vim b/src/testdir/test_fnamemodify.vim index 2267e18e3b..1c2a80d0ee 100644 --- a/src/testdir/test_fnamemodify.vim +++ b/src/testdir/test_fnamemodify.vim @@ -1,6 +1,8 @@ " Test filename modifiers. func Test_fnamemodify() + let save_home = $HOME + let save_shell = &shell let $HOME = fnamemodify('.', ':p:h:h') set shell=sh @@ -39,7 +41,9 @@ func Test_fnamemodify() call assert_equal("'abc\ndef'", fnamemodify("abc\ndef", ':S')) set shell=tcsh call assert_equal("'abc\\\ndef'", fnamemodify("abc\ndef", ':S')) - set shell& + + let $HOME = save_home + let &shell = save_shell endfunc func Test_expand() diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index cd58f63fd0..af877e49b1 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -27,6 +27,13 @@ func Test_empty() call assert_equal(1, empty(v:false)) call assert_equal(0, empty(v:true)) + if has('channel') + call assert_equal(1, empty(test_null_channel())) + endif + if has('job') + call assert_equal(1, empty(test_null_job())) + endif + call assert_equal(0, empty(function('Test_empty'))) endfunc @@ -467,6 +474,247 @@ func Test_getbufvar() set fileformats& endfunc +func Test_bufexists() + call assert_equal(0, bufexists('does_not_exist')) + call assert_equal(1, bufexists(bufnr('%'))) + call assert_equal(0, bufexists(0)) + new Xfoo + let bn = bufnr('%') + call assert_equal(1, bufexists(bn)) + call assert_equal(1, bufexists('Xfoo')) + call assert_equal(1, bufexists(getcwd() . '/Xfoo')) + call assert_equal(1, bufexists(0)) + bw + call assert_equal(0, bufexists(bn)) + call assert_equal(0, bufexists('Xfoo')) +endfunc + +func Test_last_buffer_nr() + call assert_equal(bufnr('$'), last_buffer_nr()) +endfunc + +func Test_stridx() + call assert_equal(-1, stridx('', 'l')) + call assert_equal(0, stridx('', '')) + call assert_equal(0, stridx('hello', '')) + call assert_equal(-1, stridx('hello', 'L')) + call assert_equal(2, stridx('hello', 'l', -1)) + call assert_equal(2, stridx('hello', 'l', 0)) + call assert_equal(2, stridx('hello', 'l', 1)) + call assert_equal(3, stridx('hello', 'l', 3)) + call assert_equal(-1, stridx('hello', 'l', 4)) + call assert_equal(-1, stridx('hello', 'l', 10)) + call assert_equal(2, stridx('hello', 'll')) + call assert_equal(-1, stridx('hello', 'hello world')) +endfunc + +func Test_strridx() + call assert_equal(-1, strridx('', 'l')) + call assert_equal(0, strridx('', '')) + call assert_equal(5, strridx('hello', '')) + call assert_equal(-1, strridx('hello', 'L')) + call assert_equal(3, strridx('hello', 'l')) + call assert_equal(3, strridx('hello', 'l', 10)) + call assert_equal(3, strridx('hello', 'l', 3)) + call assert_equal(2, strridx('hello', 'l', 2)) + call assert_equal(-1, strridx('hello', 'l', 1)) + call assert_equal(-1, strridx('hello', 'l', 0)) + call assert_equal(-1, strridx('hello', 'l', -1)) + call assert_equal(2, strridx('hello', 'll')) + call assert_equal(-1, strridx('hello', 'hello world')) +endfunc + +func Test_matchend() + call assert_equal(7, matchend('testing', 'ing')) + call assert_equal(7, matchend('testing', 'ing', 2)) + call assert_equal(-1, matchend('testing', 'ing', 5)) +endfunc + +func Test_nextnonblank_prevnonblank() + new +insert +This + + +is + +a +Test +. + call assert_equal(0, nextnonblank(-1)) + call assert_equal(0, nextnonblank(0)) + call assert_equal(1, nextnonblank(1)) + call assert_equal(4, nextnonblank(2)) + call assert_equal(4, nextnonblank(3)) + call assert_equal(4, nextnonblank(4)) + call assert_equal(6, nextnonblank(5)) + call assert_equal(6, nextnonblank(6)) + call assert_equal(7, nextnonblank(7)) + call assert_equal(0, nextnonblank(8)) + + call assert_equal(0, prevnonblank(-1)) + call assert_equal(0, prevnonblank(0)) + call assert_equal(1, prevnonblank(1)) + call assert_equal(1, prevnonblank(2)) + call assert_equal(1, prevnonblank(3)) + call assert_equal(4, prevnonblank(4)) + call assert_equal(4, prevnonblank(5)) + call assert_equal(6, prevnonblank(6)) + call assert_equal(7, prevnonblank(7)) + call assert_equal(0, prevnonblank(8)) + bw! +endfunc + +func Test_byte2line_line2byte() + new + call setline(1, ['a', 'bc', 'd']) + + set fileformat=unix + call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], + \ map(range(-1, 8), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 3, 6, 8, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat=mac + call assert_equal([-1, -1, 1, 1, 2, 2, 2, 3, 3, -1], + \ map(range(-1, 8), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 3, 6, 8, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat=dos + call assert_equal([-1, -1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, -1], + \ map(range(-1, 11), 'byte2line(v:val)')) + call assert_equal([-1, -1, 1, 4, 8, 11, -1], + \ map(range(-1, 5), 'line2byte(v:val)')) + + set fileformat& + bw! +endfunc + +func Test_count() + let l = ['a', 'a', 'A', 'b'] + call assert_equal(2, count(l, 'a')) + call assert_equal(1, count(l, 'A')) + call assert_equal(1, count(l, 'b')) + call assert_equal(0, count(l, 'B')) + + call assert_equal(2, count(l, 'a', 0)) + call assert_equal(1, count(l, 'A', 0)) + call assert_equal(1, count(l, 'b', 0)) + call assert_equal(0, count(l, 'B', 0)) + + call assert_equal(3, count(l, 'a', 1)) + call assert_equal(3, count(l, 'A', 1)) + call assert_equal(1, count(l, 'b', 1)) + call assert_equal(1, count(l, 'B', 1)) + call assert_equal(0, count(l, 'c', 1)) + + call assert_equal(1, count(l, 'a', 0, 1)) + call assert_equal(2, count(l, 'a', 1, 1)) + call assert_fails('call count(l, "a", 0, 10)', 'E684:') + + let d = {1: 'a', 2: 'a', 3: 'A', 4: 'b'} + call assert_equal(2, count(d, 'a')) + call assert_equal(1, count(d, 'A')) + call assert_equal(1, count(d, 'b')) + call assert_equal(0, count(d, 'B')) + + call assert_equal(2, count(d, 'a', 0)) + call assert_equal(1, count(d, 'A', 0)) + call assert_equal(1, count(d, 'b', 0)) + call assert_equal(0, count(d, 'B', 0)) + + call assert_equal(3, count(d, 'a', 1)) + call assert_equal(3, count(d, 'A', 1)) + call assert_equal(1, count(d, 'b', 1)) + call assert_equal(1, count(d, 'B', 1)) + call assert_equal(0, count(d, 'c', 1)) + + call assert_fails('call count(d, "a", 0, 1)', 'E474:') + call assert_fails('call count("a", "a")', 'E712:') +endfunc + +func Test_changenr() + new Xchangenr + call assert_equal(0, changenr()) + norm ifoo + call assert_equal(1, changenr()) + set undolevels=10 + norm Sbar + call assert_equal(2, changenr()) + undo + call assert_equal(1, changenr()) + redo + call assert_equal(2, changenr()) + bw! + set undolevels& +endfunc + +func Test_filewritable() + new Xfilewritable + write! + call assert_equal(1, filewritable('Xfilewritable')) + + call assert_notequal(0, setfperm('Xfilewritable', 'r--r-----')) + call assert_equal(0, filewritable('Xfilewritable')) + + call assert_notequal(0, setfperm('Xfilewritable', 'rw-r-----')) + call assert_equal(1, filewritable('Xfilewritable')) + + call assert_equal(0, filewritable('doesnotexist')) + + call delete('Xfilewritable') + bw! +endfunc + +func Test_hostname() + let hostname_vim = hostname() + if has('unix') + let hostname_system = systemlist('uname -n')[0] + call assert_equal(hostname_vim, hostname_system) + endif +endfunc + +func Test_getpid() + " getpid() always returns the same value within a vim instance. + call assert_equal(getpid(), getpid()) + if has('unix') + call assert_equal(systemlist('echo $PPID')[0], string(getpid())) + endif +endfunc + +func Test_hlexists() + call assert_equal(0, hlexists('does_not_exist')) + call assert_equal(0, hlexists('Number')) + call assert_equal(0, highlight_exists('does_not_exist')) + call assert_equal(0, highlight_exists('Number')) + syntax on + call assert_equal(0, hlexists('does_not_exist')) + call assert_equal(1, hlexists('Number')) + call assert_equal(0, highlight_exists('does_not_exist')) + call assert_equal(1, highlight_exists('Number')) + syntax off +endfunc + +func Test_col() + new + call setline(1, 'abcdef') + norm gg4|mx6|mY2| + call assert_equal(2, col('.')) + call assert_equal(7, col('$')) + call assert_equal(4, col("'x")) + call assert_equal(6, col("'Y")) + call assert_equal(2, col([1, 2])) + call assert_equal(7, col([1, '$'])) + + call assert_equal(0, col('')) + call assert_equal(0, col('x')) + call assert_equal(0, col([2, '$'])) + call assert_equal(0, col([1, 100])) + call assert_equal(0, col([1])) + bw! +endfunc + func Test_balloon_show() if has('balloon_eval') " This won't do anything but must not crash either. diff --git a/src/testdir/test_packadd.vim b/src/testdir/test_packadd.vim index 9d4c6d8fe1..7dcaa60622 100644 --- a/src/testdir/test_packadd.vim +++ b/src/testdir/test_packadd.vim @@ -71,11 +71,12 @@ endfunc func Test_packadd_symlink_dir() if !has('unix') - return + return endif let top2_dir = s:topdir . '/Xdir2' let real_dir = s:topdir . '/Xsym' - exec "silent !ln -s" real_dir top2_dir + call mkdir(real_dir, 'p') + exec "silent !ln -s Xsym" top2_dir let &rtp = top2_dir . ',' . top2_dir . '/after' let &packpath = &rtp diff --git a/src/testdir/test_search.vim b/src/testdir/test_search.vim index 7f4f7e0ec9..730e683911 100644 --- a/src/testdir/test_search.vim +++ b/src/testdir/test_search.vim @@ -7,7 +7,7 @@ func Test_search_cmdline() endif " need to disable char_avail, " so that expansion of commandline works - call test_disable_char_avail(1) + call test_override("char_avail", 1) new call setline(1, [' 1', ' 2 these', ' 3 the', ' 4 their', ' 5 there', ' 6 their', ' 7 the', ' 8 them', ' 9 these', ' 10 foobar']) " Test 1 @@ -194,7 +194,7 @@ func Test_search_cmdline() call assert_equal(' 3 the', getline('.')) " clean up - call test_disable_char_avail(0) + call test_override("char_avail", 0) bw! endfunc @@ -204,7 +204,7 @@ func Test_search_cmdline2() endif " need to disable char_avail, " so that expansion of commandline works - call test_disable_char_avail(1) + call test_override("char_avail", 1) new call setline(1, [' 1', ' 2 these', ' 3 the theother']) " Test 1 @@ -266,7 +266,7 @@ func Test_search_cmdline2() " clean up set noincsearch - call test_disable_char_avail(0) + call test_override("char_avail", 0) bw! endfunc diff --git a/src/version.c b/src/version.c index f35ba42682..99f7e8b034 100644 --- a/src/version.c +++ b/src/version.c @@ -779,6 +779,24 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 442, +/**/ + 441, +/**/ + 440, +/**/ + 439, +/**/ + 438, +/**/ + 437, +/**/ + 436, +/**/ + 435, +/**/ + 434, /**/ 433, /**/