From ebefac63f30ac038c0c35d7f1b9257483ec41812 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Wed, 28 Dec 2005 22:39:57 +0000 Subject: updated for version 7.0177 --- src/edit.c | 6 +- src/ex_cmds.c | 2 +- src/ex_docmd.c | 6 +- src/ex_getln.c | 10 ++- src/getchar.c | 44 +++++----- src/keymap.h | 2 + src/main.c | 2 +- src/misc2.c | 11 ++- src/normal.c | 24 ++++-- src/proto/getchar.pro | 2 +- src/search.c | 2 +- src/spell.c | 3 +- src/term.c | 3 + src/testdir/test60.in | 217 ++++++++++++++++++++++++++++++++++++++++++++++++++ src/testdir/test60.ok | 80 +++++++++++++++++++ src/ui.c | 10 ++- src/version.h | 4 +- 17 files changed, 378 insertions(+), 50 deletions(-) (limited to 'src') diff --git a/src/edit.c b/src/edit.c index c21c7e3fb..23dd57eb9 100644 --- a/src/edit.c +++ b/src/edit.c @@ -2657,7 +2657,7 @@ ins_compl_prep(c) } for (temp = 0; p[temp]; ++temp) AppendCharToRedobuff(K_BS); - AppendToRedobuffLit(ptr); + AppendToRedobuffLit(ptr, -1); } #ifdef FEAT_CINDENT @@ -4240,7 +4240,7 @@ insert_special(c, allow_modmask, ctrlv) return; p[len - 1] = NUL; ins_str(p); - AppendToRedobuffLit(p); + AppendToRedobuffLit(p, -1); ctrlv = FALSE; } } @@ -4756,7 +4756,7 @@ insertchar(c, flags, second_indent) else i = 0; if (buf[i] != NUL) - AppendToRedobuffLit(buf + i); + AppendToRedobuffLit(buf + i, -1); } else { diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 1d8348d29..006733c4d 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -921,7 +921,7 @@ do_bang(addr_count, eap, forceit, do_in, do_out) if (bangredo) /* put cmd in redo buffer for ! command */ { - AppendToRedobuffLit(prevcmd); + AppendToRedobuffLit(prevcmd, -1); AppendToRedobuff((char_u *)"\n"); bangredo = FALSE; } diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 3e001a242..a49dfce8a 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -2826,11 +2826,7 @@ find_ucmd(eap, p, full, xp, compl) if (k == len && found && *np != NUL) { if (gap == &ucmds) - { - if (xp != NULL) - xp->xp_context = EXPAND_UNSUCCESSFUL; return NULL; - } amb_local = TRUE; } @@ -3091,6 +3087,8 @@ set_one_cmd_context(xp, buff) NULL # endif ); + if (p == NULL) + ea.cmdidx = CMD_SIZE; /* ambiguous user command */ } #endif } diff --git a/src/ex_getln.c b/src/ex_getln.c index 508c563a3..335f2a411 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2765,9 +2765,17 @@ cmdline_paste(regname, literally) regname = may_get_selection(regname); #endif - /* Need to save and restore ccline. */ + /* Need to save and restore ccline. And go into the sandbox to avoid + * nasty things like going to another buffer when evaluating an + * expression. */ save_cmdline(&save_ccline); +#ifdef HAVE_SANDBOX + ++sandbox; +#endif i = get_spec_reg(regname, &arg, &allocated, TRUE); +#ifdef HAVE_SANDBOX + --sandbox; +#endif restore_cmdline(&save_ccline); if (i) diff --git a/src/getchar.c b/src/getchar.c index 69cebaee5..c1c9bca75 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -529,16 +529,18 @@ AppendToRedobuff(s) * K_SPECIAL and CSI are escaped as well. */ void -AppendToRedobuffLit(s) - char_u *s; +AppendToRedobuffLit(str, len) + char_u *str; + int len; /* length of "str" or -1 for up to the NUL */ { + char_u *s = str; int c; char_u *start; if (block_redo) return; - while (*s != NUL) + while (len < 0 ? *s != NUL : s - str < len) { /* Put a string of normal characters in the redo buffer (that's * faster). */ @@ -547,7 +549,7 @@ AppendToRedobuffLit(s) #ifndef EBCDIC && *s < DEL /* EBCDIC: all chars above space are normal */ #endif - ) + && (len < 0 || s - str < len)) ++s; /* Don't put '0' or '^' as last character, just in case a CTRL-D is @@ -557,29 +559,29 @@ AppendToRedobuffLit(s) if (s > start) add_buff(&redobuff, start, (long)(s - start)); - if (*s != NUL) - { - /* Handle a special or multibyte character. */ + if (*s == NUL || (len >= 0 && s - str >= len)) + break; + + /* Handle a special or multibyte character. */ #ifdef FEAT_MBYTE - if (has_mbyte) - /* Handle composing chars separately. */ - c = mb_cptr2char_adv(&s); - else + if (has_mbyte) + /* Handle composing chars separately. */ + c = mb_cptr2char_adv(&s); + else #endif - c = *s++; - if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^'))) - add_char_buff(&redobuff, Ctrl_V); + c = *s++; + if (c < ' ' || c == DEL || (*s == NUL && (c == '0' || c == '^'))) + add_char_buff(&redobuff, Ctrl_V); - /* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */ - if (*s == NUL && c == '0') + /* CTRL-V '0' must be inserted as CTRL-V 048 (EBCDIC: xf0) */ + if (*s == NUL && c == '0') #ifdef EBCDIC - add_buff(&redobuff, (char_u *)"xf0", 3L); + add_buff(&redobuff, (char_u *)"xf0", 3L); #else - add_buff(&redobuff, (char_u *)"048", 3L); + add_buff(&redobuff, (char_u *)"048", 3L); #endif - else - add_char_buff(&redobuff, c); - } + else + add_char_buff(&redobuff, c); } } diff --git a/src/keymap.h b/src/keymap.h index 88855f1f7..0aa447498 100644 --- a/src/keymap.h +++ b/src/keymap.h @@ -247,6 +247,7 @@ enum key_extra , KE_DROP /* DnD data is available */ , KE_CURSORHOLD /* CursorHold event */ + , KE_NOP /* doesn't do something */ }; /* @@ -422,6 +423,7 @@ enum key_extra #define K_X2RELEASE TERMCAP2KEY(KS_EXTRA, KE_X2RELEASE) #define K_IGNORE TERMCAP2KEY(KS_EXTRA, KE_IGNORE) +#define K_NOP TERMCAP2KEY(KS_EXTRA, KE_NOP) #define K_SNIFF TERMCAP2KEY(KS_EXTRA, KE_SNIFF) diff --git a/src/main.c b/src/main.c index 89bad4c95..551e980f9 100644 --- a/src/main.c +++ b/src/main.c @@ -871,7 +871,7 @@ main /* If ":startinsert" command used, stuff a dummy command to be able to * call normal_cmd(), which will then start Insert mode. */ if (restart_edit != 0) - stuffcharReadbuff(K_IGNORE); + stuffcharReadbuff(K_NOP); #ifdef FEAT_NETBEANS_INTG if (usingNetbeans) diff --git a/src/misc2.c b/src/misc2.c index e8845e25a..c3f2b3798 100644 --- a/src/misc2.c +++ b/src/misc2.c @@ -177,7 +177,7 @@ coladvance2(pos, addspaces, finetune, wcol) #ifdef FEAT_VIRTUALEDIT int width = W_WIDTH(curwin) - win_col_off(curwin); - if ((addspaces || finetune) + if (finetune && curwin->w_p_wrap # ifdef FEAT_VERTSPLIT && curwin->w_width != 0 @@ -188,10 +188,13 @@ coladvance2(pos, addspaces, finetune, wcol) if (csize > 0) csize--; - if (wcol / width > (colnr_T)csize / width) + if (wcol / width > (colnr_T)csize / width + && ((State & INSERT) == 0 || (int)wcol > csize + 1)) { /* In case of line wrapping don't move the cursor beyond the - * right screen edge. */ + * right screen edge. In Insert mode allow going just beyond + * the last character (like what happens when typing and + * reaching the right window edge). */ wcol = (csize / width + 1) * width - 1; } } @@ -501,7 +504,7 @@ check_cursor_col() { /* Allow cursor past end-of-line in Insert mode, restarting Insert * mode or when in Visual mode and 'selection' isn't "old" */ - if (State & INSERT || restart_edit + if ((State & INSERT) || restart_edit #ifdef FEAT_VISUAL || (VIsual_active && *p_sel != 'o') #endif diff --git a/src/normal.c b/src/normal.c index 80f086459..b0262b222 100644 --- a/src/normal.c +++ b/src/normal.c @@ -57,6 +57,7 @@ static void del_from_showcmd __ARGS((int)); * v_*(): functions called to handle Visual mode commands. */ static void nv_ignore __ARGS((cmdarg_T *cap)); +static void nv_nop __ARGS((cmdarg_T *cap)); static void nv_error __ARGS((cmdarg_T *cap)); static void nv_help __ARGS((cmdarg_T *cap)); static void nv_addsub __ARGS((cmdarg_T *cap)); @@ -378,6 +379,7 @@ static const struct nv_cmd {K_X2RELEASE, nv_mouse, 0, 0}, #endif {K_IGNORE, nv_ignore, 0, 0}, + {K_NOP, nv_nop, 0, 0}, {K_INS, nv_edit, 0, 0}, {K_KINS, nv_edit, 0, 0}, {K_BS, nv_ctrlh, 0, 0}, @@ -1415,7 +1417,7 @@ do_pending_operator(cap, old_col, gui_yank) * pattern to really repeat the same command. */ if (vim_strchr(p_cpo, CPO_REDO) == NULL) - AppendToRedobuffLit(cap->searchbuf); + AppendToRedobuffLit(cap->searchbuf, -1); AppendToRedobuff(NL_STR); } else if (cap->cmdchar == ':') @@ -1427,7 +1429,7 @@ do_pending_operator(cap, old_col, gui_yank) ResetRedobuff(); else { - AppendToRedobuffLit(repeat_cmdline); + AppendToRedobuffLit(repeat_cmdline, -1); AppendToRedobuff(NL_STR); vim_free(repeat_cmdline); repeat_cmdline = NULL; @@ -3928,7 +3930,6 @@ check_scrollbind(topline_diff, leftcol_diff) * Used for CTRL-Q and CTRL-S to avoid problems with terminals that use * xon/xoff */ -/*ARGSUSED */ static void nv_ignore(cap) cmdarg_T *cap; @@ -3936,6 +3937,17 @@ nv_ignore(cap) cap->retval |= CA_COMMAND_BUSY; /* don't call edit() now */ } +/* + * Command character that doesn't do anything, but unlike nv_ignore() does + * start edit(). Used for "startinsert" executed while starting up. + */ +/*ARGSUSED */ + static void +nv_nop(cap) + cmdarg_T *cap; +{ +} + /* * Command character doesn't exist. */ @@ -6320,10 +6332,8 @@ nv_brace(cap) { cap->oap->motion_type = MCHAR; cap->oap->use_reg_one = TRUE; - if (cap->cmdchar == ')') - cap->oap->inclusive = FALSE; - else - cap->oap->inclusive = TRUE; + /* The motion used to be inclusive for "(", but that is not what Vi does. */ + cap->oap->inclusive = FALSE; curwin->w_set_curswant = TRUE; if (findsent(cap->arg, cap->count1) == FAIL) diff --git a/src/proto/getchar.pro b/src/proto/getchar.pro index 270998984..e38f38009 100644 --- a/src/proto/getchar.pro +++ b/src/proto/getchar.pro @@ -9,7 +9,7 @@ void ResetRedobuff __ARGS((void)); void saveRedobuff __ARGS((void)); void restoreRedobuff __ARGS((void)); void AppendToRedobuff __ARGS((char_u *s)); -void AppendToRedobuffLit __ARGS((char_u *s)); +void AppendToRedobuffLit __ARGS((char_u *str, int len)); void AppendCharToRedobuff __ARGS((int c)); void AppendNumberToRedobuff __ARGS((long n)); void stuffReadbuff __ARGS((char_u *s)); diff --git a/src/search.c b/src/search.c index 5311141df..5e370b899 100644 --- a/src/search.c +++ b/src/search.c @@ -2394,7 +2394,7 @@ showmatch(c) /* * findsent(dir, count) - Find the start of the next sentence in direction - * 'dir' Sentences are supposed to end in ".", "!" or "?" followed by white + * "dir" Sentences are supposed to end in ".", "!" or "?" followed by white * space or a line break. Also stop at an empty line. * Return OK if the next sentence was found. */ diff --git a/src/spell.c b/src/spell.c index 303ed587e..d12a4bc55 100644 --- a/src/spell.c +++ b/src/spell.c @@ -8594,7 +8594,8 @@ spell_suggest(count) /* For redo we use a change-word command. */ ResetRedobuff(); AppendToRedobuff((char_u *)"ciw"); - AppendToRedobuff(stp->st_word); + AppendToRedobuffLit(p + c, + STRLEN(stp->st_word) + sug.su_badlen - stp->st_orglen); AppendCharToRedobuff(ESC); } } diff --git a/src/term.c b/src/term.c index a52e3fa28..cc3c0365a 100644 --- a/src/term.c +++ b/src/term.c @@ -3256,6 +3256,8 @@ stoptermcap() * echoed. * Only do this after termcap mode has been started, otherwise the codes for * the cursor keys may be wrong. + * Only do this when 'esckeys' is on, otherwise the response causes trouble in + * Insert mode. * On Unix only do it when both output and input are a tty (avoid writing * request to terminal while reading from a file). * The result is caught in check_termcode(). @@ -3266,6 +3268,7 @@ may_req_termresponse() if (crv_status == CRV_GET && cur_tmode == TMODE_RAW && termcap_active + && p_ek #ifdef UNIX && isatty(1) && isatty(read_cmd_fd) diff --git a/src/testdir/test60.in b/src/testdir/test60.in index 4435343ac..9899a94eb 100644 --- a/src/testdir/test60.in +++ b/src/testdir/test60.in @@ -47,6 +47,40 @@ endfunction " Non-existing autocmd event let test_cases += [['##MySpecialCmd', 0]] + " Existing and working option (long form) + let test_cases += [['&textwidth', 1]] + " Existing and working option (short form) + let test_cases += [['&tw', 1]] + " Negative form of existing and working option (long form) + let test_cases += [['&nojoinspaces', 0]] + " Negative form of existing and working option (short form) + let test_cases += [['&nojs', 0]] + " Non-existing option + let test_cases += [['&myxyzoption', 0]] + + " Existing and working option (long form) + let test_cases += [['+incsearch', 1]] + " Existing and working option (short form) + let test_cases += [['+is', 1]] + " Existing option that is hidden. + let test_cases += [['+autoprint', 0]] + + " Existing environment variable + let $EDITOR_NAME = 'Vim Editor' + let test_cases += [['$EDITOR_NAME', 1]] + " Non-existing environment variable + let test_cases += [['$NON_ENV_VAR', 0]] + + " Valid internal function + let test_cases += [['*bufnr', 1]] + " Non-existing internal function + let test_cases += [['*myxyzfunc', 0]] + + " Valid user defined function + let test_cases += [['*TestExists', 1]] + " Non-existing user defined function + let test_cases += [['*MyxyzFunc', 0]] + redir! > test.out for [test_case, result] in test_cases @@ -54,6 +88,189 @@ endfunction call RunTest(test_case, result) endfor + " Valid internal command (full match) + echo ':edit: 2' + if exists(':edit') == 2 + echo "OK" + else + echo "FAILED" + endif + + " Valid internal command (partial match) + echo ':q: 1' + if exists(':q') == 1 + echo "OK" + else + echo "FAILED" + endif + + " Non-existing internal command + echo ':invalidcmd: 0' + if !exists(':invalidcmd') + echo "OK" + else + echo "FAILED" + endif + + " User defined command (full match) + command! MyCmd :echo 'My command' + echo ':MyCmd: 2' + if exists(':MyCmd') == 2 + echo "OK" + else + echo "FAILED" + endif + + " User defined command (partial match) + command! MyOtherCmd :echo 'Another command' + echo ':My: 3' + if exists(':My') == 3 + echo "OK" + else + echo "FAILED" + endif + + " Command modifier + echo ':rightbelow: 2' + if exists(':rightbelow') == 2 + echo "OK" + else + echo "FAILED" + endif + + " Non-existing user defined command (full match) + delcommand MyCmd + + echo ':MyCmd: 0' + if !exists(':MyCmd') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing user defined command (partial match) + delcommand MyOtherCmd + + echo ':My: 0' + if !exists(':My') + echo "OK" + else + echo "FAILED" + endif + + " Valid local variable + let local_var = 1 + echo 'local_var: 1' + if exists('local_var') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing local variable + unlet local_var + echo 'local_var: 0' + if !exists('local_var') + echo "OK" + else + echo "FAILED" + endif + + " Valid local list + let local_list = ["blue", "orange"] + echo 'local_list: 1' + if exists('local_list') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing local list + unlet local_list + echo 'local_list: 0' + if !exists('local_list') + echo "OK" + else + echo "FAILED" + endif + + " Valid local dictionary + let local_dict = {"xcord":100, "ycord":2} + echo 'local_dict: 1' + if exists('local_dict') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing local dictionary + unlet local_dict + echo 'local_dict: 0' + if !exists('local_dict') + echo "OK" + else + echo "FAILED" + endif + + " Existing global variable + let g:global_var = 1 + echo 'g:global_var: 1' + if exists('g:global_var') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing global variable + unlet g:global_var + echo 'g:global_var: 0' + if !exists('g:global_var') + echo "OK" + else + echo "FAILED" + endif + + " Existing local curly-brace variable + let curly_local_var = 1 + let str = "local" + echo 'curly_{str}_var: 1' + if exists('curly_{str}_var') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing local curly-brace variable + unlet curly_local_var + echo 'curly_{str}_var: 0' + if !exists('curly_{str}_var') + echo "OK" + else + echo "FAILED" + endif + + " Existing global curly-brace variable + let g:curly_global_var = 1 + let str = "global" + echo 'g:curly_{str}_var: 1' + if exists('g:curly_{str}_var') + echo "OK" + else + echo "FAILED" + endif + + " Non-existing global curly-brace variable + unlet g:curly_global_var + echo 'g:curly_{str}_var: 0' + if !exists('g:curly_{str}_var') + echo "OK" + else + echo "FAILED" + endif + + " Script-local tests + source test60.vim + redir END endfunction :call TestExists() diff --git a/src/testdir/test60.ok b/src/testdir/test60.ok index 0d1e3dccd..fe6c4b765 100644 --- a/src/testdir/test60.ok +++ b/src/testdir/test60.ok @@ -29,3 +29,83 @@ OK OK ##MySpecialCmd: 0 OK +&textwidth: 1 +OK +&tw: 1 +OK +&nojoinspaces: 0 +OK +&nojs: 0 +OK +&myxyzoption: 0 +OK ++incsearch: 1 +OK ++is: 1 +OK ++autoprint: 0 +OK +$EDITOR_NAME: 1 +OK +$NON_ENV_VAR: 0 +OK +*bufnr: 1 +OK +*myxyzfunc: 0 +OK +*TestExists: 1 +OK +*MyxyzFunc: 0 +OK +:edit: 2 +OK +:q: 1 +OK +:invalidcmd: 0 +OK +:MyCmd: 2 +OK +:My: 3 +OK +:rightbelow: 2 +OK +:MyCmd: 0 +OK +:My: 0 +OK +local_var: 1 +OK +local_var: 0 +OK +local_list: 1 +OK +local_list: 0 +OK +local_dict: 1 +OK +local_dict: 0 +OK +g:global_var: 1 +OK +g:global_var: 0 +OK +curly_{str}_var: 1 +OK +curly_{str}_var: 0 +OK +g:curly_{str}_var: 1 +OK +g:curly_{str}_var: 0 +OK +s:script_var: 1 +OK +s:script_var: 0 +OK +s:curly_{str}_var: 1 +OK +s:curly_{str}_var: 0 +OK +*s:my_script_func: 1 +OK +*s:my_script_func: 0 +OK diff --git a/src/ui.c b/src/ui.c index c48af4ef8..ba5911f8a 100644 --- a/src/ui.c +++ b/src/ui.c @@ -469,9 +469,9 @@ clip_own_selection(cbd) #ifdef FEAT_X11 if (cbd == &clip_star) { - /* May have to show a different kind of highlighting for the selected - * area. There is no specific redraw command for this, just redraw - * all windows on the current buffer. */ + /* May have to show a different kind of highlighting for the + * selected area. There is no specific redraw command for this, + * just redraw all windows on the current buffer. */ if (cbd->owned && get_real_state() == VISUAL && clip_isautosel() @@ -2130,6 +2130,10 @@ clip_x11_request_selection(myShell, dpy, cbd) { if (XCheckTypedEvent(dpy, SelectionNotify, &event)) break; + if (XCheckTypedEvent(dpy, SelectionRequest, &event)) + /* We may get a SelectionRequest here and if we don't handle + * it we hang. KDE klipper does this, for example. */ + XtDispatchEvent(&event); /* Do we need this? Probably not. */ XSync(dpy, False); diff --git a/src/version.h b/src/version.h index 1402a4877..3e0e393bc 100644 --- a/src/version.h +++ b/src/version.h @@ -36,5 +36,5 @@ #define VIM_VERSION_NODOT "vim70aa" #define VIM_VERSION_SHORT "7.0aa" #define VIM_VERSION_MEDIUM "7.0aa ALPHA" -#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 23)" -#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 23, compiled " +#define VIM_VERSION_LONG "VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 28)" +#define VIM_VERSION_LONG_DATE "VIM - Vi IMproved 7.0aa ALPHA (2005 Dec 28, compiled " -- cgit v1.2.3