-*cmdline.txt* For Vim version 7.0aa. Last change: 2005 Dec 23
+*cmdline.txt* For Vim version 7.0aa. Last change: 2005 Dec 27
VIM REFERENCE MANUAL by Bram Moolenaar
*c_CTRL-R_=*
'=' the expression register: you are prompted to
enter an expression (see |expression|)
- (doesn't work at the expression prompt)
+ (doesn't work at the expression prompt; uses
+ the |sandbox| to avoid side effects)
See |registers| about registers. {not in Vi}
Implementation detail: When using the |expression| register
and invoking setcmdpos(), this sets the position before
-*eval.txt* For Vim version 7.0aa. Last change: 2005 Dec 19
+*eval.txt* For Vim version 7.0aa. Last change: 2005 Dec 27
VIM REFERENCE MANUAL by Bram Moolenaar
options are evaluated in a sandbox. This means that you are protected from
these expressions having nasty side effects. This gives some safety for when
these options are set from a modeline. It is also used when the command from
-a tags file is executed.
+a tags file is executed and for CTRL-R = in the command line.
The sandbox is also used for the |:sandbox| command.
These items are not allowed in the sandbox:
-*insert.txt* For Vim version 7.0aa. Last change: 2005 Dec 18
+*insert.txt* For Vim version 7.0aa. Last change: 2005 Dec 28
VIM REFERENCE MANUAL by Bram Moolenaar
INSERT COMPLETION POPUP MENU *ins-completion-menu*
-
+ *popupmenu-completion*
Vim can display the matches in a simplistic popup menu.
The menu is used when:
-*todo.txt* For Vim version 7.0aa. Last change: 2005 Dec 23
+*todo.txt* For Vim version 7.0aa. Last change: 2005 Dec 28
VIM REFERENCE MANUAL by Bram Moolenaar
*known-bugs*
-------------------- Known bugs and current work -----------------------
+Win32: test52 fails.
+
ccomplete:
- When an option is set: In completion mode and the user types (identifier)
characters, advance to the first match instead of removing the popup menu.
Performance:
7 For strings up to 3 bytes don't allocate memory, use v_list itself as a
character array. Use VAR_SSTRING (short string).
-8 Loading plugins takes startup time. Only load the part that is used to
- trigger the rest, and load the rest when it's needed?
8 Turn b_syn_ic and b_syn_containedin into b_syn_flags.
9 Loading menu.vim still takes quite a bit of time. How to make it faster?
8 in_id_list() takes much time for syntax highlighting. Cache the result?
8 Use another option than 'updatetime' for the CursorHold event. The two
things are unrelated for the user (but the implementation is more
difficult).
+8 Add an event like CursorHold that is triggered repeatedly, not just once.
8 Also trigger CursorHold in Insert mode?
7 Add autocommand event for when a buffer cannot be abandoned. So that user
can define the action taking (autowrite, dialog, fail) based on the kind
that marks can be updated. HierAssist has patch to add
BufChangePre, BufChangePost and RevertBuf. (Shah)
WinResized - When a window has been resized
-- Add autocommand to be executed every so many seconds? For writing the
- file now and then ('autosave').
+- Write the file now and then ('autosave'):
*'autosave'* *'as'* *'noautosave'* *'noas'*
'autosave' 'aw' number (default 0)
Automatically write the current buffer to file N seconds after the
8 Add "g^E" and "g^Y", to scroll a screen-full line up and down.
6 Add ":timer" command, to set a command to be executed at a certain
interval, or once after some time has elapsed. (Aaron)
+ Perhaps an autocommand event like CursorHold is better?
8 Add ":confirm" handling in open_exfile(), for when file already exists.
8 When quitting with changed files, make the dialog list the changed file
and allow "write all", "discard all", "write some". The last one would
-*version7.txt* For Vim version 7.0aa. Last change: 2005 Dec 23
+*version7.txt* For Vim version 7.0aa. Last change: 2005 Dec 28
VIM REFERENCE MANUAL by Bram Moolenaar
the same file with two different swapfile names. Now set the inode in the
buffer when creating a new file.
+When 'esckeys' is not set don't send the xterm code to request the version
+string, because it may cause trouble in Insert mode.
+
+When evaluating an expression for CTRL-R = on the command line it was possible
+to open a new window, resulting in errors for incremental search, and many
+other nasty things were possible. Now evaluate the expression in the sandbox
+to protect from unexpected behavior.
+
+"d(" deleted the character under the cursor, while the documentation specified
+an exclusive motion. Vi also doesn't delete the character under the cursor.
+
+Shift-Insert in Insert mode could put the cursor before the last character
+when it just fits in the window. In coladvance() don't stop at the window
+edge when filling with spaces and when in Insert mode. In mswin.vim avoid
+getting a beep from the "l" command.
+
vim:tw=78:ts=8:ft=help:norl:
" Set options and add mapping such that Vim behaves a lot like MS-Windows
"
" Maintainer: Bram Moolenaar <Bram@vim.org>
-" Last change: 2004 Jul 27
+" Last change: 2005 Dec 28
" bail out if this isn't wanted (mrsvim.vim uses this).
if exists("g:skip_loading_mswin") && g:skip_loading_mswin
let c = col(".")
normal i\e
if col(".") < c " compensate for i<ESC> moving the cursor left
+ " Avoid a beep when the text ends at the window edge.
+ let vb_save = &vb
+ let t_vb_save = &t_vb
+ set vb t_vb=
normal l
+ let &vb = vb_save
+ let &t_vb = t_vb_save
endif
let &ve = ove
endfunc
}
for (temp = 0; p[temp]; ++temp)
AppendCharToRedobuff(K_BS);
- AppendToRedobuffLit(ptr);
+ AppendToRedobuffLit(ptr, -1);
}
#ifdef FEAT_CINDENT
return;
p[len - 1] = NUL;
ins_str(p);
- AppendToRedobuffLit(p);
+ AppendToRedobuffLit(p, -1);
ctrlv = FALSE;
}
}
else
i = 0;
if (buf[i] != NUL)
- AppendToRedobuffLit(buf + i);
+ AppendToRedobuffLit(buf + i, -1);
}
else
{
if (bangredo) /* put cmd in redo buffer for ! command */
{
- AppendToRedobuffLit(prevcmd);
+ AppendToRedobuffLit(prevcmd, -1);
AppendToRedobuff((char_u *)"\n");
bangredo = FALSE;
}
if (k == len && found && *np != NUL)
{
if (gap == &ucmds)
- {
- if (xp != NULL)
- xp->xp_context = EXPAND_UNSUCCESSFUL;
return NULL;
- }
amb_local = TRUE;
}
NULL
# endif
);
+ if (p == NULL)
+ ea.cmdidx = CMD_SIZE; /* ambiguous user command */
}
#endif
}
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)
* 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). */
#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
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);
}
}
, KE_DROP /* DnD data is available */
, KE_CURSORHOLD /* CursorHold event */
+ , KE_NOP /* doesn't do something */
};
/*
#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)
/* 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)
#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
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;
}
}
{
/* 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
* 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));
{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},
* 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 == ':')
ResetRedobuff();
else
{
- AppendToRedobuffLit(repeat_cmdline);
+ AppendToRedobuffLit(repeat_cmdline, -1);
AppendToRedobuff(NL_STR);
vim_free(repeat_cmdline);
repeat_cmdline = NULL;
* 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;
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.
*/
{
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)
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));
/*
* 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.
*/
/* 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);
}
}
* 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().
if (crv_status == CRV_GET
&& cur_tmode == TMODE_RAW
&& termcap_active
+ && p_ek
#ifdef UNIX
&& isatty(1)
&& isatty(read_cmd_fd)
" 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
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()
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
#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()
{
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);
#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 "