mirror of
https://github.com/neovim/neovim.git
synced 2024-12-29 14:41:06 -07:00
Merge #7960 'vim patches'
This commit is contained in:
commit
f389196a34
@ -562,16 +562,16 @@ list of the current window.
|
||||
buffer.
|
||||
Also see |++opt| and |+cmd|.
|
||||
|
||||
:[count]arge[dit][!] [++opt] [+cmd] {name} *:arge* *:argedit*
|
||||
Add {name} to the argument list and edit it.
|
||||
:[count]arge[dit][!] [++opt] [+cmd] {name} .. *:arge* *:argedit*
|
||||
Add {name}s to the argument list and edit it.
|
||||
When {name} already exists in the argument list, this
|
||||
entry is edited.
|
||||
This is like using |:argadd| and then |:edit|.
|
||||
Note that only one file name is allowed, and spaces
|
||||
inside the file name are allowed, like with |:edit|.
|
||||
Spaces in filenames have to be escaped with "\".
|
||||
[count] is used like with |:argadd|.
|
||||
[!] is required if the current file cannot be
|
||||
|abandon|ed.
|
||||
If the current file cannot be |abandon|ed {name}s will
|
||||
still be added to the argument list, but won't be
|
||||
edited. No check for duplicates is done.
|
||||
Also see |++opt| and |+cmd|.
|
||||
|
||||
:[count]arga[dd] {name} .. *:arga* *:argadd* *E479*
|
||||
|
@ -376,7 +376,6 @@ MS-DOS support:
|
||||
Test functions:
|
||||
test_alloc_fail()
|
||||
test_autochdir()
|
||||
test_disable_char_avail()
|
||||
test_garbagecollect_now()
|
||||
test_null_channel()
|
||||
test_null_dict()
|
||||
@ -384,6 +383,7 @@ Test functions:
|
||||
test_null_list()
|
||||
test_null_partial()
|
||||
test_null_string()
|
||||
test_override()
|
||||
test_settime()
|
||||
|
||||
Other options:
|
||||
|
@ -1019,7 +1019,7 @@ au BufNewFile,BufRead *.java,*.jav setf java
|
||||
au BufNewFile,BufRead *.jj,*.jjt setf javacc
|
||||
|
||||
" JavaScript, ECMAScript
|
||||
au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx setf javascript
|
||||
au BufNewFile,BufRead *.js,*.javascript,*.es,*.jsx,*.mjs setf javascript
|
||||
|
||||
" Java Server Pages
|
||||
au BufNewFile,BufRead *.jsp setf jsp
|
||||
@ -1183,14 +1183,21 @@ au BufNewFile,BufRead *.markdown,*.mdown,*.mkd,*.mkdn,*.mdwn,*.md setf markdown
|
||||
" Mason
|
||||
au BufNewFile,BufRead *.mason,*.mhtml,*.comp setf mason
|
||||
|
||||
" Matlab or Objective C
|
||||
" Mathematica, Matlab, Murphi or Objective C
|
||||
au BufNewFile,BufRead *.m call s:FTm()
|
||||
|
||||
func! s:FTm()
|
||||
let n = 1
|
||||
while n < 10
|
||||
let saw_comment = 0 " Whether we've seen a multiline comment leader.
|
||||
while n < 100
|
||||
let line = getline(n)
|
||||
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|/\*\|//\)'
|
||||
if line =~ '^\s*/\*'
|
||||
" /* ... */ is a comment in Objective C and Murphi, so we can't conclude
|
||||
" it's either of them yet, but track this as a hint in case we don't see
|
||||
" anything more definitive.
|
||||
let saw_comment = 1
|
||||
endif
|
||||
if line =~ '^\s*\(#\s*\(include\|import\)\>\|@import\>\|//\)'
|
||||
setf objc
|
||||
return
|
||||
endif
|
||||
@ -1202,11 +1209,23 @@ func! s:FTm()
|
||||
setf mma
|
||||
return
|
||||
endif
|
||||
if line =~ '^\c\s*\(\(type\|var\)\>\|--\)'
|
||||
setf murphi
|
||||
return
|
||||
endif
|
||||
let n = n + 1
|
||||
endwhile
|
||||
if exists("g:filetype_m")
|
||||
|
||||
if saw_comment
|
||||
" We didn't see anything definitive, but this looks like either Objective C
|
||||
" or Murphi based on the comment leader. Assume the former as it is more
|
||||
" common.
|
||||
setf objc
|
||||
elseif exists("g:filetype_m")
|
||||
" Use user specified default filetype for .m
|
||||
exe "setf " . g:filetype_m
|
||||
else
|
||||
" Default is matlab
|
||||
setf matlab
|
||||
endif
|
||||
endfunc
|
||||
@ -1315,6 +1334,9 @@ au BufNewFile,BufRead *.mush setf mush
|
||||
" Mutt setup file (also for Muttng)
|
||||
au BufNewFile,BufRead Mutt{ng,}rc setf muttrc
|
||||
|
||||
" N1QL
|
||||
au BufRead,BufNewfile *.n1ql,*.nql setf n1ql
|
||||
|
||||
" Nano
|
||||
au BufNewFile,BufRead */etc/nanorc,*.nanorc setf nanorc
|
||||
|
||||
@ -2246,6 +2268,8 @@ func! s:FTtex()
|
||||
elseif format == 'plaintex'
|
||||
let format = 'plain'
|
||||
endif
|
||||
elseif expand('%') =~ 'tex/context/.*/.*.tex'
|
||||
let format = 'context'
|
||||
else
|
||||
" Default value, may be changed later:
|
||||
let format = exists("g:tex_flavor") ? g:tex_flavor : 'plain'
|
||||
@ -2287,7 +2311,7 @@ func! s:FTtex()
|
||||
endfunc
|
||||
|
||||
" ConTeXt
|
||||
au BufNewFile,BufRead tex/context/*/*.tex,*.mkii,*.mkiv,*.mkvi setf context
|
||||
au BufNewFile,BufRead *.mkii,*.mkiv,*.mkvi setf context
|
||||
|
||||
" Texinfo
|
||||
au BufNewFile,BufRead *.texinfo,*.texi,*.txi setf texinfo
|
||||
@ -2792,12 +2816,12 @@ runtime! ftdetect/*.vim
|
||||
" state.
|
||||
augroup END
|
||||
|
||||
" Generic configuration file (check this last, it's just guessing!)
|
||||
" Generic configuration file. Use FALLBACK, it's just guessing!
|
||||
au filetypedetect BufNewFile,BufRead,StdinReadPost *
|
||||
\ if !did_filetype() && expand("<amatch>") !~ g:ft_ignore_pat
|
||||
\ && (getline(1) =~ '^#' || getline(2) =~ '^#' || getline(3) =~ '^#'
|
||||
\ || getline(4) =~ '^#' || getline(5) =~ '^#') |
|
||||
\ setf conf |
|
||||
\ setf FALLBACK conf |
|
||||
\ endif
|
||||
|
||||
|
||||
|
@ -234,7 +234,8 @@ stage_patch() {
|
||||
printf "\n✘ 'patch' command not found\n"
|
||||
else
|
||||
printf "\nApplying patch...\n"
|
||||
patch -p1 --posix < "${patch_file}" || true
|
||||
patch -p1 < "${patch_file}" || true
|
||||
find -name '*.orig' -type f -delete
|
||||
fi
|
||||
printf "\nInstructions:\n Proceed to port the patch.\n"
|
||||
else
|
||||
|
@ -1387,20 +1387,25 @@ void set_curbuf(buf_T *buf, int action)
|
||||
/* Don't restart Select mode after switching to another buffer. */
|
||||
VIsual_reselect = FALSE;
|
||||
|
||||
/* close_windows() or apply_autocmds() may change curbuf */
|
||||
// close_windows() or apply_autocmds() may change curbuf and wipe out "buf"
|
||||
prevbuf = curbuf;
|
||||
bufref_T bufref;
|
||||
set_bufref(&bufref, prevbuf);
|
||||
bufref_T newbufref;
|
||||
bufref_T prevbufref;
|
||||
set_bufref(&prevbufref, prevbuf);
|
||||
set_bufref(&newbufref, buf);
|
||||
|
||||
// Autocommands may delete the curren buffer and/or the buffer we wan to go
|
||||
// to. In those cases don't close the buffer.
|
||||
if (!apply_autocmds(EVENT_BUFLEAVE, NULL, NULL, false, curbuf)
|
||||
|| (bufref_valid(&bufref) && !aborting())) {
|
||||
|| (bufref_valid(&prevbufref) && bufref_valid(&newbufref)
|
||||
&& !aborting())) {
|
||||
if (prevbuf == curwin->w_buffer) {
|
||||
reset_synblock(curwin);
|
||||
}
|
||||
if (unload) {
|
||||
close_windows(prevbuf, false);
|
||||
}
|
||||
if (bufref_valid(&bufref) && !aborting()) {
|
||||
if (bufref_valid(&prevbufref) && !aborting()) {
|
||||
win_T *previouswin = curwin;
|
||||
if (prevbuf == curbuf)
|
||||
u_sync(FALSE);
|
||||
|
@ -1058,6 +1058,20 @@ void ex_diffthis(exarg_T *eap)
|
||||
diff_win_options(curwin, TRUE);
|
||||
}
|
||||
|
||||
static void set_diff_option(win_T *wp, int value)
|
||||
{
|
||||
win_T *old_curwin = curwin;
|
||||
|
||||
curwin = wp;
|
||||
curbuf = curwin->w_buffer;
|
||||
curbuf_lock++;
|
||||
set_option_value("diff", (long)value, NULL, OPT_LOCAL);
|
||||
curbuf_lock--;
|
||||
curwin = old_curwin;
|
||||
curbuf = curwin->w_buffer;
|
||||
}
|
||||
|
||||
|
||||
/// Set options in window "wp" for diff mode.
|
||||
///
|
||||
/// @param addbuf Add buffer to diff.
|
||||
@ -1115,10 +1129,10 @@ void diff_win_options(win_T *wp, int addbuf)
|
||||
do_cmdline_cmd("set sbo+=hor");
|
||||
}
|
||||
|
||||
// Saved the current values, to be restored in ex_diffoff().
|
||||
wp->w_p_diff_saved = TRUE;
|
||||
// Save the current values, to be restored in ex_diffoff().
|
||||
wp->w_p_diff_saved = true;
|
||||
|
||||
wp->w_p_diff = true;
|
||||
set_diff_option(wp, true);
|
||||
|
||||
if (addbuf) {
|
||||
diff_buf_add(wp->w_buffer);
|
||||
@ -1139,7 +1153,7 @@ void ex_diffoff(exarg_T *eap)
|
||||
// Set 'diff' off. If option values were saved in
|
||||
// diff_win_options(), restore the ones whose settings seem to have
|
||||
// been left over from diff mode.
|
||||
wp->w_p_diff = false;
|
||||
set_diff_option(wp, false);
|
||||
|
||||
if (wp->w_p_diff_saved) {
|
||||
if (wp->w_p_scb) {
|
||||
|
@ -108,7 +108,7 @@ return {
|
||||
},
|
||||
{
|
||||
command='argedit',
|
||||
flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILE1, EDITCMD, ARGOPT, TRLBAR),
|
||||
flags=bit.bor(BANG, NEEDARG, RANGE, NOTADR, ZEROR, FILES, EDITCMD, ARGOPT, TRLBAR),
|
||||
addr_type=ADDR_ARGUMENTS,
|
||||
func='ex_argedit',
|
||||
},
|
||||
|
@ -1558,12 +1558,17 @@ static char_u *do_one_arg(char_u *str)
|
||||
|
||||
/// Separate the arguments in "str" and return a list of pointers in the
|
||||
/// growarray "gap".
|
||||
void get_arglist(garray_T *gap, char_u *str)
|
||||
static void get_arglist(garray_T *gap, char_u *str, int escaped)
|
||||
{
|
||||
ga_init(gap, (int)sizeof(char_u *), 20);
|
||||
while (*str != NUL) {
|
||||
GA_APPEND(char_u *, gap, str);
|
||||
|
||||
// If str is escaped, don't handle backslashes or spaces
|
||||
if (!escaped) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Isolate one argument, change it in-place, put a NUL after it.
|
||||
str = do_one_arg(str);
|
||||
}
|
||||
@ -1578,7 +1583,7 @@ int get_arglist_exp(char_u *str, int *fcountp, char_u ***fnamesp, bool wig)
|
||||
garray_T ga;
|
||||
int i;
|
||||
|
||||
get_arglist(&ga, str);
|
||||
get_arglist(&ga, str, true);
|
||||
|
||||
if (wig) {
|
||||
i = expand_wildcards(ga.ga_len, (char_u **)ga.ga_data,
|
||||
@ -1609,6 +1614,7 @@ static int do_arglist(char_u *str, int what, int after)
|
||||
char_u **exp_files;
|
||||
char_u *p;
|
||||
int match;
|
||||
int arg_escaped = true;
|
||||
|
||||
// Set default argument for ":argadd" command.
|
||||
if (what == AL_ADD && *str == NUL) {
|
||||
@ -1616,10 +1622,11 @@ static int do_arglist(char_u *str, int what, int after)
|
||||
return FAIL;
|
||||
}
|
||||
str = curbuf->b_fname;
|
||||
arg_escaped = false;
|
||||
}
|
||||
|
||||
// Collect all file name arguments in "new_ga".
|
||||
get_arglist(&new_ga, str);
|
||||
get_arglist(&new_ga, str, arg_escaped);
|
||||
|
||||
if (what == AL_DEL) {
|
||||
regmatch_T regmatch;
|
||||
@ -1915,31 +1922,21 @@ void ex_next(exarg_T *eap)
|
||||
/// ":argedit"
|
||||
void ex_argedit(exarg_T *eap)
|
||||
{
|
||||
int fnum;
|
||||
int i;
|
||||
char_u *s;
|
||||
int i = eap->addr_count ? (int)eap->line2 : curwin->w_arg_idx + 1;
|
||||
|
||||
// Add the argument to the buffer list and get the buffer number.
|
||||
fnum = buflist_add(eap->arg, BLN_LISTED);
|
||||
|
||||
// Check if this argument is already in the argument list.
|
||||
for (i = 0; i < ARGCOUNT; i++) {
|
||||
if (ARGLIST[i].ae_fnum == fnum) {
|
||||
break;
|
||||
}
|
||||
if (do_arglist(eap->arg, AL_ADD, i) == FAIL) {
|
||||
return;
|
||||
}
|
||||
if (i == ARGCOUNT) {
|
||||
// Can't find it, add it to the argument list.
|
||||
s = vim_strsave(eap->arg);
|
||||
int after = eap->addr_count > 0 ? (int)eap->line2 : curwin->w_arg_idx + 1;
|
||||
i = alist_add_list(1, &s, after);
|
||||
curwin->w_arg_idx = i;
|
||||
maketitle();
|
||||
|
||||
if (curwin->w_arg_idx == 0 && (curbuf->b_ml.ml_flags & ML_EMPTY)
|
||||
&& curbuf->b_ffname == NULL) {
|
||||
i = 0;
|
||||
}
|
||||
|
||||
alist_check_arg_idx();
|
||||
|
||||
// Edit the argument.
|
||||
do_argfile(eap, i);
|
||||
if (i < ARGCOUNT) {
|
||||
do_argfile(eap, i);
|
||||
}
|
||||
}
|
||||
|
||||
/// ":argadd"
|
||||
@ -1959,8 +1956,14 @@ void ex_argdelete(exarg_T *eap)
|
||||
eap->line2 = ARGCOUNT;
|
||||
}
|
||||
linenr_T 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 (linenr_T i = eap->line1; i <= eap->line2; i++) {
|
||||
xfree(ARGLIST[i - 1].ae_fname);
|
||||
|
@ -5974,15 +5974,18 @@ static void ex_quit(exarg_T *eap)
|
||||
wp = curwin;
|
||||
}
|
||||
|
||||
apply_autocmds(EVENT_QUITPRE, NULL, NULL, false, curbuf);
|
||||
// Refuse to quit when locked.
|
||||
if (curbuf_locked()) {
|
||||
return;
|
||||
}
|
||||
apply_autocmds(EVENT_QUITPRE, NULL, NULL, false, wp->w_buffer);
|
||||
// Refuse to quit when locked or when the buffer in the last window is
|
||||
// being closed (can only happen in autocommands).
|
||||
if (curbuf_locked()
|
||||
if (!win_valid(wp)
|
||||
|| (wp->w_buffer->b_nwindows == 1 && wp->w_buffer->b_locked > 0)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* If there are more files or windows we won't exit.
|
||||
*/
|
||||
@ -9740,13 +9743,20 @@ void filetype_maybe_enable(void)
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* ":setfiletype {name}"
|
||||
*/
|
||||
/// ":setfiletype [FALLBACK] {name}"
|
||||
static void ex_setfiletype(exarg_T *eap)
|
||||
{
|
||||
if (!did_filetype) {
|
||||
set_option_value("filetype", 0L, (char *)eap->arg, OPT_LOCAL);
|
||||
char_u *arg = eap->arg;
|
||||
|
||||
if (STRNCMP(arg, "FALLBACK ", 9) == 0) {
|
||||
arg += 9;
|
||||
}
|
||||
|
||||
set_option_value("filetype", 0L, (char *)arg, OPT_LOCAL);
|
||||
if (arg != eap->arg) {
|
||||
did_filetype = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -443,14 +443,8 @@ static uint8_t *command_line_enter(int firstc, long count, int indent)
|
||||
}
|
||||
}
|
||||
|
||||
if (s->gotesc) { // abandon command line
|
||||
xfree(ccline.cmdbuff);
|
||||
ccline.cmdbuff = NULL;
|
||||
if (msg_scrolled == 0) {
|
||||
compute_cmdrow();
|
||||
}
|
||||
MSG("");
|
||||
redraw_cmdline = true;
|
||||
if (s->gotesc) {
|
||||
abandon_cmdline();
|
||||
}
|
||||
}
|
||||
|
||||
@ -1062,6 +1056,12 @@ static void command_line_next_incsearch(CommandLineState *s, bool next_match)
|
||||
// put back on the match
|
||||
s->search_start = t;
|
||||
(void)decl(&s->search_start);
|
||||
} else if (next_match && s->firstc == '?') {
|
||||
// move just after the current match, so that
|
||||
// when nv_search finishes the cursor will be
|
||||
// put back on the match
|
||||
s->search_start = t;
|
||||
(void)incl(&s->search_start);
|
||||
}
|
||||
if (lt(t, s->search_start) && next_match) {
|
||||
// wrap around
|
||||
@ -1549,7 +1549,7 @@ static int command_line_handle_key(CommandLineState *s)
|
||||
}
|
||||
if (s->c != NUL) {
|
||||
if (s->c == s->firstc
|
||||
|| vim_strchr((char_u *)(p_magic ? "\\^$.*[" : "\\^$"), s->c)
|
||||
|| vim_strchr((char_u *)(p_magic ? "\\~^$.*[" : "\\^$"), s->c)
|
||||
!= NULL) {
|
||||
// put a backslash before special characters
|
||||
stuffcharReadbuff(s->c);
|
||||
@ -1673,9 +1673,6 @@ static int command_line_handle_key(CommandLineState *s)
|
||||
case Ctrl_G: // next match
|
||||
case Ctrl_T: // previous match
|
||||
if (p_is && !cmd_silent && (s->firstc == '/' || s->firstc == '?')) {
|
||||
if (char_avail()) {
|
||||
return 1;
|
||||
}
|
||||
if (ccline.cmdlen != 0) {
|
||||
command_line_next_incsearch(s, s->c == Ctrl_G);
|
||||
}
|
||||
@ -1941,6 +1938,18 @@ static int command_line_changed(CommandLineState *s)
|
||||
return 1;
|
||||
}
|
||||
|
||||
/// Abandon the command line.
|
||||
static void abandon_cmdline(void)
|
||||
{
|
||||
xfree(ccline.cmdbuff);
|
||||
ccline.cmdbuff = NULL;
|
||||
if (msg_scrolled == 0) {
|
||||
compute_cmdrow();
|
||||
}
|
||||
MSG("");
|
||||
redraw_cmdline = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* getcmdline() - accept a command line starting with firstc.
|
||||
*
|
||||
|
@ -6274,13 +6274,13 @@ do_doautocmd (
|
||||
|
||||
fname = skipwhite(fname);
|
||||
|
||||
/*
|
||||
* Loop over the events.
|
||||
*/
|
||||
while (*arg && !ascii_iswhite(*arg))
|
||||
if (apply_autocmds_group(event_name2nr(arg, &arg),
|
||||
fname, NULL, TRUE, group, curbuf, NULL))
|
||||
nothing_done = FALSE;
|
||||
// Loop over the events.
|
||||
while (*arg && !ends_excmd(*arg) && !ascii_iswhite(*arg)) {
|
||||
if (apply_autocmds_group(event_name2nr(arg, &arg), fname, NULL, true,
|
||||
group, curbuf, NULL)) {
|
||||
nothing_done = false;
|
||||
}
|
||||
}
|
||||
|
||||
if (nothing_done && do_msg) {
|
||||
MSG(_("No matching autocommands"));
|
||||
@ -6671,12 +6671,12 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
|
||||
proftime_T wait_time;
|
||||
bool did_save_redobuff = false;
|
||||
|
||||
/*
|
||||
* Quickly return if there are no autocommands for this event or
|
||||
* autocommands are blocked.
|
||||
*/
|
||||
if (first_autopat[(int)event] == NULL || autocmd_blocked > 0)
|
||||
// Quickly return if there are no autocommands for this event or
|
||||
// autocommands are blocked.
|
||||
if (event == NUM_EVENTS || first_autopat[(int)event] == NULL
|
||||
|| autocmd_blocked > 0) {
|
||||
goto BYPASS_AU;
|
||||
}
|
||||
|
||||
/*
|
||||
* When autocommands are busy, new autocommands are only executed when
|
||||
@ -6742,19 +6742,22 @@ static bool apply_autocmds_group(event_T event, char_u *fname, char_u *fname_io,
|
||||
* invalid.
|
||||
*/
|
||||
if (fname_io == NULL) {
|
||||
if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET)
|
||||
if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET) {
|
||||
autocmd_fname = NULL;
|
||||
else if (fname != NULL && *fname != NUL)
|
||||
} else if (fname != NULL && !ends_excmd(*fname)) {
|
||||
autocmd_fname = fname;
|
||||
else if (buf != NULL)
|
||||
} else if (buf != NULL) {
|
||||
autocmd_fname = buf->b_ffname;
|
||||
else
|
||||
} else {
|
||||
autocmd_fname = NULL;
|
||||
} else
|
||||
}
|
||||
} else {
|
||||
autocmd_fname = fname_io;
|
||||
if (autocmd_fname != NULL)
|
||||
}
|
||||
if (autocmd_fname != NULL) {
|
||||
autocmd_fname = vim_strsave(autocmd_fname);
|
||||
autocmd_fname_full = FALSE; /* call FullName_save() later */
|
||||
}
|
||||
autocmd_fname_full = false; // call FullName_save() later
|
||||
|
||||
/*
|
||||
* Set the buffer number to be used for <abuf>.
|
||||
|
@ -1330,10 +1330,14 @@ recover_names (
|
||||
names[2] = (char_u *)concat_fnames((char *)dir_name, ".sw?", TRUE);
|
||||
num_names = 3;
|
||||
} else {
|
||||
p = dir_name + STRLEN(dir_name);
|
||||
if (after_pathsep((char *)dir_name, (char *)p) && p[-1] == p[-2]) {
|
||||
/* Ends with '//', Use Full path for swap name */
|
||||
tail = (char_u *)make_percent_swname((char *)dir_name, (char *)fname_res);
|
||||
int len = STRLEN(dir_name);
|
||||
p = dir_name + len;
|
||||
if (after_pathsep((char *)dir_name, (char *)p)
|
||||
&& len > 1
|
||||
&& p[-1] == p[-2]) {
|
||||
// Ends with '//', Use Full path for swap name
|
||||
tail = (char_u *)make_percent_swname((char *)dir_name,
|
||||
(char *)fname_res);
|
||||
} else {
|
||||
tail = path_tail(fname_res);
|
||||
tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, TRUE);
|
||||
@ -3054,9 +3058,12 @@ char_u *makeswapname(char_u *fname, char_u *ffname, buf_T *buf, char_u *dir_name
|
||||
#ifdef HAVE_READLINK
|
||||
char_u fname_buf[MAXPATHL];
|
||||
#endif
|
||||
int len = STRLEN(dir_name);
|
||||
|
||||
s = dir_name + STRLEN(dir_name);
|
||||
if (after_pathsep((char *)dir_name, (char *)s) && s[-1] == s[-2]) { /* Ends with '//', Use Full path */
|
||||
s = dir_name + len;
|
||||
if (after_pathsep((char *)dir_name, (char *)s)
|
||||
&& len > 1
|
||||
&& s[-1] == s[-2]) { // Ends with '//', Use Full path
|
||||
r = NULL;
|
||||
if ((s = (char_u *)make_percent_swname((char *)dir_name, (char *)fname)) != NULL) {
|
||||
r = (char_u *)modname((char *)s, ".swp", FALSE);
|
||||
|
@ -1469,7 +1469,7 @@ void ins_char_bytes(char_u *buf, size_t charlen)
|
||||
}
|
||||
}
|
||||
|
||||
char_u *newp = (char_u *) xmalloc((size_t)(linelen + newlen - oldlen));
|
||||
char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen));
|
||||
|
||||
// Copy bytes before the cursor.
|
||||
if (col > 0) {
|
||||
@ -1478,7 +1478,10 @@ void ins_char_bytes(char_u *buf, size_t charlen)
|
||||
|
||||
// Copy bytes after the changed character(s).
|
||||
char_u *p = newp + col;
|
||||
memmove(p + newlen, oldp + col + oldlen, (size_t)(linelen - col - oldlen));
|
||||
if (linelen > col + oldlen) {
|
||||
memmove(p + newlen, oldp + col + oldlen,
|
||||
(size_t)(linelen - col - oldlen));
|
||||
}
|
||||
|
||||
// Insert or overwrite the new character.
|
||||
memmove(p, buf, charlen);
|
||||
|
@ -1637,16 +1637,22 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank)
|
||||
/* Prepare for redoing. Only use the nchar field for "r",
|
||||
* otherwise it might be the second char of the operator. */
|
||||
if (cap->cmdchar == 'g' && (cap->nchar == 'n'
|
||||
|| cap->nchar == 'N'))
|
||||
|| cap->nchar == 'N')) {
|
||||
prep_redo(oap->regname, cap->count0,
|
||||
get_op_char(oap->op_type), get_extra_op_char(oap->op_type),
|
||||
oap->motion_force, cap->cmdchar, cap->nchar);
|
||||
else if (cap->cmdchar != ':')
|
||||
prep_redo(oap->regname, 0L, NUL, 'v',
|
||||
get_op_char(oap->op_type),
|
||||
get_extra_op_char(oap->op_type),
|
||||
oap->op_type == OP_REPLACE
|
||||
? cap->nchar : NUL);
|
||||
get_op_char(oap->op_type), get_extra_op_char(oap->op_type),
|
||||
oap->motion_force, cap->cmdchar, cap->nchar);
|
||||
} else if (cap->cmdchar != ':') {
|
||||
int nchar = oap->op_type == OP_REPLACE ? cap->nchar : NUL;
|
||||
|
||||
// reverse what nv_replace() did
|
||||
if (nchar == REPLACE_CR_NCHAR) {
|
||||
nchar = CAR;
|
||||
} else if (nchar == REPLACE_NL_NCHAR) {
|
||||
nchar = NL;
|
||||
}
|
||||
prep_redo(oap->regname, 0L, NUL, 'v', get_op_char(oap->op_type),
|
||||
get_extra_op_char(oap->op_type), nchar);
|
||||
}
|
||||
if (!redo_VIsual_busy) {
|
||||
redo_VIsual_mode = resel_VIsual_mode;
|
||||
redo_VIsual_vcol = resel_VIsual_vcol;
|
||||
@ -5854,10 +5860,13 @@ static void nv_replace(cmdarg_T *cap)
|
||||
if (got_int)
|
||||
reset_VIsual();
|
||||
if (had_ctrl_v) {
|
||||
if (cap->nchar == '\r')
|
||||
cap->nchar = -1;
|
||||
else if (cap->nchar == '\n')
|
||||
cap->nchar = -2;
|
||||
// Use a special (negative) number to make a difference between a
|
||||
// literal CR or NL and a line break.
|
||||
if (cap->nchar == CAR) {
|
||||
cap->nchar = REPLACE_CR_NCHAR;
|
||||
} else if (cap->nchar == NL) {
|
||||
cap->nchar = REPLACE_NL_NCHAR;
|
||||
}
|
||||
}
|
||||
nv_operator(cap);
|
||||
return;
|
||||
|
@ -1629,13 +1629,18 @@ int op_replace(oparg_T *oap, int c)
|
||||
colnr_T oldlen;
|
||||
struct block_def bd;
|
||||
char_u *after_p = NULL;
|
||||
int had_ctrl_v_cr = (c == -1 || c == -2);
|
||||
int had_ctrl_v_cr = false;
|
||||
|
||||
if ((curbuf->b_ml.ml_flags & ML_EMPTY ) || oap->empty)
|
||||
return OK; /* nothing to do */
|
||||
|
||||
if (had_ctrl_v_cr)
|
||||
c = (c == -1 ? '\r' : '\n');
|
||||
if (c == REPLACE_CR_NCHAR) {
|
||||
had_ctrl_v_cr = true;
|
||||
c = CAR;
|
||||
} else if (c == REPLACE_NL_NCHAR) {
|
||||
had_ctrl_v_cr = true;
|
||||
c = NL;
|
||||
}
|
||||
|
||||
if (has_mbyte)
|
||||
mb_adjust_opend(oap);
|
||||
@ -1713,7 +1718,7 @@ int op_replace(oparg_T *oap, int c)
|
||||
// insert pre-spaces
|
||||
memset(newp + bd.textcol, ' ', (size_t)bd.startspaces);
|
||||
// insert replacement chars CHECK FOR ALLOCATED SPACE
|
||||
// -1/-2 is used for entering CR literally.
|
||||
// REPLACE_CR_NCHAR/REPLACE_NL_NCHAR is used for entering CR literally.
|
||||
size_t after_p_len = 0;
|
||||
if (had_ctrl_v_cr || (c != '\r' && c != '\n')) {
|
||||
// strlen(newp) at this point
|
||||
|
@ -1498,6 +1498,7 @@ do_set (
|
||||
char_u *newval;
|
||||
char_u *origval = NULL;
|
||||
char *saved_origval = NULL;
|
||||
char *saved_newval = NULL;
|
||||
unsigned newlen;
|
||||
int comma;
|
||||
int bs;
|
||||
@ -1514,7 +1515,17 @@ do_set (
|
||||
/* The old value is kept until we are sure that the
|
||||
* new value is valid. */
|
||||
oldval = *(char_u **)varp;
|
||||
if (nextchar == '&') { /* set to default val */
|
||||
|
||||
// When setting the local value of a global
|
||||
// option, the old value may be the global value.
|
||||
if (((int)options[opt_idx].indir & PV_BOTH) && (opt_flags
|
||||
& OPT_LOCAL)) {
|
||||
origval = *(char_u **)get_varp(&options[opt_idx]);
|
||||
} else {
|
||||
origval = oldval;
|
||||
}
|
||||
|
||||
if (nextchar == '&') { // set to default val
|
||||
newval = options[opt_idx].def_val[
|
||||
((flags & P_VI_DEF) || cp_val)
|
||||
? VI_DEFAULT : VIM_DEFAULT];
|
||||
@ -1573,6 +1584,9 @@ do_set (
|
||||
break;
|
||||
}
|
||||
xfree(oldval);
|
||||
if (origval == oldval) {
|
||||
origval = *(char_u **)varp;
|
||||
}
|
||||
oldval = *(char_u **)varp;
|
||||
}
|
||||
/*
|
||||
@ -1609,15 +1623,6 @@ do_set (
|
||||
++arg;
|
||||
}
|
||||
|
||||
/* When setting the local value of a global
|
||||
* option, the old value may be the global value. */
|
||||
if (((int)options[opt_idx].indir & PV_BOTH)
|
||||
&& (opt_flags & OPT_LOCAL))
|
||||
origval = *(char_u **)get_varp(
|
||||
&options[opt_idx]);
|
||||
else
|
||||
origval = oldval;
|
||||
|
||||
/*
|
||||
* Copy the new string into allocated memory.
|
||||
* Can't use set_string_option_direct(), because
|
||||
@ -1787,43 +1792,37 @@ do_set (
|
||||
new_value_alloced = TRUE;
|
||||
}
|
||||
|
||||
/* Set the new value. */
|
||||
// Set the new value.
|
||||
*(char_u **)(varp) = newval;
|
||||
|
||||
if (!starting && origval != NULL) {
|
||||
if (!starting && origval != NULL && newval != NULL) {
|
||||
// origval may be freed by
|
||||
// did_set_string_option(), make a copy.
|
||||
saved_origval = xstrdup((char *) origval);
|
||||
saved_origval = xstrdup((char *)origval);
|
||||
// newval (and varp) may become invalid if the
|
||||
// buffer is closed by autocommands.
|
||||
saved_newval = xstrdup((char *)newval);
|
||||
}
|
||||
|
||||
/* Handle side effects, and set the global value for
|
||||
* ":set" on local options. */
|
||||
// Handle side effects, and set the global value for
|
||||
// ":set" on local options. Note: when setting 'syntax'
|
||||
// or 'filetype' autocommands may be triggered that can
|
||||
// cause havoc.
|
||||
errmsg = did_set_string_option(opt_idx, (char_u **)varp,
|
||||
new_value_alloced, oldval, errbuf, opt_flags);
|
||||
|
||||
if (errmsg == NULL) {
|
||||
trigger_optionsset_string(opt_idx, opt_flags, saved_origval,
|
||||
saved_newval);
|
||||
}
|
||||
xfree(saved_origval);
|
||||
xfree(saved_newval);
|
||||
|
||||
// If error detected, print the error message.
|
||||
if (errmsg != NULL) {
|
||||
xfree(saved_origval);
|
||||
goto skip;
|
||||
}
|
||||
|
||||
if (saved_origval != NULL) {
|
||||
char buf_type[7];
|
||||
vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
|
||||
(opt_flags & OPT_LOCAL) ? "local" : "global");
|
||||
set_vim_var_string(VV_OPTION_NEW, *(char **) varp, -1);
|
||||
set_vim_var_string(VV_OPTION_OLD, saved_origval, -1);
|
||||
set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
|
||||
apply_autocmds(EVENT_OPTIONSET,
|
||||
(char_u *)options[opt_idx].fullname,
|
||||
NULL, false, NULL);
|
||||
reset_v_option_vars();
|
||||
xfree(saved_origval);
|
||||
if (options[opt_idx].flags & P_UI_OPTION) {
|
||||
ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
|
||||
STRING_OBJ(cstr_as_string(*(char **)varp)));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// key code option(FIXME(tarruda): Show a warning or something
|
||||
// similar)
|
||||
@ -2406,6 +2405,7 @@ static char *set_string_option(const int opt_idx, const char *const value,
|
||||
*varp = s;
|
||||
|
||||
char *const saved_oldval = (starting ? NULL : xstrdup(oldval));
|
||||
char *const saved_newval = (starting ? NULL : xstrdup(s));
|
||||
|
||||
char *const r = (char *)did_set_string_option(
|
||||
opt_idx, (char_u **)varp, (int)true, (char_u *)oldval, NULL, opt_flags);
|
||||
@ -2414,23 +2414,12 @@ static char *set_string_option(const int opt_idx, const char *const value,
|
||||
}
|
||||
|
||||
// call autocommand after handling side effects
|
||||
if (saved_oldval != NULL) {
|
||||
char buf_type[7];
|
||||
vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
|
||||
(opt_flags & OPT_LOCAL) ? "local" : "global");
|
||||
set_vim_var_string(VV_OPTION_NEW, (char *)(*varp), -1);
|
||||
set_vim_var_string(VV_OPTION_OLD, saved_oldval, -1);
|
||||
set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
|
||||
apply_autocmds(EVENT_OPTIONSET,
|
||||
(char_u *)options[opt_idx].fullname,
|
||||
NULL, false, NULL);
|
||||
reset_v_option_vars();
|
||||
xfree(saved_oldval);
|
||||
if (options[opt_idx].flags & P_UI_OPTION) {
|
||||
ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
|
||||
STRING_OBJ(cstr_as_string((char *)(*varp))));
|
||||
}
|
||||
if (r == NULL) {
|
||||
trigger_optionsset_string(opt_idx, opt_flags,
|
||||
saved_oldval, saved_newval);
|
||||
}
|
||||
xfree(saved_oldval);
|
||||
xfree(saved_newval);
|
||||
|
||||
return r;
|
||||
}
|
||||
@ -4461,6 +4450,27 @@ static char *set_num_option(int opt_idx, char_u *varp, long value,
|
||||
return (char *)errmsg;
|
||||
}
|
||||
|
||||
static void trigger_optionsset_string(int opt_idx, int opt_flags,
|
||||
char *oldval, char *newval)
|
||||
{
|
||||
if (oldval != NULL && newval != NULL) {
|
||||
char buf_type[7];
|
||||
|
||||
vim_snprintf(buf_type, ARRAY_SIZE(buf_type), "%s",
|
||||
(opt_flags & OPT_LOCAL) ? "local" : "global");
|
||||
set_vim_var_string(VV_OPTION_OLD, oldval, -1);
|
||||
set_vim_var_string(VV_OPTION_NEW, newval, -1);
|
||||
set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
|
||||
apply_autocmds(EVENT_OPTIONSET,
|
||||
(char_u *)options[opt_idx].fullname, NULL, false, NULL);
|
||||
reset_v_option_vars();
|
||||
if (options[opt_idx].flags & P_UI_OPTION) {
|
||||
ui_call_option_set(cstr_as_string(options[opt_idx].fullname),
|
||||
STRING_OBJ(cstr_as_string(newval)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Called after an option changed: check if something needs to be redrawn.
|
||||
*/
|
||||
|
@ -567,6 +567,7 @@ static int pum_set_selected(int n, int repeat)
|
||||
&& (repeat <= 1)
|
||||
&& (vim_strchr(p_cot, 'p') != NULL)) {
|
||||
win_T *curwin_save = curwin;
|
||||
tabpage_T *curtab_save = curtab;
|
||||
int res = OK;
|
||||
|
||||
// Open a preview window. 3 lines by default. Prefer
|
||||
@ -647,7 +648,12 @@ static int pum_set_selected(int n, int repeat)
|
||||
curwin->w_cursor.lnum = 1;
|
||||
curwin->w_cursor.col = 0;
|
||||
|
||||
if ((curwin != curwin_save) && win_valid(curwin_save)) {
|
||||
if ((curwin != curwin_save && win_valid(curwin_save))
|
||||
|| (curtab != curtab_save && valid_tabpage(curtab_save))) {
|
||||
if (curtab != curtab_save && valid_tabpage(curtab_save)) {
|
||||
goto_tabpage_tp(curtab_save, false, false);
|
||||
}
|
||||
|
||||
// When the first completion is done and the preview
|
||||
// window is not resized, skip the preview window's
|
||||
// status line redrawing.
|
||||
|
@ -3909,6 +3909,7 @@ load_dummy_buffer (
|
||||
bufref_T newbuf_to_wipe;
|
||||
int failed = true;
|
||||
aco_save_T aco;
|
||||
int readfile_result;
|
||||
|
||||
// Allocate a buffer without putting it in the buffer list.
|
||||
newbuf = buflist_new(NULL, NULL, (linenr_T)1, BLN_DUMMY);
|
||||
@ -3922,7 +3923,9 @@ load_dummy_buffer (
|
||||
|
||||
/* need to open the memfile before putting the buffer in a window */
|
||||
if (ml_open(newbuf) == OK) {
|
||||
/* set curwin/curbuf to buf and save a few things */
|
||||
// Make sure this buffer isn't wiped out by auto commands.
|
||||
newbuf->b_locked++;
|
||||
// set curwin/curbuf to buf and save a few things
|
||||
aucmd_prepbuf(&aco, newbuf);
|
||||
|
||||
/* Need to set the filename for autocommands. */
|
||||
@ -3936,9 +3939,11 @@ load_dummy_buffer (
|
||||
curbuf->b_flags &= ~BF_DUMMY;
|
||||
|
||||
newbuf_to_wipe.br_buf = NULL;
|
||||
if (readfile(fname, NULL,
|
||||
(linenr_T)0, (linenr_T)0, (linenr_T)MAXLNUM,
|
||||
NULL, READ_NEW | READ_DUMMY) == OK
|
||||
readfile_result = readfile(fname, NULL, (linenr_T)0, (linenr_T)0,
|
||||
(linenr_T)MAXLNUM, NULL,
|
||||
READ_NEW | READ_DUMMY);
|
||||
newbuf->b_locked--;
|
||||
if (readfile_result == OK
|
||||
&& !got_int
|
||||
&& !(curbuf->b_flags & BF_NEW)) {
|
||||
failed = FALSE;
|
||||
|
@ -3712,7 +3712,7 @@ current_quote (
|
||||
int selected_quote = FALSE; /* Has quote inside selection */
|
||||
int i;
|
||||
|
||||
/* Correct cursor when 'selection' is exclusive */
|
||||
// Correct cursor when 'selection' is "exclusive".
|
||||
if (VIsual_active) {
|
||||
// this only works within one line
|
||||
if (VIsual.lnum != curwin->w_cursor.lnum) {
|
||||
@ -3720,8 +3720,17 @@ current_quote (
|
||||
}
|
||||
|
||||
vis_bef_curs = lt(VIsual, curwin->w_cursor);
|
||||
if (*p_sel == 'e' && vis_bef_curs)
|
||||
if (*p_sel == 'e') {
|
||||
if (!vis_bef_curs) {
|
||||
// VIsual needs to be start of Visual selection.
|
||||
pos_T t = curwin->w_cursor;
|
||||
|
||||
curwin->w_cursor = VIsual;
|
||||
VIsual = t;
|
||||
vis_bef_curs = true;
|
||||
}
|
||||
dec_cursor();
|
||||
}
|
||||
vis_empty = equalpos(VIsual, curwin->w_cursor);
|
||||
}
|
||||
|
||||
|
@ -22,15 +22,12 @@ SCRIPTS_DEFAULT = \
|
||||
test48.out \
|
||||
test49.out \
|
||||
test52.out \
|
||||
test53.out \
|
||||
test64.out \
|
||||
test73.out \
|
||||
test79.out \
|
||||
|
||||
ifneq ($(OS),Windows_NT)
|
||||
SCRIPTS_DEFAULTS := $(SCRIPTS_DEFAULT) \
|
||||
test17.out \
|
||||
test32.out \
|
||||
|
||||
endif
|
||||
|
||||
@ -48,9 +45,13 @@ NEW_TESTS ?= \
|
||||
test_cmdline.res \
|
||||
test_command_count.res \
|
||||
test_cscope.res \
|
||||
test_curswant.res \
|
||||
test_digraph.res \
|
||||
test_edit.res \
|
||||
test_exists.res \
|
||||
test_diffmode.res \
|
||||
test_farsi.res \
|
||||
test_file_size.res \
|
||||
test_filter_map.res \
|
||||
test_findfile.res \
|
||||
test_fnameescape.res \
|
||||
@ -66,8 +67,11 @@ NEW_TESTS ?= \
|
||||
test_hlsearch.res \
|
||||
test_increment.res \
|
||||
test_increment_dbcs.res \
|
||||
test_ins_complete.res \
|
||||
test_lambda.res \
|
||||
test_langmap.res \
|
||||
test_let.res \
|
||||
test_lineending.res \
|
||||
test_makeencoding.res \
|
||||
test_marks.res \
|
||||
test_match.res \
|
||||
@ -81,7 +85,9 @@ NEW_TESTS ?= \
|
||||
test_options.res \
|
||||
test_profile.res \
|
||||
test_quickfix.res \
|
||||
test_recover.res \
|
||||
test_retab.res \
|
||||
test_scrollbind.res \
|
||||
test_search.res \
|
||||
test_signs.res \
|
||||
test_smartindent.res \
|
||||
@ -92,6 +98,7 @@ NEW_TESTS ?= \
|
||||
test_substitute.res \
|
||||
test_syntax.res \
|
||||
test_system.res \
|
||||
test_tab.res \
|
||||
test_tabpage.res \
|
||||
test_textobjects.res \
|
||||
test_timers.res \
|
||||
@ -99,6 +106,7 @@ NEW_TESTS ?= \
|
||||
test_usercommands.res \
|
||||
test_vimscript.res \
|
||||
test_visual.res \
|
||||
test_winbuf_close.res \
|
||||
test_window_id.res \
|
||||
test_writefile.res \
|
||||
test_alot.res
|
||||
|
@ -4,7 +4,7 @@
|
||||
"
|
||||
" To execute only specific test functions, add a second argument. It will be
|
||||
" matched against the names of the Test_ function. E.g.:
|
||||
" ../vim -u NONE -S runtest.vim test_channel.vim open_delay
|
||||
" ../vim -u NONE -S runtest.vim test_channel.vim open_delay
|
||||
" The output can be found in the "messages" file.
|
||||
"
|
||||
" The test script may contain anything, only functions that start with
|
||||
@ -42,10 +42,11 @@ endif
|
||||
" Common with all tests on all systems.
|
||||
source setup.vim
|
||||
|
||||
" For consistency run all tests with 'nocompatible' set.
|
||||
" This also enables use of line continuation.
|
||||
set viminfo+=nviminfo
|
||||
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
|
||||
@ -62,11 +63,38 @@ lang mess C
|
||||
" Always use forward slashes.
|
||||
set shellslash
|
||||
|
||||
" Prepare for calling garbagecollect_for_testing().
|
||||
" Prepare for calling test_garbagecollect_now().
|
||||
let v:testing = 1
|
||||
|
||||
" Support function: get the alloc ID by name.
|
||||
function GetAllocId(name)
|
||||
exe 'split ' . s:srcdir . '/alloc.h'
|
||||
let top = search('typedef enum')
|
||||
if top == 0
|
||||
call add(v:errors, 'typedef not found in alloc.h')
|
||||
endif
|
||||
let lnum = search('aid_' . a:name . ',')
|
||||
if lnum == 0
|
||||
call add(v:errors, 'Alloc ID ' . a:name . ' not defined')
|
||||
endif
|
||||
close
|
||||
return lnum - top - 1
|
||||
endfunc
|
||||
|
||||
func RunTheTest(test)
|
||||
echo 'Executing ' . a:test
|
||||
|
||||
" Avoid stopping at the "hit enter" prompt
|
||||
set nomore
|
||||
|
||||
" Avoid a three second wait when a message is about to be overwritten by the
|
||||
" mode message.
|
||||
set noshowmode
|
||||
|
||||
" Some tests wipe out buffers. To be consistent, always wipe out all
|
||||
" buffers.
|
||||
%bwipe!
|
||||
|
||||
if exists("*SetUp")
|
||||
try
|
||||
call SetUp()
|
||||
@ -77,14 +105,21 @@ func RunTheTest(test)
|
||||
|
||||
call add(s:messages, 'Executing ' . a:test)
|
||||
let s:done += 1
|
||||
try
|
||||
|
||||
if a:test =~ 'Test_nocatch_'
|
||||
" Function handles errors itself. This avoids skipping commands after the
|
||||
" error.
|
||||
exe 'call ' . a:test
|
||||
catch /^\cskipped/
|
||||
call add(s:messages, ' Skipped')
|
||||
call add(s:skipped, 'SKIPPED ' . a:test . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
|
||||
catch
|
||||
call add(v:errors, 'Caught exception in ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
|
||||
endtry
|
||||
else
|
||||
try
|
||||
exe 'call ' . a:test
|
||||
catch /^\cskipped/
|
||||
call add(s:messages, ' Skipped')
|
||||
call add(s:skipped, 'SKIPPED ' . a:test . ': ' . substitute(v:exception, '^\S*\s\+', '', ''))
|
||||
catch
|
||||
call add(v:errors, 'Caught exception in ' . a:test . ': ' . v:exception . ' @ ' . v:throwpoint)
|
||||
endtry
|
||||
endif
|
||||
|
||||
if exists("*TearDown")
|
||||
try
|
||||
@ -94,7 +129,14 @@ func RunTheTest(test)
|
||||
endtry
|
||||
endif
|
||||
|
||||
" Close any extra windows and make the current one not modified.
|
||||
" Clear any autocommands
|
||||
au!
|
||||
|
||||
" Close any extra tab pages and windows and make the current one not modified.
|
||||
while tabpagenr('$') > 1
|
||||
quit!
|
||||
endwhile
|
||||
|
||||
while 1
|
||||
let wincount = winnr('$')
|
||||
if wincount == 1
|
||||
@ -107,7 +149,6 @@ func RunTheTest(test)
|
||||
break
|
||||
endif
|
||||
endwhile
|
||||
set nomodified
|
||||
endfunc
|
||||
|
||||
func AfterTheTest()
|
||||
@ -186,8 +227,14 @@ endif
|
||||
|
||||
" Names of flaky tests.
|
||||
let s:flaky = [
|
||||
\ 'Test_with_partial_callback()',
|
||||
\ 'Test_oneshot()',
|
||||
\ 'Test_out_cb()',
|
||||
\ 'Test_paused()',
|
||||
\ 'Test_reltime()',
|
||||
\ 'Test_terminal_composing_unicode()',
|
||||
\ 'Test_terminal_redir_file()',
|
||||
\ 'Test_terminal_tmap()',
|
||||
\ 'Test_with_partial_callback()',
|
||||
\ 'Test_lambda_with_timer()',
|
||||
\ ]
|
||||
|
||||
@ -204,12 +251,30 @@ endif
|
||||
|
||||
" Execute the tests in alphabetical order.
|
||||
for s:test in sort(s:tests)
|
||||
" Silence, please!
|
||||
set belloff=all
|
||||
|
||||
call RunTheTest(s:test)
|
||||
|
||||
if len(v:errors) > 0 && index(s:flaky, s:test) >= 0
|
||||
call add(s:messages, 'Found errors in ' . s:test . ':')
|
||||
call extend(s:messages, v:errors)
|
||||
call add(s:messages, 'Flaky test failed, running it again')
|
||||
let first_run = v:errors
|
||||
|
||||
" Flakiness is often caused by the system being very busy. Sleep a couple
|
||||
" of seconds to have a higher chance of succeeding the second time.
|
||||
sleep 2
|
||||
|
||||
let v:errors = []
|
||||
call RunTheTest(s:test)
|
||||
if len(v:errors) > 0
|
||||
let second_run = v:errors
|
||||
let v:errors = ['First run:']
|
||||
call extend(v:errors, first_run)
|
||||
call add(v:errors, 'Second run:')
|
||||
call extend(v:errors, second_run)
|
||||
endif
|
||||
endif
|
||||
|
||||
call AfterTheTest()
|
||||
|
@ -1,60 +0,0 @@
|
||||
Test for insert expansion
|
||||
|
||||
:se cpt=.,w
|
||||
* add-expands (word from next line) from other window
|
||||
* add-expands (current buffer first)
|
||||
* Local expansion, ends in an empty line (unless it becomes a global expansion)
|
||||
* starts Local and switches to global add-expansion
|
||||
:se cpt=.,w,i
|
||||
* i-add-expands and switches to local
|
||||
* add-expands lines (it would end in an empty line if it didn't ignored it self)
|
||||
:se cpt=kXtestfile
|
||||
* checks k-expansion, and file expansion (use Xtest11 instead of test11,
|
||||
* because TEST11.OUT may match first on DOS)
|
||||
:se cpt=w
|
||||
* checks make_cyclic in other window
|
||||
:se cpt=u nohid
|
||||
* checks unloaded buffer expansion
|
||||
* checks adding mode abortion
|
||||
:se cpt=t,d
|
||||
* tag expansion, define add-expansion interrupted
|
||||
* t-expansion
|
||||
|
||||
STARTTEST
|
||||
:se backspace=""
|
||||
:se cpt=.,w ff=unix | $-2,$w!Xtestfile | set ff&
|
||||
:se cot=
|
||||
nO#include "Xtestfile"
|
||||
ru
|
||||
O
|
||||
|
||||
|
||||
:se cpt=.,w,i
|
||||
kOM
|
||||
|
||||
:se cpt=kXtestfile
|
||||
:w Xtest11.one
|
||||
:w Xtest11.two
|
||||
OIXA
|
||||
:" use CTRL-X CTRL-F to complete Xtest11.one, remove it and then use
|
||||
:" CTRL-X CTRL-F again to verify this doesn't cause trouble.
|
||||
OXddk
|
||||
:se cpt=w
|
||||
OST
|
||||
:se cpt=u nohid
|
||||
oOEN
|
||||
unl
|
||||
:se cpt=t,d def=^\\k* tags=Xtestfile notagbsearch
|
||||
O
|
||||
a
|
||||
:wq! test.out
|
||||
ENDTEST
|
||||
|
||||
start of testfile
|
||||
run1
|
||||
run2
|
||||
end of testfile
|
||||
|
||||
test11 36Gepeto /Tag/
|
||||
asd test11file 36G
|
||||
Makefile to run
|
@ -1,15 +0,0 @@
|
||||
#include "Xtestfile"
|
||||
run1 run3
|
||||
run3 run3
|
||||
|
||||
Makefile to run3
|
||||
Makefile to run3
|
||||
Makefile to run3
|
||||
Xtest11.two
|
||||
STARTTEST
|
||||
ENDTEST
|
||||
unless
|
||||
test11file 36Gepeto /Tag/ asd
|
||||
asd
|
||||
run1 run2
|
||||
|
@ -1,74 +0,0 @@
|
||||
Tests for string and html text objects. vim: set ft=vim :
|
||||
|
||||
Note that the end-of-line moves the cursor to the next test line.
|
||||
|
||||
Also test match() and matchstr()
|
||||
|
||||
STARTTEST
|
||||
/^start:/
|
||||
da"
|
||||
0va'a'rx
|
||||
02f`da`
|
||||
0fXdi"
|
||||
03f'vi'ry
|
||||
:set quoteescape=+*-
|
||||
di`
|
||||
$F"va"oha"i"rz
|
||||
:"
|
||||
/^<begin
|
||||
jfXdit
|
||||
0fXdit
|
||||
fXdat
|
||||
0fXdat
|
||||
dit
|
||||
:"
|
||||
:put =matchstr(\"abcd\", \".\", 0, 2) " b
|
||||
:put =matchstr(\"abcd\", \"..\", 0, 2) " bc
|
||||
:put =matchstr(\"abcd\", \".\", 2, 0) " c (zero and negative -> first match)
|
||||
:put =matchstr(\"abcd\", \".\", 0, -1) " a
|
||||
:put =match(\"abcd\", \".\", 0, 5) " -1
|
||||
:put =match(\"abcd\", \".\", 0, -1) " 0
|
||||
:put =match('abc', '.', 0, 1) " 0
|
||||
:put =match('abc', '.', 0, 2) " 1
|
||||
:put =match('abc', '.', 0, 3) " 2
|
||||
:put =match('abc', '.', 0, 4) " -1
|
||||
:put =match('abc', '.', 1, 1) " 1
|
||||
:put =match('abc', '.', 2, 1) " 2
|
||||
:put =match('abc', '.', 3, 1) " -1
|
||||
:put =match('abc', '$', 0, 1) " 3
|
||||
:put =match('abc', '$', 0, 2) " -1
|
||||
:put =match('abc', '$', 1, 1) " 3
|
||||
:put =match('abc', '$', 2, 1) " 3
|
||||
:put =match('abc', '$', 3, 1) " 3
|
||||
:put =match('abc', '$', 4, 1) " -1
|
||||
:put =match('abc', '\zs', 0, 1) " 0
|
||||
:put =match('abc', '\zs', 0, 2) " 1
|
||||
:put =match('abc', '\zs', 0, 3) " 2
|
||||
:put =match('abc', '\zs', 0, 4) " 3
|
||||
:put =match('abc', '\zs', 0, 5) " -1
|
||||
:put =match('abc', '\zs', 1, 1) " 1
|
||||
:put =match('abc', '\zs', 2, 1) " 2
|
||||
:put =match('abc', '\zs', 3, 1) " 3
|
||||
:put =match('abc', '\zs', 4, 1) " -1
|
||||
:/^start:/,/^end:/wq! test.out
|
||||
ENDTEST
|
||||
|
||||
start: "wo\"rd\\" foo
|
||||
'foo' 'bar' 'piep'
|
||||
bla bla `quote` blah
|
||||
out " in "noXno"
|
||||
"'" 'blah' rep 'buh'
|
||||
bla `s*`d-`+++`l**` b`la
|
||||
voo "nah" sdf " asdf" sdf " sdf" sd
|
||||
|
||||
<begin>
|
||||
-<b>asdf<i>Xasdf</i>asdf</b>-
|
||||
-<b>asdX<i>a<i />sdf</i>asdf</b>-
|
||||
-<b>asdf<i>Xasdf</i>asdf</b>-
|
||||
-<b>asdX<i>as<b />df</i>asdf</b>-
|
||||
-<b>
|
||||
innertext object
|
||||
</b>
|
||||
</begin>
|
||||
SEARCH:
|
||||
end:
|
@ -1,45 +0,0 @@
|
||||
start: foo
|
||||
xxxxxxxxxxxx'piep'
|
||||
bla bla blah
|
||||
out " in ""
|
||||
"'" 'blah'yyyyy'buh'
|
||||
bla `` b`la
|
||||
voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd
|
||||
|
||||
<begin>
|
||||
-<b>asdf<i></i>asdf</b>-
|
||||
-<b></b>-
|
||||
-<b>asdfasdf</b>-
|
||||
--
|
||||
-<b></b>
|
||||
</begin>
|
||||
b
|
||||
bc
|
||||
c
|
||||
a
|
||||
-1
|
||||
0
|
||||
0
|
||||
1
|
||||
2
|
||||
-1
|
||||
1
|
||||
2
|
||||
-1
|
||||
3
|
||||
-1
|
||||
3
|
||||
3
|
||||
3
|
||||
-1
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
-1
|
||||
1
|
||||
2
|
||||
3
|
||||
-1
|
||||
SEARCH:
|
||||
end:
|
Binary file not shown.
Binary file not shown.
@ -1,7 +1,6 @@
|
||||
" A series of tests that can run in one Vim invocation.
|
||||
" This makes testing go faster, since Vim doesn't need to restart.
|
||||
|
||||
set belloff=all
|
||||
source test_assign.vim
|
||||
source test_changedtick.vim
|
||||
source test_cursor_func.vim
|
||||
@ -19,12 +18,14 @@ source test_ga.vim
|
||||
source test_goto.vim
|
||||
source test_jumps.vim
|
||||
source test_fileformat.vim
|
||||
source test_filetype.vim
|
||||
source test_lambda.vim
|
||||
source test_menu.vim
|
||||
source test_mapping.vim
|
||||
source test_messages.vim
|
||||
source test_partial.vim
|
||||
source test_popup.vim
|
||||
source test_recover.vim
|
||||
source test_regexp_utf8.vim
|
||||
source test_source_utf8.vim
|
||||
source test_statusline.vim
|
||||
|
355
src/nvim/testdir/test_arglist.vim
Normal file
355
src/nvim/testdir/test_arglist.vim
Normal file
@ -0,0 +1,355 @@
|
||||
" Test argument list commands
|
||||
|
||||
func Test_argidx()
|
||||
args a b c
|
||||
last
|
||||
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())
|
||||
next
|
||||
call assert_equal(1, argidx())
|
||||
next
|
||||
call assert_equal(2, argidx())
|
||||
1argdelete
|
||||
call assert_equal(1, argidx())
|
||||
1argdelete
|
||||
call assert_equal(0, argidx())
|
||||
1argdelete
|
||||
call assert_equal(0, argidx())
|
||||
endfunc
|
||||
|
||||
func Test_argadd()
|
||||
%argdelete
|
||||
argadd a b c
|
||||
call assert_equal(0, argidx())
|
||||
|
||||
%argdelete
|
||||
argadd a
|
||||
call assert_equal(0, argidx())
|
||||
argadd b c d
|
||||
call assert_equal(0, argidx())
|
||||
|
||||
call Init_abc()
|
||||
argadd x
|
||||
call Assert_argc(['a', 'b', 'x', 'c'])
|
||||
call assert_equal(1, argidx())
|
||||
|
||||
call Init_abc()
|
||||
0argadd x
|
||||
call Assert_argc(['x', 'a', 'b', 'c'])
|
||||
call assert_equal(2, argidx())
|
||||
|
||||
call Init_abc()
|
||||
1argadd x
|
||||
call Assert_argc(['a', 'x', 'b', 'c'])
|
||||
call assert_equal(2, argidx())
|
||||
|
||||
call Init_abc()
|
||||
$argadd x
|
||||
call Assert_argc(['a', 'b', 'c', 'x'])
|
||||
call assert_equal(1, argidx())
|
||||
|
||||
call Init_abc()
|
||||
$argadd x
|
||||
+2argadd y
|
||||
call Assert_argc(['a', 'b', 'c', 'x', 'y'])
|
||||
call assert_equal(1, argidx())
|
||||
|
||||
%argd
|
||||
edit d
|
||||
arga
|
||||
call assert_equal(1, len(argv()))
|
||||
call assert_equal('d', get(argv(), 0, ''))
|
||||
|
||||
%argd
|
||||
edit some\ file
|
||||
arga
|
||||
call assert_equal(1, len(argv()))
|
||||
call assert_equal('some file', get(argv(), 0, ''))
|
||||
|
||||
%argd
|
||||
new
|
||||
arga
|
||||
call assert_equal(0, len(argv()))
|
||||
endfunc
|
||||
|
||||
func Init_abc()
|
||||
args a b c
|
||||
next
|
||||
endfunc
|
||||
|
||||
func Assert_argc(l)
|
||||
call assert_equal(len(a:l), argc())
|
||||
let i = 0
|
||||
while i < len(a:l) && i < argc()
|
||||
call assert_equal(a:l[i], argv(i))
|
||||
let i += 1
|
||||
endwhile
|
||||
endfunc
|
||||
|
||||
" Test for [count]argument and [count]argdelete commands
|
||||
" Ported from the test_argument_count.in test script
|
||||
func Test_argument()
|
||||
" Clean the argument list
|
||||
arga a | %argd
|
||||
|
||||
let save_hidden = &hidden
|
||||
set hidden
|
||||
|
||||
let g:buffers = []
|
||||
augroup TEST
|
||||
au BufEnter * call add(buffers, expand('%:t'))
|
||||
augroup END
|
||||
|
||||
argadd a b c d
|
||||
$argu
|
||||
$-argu
|
||||
-argu
|
||||
1argu
|
||||
+2argu
|
||||
|
||||
augroup TEST
|
||||
au!
|
||||
augroup END
|
||||
|
||||
call assert_equal(['d', 'c', 'b', 'a', 'c'], g:buffers)
|
||||
|
||||
redir => result
|
||||
ar
|
||||
redir END
|
||||
call assert_true(result =~# 'a b \[c] d')
|
||||
|
||||
.argd
|
||||
call assert_equal(['a', 'b', 'd'], argv())
|
||||
|
||||
-argd
|
||||
call assert_equal(['a', 'd'], argv())
|
||||
|
||||
$argd
|
||||
call assert_equal(['a'], argv())
|
||||
|
||||
1arga c
|
||||
1arga b
|
||||
$argu
|
||||
$arga x
|
||||
call assert_equal(['a', 'b', 'c', 'x'], argv())
|
||||
|
||||
0arga y
|
||||
call assert_equal(['y', 'a', 'b', 'c', 'x'], argv())
|
||||
|
||||
%argd
|
||||
call assert_equal([], argv())
|
||||
|
||||
arga a b c d e f
|
||||
2,$-argd
|
||||
call assert_equal(['a', 'f'], argv())
|
||||
|
||||
let &hidden = save_hidden
|
||||
|
||||
" Setting argument list should fail when the current buffer has unsaved
|
||||
" changes
|
||||
%argd
|
||||
enew!
|
||||
set modified
|
||||
call assert_fails('args x y z', 'E37:')
|
||||
args! x y z
|
||||
call assert_equal(['x', 'y', 'z'], argv())
|
||||
call assert_equal('x', expand('%:t'))
|
||||
|
||||
last | enew | argu
|
||||
call assert_equal('z', expand('%:t'))
|
||||
|
||||
%argdelete
|
||||
call assert_fails('argument', 'E163:')
|
||||
endfunc
|
||||
|
||||
" Test for 0argadd and 0argedit
|
||||
" Ported from the test_argument_0count.in test script
|
||||
func Test_zero_argadd()
|
||||
" Clean the argument list
|
||||
arga a | %argd
|
||||
|
||||
arga a b c d
|
||||
2argu
|
||||
0arga added
|
||||
call assert_equal(['added', 'a', 'b', 'c', 'd'], argv())
|
||||
|
||||
2argu
|
||||
arga third
|
||||
call assert_equal(['added', 'a', 'third', 'b', 'c', 'd'], argv())
|
||||
|
||||
%argd
|
||||
arga a b c d
|
||||
2argu
|
||||
0arge edited
|
||||
call assert_equal(['edited', 'a', 'b', 'c', 'd'], argv())
|
||||
|
||||
2argu
|
||||
arga third
|
||||
call assert_equal(['edited', 'a', 'third', 'b', 'c', 'd'], argv())
|
||||
|
||||
2argu
|
||||
argedit file\ with\ spaces another file
|
||||
call assert_equal(['edited', 'a', 'file with spaces', 'another', 'file', 'third', 'b', 'c', 'd'], argv())
|
||||
call assert_equal('file with spaces', expand('%'))
|
||||
endfunc
|
||||
|
||||
func Reset_arglist()
|
||||
args a | %argd
|
||||
endfunc
|
||||
|
||||
" Test for argc()
|
||||
func Test_argc()
|
||||
call Reset_arglist()
|
||||
call assert_equal(0, argc())
|
||||
argadd a b
|
||||
call assert_equal(2, argc())
|
||||
endfunc
|
||||
|
||||
" Test for arglistid()
|
||||
func Test_arglistid()
|
||||
call Reset_arglist()
|
||||
arga a b
|
||||
call assert_equal(0, arglistid())
|
||||
split
|
||||
arglocal
|
||||
call assert_equal(1, arglistid())
|
||||
tabnew | tabfirst
|
||||
call assert_equal(0, arglistid(2))
|
||||
call assert_equal(1, arglistid(1, 1))
|
||||
call assert_equal(0, arglistid(2, 1))
|
||||
call assert_equal(1, arglistid(1, 2))
|
||||
tabonly | only | enew!
|
||||
argglobal
|
||||
call assert_equal(0, arglistid())
|
||||
endfunc
|
||||
|
||||
" Test for argv()
|
||||
func Test_argv()
|
||||
call Reset_arglist()
|
||||
call assert_equal([], argv())
|
||||
call assert_equal("", argv(2))
|
||||
argadd a b c d
|
||||
call assert_equal('c', argv(2))
|
||||
endfunc
|
||||
|
||||
" Test for the :argedit command
|
||||
func Test_argedit()
|
||||
call Reset_arglist()
|
||||
argedit a
|
||||
call assert_equal(['a'], argv())
|
||||
call assert_equal('a', expand('%:t'))
|
||||
argedit b
|
||||
call assert_equal(['a', 'b'], argv())
|
||||
call assert_equal('b', expand('%:t'))
|
||||
argedit a
|
||||
call assert_equal(['a', 'b', 'a'], argv())
|
||||
call assert_equal('a', expand('%:t'))
|
||||
" When file name case is ignored, an existing buffer with only case
|
||||
" difference is re-used.
|
||||
argedit C D
|
||||
call assert_equal('C', expand('%:t'))
|
||||
call assert_equal(['a', 'b', 'a', 'C', 'D'], argv())
|
||||
argedit c
|
||||
if has('fname_case')
|
||||
call assert_equal(['a', 'b', 'a', 'C', 'c', 'D'], argv())
|
||||
else
|
||||
call assert_equal(['a', 'b', 'a', 'C', 'C', 'D'], argv())
|
||||
endif
|
||||
0argedit x
|
||||
if has('fname_case')
|
||||
call assert_equal(['x', 'a', 'b', 'a', 'C', 'c', 'D'], argv())
|
||||
else
|
||||
call assert_equal(['x', 'a', 'b', 'a', 'C', 'C', 'D'], argv())
|
||||
endif
|
||||
enew! | set modified
|
||||
call assert_fails('argedit y', 'E37:')
|
||||
argedit! y
|
||||
if has('fname_case')
|
||||
call assert_equal(['x', 'y', 'y', 'a', 'b', 'a', 'C', 'c', 'D'], argv())
|
||||
else
|
||||
call assert_equal(['x', 'y', 'y', 'a', 'b', 'a', 'C', 'C', 'D'], argv())
|
||||
endif
|
||||
%argd
|
||||
bwipe! C
|
||||
bwipe! D
|
||||
endfunc
|
||||
|
||||
" Test for the :argdelete command
|
||||
func Test_argdelete()
|
||||
call Reset_arglist()
|
||||
args aa a aaa b bb
|
||||
argdelete a*
|
||||
call assert_equal(['b', 'bb'], argv())
|
||||
call assert_equal('aa', expand('%:t'))
|
||||
last
|
||||
argdelete %
|
||||
call assert_equal(['b'], argv())
|
||||
call assert_fails('argdelete', 'E471:')
|
||||
call assert_fails('1,100argdelete', 'E16:')
|
||||
%argd
|
||||
endfunc
|
||||
|
||||
" Tests for the :next, :prev, :first, :last, :rewind commands
|
||||
func Test_argpos()
|
||||
call Reset_arglist()
|
||||
args a b c d
|
||||
last
|
||||
call assert_equal(3, argidx())
|
||||
call assert_fails('next', 'E165:')
|
||||
prev
|
||||
call assert_equal(2, argidx())
|
||||
Next
|
||||
call assert_equal(1, argidx())
|
||||
first
|
||||
call assert_equal(0, argidx())
|
||||
call assert_fails('prev', 'E164:')
|
||||
3next
|
||||
call assert_equal(3, argidx())
|
||||
rewind
|
||||
call assert_equal(0, argidx())
|
||||
%argd
|
||||
endfunc
|
||||
|
||||
" Test for autocommand that redefines the argument list, when doing ":all".
|
||||
func Test_arglist_autocmd()
|
||||
autocmd BufReadPost Xxx2 next Xxx2 Xxx1
|
||||
call writefile(['test file Xxx1'], 'Xxx1')
|
||||
call writefile(['test file Xxx2'], 'Xxx2')
|
||||
call writefile(['test file Xxx3'], 'Xxx3')
|
||||
|
||||
new
|
||||
" redefine arglist; go to Xxx1
|
||||
next! Xxx1 Xxx2 Xxx3
|
||||
" open window for all args
|
||||
all
|
||||
call assert_equal('test file Xxx1', getline(1))
|
||||
wincmd w
|
||||
wincmd w
|
||||
call assert_equal('test file Xxx1', getline(1))
|
||||
" should now be in Xxx2
|
||||
rewind
|
||||
call assert_equal('test file Xxx2', getline(1))
|
||||
|
||||
autocmd! BufReadPost Xxx2
|
||||
enew! | only
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
call delete('Xxx3')
|
||||
argdelete Xxx*
|
||||
bwipe! Xxx1 Xxx2 Xxx3
|
||||
endfunc
|
||||
|
||||
func Test_arg_all_expand()
|
||||
call writefile(['test file Xxx1'], 'Xx x')
|
||||
next notexist Xx\ x runtest.vim
|
||||
call assert_equal('notexist Xx\ x runtest.vim', expand('##'))
|
||||
call delete('Xx x')
|
||||
endfunc
|
19
src/nvim/testdir/test_autochdir.vim
Normal file
19
src/nvim/testdir/test_autochdir.vim
Normal file
@ -0,0 +1,19 @@
|
||||
" Test 'autochdir' behavior
|
||||
|
||||
if !exists("+autochdir")
|
||||
finish
|
||||
endif
|
||||
|
||||
func Test_set_filename()
|
||||
let cwd = getcwd()
|
||||
call test_autochdir()
|
||||
set acd
|
||||
new
|
||||
w samples/Xtest
|
||||
call assert_equal("Xtest", expand('%'))
|
||||
call assert_equal("samples", substitute(getcwd(), '.*/\(\k*\)', '\1', ''))
|
||||
bwipe!
|
||||
set noacd
|
||||
exe 'cd ' . cwd
|
||||
call delete('samples/Xtest')
|
||||
endfunc
|
@ -1,14 +1,13 @@
|
||||
" Tests for autocommands
|
||||
|
||||
set belloff=all
|
||||
|
||||
function! s:cleanup_buffers() abort
|
||||
func! s:cleanup_buffers() abort
|
||||
for bnr in range(1, bufnr('$'))
|
||||
if bufloaded(bnr) && bufnr('%') != bnr
|
||||
execute 'bd! ' . bnr
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
func Test_vim_did_enter()
|
||||
call assert_false(v:vim_did_enter)
|
||||
@ -49,7 +48,7 @@ if has('timers')
|
||||
endfunc
|
||||
endif
|
||||
|
||||
function Test_bufunload()
|
||||
func Test_bufunload()
|
||||
augroup test_bufunload_group
|
||||
autocmd!
|
||||
autocmd BufUnload * call add(s:li, "bufunload")
|
||||
@ -80,7 +79,7 @@ function Test_bufunload()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2005 or older)
|
||||
function Test_autocmd_bufunload_with_tabnext()
|
||||
func Test_autocmd_bufunload_with_tabnext()
|
||||
tabedit
|
||||
tabfirst
|
||||
|
||||
@ -98,7 +97,7 @@ function Test_autocmd_bufunload_with_tabnext()
|
||||
quit
|
||||
endfunc
|
||||
|
||||
function Test_autocmd_bufwinleave_with_tabfirst()
|
||||
func Test_autocmd_bufwinleave_with_tabfirst()
|
||||
tabedit
|
||||
augroup sample
|
||||
autocmd!
|
||||
@ -110,7 +109,7 @@ function Test_autocmd_bufwinleave_with_tabfirst()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
||||
function Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
func Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
split aa.txt
|
||||
let lastbuf = bufnr('$')
|
||||
|
||||
@ -128,7 +127,7 @@ function Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
||||
function Test_autocmd_bufunload_avoiding_SEGV_02()
|
||||
func Test_autocmd_bufunload_avoiding_SEGV_02()
|
||||
setlocal buftype=nowrite
|
||||
let lastbuf = bufnr('$')
|
||||
|
||||
@ -353,8 +352,10 @@ endfunc
|
||||
|
||||
" Closing a window might cause an endless loop
|
||||
" E814 for older Vims
|
||||
function Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
func Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
edit Xtest
|
||||
tabnew
|
||||
file Xsomething
|
||||
set noswapfile
|
||||
mksession!
|
||||
|
||||
@ -362,7 +363,7 @@ function Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
\ 'let v:swapchoice="e"',
|
||||
\ 'augroup test_autocmd_sessionload',
|
||||
\ 'autocmd!',
|
||||
\ 'autocmd SessionLoadPost * 4bw!',
|
||||
\ 'autocmd SessionLoadPost * exe bufnr("Xsomething") . "bw!"',
|
||||
\ 'augroup END',
|
||||
\ '',
|
||||
\ 'func WriteErrors()',
|
||||
@ -382,7 +383,7 @@ function Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions.
|
||||
function Test_autocmd_bufwipe_in_SessLoadPost2()
|
||||
func Test_autocmd_bufwipe_in_SessLoadPost2()
|
||||
tabnew
|
||||
set noswapfile
|
||||
mksession!
|
||||
@ -421,6 +422,382 @@ function Test_autocmd_bufwipe_in_SessLoadPost2()
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
func Test_empty_doau()
|
||||
doau \|
|
||||
endfunc
|
||||
|
||||
func s:AutoCommandOptionSet(match)
|
||||
let item = remove(g:options, 0)
|
||||
let expected = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", item[0], item[1], item[2], item[3])
|
||||
let actual = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope: <%s>\n", a:match, v:option_old, v:option_new, v:option_type)
|
||||
let g:opt = [expected, actual]
|
||||
"call assert_equal(expected, actual)
|
||||
endfunc
|
||||
|
||||
func Test_OptionSet()
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
if !has("eval") || !has("autocmd") || !exists("+autochdir")
|
||||
return
|
||||
endif
|
||||
|
||||
call test_override('starting', 1)
|
||||
set nocp
|
||||
au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
|
||||
|
||||
" 1: Setting number option"
|
||||
let g:options=[['number', 0, 1, 'global']]
|
||||
set nu
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 2: Setting local number option"
|
||||
let g:options=[['number', 1, 0, 'local']]
|
||||
setlocal nonu
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 3: Setting global number option"
|
||||
let g:options=[['number', 1, 0, 'global']]
|
||||
setglobal nonu
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 4: Setting local autoindent option"
|
||||
let g:options=[['autoindent', 0, 1, 'local']]
|
||||
setlocal ai
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 5: Setting global autoindent option"
|
||||
let g:options=[['autoindent', 0, 1, 'global']]
|
||||
setglobal ai
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 6: Setting global autoindent option"
|
||||
let g:options=[['autoindent', 1, 0, 'global']]
|
||||
set ai!
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" Should not print anything, use :noa
|
||||
" 7: don't trigger OptionSet"
|
||||
let g:options=[['invalid', 1, 1, 'invalid']]
|
||||
noa set nonu
|
||||
call assert_equal([['invalid', 1, 1, 'invalid']], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 8: Setting several global list and number option"
|
||||
let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
|
||||
set list nu
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 9: don't trigger OptionSet"
|
||||
let g:options=[['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']]
|
||||
noa set nolist nonu
|
||||
call assert_equal([['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 10: Setting global acd"
|
||||
let g:options=[['autochdir', 0, 1, 'local']]
|
||||
setlocal acd
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 11: Setting global autoread (also sets local value)"
|
||||
let g:options=[['autoread', 0, 1, 'global']]
|
||||
set ar
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 12: Setting local autoread"
|
||||
let g:options=[['autoread', 1, 1, 'local']]
|
||||
setlocal ar
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 13: Setting global autoread"
|
||||
let g:options=[['autoread', 1, 0, 'global']]
|
||||
setglobal invar
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 14: Setting option backspace through :let"
|
||||
let g:options=[['backspace', '', 'eol,indent,start', 'global']]
|
||||
let &bs="eol,indent,start"
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 15: Setting option backspace through setbufvar()"
|
||||
let g:options=[['backup', 0, 1, 'local']]
|
||||
" try twice, first time, shouldn't trigger because option name is invalid,
|
||||
" second time, it should trigger
|
||||
call assert_fails("call setbufvar(1, '&l:bk', 1)", "E355")
|
||||
" should trigger, use correct option name
|
||||
call setbufvar(1, '&backup', 1)
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 16: Setting number option using setwinvar"
|
||||
let g:options=[['number', 0, 1, 'local']]
|
||||
call setwinvar(0, '&number', 1)
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 17: Setting key option, shouldn't trigger"
|
||||
let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
|
||||
setlocal key=blah
|
||||
setlocal key=
|
||||
call assert_equal([['key', 'invalid', 'invalid1', 'invalid']], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 18: Setting string option"
|
||||
let oldval = &tags
|
||||
let g:options=[['tags', oldval, 'tagpath', 'global']]
|
||||
set tags=tagpath
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" 1l: Resetting string option"
|
||||
let g:options=[['tags', 'tagpath', oldval, 'global']]
|
||||
set tags&
|
||||
call assert_equal([], g:options)
|
||||
call assert_equal(g:opt[0], g:opt[1])
|
||||
|
||||
" Cleanup
|
||||
au! OptionSet
|
||||
for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp']
|
||||
exe printf(":set %s&vi", opt)
|
||||
endfor
|
||||
call test_override('starting', 0)
|
||||
delfunc! AutoCommandOptionSet
|
||||
endfunc
|
||||
|
||||
func Test_OptionSet_diffmode()
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
call test_override('starting', 1)
|
||||
" 18: Changing an option when enetering diff mode
|
||||
new
|
||||
au OptionSet diff :let &l:cul=v:option_new
|
||||
|
||||
call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
|
||||
call assert_equal(0, &l:cul)
|
||||
diffthis
|
||||
call assert_equal(1, &l:cul)
|
||||
|
||||
vnew
|
||||
call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
|
||||
call assert_equal(0, &l:cul)
|
||||
diffthis
|
||||
call assert_equal(1, &l:cul)
|
||||
|
||||
diffoff
|
||||
call assert_equal(0, &l:cul)
|
||||
call assert_equal(1, getwinvar(2, '&l:cul'))
|
||||
bw!
|
||||
|
||||
call assert_equal(1, &l:cul)
|
||||
diffoff!
|
||||
call assert_equal(0, &l:cul)
|
||||
call assert_equal(0, getwinvar(1, '&l:cul'))
|
||||
bw!
|
||||
|
||||
" Cleanup
|
||||
au! OptionSet
|
||||
call test_override('starting', 0)
|
||||
endfunc
|
||||
|
||||
func Test_OptionSet_diffmode_close()
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
call test_override('starting', 1)
|
||||
" 19: Try to close the current window when entering diff mode
|
||||
" should not segfault
|
||||
new
|
||||
au OptionSet diff close
|
||||
|
||||
call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
|
||||
call assert_fails(':diffthis', 'E788')
|
||||
call assert_equal(1, &diff)
|
||||
vnew
|
||||
call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
|
||||
call assert_fails(':diffthis', 'E788')
|
||||
call assert_equal(1, &diff)
|
||||
bw!
|
||||
call assert_fails(':diffoff!', 'E788')
|
||||
bw!
|
||||
|
||||
" Cleanup
|
||||
au! OptionSet
|
||||
call test_override('starting', 0)
|
||||
"delfunc! AutoCommandOptionSet
|
||||
endfunc
|
||||
|
||||
" Test for Bufleave autocommand that deletes the buffer we are about to edit.
|
||||
func Test_BufleaveWithDelete()
|
||||
new | edit Xfile1
|
||||
|
||||
augroup test_bufleavewithdelete
|
||||
autocmd!
|
||||
autocmd BufLeave Xfile1 bwipe Xfile2
|
||||
augroup END
|
||||
|
||||
call assert_fails('edit Xfile2', 'E143:')
|
||||
call assert_equal('Xfile1', bufname('%'))
|
||||
|
||||
autocmd! test_bufleavewithdelete BufLeave Xfile1
|
||||
augroup! test_bufleavewithdelete
|
||||
|
||||
new
|
||||
bwipe! Xfile1
|
||||
endfunc
|
||||
|
||||
" Test for autocommand that changes the buffer list, when doing ":ball".
|
||||
func Test_Acmd_BufAll()
|
||||
enew!
|
||||
%bwipe!
|
||||
call writefile(['Test file Xxx1'], 'Xxx1')
|
||||
call writefile(['Test file Xxx2'], 'Xxx2')
|
||||
call writefile(['Test file Xxx3'], 'Xxx3')
|
||||
|
||||
" Add three files to the buffer list
|
||||
split Xxx1
|
||||
close
|
||||
split Xxx2
|
||||
close
|
||||
split Xxx3
|
||||
close
|
||||
|
||||
" Wipe the buffer when the buffer is opened
|
||||
au BufReadPost Xxx2 bwipe
|
||||
|
||||
call append(0, 'Test file Xxx4')
|
||||
ball
|
||||
|
||||
call assert_equal(2, winnr('$'))
|
||||
call assert_equal('Xxx1', bufname(winbufnr(winnr('$'))))
|
||||
wincmd t
|
||||
|
||||
au! BufReadPost
|
||||
%bwipe!
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
call delete('Xxx3')
|
||||
enew! | only
|
||||
endfunc
|
||||
|
||||
" Test for autocommand that changes current buffer on BufEnter event.
|
||||
" Check if modelines are interpreted for the correct buffer.
|
||||
func Test_Acmd_BufEnter()
|
||||
%bwipe!
|
||||
call writefile(['start of test file Xxx1',
|
||||
\ "\<Tab>this is a test",
|
||||
\ 'end of test file Xxx1'], 'Xxx1')
|
||||
call writefile(['start of test file Xxx2',
|
||||
\ 'vim: set noai :',
|
||||
\ "\<Tab>this is a test",
|
||||
\ 'end of test file Xxx2'], 'Xxx2')
|
||||
|
||||
au BufEnter Xxx2 brew
|
||||
set ai modeline modelines=3
|
||||
edit Xxx1
|
||||
" edit Xxx2, autocmd will do :brew
|
||||
edit Xxx2
|
||||
exe "normal G?this is a\<CR>"
|
||||
" Append text with autoindent to this file
|
||||
normal othis should be auto-indented
|
||||
call assert_equal("\<Tab>this should be auto-indented", getline('.'))
|
||||
call assert_equal(3, line('.'))
|
||||
" Remove autocmd and edit Xxx2 again
|
||||
au! BufEnter Xxx2
|
||||
buf! Xxx2
|
||||
exe "normal G?this is a\<CR>"
|
||||
" append text without autoindent to Xxx
|
||||
normal othis should be in column 1
|
||||
call assert_equal("this should be in column 1", getline('.'))
|
||||
call assert_equal(4, line('.'))
|
||||
|
||||
%bwipe!
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
set ai&vim modeline&vim modelines&vim
|
||||
endfunc
|
||||
|
||||
" Test for issue #57
|
||||
" do not move cursor on <c-o> when autoindent is set
|
||||
func Test_ai_CTRL_O()
|
||||
enew!
|
||||
set ai
|
||||
let save_fo = &fo
|
||||
set fo+=r
|
||||
exe "normal o# abcdef\<Esc>2hi\<CR>\<C-O>d0\<Esc>"
|
||||
exe "normal o# abcdef\<Esc>2hi\<C-O>d0\<Esc>"
|
||||
call assert_equal(['# abc', 'def', 'def'], getline(2, 4))
|
||||
|
||||
set ai&vim
|
||||
let &fo = save_fo
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
" Test for autocommand that deletes the current buffer on BufLeave event.
|
||||
" Also test deleting the last buffer, should give a new, empty buffer.
|
||||
func Test_BufLeave_Wipe()
|
||||
throw 'skipped: TODO: '
|
||||
%bwipe!
|
||||
let content = ['start of test file Xxx',
|
||||
\ 'this is a test',
|
||||
\ 'end of test file Xxx']
|
||||
call writefile(content, 'Xxx1')
|
||||
call writefile(content, 'Xxx2')
|
||||
|
||||
au BufLeave Xxx2 bwipe
|
||||
edit Xxx1
|
||||
split Xxx2
|
||||
" delete buffer Xxx2, we should be back to Xxx1
|
||||
bwipe
|
||||
call assert_equal('Xxx1', bufname('%'))
|
||||
call assert_equal(1, winnr('$'))
|
||||
|
||||
" Create an alternate buffer
|
||||
%write! test.out
|
||||
call assert_equal('test.out', bufname('#'))
|
||||
" delete alternate buffer
|
||||
bwipe test.out
|
||||
call assert_equal('Xxx1', bufname('%'))
|
||||
call assert_equal('', bufname('#'))
|
||||
|
||||
au BufLeave Xxx1 bwipe
|
||||
" delete current buffer, get an empty one
|
||||
bwipe!
|
||||
call assert_equal(1, line('$'))
|
||||
call assert_equal('', bufname('%'))
|
||||
let g:bufinfo = getbufinfo()
|
||||
call assert_equal(1, len(g:bufinfo))
|
||||
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
call delete('test.out')
|
||||
%bwipe
|
||||
au! BufLeave
|
||||
|
||||
" check that bufinfo doesn't contain a pointer to freed memory
|
||||
call test_garbagecollect_now()
|
||||
endfunc
|
||||
|
||||
func Test_QuitPre()
|
||||
edit Xfoo
|
||||
let winid = win_getid(winnr())
|
||||
split Xbar
|
||||
au! QuitPre * let g:afile = expand('<afile>')
|
||||
" Close the other window, <afile> should be correct.
|
||||
exe win_id2win(winid) . 'q'
|
||||
call assert_equal('Xfoo', g:afile)
|
||||
|
||||
unlet g:afile
|
||||
bwipe Xfoo
|
||||
bwipe Xbar
|
||||
endfunc
|
||||
|
||||
func Test_Cmdline()
|
||||
au! CmdlineEnter : let g:entered = expand('<afile>')
|
||||
au! CmdlineLeave : let g:left = expand('<afile>')
|
||||
@ -436,9 +813,355 @@ func Test_Cmdline()
|
||||
au! CmdlineLeave / let g:left = expand('<afile>')
|
||||
let g:entered = 0
|
||||
let g:left = 0
|
||||
call feedkeys("/hello<CR>", 'xt')
|
||||
new
|
||||
call setline(1, 'hello')
|
||||
call feedkeys("/hello\<CR>", 'xt')
|
||||
call assert_equal('/', g:entered)
|
||||
call assert_equal('/', g:left)
|
||||
bwipe!
|
||||
au! CmdlineEnter
|
||||
au! CmdlineLeave
|
||||
endfunc
|
||||
|
||||
" Test for BufWritePre autocommand that deletes or unloads the buffer.
|
||||
func Test_BufWritePre()
|
||||
%bwipe
|
||||
au BufWritePre Xxx1 bunload
|
||||
au BufWritePre Xxx2 bwipe
|
||||
|
||||
call writefile(['start of Xxx1', 'test', 'end of Xxx1'], 'Xxx1')
|
||||
call writefile(['start of Xxx2', 'test', 'end of Xxx2'], 'Xxx2')
|
||||
|
||||
edit Xtest
|
||||
e! Xxx2
|
||||
bdel Xtest
|
||||
e Xxx1
|
||||
" write it, will unload it and give an error msg
|
||||
call assert_fails('w', 'E203')
|
||||
call assert_equal('Xxx2', bufname('%'))
|
||||
edit Xtest
|
||||
e! Xxx2
|
||||
bwipe Xtest
|
||||
" write it, will delete the buffer and give an error msg
|
||||
call assert_fails('w', 'E203')
|
||||
call assert_equal('Xxx1', bufname('%'))
|
||||
au! BufWritePre
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
endfunc
|
||||
|
||||
" Test for BufUnload autocommand that unloads all the other buffers
|
||||
func Test_bufunload_all()
|
||||
call writefile(['Test file Xxx1'], 'Xxx1')"
|
||||
call writefile(['Test file Xxx2'], 'Xxx2')"
|
||||
|
||||
let content = [
|
||||
\ "func UnloadAllBufs()",
|
||||
\ " let i = 1",
|
||||
\ " while i <= bufnr('$')",
|
||||
\ " if i != bufnr('%') && bufloaded(i)",
|
||||
\ " exe i . 'bunload'",
|
||||
\ " endif",
|
||||
\ " let i += 1",
|
||||
\ " endwhile",
|
||||
\ "endfunc",
|
||||
\ "au BufUnload * call UnloadAllBufs()",
|
||||
\ "au VimLeave * call writefile(['Test Finished'], 'Xout')",
|
||||
\ "edit Xxx1",
|
||||
\ "split Xxx2",
|
||||
\ "q"]
|
||||
call writefile(content, 'Xtest')
|
||||
|
||||
call delete('Xout')
|
||||
call system(v:progpath. ' -u NORC -i NONE -N -S Xtest')
|
||||
call assert_true(filereadable('Xout'))
|
||||
|
||||
call delete('Xxx1')
|
||||
call delete('Xxx2')
|
||||
call delete('Xtest')
|
||||
call delete('Xout')
|
||||
endfunc
|
||||
|
||||
" Some tests for buffer-local autocommands
|
||||
func Test_buflocal_autocmd()
|
||||
let g:bname = ''
|
||||
edit xx
|
||||
au BufLeave <buffer> let g:bname = expand("%")
|
||||
" here, autocommand for xx should trigger.
|
||||
" but autocommand shall not apply to buffer named <buffer>.
|
||||
edit somefile
|
||||
call assert_equal('xx', g:bname)
|
||||
let g:bname = ''
|
||||
" here, autocommand shall be auto-deleted
|
||||
bwipe xx
|
||||
" autocmd should not trigger
|
||||
edit xx
|
||||
call assert_equal('', g:bname)
|
||||
" autocmd should not trigger
|
||||
edit somefile
|
||||
call assert_equal('', g:bname)
|
||||
enew
|
||||
unlet g:bname
|
||||
endfunc
|
||||
|
||||
" Test for "*Cmd" autocommands
|
||||
func Test_Cmd_Autocmds()
|
||||
call writefile(['start of Xxx', "\tabc2", 'end of Xxx'], 'Xxx')
|
||||
|
||||
enew!
|
||||
au BufReadCmd XtestA 0r Xxx|$del
|
||||
edit XtestA " will read text of Xxd instead
|
||||
call assert_equal('start of Xxx', getline(1))
|
||||
|
||||
au BufWriteCmd XtestA call append(line("$"), "write")
|
||||
write " will append a line to the file
|
||||
call assert_equal('write', getline('$'))
|
||||
call assert_fails('read XtestA', 'E484') " should not read anything
|
||||
call assert_equal('write', getline(4))
|
||||
|
||||
" now we have:
|
||||
" 1 start of Xxx
|
||||
" 2 abc2
|
||||
" 3 end of Xxx
|
||||
" 4 write
|
||||
|
||||
au FileReadCmd XtestB '[r Xxx
|
||||
2r XtestB " will read Xxx below line 2 instead
|
||||
call assert_equal('start of Xxx', getline(3))
|
||||
|
||||
" now we have:
|
||||
" 1 start of Xxx
|
||||
" 2 abc2
|
||||
" 3 start of Xxx
|
||||
" 4 abc2
|
||||
" 5 end of Xxx
|
||||
" 6 end of Xxx
|
||||
" 7 write
|
||||
|
||||
au FileWriteCmd XtestC '[,']copy $
|
||||
normal 4GA1
|
||||
4,5w XtestC " will copy lines 4 and 5 to the end
|
||||
call assert_equal("\tabc21", getline(8))
|
||||
call assert_fails('r XtestC', 'E484') " should not read anything
|
||||
call assert_equal("end of Xxx", getline(9))
|
||||
|
||||
" now we have:
|
||||
" 1 start of Xxx
|
||||
" 2 abc2
|
||||
" 3 start of Xxx
|
||||
" 4 abc21
|
||||
" 5 end of Xxx
|
||||
" 6 end of Xxx
|
||||
" 7 write
|
||||
" 8 abc21
|
||||
" 9 end of Xxx
|
||||
|
||||
let g:lines = []
|
||||
au FileAppendCmd XtestD call extend(g:lines, getline(line("'["), line("']")))
|
||||
w >>XtestD " will add lines to 'lines'
|
||||
call assert_equal(9, len(g:lines))
|
||||
call assert_fails('$r XtestD', 'E484') " should not read anything
|
||||
call assert_equal(9, line('$'))
|
||||
call assert_equal('end of Xxx', getline('$'))
|
||||
|
||||
au BufReadCmd XtestE 0r Xxx|$del
|
||||
sp XtestE " split window with test.out
|
||||
call assert_equal('end of Xxx', getline(3))
|
||||
|
||||
let g:lines = []
|
||||
exe "normal 2Goasdf\<Esc>\<C-W>\<C-W>"
|
||||
au BufWriteCmd XtestE call extend(g:lines, getline(0, '$'))
|
||||
wall " will write other window to 'lines'
|
||||
call assert_equal(4, len(g:lines), g:lines)
|
||||
call assert_equal("\tasdf", g:lines[2])
|
||||
|
||||
au! BufReadCmd
|
||||
au! BufWriteCmd
|
||||
au! FileReadCmd
|
||||
au! FileWriteCmd
|
||||
au! FileAppendCmd
|
||||
%bwipe!
|
||||
call delete('Xxx')
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
func SetChangeMarks(start, end)
|
||||
exe a:start. 'mark ['
|
||||
exe a:end. 'mark ]'
|
||||
endfunc
|
||||
|
||||
" Verify the effects of autocmds on '[ and ']
|
||||
func Test_change_mark_in_autocmds()
|
||||
edit! Xtest
|
||||
call feedkeys("ia\<CR>b\<CR>c\<CR>d\<C-g>u", 'xtn')
|
||||
|
||||
call SetChangeMarks(2, 3)
|
||||
write
|
||||
call assert_equal([1, 4], [line("'["), line("']")])
|
||||
|
||||
call SetChangeMarks(2, 3)
|
||||
au BufWritePre * call assert_equal([1, 4], [line("'["), line("']")])
|
||||
write
|
||||
au! BufWritePre
|
||||
|
||||
if executable('cat')
|
||||
write XtestFilter
|
||||
write >> XtestFilter
|
||||
|
||||
call SetChangeMarks(2, 3)
|
||||
" Marks are set to the entire range of the write
|
||||
au FilterWritePre * call assert_equal([1, 4], [line("'["), line("']")])
|
||||
" '[ is adjusted to just before the line that will receive the filtered
|
||||
" data
|
||||
au FilterReadPre * call assert_equal([4, 4], [line("'["), line("']")])
|
||||
" The filtered data is read into the buffer, and the source lines are
|
||||
" still present, so the range is after the source lines
|
||||
au FilterReadPost * call assert_equal([5, 12], [line("'["), line("']")])
|
||||
%!cat XtestFilter
|
||||
" After the filtered data is read, the original lines are deleted
|
||||
call assert_equal([1, 8], [line("'["), line("']")])
|
||||
au! FilterWritePre,FilterReadPre,FilterReadPost
|
||||
undo
|
||||
|
||||
call SetChangeMarks(1, 4)
|
||||
au FilterWritePre * call assert_equal([2, 3], [line("'["), line("']")])
|
||||
au FilterReadPre * call assert_equal([3, 3], [line("'["), line("']")])
|
||||
au FilterReadPost * call assert_equal([4, 11], [line("'["), line("']")])
|
||||
2,3!cat XtestFilter
|
||||
call assert_equal([2, 9], [line("'["), line("']")])
|
||||
au! FilterWritePre,FilterReadPre,FilterReadPost
|
||||
undo
|
||||
|
||||
call delete('XtestFilter')
|
||||
endif
|
||||
|
||||
call SetChangeMarks(1, 4)
|
||||
au FileWritePre * call assert_equal([2, 3], [line("'["), line("']")])
|
||||
2,3write Xtest2
|
||||
au! FileWritePre
|
||||
|
||||
call SetChangeMarks(2, 3)
|
||||
au FileAppendPre * call assert_equal([1, 4], [line("'["), line("']")])
|
||||
write >> Xtest2
|
||||
au! FileAppendPre
|
||||
|
||||
call SetChangeMarks(1, 4)
|
||||
au FileAppendPre * call assert_equal([2, 3], [line("'["), line("']")])
|
||||
2,3write >> Xtest2
|
||||
au! FileAppendPre
|
||||
|
||||
call SetChangeMarks(1, 1)
|
||||
au FileReadPre * call assert_equal([3, 1], [line("'["), line("']")])
|
||||
au FileReadPost * call assert_equal([4, 11], [line("'["), line("']")])
|
||||
3read Xtest2
|
||||
au! FileReadPre,FileReadPost
|
||||
undo
|
||||
|
||||
call SetChangeMarks(4, 4)
|
||||
" When the line is 0, it's adjusted to 1
|
||||
au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
|
||||
au FileReadPost * call assert_equal([1, 8], [line("'["), line("']")])
|
||||
0read Xtest2
|
||||
au! FileReadPre,FileReadPost
|
||||
undo
|
||||
|
||||
call SetChangeMarks(4, 4)
|
||||
" When the line is 0, it's adjusted to 1
|
||||
au FileReadPre * call assert_equal([1, 4], [line("'["), line("']")])
|
||||
au FileReadPost * call assert_equal([2, 9], [line("'["), line("']")])
|
||||
1read Xtest2
|
||||
au! FileReadPre,FileReadPost
|
||||
undo
|
||||
|
||||
bwipe!
|
||||
call delete('Xtest')
|
||||
call delete('Xtest2')
|
||||
endfunc
|
||||
|
||||
func Test_Filter_noshelltemp()
|
||||
if !executable('cat')
|
||||
return
|
||||
endif
|
||||
|
||||
enew!
|
||||
call setline(1, ['a', 'b', 'c', 'd'])
|
||||
|
||||
let shelltemp = &shelltemp
|
||||
set shelltemp
|
||||
|
||||
let g:filter_au = 0
|
||||
au FilterWritePre * let g:filter_au += 1
|
||||
au FilterReadPre * let g:filter_au += 1
|
||||
au FilterReadPost * let g:filter_au += 1
|
||||
%!cat
|
||||
call assert_equal(3, g:filter_au)
|
||||
|
||||
if has('filterpipe')
|
||||
set noshelltemp
|
||||
|
||||
let g:filter_au = 0
|
||||
au FilterWritePre * let g:filter_au += 1
|
||||
au FilterReadPre * let g:filter_au += 1
|
||||
au FilterReadPost * let g:filter_au += 1
|
||||
%!cat
|
||||
call assert_equal(0, g:filter_au)
|
||||
endif
|
||||
|
||||
au! FilterWritePre,FilterReadPre,FilterReadPost
|
||||
let &shelltemp = shelltemp
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_TextYankPost()
|
||||
enew!
|
||||
call setline(1, ['foo'])
|
||||
|
||||
let g:event = []
|
||||
au TextYankPost * let g:event = copy(v:event)
|
||||
|
||||
call assert_equal({}, v:event)
|
||||
call assert_fails('let v:event = {}', 'E46:')
|
||||
call assert_fails('let v:event.mykey = 0', 'E742:')
|
||||
|
||||
norm "ayiw
|
||||
call assert_equal(
|
||||
\{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v'},
|
||||
\g:event)
|
||||
norm y_
|
||||
call assert_equal(
|
||||
\{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V'},
|
||||
\g:event)
|
||||
call feedkeys("\<C-V>y", 'x')
|
||||
call assert_equal(
|
||||
\{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161"},
|
||||
\g:event)
|
||||
norm "xciwbar
|
||||
call assert_equal(
|
||||
\{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v'},
|
||||
\g:event)
|
||||
norm "bdiw
|
||||
call assert_equal(
|
||||
\{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v'},
|
||||
\g:event)
|
||||
|
||||
call assert_equal({}, v:event)
|
||||
|
||||
au! TextYankPost
|
||||
unlet g:event
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
func Test_nocatch_wipe_all_buffers()
|
||||
" Real nasty autocommand: wipe all buffers on any event.
|
||||
au * * bwipe *
|
||||
call assert_fails('next x', 'E93')
|
||||
bwipe
|
||||
au!
|
||||
endfunc
|
||||
|
||||
func Test_nocatch_wipe_dummy_buffer()
|
||||
" Nasty autocommand: wipe buffer on any event.
|
||||
au * x bwipe
|
||||
call assert_fails('lv½ /x', 'E480')
|
||||
au!
|
||||
endfunc
|
||||
|
@ -1,7 +1,6 @@
|
||||
" Tests for the getbufinfo(), getwininfo() and gettabinfo() functions
|
||||
|
||||
function Test_getbufwintabinfo()
|
||||
1,$bwipeout
|
||||
edit Xtestfile1
|
||||
edit Xtestfile2
|
||||
let buflist = getbufinfo()
|
||||
|
@ -1,6 +1,5 @@
|
||||
" Tests for editing the command line.
|
||||
|
||||
set belloff=all
|
||||
|
||||
func Test_complete_tab()
|
||||
call writefile(['testfile'], 'Xtestfile')
|
||||
|
@ -1,6 +1,7 @@
|
||||
" Test for user command counts.
|
||||
|
||||
func Test_command_count_0()
|
||||
let bufnr = bufnr('%')
|
||||
set hidden
|
||||
set noswapfile
|
||||
|
||||
@ -15,17 +16,17 @@ func Test_command_count_0()
|
||||
command! -range=% -addr=buffers RangeBuffersAll :let lines = [<line1>, <line2>]
|
||||
|
||||
.,$RangeLoadedBuffers
|
||||
call assert_equal([1, 1], lines)
|
||||
call assert_equal([bufnr, bufnr], lines)
|
||||
%RangeLoadedBuffers
|
||||
call assert_equal([1, 1], lines)
|
||||
call assert_equal([bufnr, bufnr], lines)
|
||||
RangeLoadedBuffersAll
|
||||
call assert_equal([1, 1], lines)
|
||||
call assert_equal([bufnr, bufnr], lines)
|
||||
.,$RangeBuffers
|
||||
call assert_equal([1, lastbuf], lines)
|
||||
call assert_equal([bufnr, lastbuf], lines)
|
||||
%RangeBuffers
|
||||
call assert_equal([1, lastbuf], lines)
|
||||
call assert_equal([bufnr, lastbuf], lines)
|
||||
RangeBuffersAll
|
||||
call assert_equal([1, lastbuf], lines)
|
||||
call assert_equal([bufnr, lastbuf], lines)
|
||||
|
||||
delcommand RangeLoadedBuffers
|
||||
delcommand RangeLoadedBuffersAll
|
||||
@ -138,6 +139,7 @@ func Test_command_count_2()
|
||||
endfunc
|
||||
|
||||
func Test_command_count_3()
|
||||
let bufnr = bufnr('%')
|
||||
se nohidden
|
||||
e aaa
|
||||
let buf_aaa = bufnr('%')
|
||||
@ -145,7 +147,7 @@ func Test_command_count_3()
|
||||
let buf_bbb = bufnr('%')
|
||||
e ccc
|
||||
let buf_ccc = bufnr('%')
|
||||
buf 1
|
||||
exe bufnr . 'buf'
|
||||
call assert_equal([1, 1, 1], [buflisted(buf_aaa), buflisted(buf_bbb), buflisted(buf_ccc)])
|
||||
exe buf_bbb . "," . buf_ccc . "bdelete"
|
||||
call assert_equal([1, 0, 0], [buflisted(buf_aaa), buflisted(buf_bbb), buflisted(buf_ccc)])
|
||||
@ -155,7 +157,7 @@ endfunc
|
||||
|
||||
func Test_command_count_4()
|
||||
%argd
|
||||
let bufnr = bufnr('$') + 1
|
||||
let bufnr = bufnr('$')
|
||||
arga aa bb cc dd ee ff
|
||||
3argu
|
||||
let args = []
|
||||
@ -171,6 +173,8 @@ func Test_command_count_4()
|
||||
only!
|
||||
|
||||
exe bufnr . 'buf'
|
||||
bnext
|
||||
let bufnr = bufnr('%')
|
||||
let buffers = []
|
||||
.,$-bufdo call add(buffers, bufnr('%'))
|
||||
call assert_equal([bufnr, bufnr + 1, bufnr + 2, bufnr + 3, bufnr + 4], buffers)
|
||||
|
23
src/nvim/testdir/test_curswant.vim
Normal file
23
src/nvim/testdir/test_curswant.vim
Normal file
@ -0,0 +1,23 @@
|
||||
" Tests for curswant not changing when setting an option
|
||||
|
||||
func Test_curswant()
|
||||
new
|
||||
call append(0, ['1234567890', '12345'])
|
||||
|
||||
normal! ggf8j
|
||||
call assert_equal(7, winsaveview().curswant)
|
||||
let &tabstop=&tabstop
|
||||
call assert_equal(4, winsaveview().curswant)
|
||||
|
||||
normal! ggf8j
|
||||
call assert_equal(7, winsaveview().curswant)
|
||||
let &timeoutlen=&timeoutlen
|
||||
call assert_equal(7, winsaveview().curswant)
|
||||
|
||||
normal! ggf8j
|
||||
call assert_equal(7, winsaveview().curswant)
|
||||
let &ttimeoutlen=&ttimeoutlen
|
||||
call assert_equal(7, winsaveview().curswant)
|
||||
|
||||
enew!
|
||||
endfunc
|
@ -1,5 +1,4 @@
|
||||
" Tests for diff mode
|
||||
set belloff=all
|
||||
|
||||
func Test_diff_fold_sync()
|
||||
enew!
|
||||
|
@ -3,7 +3,6 @@
|
||||
if !has("digraphs") || !has("multi_byte")
|
||||
finish
|
||||
endif
|
||||
set belloff=all
|
||||
|
||||
func! Put_Dig(chars)
|
||||
exe "norm! o\<c-k>".a:chars
|
||||
|
1310
src/nvim/testdir/test_edit.vim
Normal file
1310
src/nvim/testdir/test_edit.vim
Normal file
File diff suppressed because it is too large
Load Diff
321
src/nvim/testdir/test_exists.vim
Normal file
321
src/nvim/testdir/test_exists.vim
Normal file
@ -0,0 +1,321 @@
|
||||
" Tests for the exists() function
|
||||
func Test_exists()
|
||||
augroup myagroup
|
||||
autocmd! BufEnter *.my echo "myfile edited"
|
||||
autocmd! FuncUndefined UndefFun exec "fu UndefFun()\nendfu"
|
||||
augroup END
|
||||
set rtp+=./sautest
|
||||
|
||||
" valid autocmd group
|
||||
call assert_equal(1, exists('#myagroup'))
|
||||
" valid autocmd group with garbage
|
||||
call assert_equal(0, exists('#myagroup+b'))
|
||||
" Valid autocmd group and event
|
||||
call assert_equal(1, exists('#myagroup#BufEnter'))
|
||||
" Valid autocmd group, event and pattern
|
||||
call assert_equal(1, exists('#myagroup#BufEnter#*.my'))
|
||||
" Valid autocmd event
|
||||
call assert_equal(1, exists('#BufEnter'))
|
||||
" Valid autocmd event and pattern
|
||||
call assert_equal(1, exists('#BufEnter#*.my'))
|
||||
" Non-existing autocmd group or event
|
||||
call assert_equal(0, exists('#xyzagroup'))
|
||||
" Non-existing autocmd group and valid autocmd event
|
||||
call assert_equal(0, exists('#xyzagroup#BufEnter'))
|
||||
" Valid autocmd group and event with no matching pattern
|
||||
call assert_equal(0, exists('#myagroup#CmdwinEnter'))
|
||||
" Valid autocmd group and non-existing autocmd event
|
||||
call assert_equal(0, exists('#myagroup#xyzacmd'))
|
||||
" Valid autocmd group and event and non-matching pattern
|
||||
call assert_equal(0, exists('#myagroup#BufEnter#xyzpat'))
|
||||
" Valid autocmd event and non-matching pattern
|
||||
call assert_equal(0, exists('#BufEnter#xyzpat'))
|
||||
" Empty autocmd group, event and pattern
|
||||
call assert_equal(0, exists('###'))
|
||||
" Empty autocmd group and event or empty event and pattern
|
||||
call assert_equal(0, exists('##'))
|
||||
" Valid autocmd event
|
||||
call assert_equal(1, exists('##FileReadCmd'))
|
||||
" Non-existing autocmd event
|
||||
call assert_equal(0, exists('##MySpecialCmd'))
|
||||
|
||||
" Existing and working option (long form)
|
||||
call assert_equal(1, exists('&textwidth'))
|
||||
" Existing and working option (short form)
|
||||
call assert_equal(1, exists('&tw'))
|
||||
" Existing and working option with garbage
|
||||
call assert_equal(0, exists('&tw-'))
|
||||
" Global option
|
||||
call assert_equal(1, exists('&g:errorformat'))
|
||||
" Local option
|
||||
call assert_equal(1, exists('&l:errorformat'))
|
||||
" Negative form of existing and working option (long form)
|
||||
call assert_equal(0, exists('&nojoinspaces'))
|
||||
" Negative form of existing and working option (short form)
|
||||
call assert_equal(0, exists('&nojs'))
|
||||
" Non-existing option
|
||||
call assert_equal(0, exists('&myxyzoption'))
|
||||
|
||||
" Existing and working option (long form)
|
||||
call assert_equal(1, exists('+incsearch'))
|
||||
" Existing and working option with garbage
|
||||
call assert_equal(0, exists('+incsearch!1'))
|
||||
" Existing and working option (short form)
|
||||
call assert_equal(1, exists('+is'))
|
||||
" Existing option that is hidden.
|
||||
call assert_equal(0, exists('+autoprint'))
|
||||
|
||||
" Existing environment variable
|
||||
let $EDITOR_NAME = 'Vim Editor'
|
||||
call assert_equal(1, exists('$EDITOR_NAME'))
|
||||
" Non-existing environment variable
|
||||
call assert_equal(0, exists('$NON_ENV_VAR'))
|
||||
|
||||
" Valid internal function
|
||||
call assert_equal(1, exists('*bufnr'))
|
||||
" Valid internal function with ()
|
||||
call assert_equal(1, exists('*bufnr()'))
|
||||
" Non-existing internal function
|
||||
call assert_equal(0, exists('*myxyzfunc'))
|
||||
" Valid internal function with garbage
|
||||
call assert_equal(0, exists('*bufnr&6'))
|
||||
" Valid user defined function
|
||||
call assert_equal(1, exists('*Test_exists'))
|
||||
" Non-existing user defined function
|
||||
call assert_equal(0, exists('*MyxyzFunc'))
|
||||
" Function that may be created by FuncUndefined event
|
||||
call assert_equal(0, exists('*UndefFun'))
|
||||
" Function that may be created by script autoloading
|
||||
call assert_equal(0, exists('*footest#F'))
|
||||
|
||||
" Valid internal command (full match)
|
||||
call assert_equal(2, exists(':edit'))
|
||||
" Valid internal command (full match) with garbage
|
||||
call assert_equal(0, exists(':edit/a'))
|
||||
" Valid internal command (partial match)
|
||||
call assert_equal(1, exists(':q'))
|
||||
" Non-existing internal command
|
||||
call assert_equal(0, exists(':invalidcmd'))
|
||||
|
||||
" User defined command (full match)
|
||||
command! MyCmd :echo 'My command'
|
||||
call assert_equal(2, exists(':MyCmd'))
|
||||
" User defined command (partial match)
|
||||
command! MyOtherCmd :echo 'Another command'
|
||||
call assert_equal(3, exists(':My'))
|
||||
|
||||
" Command modifier
|
||||
call assert_equal(2, exists(':rightbelow'))
|
||||
|
||||
" Non-existing user defined command (full match)
|
||||
delcommand MyCmd
|
||||
call assert_equal(0, exists(':MyCmd'))
|
||||
|
||||
" Non-existing user defined command (partial match)
|
||||
delcommand MyOtherCmd
|
||||
call assert_equal(0, exists(':My'))
|
||||
|
||||
" Valid local variable
|
||||
let local_var = 1
|
||||
call assert_equal(1, exists('local_var'))
|
||||
" Valid local variable with garbage
|
||||
call assert_equal(0, exists('local_var%n'))
|
||||
" Non-existing local variable
|
||||
unlet local_var
|
||||
call assert_equal(0, exists('local_var'))
|
||||
|
||||
" Non-existing autoload variable that may be autoloaded
|
||||
call assert_equal(0, exists('footest#x'))
|
||||
|
||||
" Valid local list
|
||||
let local_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('local_list'))
|
||||
" Valid local list item
|
||||
call assert_equal(1, exists('local_list[1]'))
|
||||
" Valid local list item with garbage
|
||||
call assert_equal(0, exists('local_list[1]+5'))
|
||||
" Invalid local list item
|
||||
call assert_equal(0, exists('local_list[2]'))
|
||||
" Non-existing local list
|
||||
unlet local_list
|
||||
call assert_equal(0, exists('local_list'))
|
||||
" Valid local dictionary
|
||||
let local_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('local_dict'))
|
||||
" Non-existing local dictionary
|
||||
unlet local_dict
|
||||
call assert_equal(0, exists('local_dict'))
|
||||
" Existing local curly-brace variable
|
||||
let str = "local"
|
||||
let curly_{str}_var = 1
|
||||
call assert_equal(1, exists('curly_{str}_var'))
|
||||
" Non-existing local curly-brace variable
|
||||
unlet curly_{str}_var
|
||||
call assert_equal(0, exists('curly_{str}_var'))
|
||||
|
||||
" Existing global variable
|
||||
let g:global_var = 1
|
||||
call assert_equal(1, exists('g:global_var'))
|
||||
" Existing global variable with garbage
|
||||
call assert_equal(0, exists('g:global_var-n'))
|
||||
" Non-existing global variable
|
||||
unlet g:global_var
|
||||
call assert_equal(0, exists('g:global_var'))
|
||||
" Existing global list
|
||||
let g:global_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('g:global_list'))
|
||||
" Non-existing global list
|
||||
unlet g:global_list
|
||||
call assert_equal(0, exists('g:global_list'))
|
||||
" Existing global dictionary
|
||||
let g:global_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('g:global_dict'))
|
||||
" Non-existing global dictionary
|
||||
unlet g:global_dict
|
||||
call assert_equal(0, exists('g:global_dict'))
|
||||
" Existing global curly-brace variable
|
||||
let str = "global"
|
||||
let g:curly_{str}_var = 1
|
||||
call assert_equal(1, exists('g:curly_{str}_var'))
|
||||
" Non-existing global curly-brace variable
|
||||
unlet g:curly_{str}_var
|
||||
call assert_equal(0, exists('g:curly_{str}_var'))
|
||||
|
||||
" Existing window variable
|
||||
let w:window_var = 1
|
||||
call assert_equal(1, exists('w:window_var'))
|
||||
" Non-existing window variable
|
||||
unlet w:window_var
|
||||
call assert_equal(0, exists('w:window_var'))
|
||||
" Existing window list
|
||||
let w:window_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('w:window_list'))
|
||||
" Non-existing window list
|
||||
unlet w:window_list
|
||||
call assert_equal(0, exists('w:window_list'))
|
||||
" Existing window dictionary
|
||||
let w:window_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('w:window_dict'))
|
||||
" Non-existing window dictionary
|
||||
unlet w:window_dict
|
||||
call assert_equal(0, exists('w:window_dict'))
|
||||
" Existing window curly-brace variable
|
||||
let str = "window"
|
||||
let w:curly_{str}_var = 1
|
||||
call assert_equal(1, exists('w:curly_{str}_var'))
|
||||
" Non-existing window curly-brace variable
|
||||
unlet w:curly_{str}_var
|
||||
call assert_equal(0, exists('w:curly_{str}_var'))
|
||||
|
||||
" Existing tab variable
|
||||
let t:tab_var = 1
|
||||
call assert_equal(1, exists('t:tab_var'))
|
||||
" Non-existing tab variable
|
||||
unlet t:tab_var
|
||||
call assert_equal(0, exists('t:tab_var'))
|
||||
" Existing tab list
|
||||
let t:tab_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('t:tab_list'))
|
||||
" Non-existing tab list
|
||||
unlet t:tab_list
|
||||
call assert_equal(0, exists('t:tab_list'))
|
||||
" Existing tab dictionary
|
||||
let t:tab_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('t:tab_dict'))
|
||||
" Non-existing tab dictionary
|
||||
unlet t:tab_dict
|
||||
call assert_equal(0, exists('t:tab_dict'))
|
||||
" Existing tab curly-brace variable
|
||||
let str = "tab"
|
||||
let t:curly_{str}_var = 1
|
||||
call assert_equal(1, exists('t:curly_{str}_var'))
|
||||
" Non-existing tab curly-brace variable
|
||||
unlet t:curly_{str}_var
|
||||
call assert_equal(0, exists('t:curly_{str}_var'))
|
||||
|
||||
" Existing buffer variable
|
||||
let b:buffer_var = 1
|
||||
call assert_equal(1, exists('b:buffer_var'))
|
||||
" Non-existing buffer variable
|
||||
unlet b:buffer_var
|
||||
call assert_equal(0, exists('b:buffer_var'))
|
||||
" Existing buffer list
|
||||
let b:buffer_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('b:buffer_list'))
|
||||
" Non-existing buffer list
|
||||
unlet b:buffer_list
|
||||
call assert_equal(0, exists('b:buffer_list'))
|
||||
" Existing buffer dictionary
|
||||
let b:buffer_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('b:buffer_dict'))
|
||||
" Non-existing buffer dictionary
|
||||
unlet b:buffer_dict
|
||||
call assert_equal(0, exists('b:buffer_dict'))
|
||||
" Existing buffer curly-brace variable
|
||||
let str = "buffer"
|
||||
let b:curly_{str}_var = 1
|
||||
call assert_equal(1, exists('b:curly_{str}_var'))
|
||||
" Non-existing buffer curly-brace variable
|
||||
unlet b:curly_{str}_var
|
||||
call assert_equal(0, exists('b:curly_{str}_var'))
|
||||
|
||||
" Existing Vim internal variable
|
||||
call assert_equal(1, exists('v:version'))
|
||||
" Non-existing Vim internal variable
|
||||
call assert_equal(0, exists('v:non_exists_var'))
|
||||
|
||||
" Existing script-local variable
|
||||
let s:script_var = 1
|
||||
call assert_equal(1, exists('s:script_var'))
|
||||
" Non-existing script-local variable
|
||||
unlet s:script_var
|
||||
call assert_equal(0, exists('s:script_var'))
|
||||
" Existing script-local list
|
||||
let s:script_list = ["blue", "orange"]
|
||||
call assert_equal(1, exists('s:script_list'))
|
||||
" Non-existing script-local list
|
||||
unlet s:script_list
|
||||
call assert_equal(0, exists('s:script_list'))
|
||||
" Existing script-local dictionary
|
||||
let s:script_dict = {"xcord":100, "ycord":2}
|
||||
call assert_equal(1, exists('s:script_dict'))
|
||||
" Non-existing script-local dictionary
|
||||
unlet s:script_dict
|
||||
call assert_equal(0, exists('s:script_dict'))
|
||||
" Existing script curly-brace variable
|
||||
let str = "script"
|
||||
let s:curly_{str}_var = 1
|
||||
call assert_equal(1, exists('s:curly_{str}_var'))
|
||||
" Non-existing script-local curly-brace variable
|
||||
unlet s:curly_{str}_var
|
||||
call assert_equal(0, exists('s:curly_{str}_var'))
|
||||
|
||||
" Existing script-local function
|
||||
function! s:my_script_func()
|
||||
endfunction
|
||||
|
||||
echo '*s:my_script_func: 1'
|
||||
call assert_equal(1, exists('*s:my_script_func'))
|
||||
|
||||
" Non-existing script-local function
|
||||
delfunction s:my_script_func
|
||||
|
||||
call assert_equal(0, exists('*s:my_script_func'))
|
||||
unlet str
|
||||
|
||||
call assert_equal(1, g:footest#x)
|
||||
call assert_equal(0, footest#F())
|
||||
call assert_equal(0, UndefFun())
|
||||
endfunc
|
||||
|
||||
" exists() test for Function arguments
|
||||
func FuncArg_Tests(func_arg, ...)
|
||||
call assert_equal(1, exists('a:func_arg'))
|
||||
call assert_equal(0, exists('a:non_exists_arg'))
|
||||
call assert_equal(1, exists('a:1'))
|
||||
call assert_equal(0, exists('a:2'))
|
||||
endfunc
|
||||
|
||||
func Test_exists_funcarg()
|
||||
call FuncArg_Tests("arg1", "arg2")
|
||||
endfunc
|
58
src/nvim/testdir/test_file_size.vim
Normal file
58
src/nvim/testdir/test_file_size.vim
Normal file
@ -0,0 +1,58 @@
|
||||
" Inserts 2 million lines with consecutive integers starting from 1
|
||||
" (essentially, the output of GNU's seq 1 2000000), writes them to Xtest
|
||||
" and writes its cksum to test.out.
|
||||
"
|
||||
" We need 2 million lines to trigger a call to mf_hash_grow(). If it would mess
|
||||
" up the lines the checksum would differ.
|
||||
"
|
||||
" cksum is part of POSIX and so should be available on most Unixes.
|
||||
" If it isn't available then the test will be skipped.
|
||||
func Test_File_Size()
|
||||
if !executable('cksum')
|
||||
return
|
||||
endif
|
||||
|
||||
new
|
||||
set fileformat=unix undolevels=-1
|
||||
for i in range(1, 2000000, 100)
|
||||
call append(i, range(i, i + 99))
|
||||
endfor
|
||||
|
||||
1delete
|
||||
w! Xtest
|
||||
let res = systemlist('cksum Xtest')[0]
|
||||
let res = substitute(res, "\r", "", "")
|
||||
call assert_equal('3678979763 14888896 Xtest', res)
|
||||
|
||||
enew!
|
||||
call delete('Xtest')
|
||||
set fileformat& undolevels&
|
||||
endfunc
|
||||
|
||||
" Test for writing and reading a file of over 100 Kbyte
|
||||
func Test_File_Read_Write()
|
||||
enew!
|
||||
|
||||
" Create a file with the following contents
|
||||
" 1 line: "This is the start"
|
||||
" 3001 lines: "This is the leader"
|
||||
" 1 line: "This is the middle"
|
||||
" 3001 lines: "This is the trailer"
|
||||
" 1 line: "This is the end"
|
||||
call append(0, "This is the start")
|
||||
call append(1, repeat(["This is the leader"], 3001))
|
||||
call append(3002, "This is the middle")
|
||||
call append(3003, repeat(["This is the trailer"], 3001))
|
||||
call append(6004, "This is the end")
|
||||
|
||||
write! Xtest
|
||||
enew!
|
||||
edit! Xtest
|
||||
|
||||
call assert_equal("This is the start", getline(1))
|
||||
call assert_equal("This is the middle", getline(3003))
|
||||
call assert_equal("This is the end", getline(6005))
|
||||
|
||||
enew!
|
||||
call delete("Xtest")
|
||||
endfunc
|
557
src/nvim/testdir/test_filetype.vim
Normal file
557
src/nvim/testdir/test_filetype.vim
Normal file
@ -0,0 +1,557 @@
|
||||
" Test :setfiletype
|
||||
|
||||
func Test_detection()
|
||||
filetype on
|
||||
augroup filetypedetect
|
||||
au BufNewFile,BufRead * call assert_equal(1, did_filetype())
|
||||
augroup END
|
||||
new something.vim
|
||||
call assert_equal('vim', &filetype)
|
||||
|
||||
bwipe!
|
||||
filetype off
|
||||
endfunc
|
||||
|
||||
func Test_conf_type()
|
||||
filetype on
|
||||
call writefile(['# some comment', 'must be conf'], 'Xfile')
|
||||
augroup filetypedetect
|
||||
au BufNewFile,BufRead * call assert_equal(0, did_filetype())
|
||||
augroup END
|
||||
split Xfile
|
||||
call assert_equal('conf', &filetype)
|
||||
|
||||
bwipe!
|
||||
call delete('Xfile')
|
||||
filetype off
|
||||
endfunc
|
||||
|
||||
func Test_other_type()
|
||||
filetype on
|
||||
augroup filetypedetect
|
||||
au BufNewFile,BufRead * call assert_equal(0, did_filetype())
|
||||
au BufNewFile,BufRead Xfile setf testfile
|
||||
au BufNewFile,BufRead * call assert_equal(1, did_filetype())
|
||||
augroup END
|
||||
call writefile(['# some comment', 'must be conf'], 'Xfile')
|
||||
split Xfile
|
||||
call assert_equal('testfile', &filetype)
|
||||
|
||||
bwipe!
|
||||
call delete('Xfile')
|
||||
filetype off
|
||||
endfunc
|
||||
|
||||
" Filetypes detected just from matching the file name.
|
||||
let s:filename_checks = {
|
||||
\ 'a2ps': ['/etc/a2ps.cfg', '/etc/a2ps/file.cfg', 'a2psrc', '.a2psrc'],
|
||||
\ 'a65': ['file.a65'],
|
||||
\ 'abap': ['file.abap'],
|
||||
\ 'abc': ['file.abc'],
|
||||
\ 'abel': ['file.abl'],
|
||||
\ 'acedb': ['file.wrm'],
|
||||
\ 'ada': ['file.adb', 'file.ads', 'file.ada', 'file.gpr'],
|
||||
\ 'ahdl': ['file.tdf'],
|
||||
\ 'alsaconf': ['.asoundrc', '/usr/share/alsa/alsa.conf', '/etc/asound.conf'],
|
||||
\ 'aml': ['file.aml'],
|
||||
\ 'ampl': ['file.run'],
|
||||
\ 'ant': ['build.xml'],
|
||||
\ 'apache': ['.htaccess', '/etc/httpd/file.conf'],
|
||||
\ 'applescript': ['file.scpt'],
|
||||
\ 'aptconf': ['apt.conf', '/.aptitude/config'],
|
||||
\ 'arch': ['.arch-inventory'],
|
||||
\ 'arduino': ['file.ino', 'file.pde'],
|
||||
\ 'art': ['file.art'],
|
||||
\ 'asciidoc': ['file.asciidoc', 'file.adoc'],
|
||||
\ 'asn': ['file.asn', 'file.asn1'],
|
||||
\ 'atlas': ['file.atl', 'file.as'],
|
||||
\ 'autohotkey': ['file.ahk'],
|
||||
\ 'autoit': ['file.au3'],
|
||||
\ 'automake': ['GNUmakefile.am'],
|
||||
\ 'ave': ['file.ave'],
|
||||
\ 'awk': ['file.awk'],
|
||||
\ 'b': ['file.mch', 'file.ref', 'file.imp'],
|
||||
\ 'bc': ['file.bc'],
|
||||
\ 'bdf': ['file.bdf'],
|
||||
\ 'bib': ['file.bib'],
|
||||
\ 'bindzone': ['named.root'],
|
||||
\ 'blank': ['file.bl'],
|
||||
\ 'bst': ['file.bst'],
|
||||
\ 'bzr': ['bzr_log.any'],
|
||||
\ 'c': ['enlightenment/file.cfg', 'file.qc', 'file.c'],
|
||||
\ 'cabal': ['file.cabal'],
|
||||
\ 'calendar': ['calendar'],
|
||||
\ 'catalog': ['catalog'],
|
||||
\ 'cdl': ['file.cdl'],
|
||||
\ 'cdrdaoconf': ['/etc/cdrdao.conf', '/etc/defaults/cdrdao', '/etc/default/cdrdao', '.cdrdao'],
|
||||
\ 'cdrtoc': ['file.toc'],
|
||||
\ 'cf': ['file.cfm', 'file.cfi', 'file.cfc'],
|
||||
\ 'cfengine': ['cfengine.conf'],
|
||||
\ 'cfg': ['file.cfg', 'file.hgrc', 'filehgrc'],
|
||||
\ 'ch': ['file.chf'],
|
||||
\ 'chaiscript': ['file.chai'],
|
||||
\ 'chaskell': ['file.chs'],
|
||||
\ 'chill': ['file..ch'],
|
||||
\ 'chordpro': ['file.chopro', 'file.crd', 'file.cho', 'file.crdpro', 'file.chordpro'],
|
||||
\ 'cl': ['file.eni'],
|
||||
\ 'clean': ['file.dcl', 'file.icl'],
|
||||
\ 'clojure': ['file.clj', 'file.cljs', 'file.cljx', 'file.cljc'],
|
||||
\ 'cmake': ['CMakeLists.txt', 'file.cmake', 'file.cmake.in'],
|
||||
\ 'cmusrc': ['any/.cmus/autosave', 'any/.cmus/rc', 'any/.cmus/command-history', 'any/.cmus/file.theme', 'any/cmus/rc', 'any/cmus/file.theme'],
|
||||
\ 'cobol': ['file.cbl', 'file.cob', 'file.lib'],
|
||||
\ 'coco': ['file.atg'],
|
||||
\ 'conaryrecipe': ['file.recipe'],
|
||||
\ 'conf': ['auto.master'],
|
||||
\ 'config': ['configure.in', 'configure.ac'],
|
||||
\ 'context': ['tex/context/any/file.tex', 'file.mkii', 'file.mkiv', 'file.mkvi'],
|
||||
\ 'cpp': ['file.cxx', 'file.c++', 'file.hh', 'file.hxx', 'file.hpp', 'file.ipp', 'file.moc', 'file.tcc', 'file.inl', 'file.tlh'],
|
||||
\ 'crm': ['file.crm'],
|
||||
\ 'cs': ['file.cs'],
|
||||
\ 'csc': ['file.csc'],
|
||||
\ 'csdl': ['file.csdl'],
|
||||
\ 'csp': ['file.csp', 'file.fdr'],
|
||||
\ 'css': ['file.css'],
|
||||
\ 'cterm': ['file.con'],
|
||||
\ 'cucumber': ['file.feature'],
|
||||
\ 'cuda': ['file.cu'],
|
||||
\ 'cupl': ['file.pld'],
|
||||
\ 'cuplsim': ['file.si'],
|
||||
\ 'cvs': ['cvs123'],
|
||||
\ 'cvsrc': ['.cvsrc'],
|
||||
\ 'cynpp': ['file.cyn'],
|
||||
\ 'datascript': ['file.ds'],
|
||||
\ 'dcd': ['file.dcd'],
|
||||
\ 'debcontrol': ['/debian/control'],
|
||||
\ 'debsources': ['/etc/apt/sources.list', '/etc/apt/sources.list.d/file.list'],
|
||||
\ 'def': ['file.def'],
|
||||
\ 'denyhosts': ['denyhosts.conf'],
|
||||
\ 'desc': ['file.desc'],
|
||||
\ 'desktop': ['file.desktop', '.directory'],
|
||||
\ 'dictconf': ['dict.conf', '.dictrc'],
|
||||
\ 'dictdconf': ['dictd.conf'],
|
||||
\ 'diff': ['file.diff', 'file.rej'],
|
||||
\ 'dircolors': ['.dir_colors', '.dircolors', '/etc/DIR_COLORS'],
|
||||
\ 'dnsmasq': ['/etc/dnsmasq.conf'],
|
||||
\ 'dockerfile': ['Dockerfile', 'file.Dockerfile'],
|
||||
\ 'dosbatch': ['file.bat', 'file.sys'],
|
||||
\ 'dosini': ['.editorconfig', '/etc/yum.conf', 'file.ini'],
|
||||
\ 'dot': ['file.dot'],
|
||||
\ 'dracula': ['file.drac', 'file.drc', 'filelvs', 'filelpe'],
|
||||
\ 'dsl': ['file.dsl'],
|
||||
\ 'dtd': ['file.dtd'],
|
||||
\ 'dts': ['file.dts', 'file.dtsi'],
|
||||
\ 'dylan': ['file.dylan'],
|
||||
\ 'dylanintr': ['file.intr'],
|
||||
\ 'dylanlid': ['file.lid'],
|
||||
\ 'ecd': ['file.ecd'],
|
||||
\ 'edif': ['file.edf', 'file.edif', 'file.edo'],
|
||||
\ 'elinks': ['/etc/elinks.conf', '/.elinks/elinks.conf'],
|
||||
\ 'elmfilt': ['filter-rules'],
|
||||
\ 'erlang': ['file.erl', 'file.hrl', 'file.yaws'],
|
||||
\ 'eruby': ['file.erb', 'file.rhtml'],
|
||||
\ 'esmtprc': ['anyesmtprc'],
|
||||
\ 'esqlc': ['file.ec', 'file.EC'],
|
||||
\ 'esterel': ['file.strl'],
|
||||
\ 'eterm': ['anyEterm/file.cfg'],
|
||||
\ 'exim': ['exim.conf'],
|
||||
\ 'expect': ['file.exp'],
|
||||
\ 'exports': ['exports'],
|
||||
\ 'factor': ['file.factor'],
|
||||
\ 'falcon': ['file.fal'],
|
||||
\ 'fan': ['file.fan', 'file.fwt'],
|
||||
\ 'fetchmail': ['.fetchmailrc'],
|
||||
\ 'fgl': ['file.4gl', 'file.4gh', 'file.m4gl'],
|
||||
\ 'focexec': ['file.fex', 'file.focexec'],
|
||||
\ 'forth': ['file.fs', 'file.ft'],
|
||||
\ 'fortran': ['file.f', 'file.for', 'file.fortran', 'file.fpp', 'file.ftn', 'file.f77', 'file.f90', 'file.f95', 'file.f03', 'file.f08'],
|
||||
\ 'framescript': ['file.fsl'],
|
||||
\ 'freebasic': ['file.fb', 'file.bi'],
|
||||
\ 'fstab': ['fstab', 'mtab'],
|
||||
\ 'gdb': ['.gdbinit'],
|
||||
\ 'gdmo': ['file.mo', 'file.gdmo'],
|
||||
\ 'gedcom': ['file.ged', 'lltxxxxx.txt'],
|
||||
\ 'gitcommit': ['COMMIT_EDITMSG', 'MERGE_MSG', 'TAG_EDITMSG'],
|
||||
\ 'gitconfig': ['file.git/config', '.gitconfig', '.gitmodules', 'file.git/modules//config', '/.config/git/config'],
|
||||
\ 'gitolite': ['gitolite.conf'],
|
||||
\ 'gitrebase': ['git-rebase-todo'],
|
||||
\ 'gitsendemail': ['.gitsendemail.msg.xxxxxx'],
|
||||
\ 'gkrellmrc': ['gkrellmrc', 'gkrellmrc_x'],
|
||||
\ 'gnash': ['gnashrc', '.gnashrc', 'gnashpluginrc', '.gnashpluginrc'],
|
||||
\ 'gnuplot': ['file.gpi'],
|
||||
\ 'go': ['file.go'],
|
||||
\ 'gp': ['file.gp', '.gprc'],
|
||||
\ 'gpg': ['/.gnupg/options', '/.gnupg/gpg.conf', '/usr/any/gnupg/options.skel'],
|
||||
\ 'grads': ['file.gs'],
|
||||
\ 'gretl': ['file.gretl'],
|
||||
\ 'groovy': ['file.gradle', 'file.groovy'],
|
||||
\ 'group': ['any/etc/group', 'any/etc/group-', 'any/etc/group.edit', 'any/etc/gshadow', 'any/etc/gshadow-', 'any/etc/gshadow.edit', 'any/var/backups/group.bak', 'any/var/backups/gshadow.bak'],
|
||||
\ 'grub': ['/boot/grub/menu.lst', '/boot/grub/grub.conf', '/etc/grub.conf'],
|
||||
\ 'gsp': ['file.gsp'],
|
||||
\ 'gtkrc': ['.gtkrc', 'gtkrc'],
|
||||
\ 'haml': ['file.haml'],
|
||||
\ 'hamster': ['file.hsc', 'file.hsm'],
|
||||
\ 'haskell': ['file.hs', 'file.hs-boot'],
|
||||
\ 'haste': ['file.ht'],
|
||||
\ 'hastepreproc': ['file.htpp'],
|
||||
\ 'hb': ['file.hb'],
|
||||
\ 'hercules': ['file.vc', 'file.ev', 'file.sum', 'file.errsum'],
|
||||
\ 'hex': ['file.hex', 'file.h32'],
|
||||
\ 'hgcommit': ['hg-editor-file.txt'],
|
||||
\ 'hog': ['file.hog', 'snort.conf', 'vision.conf'],
|
||||
\ 'hostconf': ['/etc/host.conf'],
|
||||
\ 'hostsaccess': ['/etc/hosts.allow', '/etc/hosts.deny'],
|
||||
\ 'htmlcheetah': ['file.tmpl'],
|
||||
\ 'htmlm4': ['file.html.m4'],
|
||||
\ 'httest': ['file.htt', 'file.htb'],
|
||||
\ 'ibasic': ['file.iba', 'file.ibi'],
|
||||
\ 'icemenu': ['/.icewm/menu'],
|
||||
\ 'icon': ['file.icn'],
|
||||
\ 'indent': ['.indent.pro', 'indentrc'],
|
||||
\ 'inform': ['file.inf', 'file.INF'],
|
||||
\ 'initng': ['/etc/initng/any/file.i', 'file.ii'],
|
||||
\ 'inittab': ['inittab'],
|
||||
\ 'ipfilter': ['ipf.conf', 'ipf6.conf', 'ipf.rules'],
|
||||
\ 'iss': ['file.iss'],
|
||||
\ 'ist': ['file.ist', 'file.mst'],
|
||||
\ 'j': ['file.ijs'],
|
||||
\ 'jal': ['file.jal', 'file.JAL'],
|
||||
\ 'jam': ['file.jpl', 'file.jpr'],
|
||||
\ 'java': ['file.java', 'file.jav'],
|
||||
\ 'javacc': ['file.jj', 'file.jjt'],
|
||||
\ 'javascript': ['file.js', 'file.javascript', 'file.es', 'file.jsx', 'file.mjs'],
|
||||
\ 'jess': ['file.clp'],
|
||||
\ 'jgraph': ['file.jgr'],
|
||||
\ 'jovial': ['file.jov', 'file.j73', 'file.jovial'],
|
||||
\ 'jproperties': ['file.properties', 'file.properties_xx', 'file.properties_xx_xx'],
|
||||
\ 'json': ['file.json', 'file.jsonp', 'file.webmanifest'],
|
||||
\ 'jsp': ['file.jsp'],
|
||||
\ 'kconfig': ['Kconfig', 'Kconfig.debug'],
|
||||
\ 'kivy': ['file.kv'],
|
||||
\ 'kix': ['file.kix'],
|
||||
\ 'kscript': ['file.ks'],
|
||||
\ 'kwt': ['file.k'],
|
||||
\ 'lace': ['file.ace', 'file.ACE'],
|
||||
\ 'latte': ['file.latte', 'file.lte'],
|
||||
\ 'ld': ['file.ld'],
|
||||
\ 'ldif': ['file.ldif'],
|
||||
\ 'less': ['file.less'],
|
||||
\ 'lex': ['file.lex', 'file.l', 'file.lxx', 'file.l++'],
|
||||
\ 'lftp': ['lftp.conf', '.lftprc', 'anylftp/rc'],
|
||||
\ 'lhaskell': ['file.lhs'],
|
||||
\ 'libao': ['/etc/libao.conf', '/.libao'],
|
||||
\ 'lifelines': ['file.ll'],
|
||||
\ 'lilo': ['lilo.conf'],
|
||||
\ 'limits': ['/etc/limits', '/etc/anylimits.conf', '/etc/anylimits.d/file.conf'],
|
||||
\ 'liquid': ['file.liquid'],
|
||||
\ 'lisp': ['sbclrc', '.sbclrc'],
|
||||
\ 'lite': ['file.lite', 'file.lt'],
|
||||
\ 'litestep': ['/LiteStep/any/file.rc'],
|
||||
\ 'loginaccess': ['/etc/login.access'],
|
||||
\ 'logindefs': ['/etc/login.defs'],
|
||||
\ 'logtalk': ['file.lgt'],
|
||||
\ 'lotos': ['file.lot', 'file.lotos'],
|
||||
\ 'lout': ['file.lou', 'file.lout'],
|
||||
\ 'lprolog': ['file.sig'],
|
||||
\ 'lsl': ['file.lsl'],
|
||||
\ 'lss': ['file.lss'],
|
||||
\ 'lua': ['file.lua', 'file.rockspec', 'file.nse'],
|
||||
\ 'lynx': ['lynx.cfg'],
|
||||
\ 'm4': ['file.at'],
|
||||
\ 'mail': ['snd.123', '.letter', '.letter.123', '.followup', '.article', '.article.123', 'pico.123', 'mutt-xx-xxx', 'muttng-xx-xxx', 'ae123.txt', 'file.eml'],
|
||||
\ 'mailaliases': ['/etc/mail/aliases', '/etc/aliases'],
|
||||
\ 'mailcap': ['.mailcap', 'mailcap'],
|
||||
\ 'make': ['file.mk', 'file.mak', 'file.dsp'],
|
||||
\ 'mallard': ['file.page'],
|
||||
\ 'manconf': ['/etc/man.conf', 'man.config'],
|
||||
\ 'map': ['file.map'],
|
||||
\ 'maple': ['file.mv', 'file.mpl', 'file.mws'],
|
||||
\ 'markdown': ['file.markdown', 'file.mdown', 'file.mkd', 'file.mkdn', 'file.mdwn', 'file.md'],
|
||||
\ 'mason': ['file.mason', 'file.mhtml', 'file.comp'],
|
||||
\ 'master': ['file.mas', 'file.master'],
|
||||
\ 'mel': ['file.mel'],
|
||||
\ 'messages': ['/log/auth', '/log/cron', '/log/daemon', '/log/debug', '/log/kern', '/log/lpr', '/log/mail', '/log/messages', '/log/news/news', '/log/syslog', '/log/user',
|
||||
\ '/log/auth.log', '/log/cron.log', '/log/daemon.log', '/log/debug.log', '/log/kern.log', '/log/lpr.log', '/log/mail.log', '/log/messages.log', '/log/news/news.log', '/log/syslog.log', '/log/user.log',
|
||||
\ '/log/auth.err', '/log/cron.err', '/log/daemon.err', '/log/debug.err', '/log/kern.err', '/log/lpr.err', '/log/mail.err', '/log/messages.err', '/log/news/news.err', '/log/syslog.err', '/log/user.err',
|
||||
\ '/log/auth.info', '/log/cron.info', '/log/daemon.info', '/log/debug.info', '/log/kern.info', '/log/lpr.info', '/log/mail.info', '/log/messages.info', '/log/news/news.info', '/log/syslog.info', '/log/user.info',
|
||||
\ '/log/auth.warn', '/log/cron.warn', '/log/daemon.warn', '/log/debug.warn', '/log/kern.warn', '/log/lpr.warn', '/log/mail.warn', '/log/messages.warn', '/log/news/news.warn', '/log/syslog.warn', '/log/user.warn',
|
||||
\ '/log/auth.crit', '/log/cron.crit', '/log/daemon.crit', '/log/debug.crit', '/log/kern.crit', '/log/lpr.crit', '/log/mail.crit', '/log/messages.crit', '/log/news/news.crit', '/log/syslog.crit', '/log/user.crit',
|
||||
\ '/log/auth.notice', '/log/cron.notice', '/log/daemon.notice', '/log/debug.notice', '/log/kern.notice', '/log/lpr.notice', '/log/mail.notice', '/log/messages.notice', '/log/news/news.notice', '/log/syslog.notice', '/log/user.notice'],
|
||||
\ 'mf': ['file.mf'],
|
||||
\ 'mgl': ['file.mgl'],
|
||||
\ 'mgp': ['file.mgp'],
|
||||
\ 'mib': ['file.mib', 'file.my'],
|
||||
\ 'mix': ['file.mix', 'file.mixal'],
|
||||
\ 'mma': ['file.nb'],
|
||||
\ 'mmp': ['file.mmp'],
|
||||
\ 'modconf': ['/etc/modules.conf', '/etc/modules', '/etc/conf.modules'],
|
||||
\ 'modula2': ['file.m2', 'file.mi'],
|
||||
\ 'monk': ['file.isc', 'file.monk', 'file.ssc', 'file.tsc'],
|
||||
\ 'moo': ['file.moo'],
|
||||
\ 'mp': ['file.mp'],
|
||||
\ 'mplayerconf': ['mplayer.conf', '/.mplayer/config'],
|
||||
\ 'mrxvtrc': ['mrxvtrc', '.mrxvtrc'],
|
||||
\ 'msidl': ['file.odl', 'file.mof'],
|
||||
\ 'msql': ['file.msql'],
|
||||
\ 'mupad': ['file.mu'],
|
||||
\ 'mush': ['file.mush'],
|
||||
\ 'muttrc': ['Muttngrc', 'Muttrc'],
|
||||
\ 'mysql': ['file.mysql'],
|
||||
\ 'n1ql': ['file.n1ql', 'file.nql'],
|
||||
\ 'named': ['namedfile.conf', 'rndcfile.conf'],
|
||||
\ 'nanorc': ['/etc/nanorc', 'file.nanorc'],
|
||||
\ 'ncf': ['file.ncf'],
|
||||
\ 'netrc': ['.netrc'],
|
||||
\ 'ninja': ['file.ninja'],
|
||||
\ 'nqc': ['file.nqc'],
|
||||
\ 'nroff': ['file.tr', 'file.nr', 'file.roff', 'file.tmac', 'file.mom'],
|
||||
\ 'nsis': ['file.nsi', 'file.nsh'],
|
||||
\ 'obj': ['file.obj'],
|
||||
\ 'ocaml': ['file.ml', 'file.mli', 'file.mll', 'file.mly', '.ocamlinit'],
|
||||
\ 'occam': ['file.occ'],
|
||||
\ 'omnimark': ['file.xom', 'file.xin'],
|
||||
\ 'openroad': ['file.or'],
|
||||
\ 'ora': ['file.ora'],
|
||||
\ 'pamconf': ['/etc/pam.conf'],
|
||||
\ 'papp': ['file.papp', 'file.pxml', 'file.pxsl'],
|
||||
\ 'pascal': ['file.pas', 'file.dpr'],
|
||||
\ 'passwd': ['any/etc/passwd', 'any/etc/passwd-', 'any/etc/passwd.edit', 'any/etc/shadow', 'any/etc/shadow-', 'any/etc/shadow.edit', 'any/var/backups/passwd.bak', 'any/var/backups/shadow.bak'],
|
||||
\ 'pccts': ['file.g'],
|
||||
\ 'pdf': ['file.pdf'],
|
||||
\ 'perl': ['file.plx', 'file.al', 'file.psgi', 'gitolite.rc', '.gitolite.rc', 'example.gitolite.rc'],
|
||||
\ 'perl6': ['file.p6', 'file.pm6', 'file.pl6'],
|
||||
\ 'pf': ['pf.conf'],
|
||||
\ 'pfmain': ['main.cf'],
|
||||
\ 'php': ['file.php', 'file.php9', 'file.phtml', 'file.ctp'],
|
||||
\ 'pike': ['file.pike', 'file.lpc', 'file.ulpc', 'file.pmod'],
|
||||
\ 'pilrc': ['file.rcp'],
|
||||
\ 'pine': ['.pinerc', 'pinerc', '.pinercex', 'pinercex'],
|
||||
\ 'pinfo': ['/etc/pinforc', '/.pinforc'],
|
||||
\ 'pli': ['file.pli', 'file.pl1'],
|
||||
\ 'plm': ['file.plm', 'file.p36', 'file.pac'],
|
||||
\ 'plp': ['file.plp'],
|
||||
\ 'plsql': ['file.pls', 'file.plsql'],
|
||||
\ 'po': ['file.po', 'file.pot'],
|
||||
\ 'pod': ['file.pod'],
|
||||
\ 'pod6': ['file.pod6'],
|
||||
\ 'postscr': ['file.ps', 'file.pfa', 'file.afm', 'file.eps', 'file.epsf', 'file.epsi', 'file.ai'],
|
||||
\ 'pov': ['file.pov'],
|
||||
\ 'povini': ['.povrayrc'],
|
||||
\ 'ppd': ['file.ppd'],
|
||||
\ 'ppwiz': ['file.it', 'file.ih'],
|
||||
\ 'privoxy': ['file.action'],
|
||||
\ 'proc': ['file.pc'],
|
||||
\ 'procmail': ['.procmail', '.procmailrc'],
|
||||
\ 'prolog': ['file.pdb'],
|
||||
\ 'promela': ['file.pml'],
|
||||
\ 'proto': ['file.proto'],
|
||||
\ 'protocols': ['/etc/protocols'],
|
||||
\ 'psf': ['file.psf'],
|
||||
\ 'pyrex': ['file.pyx', 'file.pxd'],
|
||||
\ 'python': ['file.py', 'file.pyw', '.pythonstartup', '.pythonrc', 'file.ptl'],
|
||||
\ 'quake': ['anybaseq2/file.cfg', 'anyid1/file.cfg', 'quake3/file.cfg'],
|
||||
\ 'radiance': ['file.rad', 'file.mat'],
|
||||
\ 'ratpoison': ['.ratpoisonrc', 'ratpoisonrc'],
|
||||
\ 'rc': ['file.rc', 'file.rch'],
|
||||
\ 'rcs': ['file,v'],
|
||||
\ 'readline': ['.inputrc', 'inputrc'],
|
||||
\ 'remind': ['.reminders', 'file.remind', 'file.rem'],
|
||||
\ 'resolv': ['resolv.conf'],
|
||||
\ 'reva': ['file.frt'],
|
||||
\ 'rexx': ['file.rex', 'file.orx', 'file.rxo', 'file.rxj', 'file.jrexx', 'file.rexxj', 'file.rexx', 'file.testGroup', 'file.testUnit'],
|
||||
\ 'rib': ['file.rib'],
|
||||
\ 'rnc': ['file.rnc'],
|
||||
\ 'rng': ['file.rng'],
|
||||
\ 'robots': ['robots.txt'],
|
||||
\ 'rpcgen': ['file.x'],
|
||||
\ 'rpl': ['file.rpl'],
|
||||
\ 'rst': ['file.rst'],
|
||||
\ 'rtf': ['file.rtf'],
|
||||
\ 'ruby': ['.irbrc', 'irbrc', 'file.rb', 'file.rbw', 'file.gemspec', 'file.ru', 'Gemfile', 'file.builder', 'file.rxml', 'file.rjs', 'file.rant', 'file.rake'],
|
||||
\ 'rust': ['file.rs'],
|
||||
\ 'samba': ['smb.conf'],
|
||||
\ 'sas': ['file.sas'],
|
||||
\ 'sass': ['file.sass'],
|
||||
\ 'sather': ['file.sa'],
|
||||
\ 'sbt': ['file.sbt'],
|
||||
\ 'scala': ['file.scala'],
|
||||
\ 'scheme': ['file.scm', 'file.ss', 'file.rkt'],
|
||||
\ 'scilab': ['file.sci', 'file.sce'],
|
||||
\ 'screen': ['.screenrc', 'screenrc'],
|
||||
\ 'scss': ['file.scss'],
|
||||
\ 'sd': ['file.sd'],
|
||||
\ 'sdc': ['file.sdc'],
|
||||
\ 'sdl': ['file.sdl', 'file.pr'],
|
||||
\ 'sed': ['file.sed'],
|
||||
\ 'sensors': ['/etc/sensors.conf', '/etc/sensors3.conf'],
|
||||
\ 'services': ['/etc/services'],
|
||||
\ 'setserial': ['/etc/serial.conf'],
|
||||
\ 'sh': ['/etc/udev/cdsymlinks.conf'],
|
||||
\ 'sieve': ['file.siv'],
|
||||
\ 'simula': ['file.sim'],
|
||||
\ 'sinda': ['file.sin', 'file.s85'],
|
||||
\ 'sisu': ['file.sst', 'file.ssm', 'file.ssi', 'file.-sst', 'file._sst', 'file.sst.meta', 'file.-sst.meta', 'file._sst.meta'],
|
||||
\ 'skill': ['file.il', 'file.ils', 'file.cdf'],
|
||||
\ 'slang': ['file.sl'],
|
||||
\ 'slice': ['file.ice'],
|
||||
\ 'slpconf': ['/etc/slp.conf'],
|
||||
\ 'slpreg': ['/etc/slp.reg'],
|
||||
\ 'slpspi': ['/etc/slp.spi'],
|
||||
\ 'slrnrc': ['.slrnrc'],
|
||||
\ 'slrnsc': ['file.score'],
|
||||
\ 'sm': ['sendmail.cf'],
|
||||
\ 'smarty': ['file.tpl'],
|
||||
\ 'smcl': ['file.hlp', 'file.ihlp', 'file.smcl'],
|
||||
\ 'smith': ['file.smt', 'file.smith'],
|
||||
\ 'sml': ['file.sml'],
|
||||
\ 'snobol4': ['file.sno', 'file.spt'],
|
||||
\ 'spec': ['file.spec'],
|
||||
\ 'spice': ['file.sp', 'file.spice'],
|
||||
\ 'spup': ['file.speedup', 'file.spdata', 'file.spd'],
|
||||
\ 'spyce': ['file.spy', 'file.spi'],
|
||||
\ 'sql': ['file.tyb', 'file.typ', 'file.tyc', 'file.pkb', 'file.pks'],
|
||||
\ 'sqlj': ['file.sqlj'],
|
||||
\ 'sqr': ['file.sqr', 'file.sqi'],
|
||||
\ 'squid': ['squid.conf'],
|
||||
\ 'srec': ['file.s19', 'file.s28', 'file.s37', 'file.mot', 'file.srec'],
|
||||
\ 'sshconfig': ['ssh_config', '/.ssh/config'],
|
||||
\ 'sshdconfig': ['sshd_config'],
|
||||
\ 'st': ['file.st'],
|
||||
\ 'stata': ['file.ado', 'file.do', 'file.imata', 'file.mata'],
|
||||
\ 'stp': ['file.stp'],
|
||||
\ 'sudoers': ['any/etc/sudoers', 'sudoers.tmp'],
|
||||
\ 'svg': ['file.svg'],
|
||||
\ 'svn': ['svn-commitfile.tmp'],
|
||||
\ 'sysctl': ['/etc/sysctl.conf', '/etc/sysctl.d/file.conf'],
|
||||
\ 'systemd': ['any/systemd/file.automount', 'any/systemd/file.mount', 'any/systemd/file.path', 'any/systemd/file.service', 'any/systemd/file.socket', 'any/systemd/file.swap', 'any/systemd/file.target', 'any/systemd/file.timer'],
|
||||
\ 'systemverilog': ['file.sv', 'file.svh'],
|
||||
\ 'tags': ['tags'],
|
||||
\ 'tak': ['file.tak'],
|
||||
\ 'taskdata': ['pending.data', 'completed.data', 'undo.data'],
|
||||
\ 'taskedit': ['file.task'],
|
||||
\ 'tcl': ['file.tcl', 'file.tk', 'file.itcl', 'file.itk', 'file.jacl'],
|
||||
\ 'teraterm': ['file.ttl'],
|
||||
\ 'terminfo': ['file.ti'],
|
||||
\ 'tex': ['file.latex', 'file.sty', 'file.dtx', 'file.ltx', 'file.bbl'],
|
||||
\ 'texinfo': ['file.texinfo', 'file.texi', 'file.txi'],
|
||||
\ 'texmf': ['texmf.cnf'],
|
||||
\ 'text': ['file.text', 'README'],
|
||||
\ 'tf': ['file.tf', '.tfrc', 'tfrc'],
|
||||
\ 'tidy': ['.tidyrc', 'tidyrc'],
|
||||
\ 'tilde': ['file.t.html'],
|
||||
\ 'tli': ['file.tli'],
|
||||
\ 'tmux': ['tmuxfile.conf', '.tmuxfile.conf'],
|
||||
\ 'tpp': ['file.tpp'],
|
||||
\ 'treetop': ['file.treetop'],
|
||||
\ 'trustees': ['trustees.conf'],
|
||||
\ 'tsalt': ['file.slt'],
|
||||
\ 'tsscl': ['file.tsscl'],
|
||||
\ 'tssgm': ['file.tssgm'],
|
||||
\ 'tssop': ['file.tssop'],
|
||||
\ 'twig': ['file.twig'],
|
||||
\ 'uc': ['file.uc'],
|
||||
\ 'udevconf': ['/etc/udev/udev.conf'],
|
||||
\ 'udevperm': ['/etc/udev/permissions.d/file.permissions'],
|
||||
\ 'uil': ['file.uit', 'file.uil'],
|
||||
\ 'updatedb': ['/etc/updatedb.conf'],
|
||||
\ 'upstart': ['/usr/share/upstart/file.conf', '/usr/share/upstart/file.override', '/etc/init/file.conf', '/etc/init/file.override', '/.init/file.conf', '/.init/file.override', '/.config/upstart/file.conf', '/.config/upstart/file.override'],
|
||||
\ 'upstreamdat': ['upstream.dat', 'UPSTREAM.DAT', 'upstream.file.dat', 'UPSTREAM.FILE.DAT', 'file.upstream.dat', 'FILE.UPSTREAM.DAT'],
|
||||
\ 'upstreaminstalllog': ['upstreaminstall.log', 'UPSTREAMINSTALL.LOG', 'upstreaminstall.file.log', 'UPSTREAMINSTALL.FILE.LOG', 'file.upstreaminstall.log', 'FILE.UPSTREAMINSTALL.LOG'],
|
||||
\ 'upstreamlog': ['fdrupstream.log', 'upstream.log', 'UPSTREAM.LOG', 'upstream.file.log', 'UPSTREAM.FILE.LOG', 'file.upstream.log', 'FILE.UPSTREAM.LOG', 'UPSTREAM-file.log', 'UPSTREAM-FILE.LOG'],
|
||||
\ 'usserverlog': ['usserver.log', 'USSERVER.LOG', 'usserver.file.log', 'USSERVER.FILE.LOG', 'file.usserver.log', 'FILE.USSERVER.LOG'],
|
||||
\ 'usw2kagtlog': ['usw2kagt.log', 'USW2KAGT.LOG', 'usw2kagt.file.log', 'USW2KAGT.FILE.LOG', 'file.usw2kagt.log', 'FILE.USW2KAGT.LOG'],
|
||||
\ 'vb': ['file.sba', 'file.vb', 'file.vbs', 'file.dsm', 'file.ctl'],
|
||||
\ 'vera': ['file.vr', 'file.vri', 'file.vrh'],
|
||||
\ 'verilog': ['file.v'],
|
||||
\ 'verilogams': ['file.va', 'file.vams'],
|
||||
\ 'vgrindefs': ['vgrindefs'],
|
||||
\ 'vhdl': ['file.hdl', 'file.vhd', 'file.vhdl', 'file.vbe', 'file.vst'],
|
||||
\ 'vim': ['file.vim', 'file.vba', '.exrc', '_exrc'],
|
||||
\ 'viminfo': ['.viminfo', '_viminfo'],
|
||||
\ 'vmasm': ['file.mar'],
|
||||
\ 'voscm': ['file.cm'],
|
||||
\ 'vrml': ['file.wrl'],
|
||||
\ 'vroom': ['file.vroom'],
|
||||
\ 'webmacro': ['file.wm'],
|
||||
\ 'wget': ['.wgetrc', 'wgetrc'],
|
||||
\ 'winbatch': ['file.wbt'],
|
||||
\ 'wml': ['file.wml'],
|
||||
\ 'wsml': ['file.wsml'],
|
||||
\ 'wvdial': ['wvdial.conf', '.wvdialrc'],
|
||||
\ 'xdefaults': ['.Xdefaults', '.Xpdefaults', '.Xresources', 'xdm-config', 'file.ad'],
|
||||
\ 'xhtml': ['file.xhtml', 'file.xht'],
|
||||
\ 'xinetd': ['/etc/xinetd.conf'],
|
||||
\ 'xmath': ['file.msc', 'file.msf'],
|
||||
\ 'xml': ['/etc/blkid.tab', '/etc/blkid.tab.old', 'file.xmi', 'file.csproj', 'file.csproj.user', 'file.ts', 'file.ui', 'file.tpm', '/etc/xdg/menus/file.menu', 'fglrxrc', 'file.xlf', 'file.xliff', 'file.xul'],
|
||||
\ 'xmodmap': ['anyXmodmap'],
|
||||
\ 'xf86conf': ['xorg.conf', 'xorg.conf-4'],
|
||||
\ 'xpm2': ['file.xpm2'],
|
||||
\ 'xquery': ['file.xq', 'file.xql', 'file.xqm', 'file.xquery', 'file.xqy'],
|
||||
\ 'xs': ['file.xs'],
|
||||
\ 'xsd': ['file.xsd'],
|
||||
\ 'xslt': ['file.xsl', 'file.xslt'],
|
||||
\ 'yacc': ['file.yy', 'file.yxx', 'file.y++'],
|
||||
\ 'yaml': ['file.yaml', 'file.yml'],
|
||||
\ 'z8a': ['file.z8a'],
|
||||
\ 'zimbu': ['file.zu'],
|
||||
\ 'zimbutempl': ['file.zut'],
|
||||
\ 'zsh': ['.zprofile', '/etc/zprofile', '.zfbfmarks', 'file.zsh'],
|
||||
\
|
||||
\ 'aap': ['file.aap'],
|
||||
\ 'help': [$VIMRUNTIME . '/doc/help.txt'],
|
||||
\ 'xpm': ['file.xpm'],
|
||||
\ }
|
||||
|
||||
let s:filename_case_checks = {
|
||||
\ 'modula2': ['file.DEF', 'file.MOD'],
|
||||
\ }
|
||||
|
||||
func CheckItems(checks)
|
||||
for [ft, names] in items(a:checks)
|
||||
for i in range(0, len(names) - 1)
|
||||
new
|
||||
try
|
||||
exe 'edit ' . names[i]
|
||||
catch
|
||||
call assert_report('cannot edit "' . names[i] . '": ' . v:errmsg)
|
||||
endtry
|
||||
call assert_equal(ft, &filetype, 'with file name: ' . names[i])
|
||||
bwipe!
|
||||
endfor
|
||||
endfor
|
||||
endfunc
|
||||
|
||||
func Test_filetype_detection()
|
||||
filetype on
|
||||
call CheckItems(s:filename_checks)
|
||||
if has('fname_case')
|
||||
call CheckItems(s:filename_case_checks)
|
||||
endif
|
||||
filetype off
|
||||
endfunc
|
||||
|
||||
" Filetypes detected from the file contents by scripts.vim
|
||||
let s:script_checks = {
|
||||
\ 'virata': [['% Virata'],
|
||||
\ ['', '% Virata'],
|
||||
\ ['', '', '% Virata'],
|
||||
\ ['', '', '', '% Virata'],
|
||||
\ ['', '', '', '', '% Virata']],
|
||||
\ 'strace': [['execve("/usr/bin/pstree", ["pstree"], 0x7ff0 /* 63 vars */) = 0'],
|
||||
\ ['15:17:47 execve("/usr/bin/pstree", ["pstree"], ... "_=/usr/bin/strace"]) = 0'],
|
||||
\ ['__libc_start_main and something']],
|
||||
\ }
|
||||
|
||||
func Test_script_detection()
|
||||
filetype on
|
||||
for [ft, files] in items(s:script_checks)
|
||||
for file in files
|
||||
call writefile(file, 'Xtest')
|
||||
split Xtest
|
||||
call assert_equal(ft, &filetype, 'for text: ' . string(file))
|
||||
bwipe!
|
||||
endfor
|
||||
endfor
|
||||
call delete('Xtest')
|
||||
filetype off
|
||||
endfunc
|
||||
|
@ -50,6 +50,7 @@ endfunc
|
||||
" We don't check much of the contents.
|
||||
func Test_with_syntax()
|
||||
if has('postscript')
|
||||
edit test_hardcopy.vim
|
||||
set printoptions=syntax:y
|
||||
syn on
|
||||
hardcopy > Xhardcopy
|
||||
|
92
src/nvim/testdir/test_ins_complete.vim
Normal file
92
src/nvim/testdir/test_ins_complete.vim
Normal file
@ -0,0 +1,92 @@
|
||||
|
||||
" Test for insert expansion
|
||||
func Test_ins_complete()
|
||||
edit test_ins_complete.vim
|
||||
set ff=unix
|
||||
call writefile(["test11\t36Gepeto\t/Tag/",
|
||||
\ "asd\ttest11file\t36G",
|
||||
\ "Makefile\tto\trun"], 'Xtestfile')
|
||||
call writefile(['', 'start of testfile',
|
||||
\ 'ru',
|
||||
\ 'run1',
|
||||
\ 'run2',
|
||||
\ 'STARTTEST',
|
||||
\ 'ENDTEST',
|
||||
\ 'end of testfile'], 'Xtestdata')
|
||||
set ff&
|
||||
|
||||
enew!
|
||||
edit Xtestdata
|
||||
new
|
||||
call append(0, ['#include "Xtestfile"', ''])
|
||||
call cursor(2, 1)
|
||||
|
||||
set cot=
|
||||
set cpt=.,w
|
||||
" add-expands (word from next line) from other window
|
||||
exe "normal iru\<C-N>\<C-N>\<C-X>\<C-N>\<Esc>\<C-A>"
|
||||
call assert_equal('run1 run3', getline('.'))
|
||||
" add-expands (current buffer first)
|
||||
exe "normal o\<C-P>\<C-X>\<C-N>"
|
||||
call assert_equal('run3 run3', getline('.'))
|
||||
" Local expansion, ends in an empty line (unless it becomes a global
|
||||
" expansion)
|
||||
exe "normal o\<C-X>\<C-P>\<C-P>\<C-P>\<C-P>\<C-P>"
|
||||
call assert_equal('', getline('.'))
|
||||
" starts Local and switches to global add-expansion
|
||||
exe "normal o\<C-X>\<C-P>\<C-P>\<C-X>\<C-X>\<C-N>\<C-X>\<C-N>\<C-N>"
|
||||
call assert_equal('run1 run2', getline('.'))
|
||||
|
||||
set cpt=.,w,i
|
||||
" i-add-expands and switches to local
|
||||
exe "normal OM\<C-N>\<C-X>\<C-N>\<C-X>\<C-N>\<C-X>\<C-X>\<C-X>\<C-P>"
|
||||
call assert_equal("Makefile\tto\trun3", getline('.'))
|
||||
" add-expands lines (it would end in an empty line if it didn't ignored
|
||||
" itself)
|
||||
exe "normal o\<C-X>\<C-L>\<C-X>\<C-L>\<C-P>\<C-P>"
|
||||
call assert_equal("Makefile\tto\trun3", getline('.'))
|
||||
call assert_equal("Makefile\tto\trun3", getline(line('.') - 1))
|
||||
|
||||
set cpt=kXtestfile
|
||||
" checks k-expansion, and file expansion (use Xtest11 instead of test11,
|
||||
" because TEST11.OUT may match first on DOS)
|
||||
write Xtest11.one
|
||||
write Xtest11.two
|
||||
exe "normal o\<C-N>\<Esc>IX\<Esc>A\<C-X>\<C-F>\<C-N>"
|
||||
call assert_equal('Xtest11.two', getline('.'))
|
||||
|
||||
" use CTRL-X CTRL-F to complete Xtest11.one, remove it and then use CTRL-X
|
||||
" CTRL-F again to verify this doesn't cause trouble.
|
||||
exe "normal oXt\<C-X>\<C-F>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<BS>\<C-X>\<C-F>"
|
||||
call assert_equal('Xtest11.one', getline('.'))
|
||||
normal ddk
|
||||
|
||||
set cpt=w
|
||||
" checks make_cyclic in other window
|
||||
exe "normal oST\<C-N>\<C-P>\<C-P>\<C-P>\<C-P>"
|
||||
call assert_equal('STARTTEST', getline('.'))
|
||||
|
||||
set cpt=u nohid
|
||||
" checks unloaded buffer expansion
|
||||
only
|
||||
exe "normal oEN\<C-N>"
|
||||
call assert_equal('ENDTEST', getline('.'))
|
||||
" checks adding mode abortion
|
||||
exe "normal ounl\<C-N>\<C-X>\<C-X>\<C-P>"
|
||||
call assert_equal('unless', getline('.'))
|
||||
|
||||
set cpt=t,d def=^\\k* tags=Xtestfile notagbsearch
|
||||
" tag expansion, define add-expansion interrupted
|
||||
exe "normal o\<C-X>\<C-]>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>\<C-X>\<C-D>"
|
||||
call assert_equal('test11file 36Gepeto /Tag/ asd', getline('.'))
|
||||
" t-expansion
|
||||
exe "normal oa\<C-N>\<Esc>"
|
||||
call assert_equal('asd', getline('.'))
|
||||
|
||||
%bw!
|
||||
call delete('Xtestfile')
|
||||
call delete('Xtest11.one')
|
||||
call delete('Xtest11.two')
|
||||
call delete('Xtestdata')
|
||||
set cpt& cot& def& tags& tagbsearch& hidden&
|
||||
endfunc
|
27
src/nvim/testdir/test_let.vim
Normal file
27
src/nvim/testdir/test_let.vim
Normal file
@ -0,0 +1,27 @@
|
||||
" Tests for the :let command.
|
||||
|
||||
func Test_let()
|
||||
" Test to not autoload when assigning. It causes internal error.
|
||||
set runtimepath+=./sautest
|
||||
let Test104#numvar = function('tr')
|
||||
call assert_equal("function('tr')", string(Test104#numvar))
|
||||
|
||||
let a = 1
|
||||
let b = 2
|
||||
|
||||
let out = execute('let a b')
|
||||
let s = "\na #1\nb #2"
|
||||
call assert_equal(s, out)
|
||||
|
||||
let out = execute('let {0 == 1 ? "a" : "b"}')
|
||||
let s = "\nb #2"
|
||||
call assert_equal(s, out)
|
||||
|
||||
let out = execute('let {0 == 1 ? "a" : "b"} a')
|
||||
let s = "\nb #2\na #1"
|
||||
call assert_equal(s, out)
|
||||
|
||||
let out = execute('let a {0 == 1 ? "a" : "b"}')
|
||||
let s = "\na #1\nb #2"
|
||||
call assert_equal(s, out)
|
||||
endfunc
|
19
src/nvim/testdir/test_lineending.vim
Normal file
19
src/nvim/testdir/test_lineending.vim
Normal file
@ -0,0 +1,19 @@
|
||||
" Tests for saving/loading a file with some lines ending in
|
||||
" CTRL-M, some not
|
||||
func Test_lineending()
|
||||
let l = ["this line ends in a\<CR>",
|
||||
\ "this one doesn't",
|
||||
\ "this one does\<CR>",
|
||||
\ "and the last one doesn't"]
|
||||
set fileformat=dos
|
||||
enew!
|
||||
call append(0, l)
|
||||
$delete
|
||||
write Xfile1
|
||||
bwipe Xfile1
|
||||
edit Xfile1
|
||||
let t = getline(1, '$')
|
||||
call assert_equal(l, t)
|
||||
new | only
|
||||
call delete('Xfile1')
|
||||
endfunc
|
82
src/nvim/testdir/test_lispwords.vim
Normal file
82
src/nvim/testdir/test_lispwords.vim
Normal file
@ -0,0 +1,82 @@
|
||||
" Tests for 'lispwords' settings being global-local
|
||||
|
||||
set nocompatible viminfo+=nviminfo
|
||||
|
||||
func Test_global_local_lispwords()
|
||||
setglobal lispwords=foo,bar,baz
|
||||
setlocal lispwords-=foo | setlocal lispwords+=quux
|
||||
call assert_equal('foo,bar,baz', &g:lispwords)
|
||||
call assert_equal('bar,baz,quux', &l:lispwords)
|
||||
call assert_equal('bar,baz,quux', &lispwords)
|
||||
|
||||
setlocal lispwords<
|
||||
call assert_equal('foo,bar,baz', &g:lispwords)
|
||||
call assert_equal('foo,bar,baz', &l:lispwords)
|
||||
call assert_equal('foo,bar,baz', &lispwords)
|
||||
endfunc
|
||||
|
||||
func Test_lisp_indent()
|
||||
enew!
|
||||
|
||||
call append(0, [
|
||||
\ '(defun html-file (base)',
|
||||
\ '(format nil "~(~A~).html" base))',
|
||||
\ '',
|
||||
\ '(defmacro page (name title &rest body)',
|
||||
\ '(let ((ti (gensym)))',
|
||||
\ '`(with-open-file (*standard-output*',
|
||||
\ '(html-file ,name)',
|
||||
\ ':direction :output',
|
||||
\ ':if-exists :supersede)',
|
||||
\ '(let ((,ti ,title))',
|
||||
\ '(as title ,ti)',
|
||||
\ '(with center ',
|
||||
\ '(as h2 (string-upcase ,ti)))',
|
||||
\ '(brs 3)',
|
||||
\ ',@body))))',
|
||||
\ '',
|
||||
\ ';;; Utilities for generating links',
|
||||
\ '',
|
||||
\ '(defmacro with-link (dest &rest body)',
|
||||
\ '`(progn',
|
||||
\ '(format t "<a href=\"~A\">" (html-file ,dest))',
|
||||
\ ',@body',
|
||||
\ '(princ "</a>")))'
|
||||
\ ])
|
||||
set lisp
|
||||
set lispwords&
|
||||
let save_copt = &cpoptions
|
||||
set cpoptions+=p
|
||||
normal 1G=G
|
||||
|
||||
call assert_equal([
|
||||
\ '(defun html-file (base)',
|
||||
\ ' (format nil "~(~A~).html" base))',
|
||||
\ '',
|
||||
\ '(defmacro page (name title &rest body)',
|
||||
\ ' (let ((ti (gensym)))',
|
||||
\ ' `(with-open-file (*standard-output*',
|
||||
\ ' (html-file ,name)',
|
||||
\ ' :direction :output',
|
||||
\ ' :if-exists :supersede)',
|
||||
\ ' (let ((,ti ,title))',
|
||||
\ ' (as title ,ti)',
|
||||
\ ' (with center ',
|
||||
\ ' (as h2 (string-upcase ,ti)))',
|
||||
\ ' (brs 3)',
|
||||
\ ' ,@body))))',
|
||||
\ '',
|
||||
\ ';;; Utilities for generating links',
|
||||
\ '',
|
||||
\ '(defmacro with-link (dest &rest body)',
|
||||
\ ' `(progn',
|
||||
\ ' (format t "<a href=\"~A\">" (html-file ,dest))',
|
||||
\ ' ,@body',
|
||||
\ ' (princ "</a>")))',
|
||||
\ ''
|
||||
\ ], getline(1, "$"))
|
||||
|
||||
enew!
|
||||
let &cpoptions=save_copt
|
||||
set nolisp
|
||||
endfunc
|
@ -2,7 +2,6 @@
|
||||
|
||||
source shared.vim
|
||||
|
||||
set belloff=all
|
||||
func! Setup_NewWindow()
|
||||
10new
|
||||
call setline(1, range(1,100))
|
||||
|
@ -570,4 +570,41 @@ func Test_completion_clear_candidate_list()
|
||||
endfunc
|
||||
|
||||
|
||||
func Test_popup_and_preview_autocommand()
|
||||
" This used to crash Vim
|
||||
if !has('python')
|
||||
return
|
||||
endif
|
||||
let h = winheight(0)
|
||||
if h < 15
|
||||
return
|
||||
endif
|
||||
new
|
||||
augroup MyBufAdd
|
||||
au!
|
||||
au BufAdd * nested tab sball
|
||||
augroup END
|
||||
set omnifunc=pythoncomplete#Complete
|
||||
call setline(1, 'import os')
|
||||
" make the line long
|
||||
call setline(2, ' os.')
|
||||
$
|
||||
call feedkeys("A\<C-X>\<C-O>\<C-N>\<C-N>\<C-N>\<enter>\<esc>", 'tx')
|
||||
call assert_equal(["import os", " os.EX_IOERR", ''], getline(1,'$'))
|
||||
call assert_equal(1, winnr('$'))
|
||||
" previewwindow option is not set
|
||||
call assert_equal(0, &previewwindow)
|
||||
norm! gt
|
||||
call assert_equal(0, &previewwindow)
|
||||
norm! gT
|
||||
call assert_equal(12, tabpagenr('$'))
|
||||
tabonly
|
||||
pclose
|
||||
augroup MyBufAdd
|
||||
au!
|
||||
augroup END
|
||||
augroup! MyBufAdd
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -151,7 +151,7 @@ endfunc
|
||||
func XageTests(cchar)
|
||||
call s:setup_commands(a:cchar)
|
||||
|
||||
let list = [{'bufnr': 1, 'lnum': 1}]
|
||||
let list = [{'bufnr': bufnr('%'), 'lnum': 1}]
|
||||
call g:Xsetlist(list)
|
||||
|
||||
" Jumping to a non existent list should return error
|
||||
|
63
src/nvim/testdir/test_recover.vim
Normal file
63
src/nvim/testdir/test_recover.vim
Normal file
@ -0,0 +1,63 @@
|
||||
" Test :recover
|
||||
|
||||
func Test_recover_root_dir()
|
||||
" This used to access invalid memory.
|
||||
split Xtest
|
||||
set dir=/
|
||||
call assert_fails('recover', 'E305:')
|
||||
close!
|
||||
|
||||
if has('win32') || filewritable('/') == 2
|
||||
" can write in / directory on MS-Windows
|
||||
set dir=/notexist/
|
||||
endif
|
||||
call assert_fails('split Xtest', 'E303:')
|
||||
set dir&
|
||||
endfunc
|
||||
|
||||
" Inserts 10000 lines with text to fill the swap file with two levels of pointer
|
||||
" blocks. Then recovers from the swap file and checks all text is restored.
|
||||
"
|
||||
" We need about 10000 lines of 100 characters to get two levels of pointer
|
||||
" blocks.
|
||||
func Test_swap_file()
|
||||
set directory=.
|
||||
set fileformat=unix undolevels=-1
|
||||
edit! Xtest
|
||||
let text = "\tabcdefghijklmnoparstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnoparstuvwxyz0123456789"
|
||||
let i = 1
|
||||
let linecount = 10000
|
||||
while i <= linecount
|
||||
call append(i - 1, i . text)
|
||||
let i += 1
|
||||
endwhile
|
||||
$delete
|
||||
preserve
|
||||
" get the name of the swap file
|
||||
let swname = split(execute("swapname"))[0]
|
||||
let swname = substitute(swname, '[[:blank:][:cntrl:]]*\(.\{-}\)[[:blank:][:cntrl:]]*$', '\1', '')
|
||||
" make a copy of the swap file in Xswap
|
||||
set binary
|
||||
exe 'sp ' . swname
|
||||
w! Xswap
|
||||
set nobinary
|
||||
new
|
||||
only!
|
||||
bwipe! Xtest
|
||||
call rename('Xswap', swname)
|
||||
recover Xtest
|
||||
call delete(swname)
|
||||
let linedollar = line('$')
|
||||
call assert_equal(linecount, linedollar)
|
||||
if linedollar < linecount
|
||||
let linecount = linedollar
|
||||
endif
|
||||
let i = 1
|
||||
while i <= linecount
|
||||
call assert_equal(i . text, getline(i))
|
||||
let i += 1
|
||||
endwhile
|
||||
|
||||
set undolevels&
|
||||
enew! | only
|
||||
endfunc
|
32
src/nvim/testdir/test_scrollbind.vim
Normal file
32
src/nvim/testdir/test_scrollbind.vim
Normal file
@ -0,0 +1,32 @@
|
||||
" Test for 'scrollbind' causing an unexpected scroll of one of the windows.
|
||||
func Test_scrollbind()
|
||||
" We don't want the status line to cause problems:
|
||||
set laststatus=0
|
||||
let totalLines = &lines * 20
|
||||
let middle = totalLines / 2
|
||||
new | only
|
||||
for i in range(1, totalLines)
|
||||
call setline(i, 'LINE ' . i)
|
||||
endfor
|
||||
exe string(middle)
|
||||
normal zt
|
||||
normal M
|
||||
aboveleft vert new
|
||||
for i in range(1, totalLines)
|
||||
call setline(i, 'line ' . i)
|
||||
endfor
|
||||
exe string(middle)
|
||||
normal zt
|
||||
normal M
|
||||
" Execute the following two commands at once to reproduce the problem.
|
||||
setl scb | wincmd p
|
||||
setl scb
|
||||
wincmd w
|
||||
let topLineLeft = line('w0')
|
||||
wincmd p
|
||||
let topLineRight = line('w0')
|
||||
setl noscrollbind
|
||||
wincmd p
|
||||
setl noscrollbind
|
||||
call assert_equal(0, topLineLeft - topLineRight)
|
||||
endfunc
|
@ -1,15 +1,14 @@
|
||||
" Test for the search command
|
||||
|
||||
set belloff=all
|
||||
func Test_search_cmdline()
|
||||
" See test/functional/legacy/search_spec.lua
|
||||
throw 'skipped: Nvim does not support test_disable_char_avail()'
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
if !exists('+incsearch')
|
||||
return
|
||||
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
|
||||
@ -196,19 +195,19 @@ 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
|
||||
|
||||
func Test_search_cmdline2()
|
||||
" See test/functional/legacy/search_spec.lua
|
||||
throw 'skipped: Nvim does not support test_disable_char_avail()'
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
if !exists('+incsearch')
|
||||
return
|
||||
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
|
||||
@ -270,7 +269,7 @@ func Test_search_cmdline2()
|
||||
|
||||
" clean up
|
||||
set noincsearch
|
||||
call test_disable_char_avail(0)
|
||||
call test_override("char_avail", 0)
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
@ -306,3 +305,136 @@ func Test_searchc()
|
||||
exe "norm 0t\u93cf"
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
func Test_search_cmdline3()
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
if !exists('+incsearch')
|
||||
return
|
||||
endif
|
||||
" need to disable char_avail,
|
||||
" so that expansion of commandline works
|
||||
call test_override("char_avail", 1)
|
||||
new
|
||||
call setline(1, [' 1', ' 2 the~e', ' 3 the theother'])
|
||||
set incsearch
|
||||
1
|
||||
" first match
|
||||
call feedkeys("/the\<c-l>\<cr>", 'tx')
|
||||
call assert_equal(' 2 the~e', getline('.'))
|
||||
" clean up
|
||||
set noincsearch
|
||||
call test_override("char_avail", 0)
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
func Test_search_cmdline4()
|
||||
" See test/functional/legacy/search_spec.lua
|
||||
throw 'skipped: Nvim does not support test_override()'
|
||||
if !exists('+incsearch')
|
||||
return
|
||||
endif
|
||||
" need to disable char_avail,
|
||||
" so that expansion of commandline works
|
||||
call test_override("char_avail", 1)
|
||||
new
|
||||
call setline(1, [' 1 the first', ' 2 the second', ' 3 the third'])
|
||||
set incsearch
|
||||
$
|
||||
call feedkeys("?the\<c-g>\<cr>", 'tx')
|
||||
call assert_equal(' 3 the third', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-g>\<c-g>\<cr>", 'tx')
|
||||
call assert_equal(' 1 the first', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-g>\<c-g>\<c-g>\<cr>", 'tx')
|
||||
call assert_equal(' 2 the second', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-t>\<cr>", 'tx')
|
||||
call assert_equal(' 1 the first', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-t>\<c-t>\<cr>", 'tx')
|
||||
call assert_equal(' 3 the third', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
|
||||
call assert_equal(' 2 the second', getline('.'))
|
||||
" clean up
|
||||
set noincsearch
|
||||
call test_override("char_avail", 0)
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
func Test_search_cmdline5()
|
||||
if !exists('+incsearch')
|
||||
return
|
||||
endif
|
||||
" Do not call test_override("char_avail", 1) so that <C-g> and <C-t> work
|
||||
" regardless char_avail.
|
||||
new
|
||||
call setline(1, [' 1 the first', ' 2 the second', ' 3 the third'])
|
||||
set incsearch
|
||||
1
|
||||
call feedkeys("/the\<c-g>\<c-g>\<cr>", 'tx')
|
||||
call assert_equal(' 3 the third', getline('.'))
|
||||
$
|
||||
call feedkeys("?the\<c-t>\<c-t>\<c-t>\<cr>", 'tx')
|
||||
call assert_equal(' 2 the second', getline('.'))
|
||||
" clean up
|
||||
set noincsearch
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" Tests for regexp with various magic settings
|
||||
func Test_search_regexp()
|
||||
enew!
|
||||
|
||||
put ='1 a aa abb abbccc'
|
||||
exe 'normal! /a*b\{2}c\+/e' . "\<CR>"
|
||||
call assert_equal([0, 2, 17, 0], getpos('.'))
|
||||
|
||||
put ='2 d dd dee deefff'
|
||||
exe 'normal! /\Md\*e\{2}f\+/e' . "\<CR>"
|
||||
call assert_equal([0, 3, 17, 0], getpos('.'))
|
||||
|
||||
set nomagic
|
||||
put ='3 g gg ghh ghhiii'
|
||||
exe 'normal! /g\*h\{2}i\+/e' . "\<CR>"
|
||||
call assert_equal([0, 4, 17, 0], getpos('.'))
|
||||
|
||||
put ='4 j jj jkk jkklll'
|
||||
exe 'normal! /\mj*k\{2}l\+/e' . "\<CR>"
|
||||
call assert_equal([0, 5, 17, 0], getpos('.'))
|
||||
|
||||
put ='5 m mm mnn mnnooo'
|
||||
exe 'normal! /\vm*n{2}o+/e' . "\<CR>"
|
||||
call assert_equal([0, 6, 17, 0], getpos('.'))
|
||||
|
||||
put ='6 x ^aa$ x'
|
||||
exe 'normal! /\V^aa$' . "\<CR>"
|
||||
call assert_equal([0, 7, 5, 0], getpos('.'))
|
||||
|
||||
set magic
|
||||
put ='7 (a)(b) abbaa'
|
||||
exe 'normal! /\v(a)(b)\2\1\1/e' . "\<CR>"
|
||||
call assert_equal([0, 8, 14, 0], getpos('.'))
|
||||
|
||||
put ='8 axx [ab]xx'
|
||||
exe 'normal! /\V[ab]\(\[xy]\)\1' . "\<CR>"
|
||||
call assert_equal([0, 9, 7, 0], getpos('.'))
|
||||
|
||||
set undolevels=100
|
||||
put ='9 foobar'
|
||||
put =''
|
||||
exe "normal! a\<C-G>u\<Esc>"
|
||||
normal G
|
||||
exe 'normal! dv?bar?' . "\<CR>"
|
||||
call assert_equal('9 foo', getline('.'))
|
||||
call assert_equal([0, 10, 5, 0], getpos('.'))
|
||||
call assert_equal(10, line('$'))
|
||||
normal u
|
||||
call assert_equal('9 foobar', getline('.'))
|
||||
call assert_equal([0, 10, 6, 0], getpos('.'))
|
||||
call assert_equal(11, line('$'))
|
||||
|
||||
set undolevels&
|
||||
enew!
|
||||
endfunc
|
||||
|
@ -182,7 +182,7 @@ func Test_sign_invalid_commands()
|
||||
call assert_fails('sign define Sign1 xxx', 'E475:')
|
||||
call assert_fails('sign undefine', 'E156:')
|
||||
call assert_fails('sign list xxx', 'E155:')
|
||||
call assert_fails('sign place 1 buffer=', 'E158:')
|
||||
call assert_fails('sign place 1 buffer=999', 'E158:')
|
||||
call assert_fails('sign define Sign2 text=', 'E239:')
|
||||
endfunc
|
||||
|
||||
|
@ -31,3 +31,33 @@ func Test_source_latin()
|
||||
bwipe!
|
||||
call delete('Xscript')
|
||||
endfunc
|
||||
|
||||
" Test for sourcing a file with CTRL-V's at the end of the line
|
||||
func Test_source_ctrl_v()
|
||||
call writefile(['map __1 afirst',
|
||||
\ 'map __2 asecond',
|
||||
\ 'map __3 athird',
|
||||
\ 'map __4 afourth',
|
||||
\ 'map __5 afifth',
|
||||
\ "map __1 asd\<C-V>",
|
||||
\ "map __2 asd\<C-V>\<C-V>",
|
||||
\ "map __3 asd\<C-V>\<C-V>",
|
||||
\ "map __4 asd\<C-V>\<C-V>\<C-V>",
|
||||
\ "map __5 asd\<C-V>\<C-V>\<C-V>",
|
||||
\ ], 'Xtestfile')
|
||||
source Xtestfile
|
||||
enew!
|
||||
exe "normal __1\<Esc>\<Esc>__2\<Esc>__3\<Esc>\<Esc>__4\<Esc>__5\<Esc>"
|
||||
exe "%s/\<C-J>/0/g"
|
||||
call assert_equal(['sd',
|
||||
\ "map __2 asd\<Esc>secondsd\<Esc>sd0map __5 asd0fifth"],
|
||||
\ getline(1, 2))
|
||||
|
||||
enew!
|
||||
call delete('Xtestfile')
|
||||
unmap __1
|
||||
unmap __2
|
||||
unmap __3
|
||||
unmap __4
|
||||
unmap __5
|
||||
endfunc
|
||||
|
@ -114,3 +114,210 @@ func Test_substitute_repeat()
|
||||
call feedkeys("Qsc\<CR>y", 'tx')
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" Tests for *sub-replace-special* and *sub-replace-expression* on :substitute.
|
||||
|
||||
" Execute a list of :substitute command tests
|
||||
func Run_SubCmd_Tests(tests)
|
||||
enew!
|
||||
for t in a:tests
|
||||
let start = line('.') + 1
|
||||
let end = start + len(t[2]) - 1
|
||||
exe "normal o" . t[0]
|
||||
call cursor(start, 1)
|
||||
exe t[1]
|
||||
call assert_equal(t[2], getline(start, end), t[1])
|
||||
endfor
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
func Test_sub_cmd_1()
|
||||
set magic
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [['A', 's/A/&&/', ['AA']],
|
||||
\ ['B', 's/B/\&/', ['&']],
|
||||
\ ['C123456789', 's/C\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\0\9\8\7\6\5\4\3\2\1/', ['C123456789987654321']],
|
||||
\ ['D', 's/D/d/', ['d']],
|
||||
\ ['E', 's/E/~/', ['d']],
|
||||
\ ['F', 's/F/\~/', ['~']],
|
||||
\ ['G', 's/G/\ugg/', ['Gg']],
|
||||
\ ['H', 's/H/\Uh\Eh/', ['Hh']],
|
||||
\ ['I', 's/I/\lII/', ['iI']],
|
||||
\ ['J', 's/J/\LJ\EJ/', ['jJ']],
|
||||
\ ['K', 's/K/\Uk\ek/', ['Kk']],
|
||||
\ ['lLl', "s/L/\<C-V>\<C-M>/", ["l\<C-V>", 'l']],
|
||||
\ ['mMm', 's/M/\r/', ['m', 'm']],
|
||||
\ ['nNn', "s/N/\\\<C-V>\<C-M>/", ["n\<C-V>", 'n']],
|
||||
\ ['oOo', 's/O/\n/', ["o\no"]],
|
||||
\ ['pPp', 's/P/\b/', ["p\<C-H>p"]],
|
||||
\ ['qQq', 's/Q/\t/', ["q\tq"]],
|
||||
\ ['rRr', 's/R/\\/', ['r\r']],
|
||||
\ ['sSs', 's/S/\c/', ['scs']],
|
||||
\ ['tTt', "s/T/\<C-V>\<C-J>/", ["t\<C-V>\<C-J>t"]],
|
||||
\ ['U', 's/U/\L\uuUu\l\EU/', ['UuuU']],
|
||||
\ ['V', 's/V/\U\lVvV\u\Ev/', ['vVVv']]
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
endfunc
|
||||
|
||||
func Test_sub_cmd_2()
|
||||
set nomagic
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [['A', 's/A/&&/', ['&&']],
|
||||
\ ['B', 's/B/\&/', ['B']],
|
||||
\ ['C123456789', 's/\mC\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\0\9\8\7\6\5\4\3\2\1/', ['C123456789987654321']],
|
||||
\ ['D', 's/D/d/', ['d']],
|
||||
\ ['E', 's/E/~/', ['~']],
|
||||
\ ['F', 's/F/\~/', ['~']],
|
||||
\ ['G', 's/G/\ugg/', ['Gg']],
|
||||
\ ['H', 's/H/\Uh\Eh/', ['Hh']],
|
||||
\ ['I', 's/I/\lII/', ['iI']],
|
||||
\ ['J', 's/J/\LJ\EJ/', ['jJ']],
|
||||
\ ['K', 's/K/\Uk\ek/', ['Kk']],
|
||||
\ ['lLl', "s/L/\<C-V>\<C-M>/", ["l\<C-V>", 'l']],
|
||||
\ ['mMm', 's/M/\r/', ['m', 'm']],
|
||||
\ ['nNn', "s/N/\\\<C-V>\<C-M>/", ["n\<C-V>", 'n']],
|
||||
\ ['oOo', 's/O/\n/', ["o\no"]],
|
||||
\ ['pPp', 's/P/\b/', ["p\<C-H>p"]],
|
||||
\ ['qQq', 's/Q/\t/', ["q\tq"]],
|
||||
\ ['rRr', 's/R/\\/', ['r\r']],
|
||||
\ ['sSs', 's/S/\c/', ['scs']],
|
||||
\ ['tTt', "s/T/\<C-V>\<C-J>/", ["t\<C-V>\<C-J>t"]],
|
||||
\ ['U', 's/U/\L\uuUu\l\EU/', ['UuuU']],
|
||||
\ ['V', 's/V/\U\lVvV\u\Ev/', ['vVVv']]
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
endfunc
|
||||
|
||||
func Test_sub_cmd_3()
|
||||
set nomagic
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [['aAa', "s/A/\\='\\'/", ['a\a']],
|
||||
\ ['bBb', "s/B/\\='\\\\'/", ['b\\b']],
|
||||
\ ['cCc', "s/C/\\='\<C-V>\<C-M>'/", ["c\<C-V>", 'c']],
|
||||
\ ['dDd', "s/D/\\='\\\<C-V>\<C-M>'/", ["d\\\<C-V>", 'd']],
|
||||
\ ['eEe', "s/E/\\='\\\\\<C-V>\<C-M>'/", ["e\\\\\<C-V>", 'e']],
|
||||
\ ['fFf', "s/F/\\='\r'/", ['f', 'f']],
|
||||
\ ['gGg', "s/G/\\='\<C-V>\<C-J>'/", ["g\<C-V>", 'g']],
|
||||
\ ['hHh', "s/H/\\='\\\<C-V>\<C-J>'/", ["h\\\<C-V>", 'h']],
|
||||
\ ['iIi', "s/I/\\='\\\\\<C-V>\<C-J>'/", ["i\\\\\<C-V>", 'i']],
|
||||
\ ['jJj', "s/J/\\='\n'/", ['j', 'j']],
|
||||
\ ['kKk', 's/K/\="\r"/', ['k', 'k']],
|
||||
\ ['lLl', 's/L/\="\n"/', ['l', 'l']]
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
endfunc
|
||||
|
||||
" Test for submatch() on :substitue.
|
||||
func Test_sub_cmd_4()
|
||||
set magic&
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [ ['aAa', "s/A/\\=substitute(submatch(0), '.', '\\', '')/",
|
||||
\ ['a\a']],
|
||||
\ ['bBb', "s/B/\\=substitute(submatch(0), '.', '\\', '')/",
|
||||
\ ['b\b']],
|
||||
\ ['cCc', "s/C/\\=substitute(submatch(0), '.', '\<C-V>\<C-M>', '')/",
|
||||
\ ["c\<C-V>", 'c']],
|
||||
\ ['dDd', "s/D/\\=substitute(submatch(0), '.', '\\\<C-V>\<C-M>', '')/",
|
||||
\ ["d\<C-V>", 'd']],
|
||||
\ ['eEe', "s/E/\\=substitute(submatch(0), '.', '\\\\\<C-V>\<C-M>', '')/",
|
||||
\ ["e\\\<C-V>", 'e']],
|
||||
\ ['fFf', "s/F/\\=substitute(submatch(0), '.', '\\r', '')/",
|
||||
\ ['f', 'f']],
|
||||
\ ['gGg', 's/G/\=substitute(submatch(0), ".", "\<C-V>\<C-J>", "")/',
|
||||
\ ["g\<C-V>", 'g']],
|
||||
\ ['hHh', 's/H/\=substitute(submatch(0), ".", "\\\<C-V>\<C-J>", "")/',
|
||||
\ ["h\<C-V>", 'h']],
|
||||
\ ['iIi', 's/I/\=substitute(submatch(0), ".", "\\\\\<C-V>\<C-J>", "")/',
|
||||
\ ["i\\\<C-V>", 'i']],
|
||||
\ ['jJj', "s/J/\\=substitute(submatch(0), '.', '\\n', '')/",
|
||||
\ ['j', 'j']],
|
||||
\ ['kKk', "s/K/\\=substitute(submatch(0), '.', '\\r', '')/",
|
||||
\ ['k', 'k']],
|
||||
\ ['lLl', "s/L/\\=substitute(submatch(0), '.', '\\n', '')/",
|
||||
\ ['l', 'l']],
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
endfunc
|
||||
|
||||
func Test_sub_cmd_5()
|
||||
set magic&
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [ ['A123456789', 's/A\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\=submatch(0) . submatch(9) . submatch(8) . submatch(7) . submatch(6) . submatch(5) . submatch(4) . submatch(3) . submatch(2) . submatch(1)/', ['A123456789987654321']],
|
||||
\ ['B123456789', 's/B\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\=string([submatch(0, 1), submatch(9, 1), submatch(8, 1), submatch(7, 1), submatch(6, 1), submatch(5, 1), submatch(4, 1), submatch(3, 1), submatch(2, 1), submatch(1, 1)])/', ["[['B123456789'], ['9'], ['8'], ['7'], ['6'], ['5'], ['4'], ['3'], ['2'], ['1']]"]],
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
endfunc
|
||||
|
||||
" Test for *:s%* on :substitute.
|
||||
func Test_sub_cmd_6()
|
||||
throw "skipped: Nvim removed POSIX-related 'cpoptions' flags"
|
||||
set magic&
|
||||
set cpo+=/
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [ ['A', 's/A/a/', ['a']],
|
||||
\ ['B', 's/B/%/', ['a']],
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
|
||||
set cpo-=/
|
||||
let tests = [ ['C', 's/C/c/', ['c']],
|
||||
\ ['D', 's/D/%/', ['%']],
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
|
||||
set cpo&
|
||||
endfunc
|
||||
|
||||
" Test for :s replacing \n with line break.
|
||||
func Test_sub_cmd_7()
|
||||
set magic&
|
||||
set cpo&
|
||||
|
||||
" List entry format: [input, cmd, output]
|
||||
let tests = [ ["A\<C-V>\<C-M>A", 's/A./\=submatch(0)/', ['A', 'A']],
|
||||
\ ["B\<C-V>\<C-J>B", 's/B./\=submatch(0)/', ['B', 'B']],
|
||||
\ ["C\<C-V>\<C-J>C", 's/C./\=strtrans(string(submatch(0, 1)))/', [strtrans("['C\<C-J>']C")]],
|
||||
\ ["D\<C-V>\<C-J>\nD", 's/D.\nD/\=strtrans(string(submatch(0, 1)))/', [strtrans("['D\<C-J>', 'D']")]],
|
||||
\ ["E\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>\n\<C-V>\<C-J>E", 's/E\_.\{-}E/\=strtrans(string(submatch(0, 1)))/', [strtrans("['E\<C-J>', '\<C-J>', '\<C-J>', '\<C-J>', '\<C-J>E']")]],
|
||||
\ ]
|
||||
call Run_SubCmd_Tests(tests)
|
||||
|
||||
exe "normal oQ\nQ\<Esc>k"
|
||||
call assert_fails('s/Q[^\n]Q/\=submatch(0)."foobar"/', 'E486')
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
func TitleString()
|
||||
let check = 'foo' =~ 'bar'
|
||||
return ""
|
||||
endfunc
|
||||
|
||||
func Test_sub_cmd_8()
|
||||
set titlestring=%{TitleString()}
|
||||
|
||||
enew!
|
||||
call append(0, ['', 'test_one', 'test_two'])
|
||||
call cursor(1,1)
|
||||
/^test_one/s/.*/\="foo\nbar"/
|
||||
call assert_equal('foo', getline(2))
|
||||
call assert_equal('bar', getline(3))
|
||||
call feedkeys(':/^test_two/s/.*/\="foo\nbar"/c', "t")
|
||||
call feedkeys("\<CR>y", "xt")
|
||||
call assert_equal('foo', getline(4))
|
||||
call assert_equal('bar', getline(5))
|
||||
|
||||
enew!
|
||||
set titlestring&
|
||||
endfunc
|
||||
|
45
src/nvim/testdir/test_tab.vim
Normal file
45
src/nvim/testdir/test_tab.vim
Normal file
@ -0,0 +1,45 @@
|
||||
|
||||
" Tests for "r<Tab>" with 'smarttab' and 'expandtab' set/not set.
|
||||
" Also test that dv_ works correctly
|
||||
func Test_smarttab()
|
||||
enew!
|
||||
set smarttab expandtab ts=8 sw=4
|
||||
" make sure that backspace works, no matter what termcap is used
|
||||
exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
|
||||
call append(0, ['start text',
|
||||
\ "\t\tsome test text",
|
||||
\ 'test text',
|
||||
\ "\t\tother test text",
|
||||
\ ' a cde',
|
||||
\ ' f ghi',
|
||||
\ 'test text',
|
||||
\ ' Second line beginning with whitespace'
|
||||
\ ])
|
||||
call cursor(1, 1)
|
||||
exe "normal /some\<CR>"
|
||||
exe "normal r\t"
|
||||
call assert_equal("\t\t ome test text", getline('.'))
|
||||
set noexpandtab
|
||||
exe "normal /other\<CR>"
|
||||
exe "normal r\t"
|
||||
call assert_equal("\t\t ther test text", getline('.'))
|
||||
|
||||
" Test replacing with Tabs and then backspacing to undo it
|
||||
exe "normal j0wR\t\t\t\<BS>\<BS>\<BS>"
|
||||
call assert_equal(" a cde", getline('.'))
|
||||
" Test replacing with Tabs
|
||||
exe "normal j0wR\t\t\t"
|
||||
call assert_equal(" \t\thi", getline('.'))
|
||||
|
||||
" Test that copyindent works with expandtab set
|
||||
set expandtab smartindent copyindent ts=8 sw=8 sts=8
|
||||
exe "normal jo{\<CR>x"
|
||||
call assert_equal('{', getline(line('.') - 1))
|
||||
call assert_equal(' x', getline('.'))
|
||||
set nosol
|
||||
exe "normal /Second line/\<CR>"
|
||||
exe "normal fwdv_"
|
||||
call assert_equal(' with whitespace', getline('.'))
|
||||
enew!
|
||||
set expandtab& smartindent& copyindent& ts& sw& sts&
|
||||
endfunc
|
@ -473,5 +473,24 @@ func Test_tabnext_on_buf_unload2()
|
||||
endwhile
|
||||
endfunc
|
||||
|
||||
func Test_close_on_quitpre()
|
||||
" This once caused a crash
|
||||
edit Xtest
|
||||
new
|
||||
only
|
||||
set bufhidden=delete
|
||||
au QuitPre <buffer> close
|
||||
tabnew tab1
|
||||
tabnew tab2
|
||||
1tabn
|
||||
q!
|
||||
call assert_equal(1, tabpagenr())
|
||||
call assert_equal(2, tabpagenr('$'))
|
||||
" clean up
|
||||
while tabpagenr('$') > 1
|
||||
bwipe!
|
||||
endwhile
|
||||
buf Xtest
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -95,4 +95,41 @@ function Test_keyword_jump()
|
||||
call delete('Xinclude')
|
||||
endfunction
|
||||
|
||||
" Test for jumping to a tag with 'hidden' set, with symbolic link in path of
|
||||
" tag. This only works for Unix, because of the symbolic link.
|
||||
func Test_tag_symbolic()
|
||||
if !has('unix')
|
||||
return
|
||||
endif
|
||||
set hidden
|
||||
call delete("Xtest.dir", "rf")
|
||||
call system("ln -s . Xtest.dir")
|
||||
" Create a tags file with the current directory name inserted.
|
||||
call writefile([
|
||||
\ "SECTION_OFF " . getcwd() . "/Xtest.dir/Xtest.c /^#define SECTION_OFF 3$/",
|
||||
\ '',
|
||||
\ ], 'Xtags')
|
||||
call writefile(['#define SECTION_OFF 3',
|
||||
\ '#define NUM_SECTIONS 3'], 'Xtest.c')
|
||||
|
||||
" Try jumping to a tag, but with a path that contains a symbolic link. When
|
||||
" wrong, this will give the ATTENTION message. The next space will then be
|
||||
" eaten by hit-return, instead of moving the cursor to 'd'.
|
||||
set tags=Xtags
|
||||
enew!
|
||||
call append(0, 'SECTION_OFF')
|
||||
call cursor(1,1)
|
||||
exe "normal \<C-]> "
|
||||
call assert_equal('Xtest.c', expand('%:t'))
|
||||
call assert_equal(2, col('.'))
|
||||
|
||||
set hidden&
|
||||
set tags&
|
||||
enew!
|
||||
call delete('Xtags')
|
||||
call delete('Xtest.c')
|
||||
call delete("Xtest.dir", "rf")
|
||||
%bwipe!
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -4,8 +4,7 @@ if !has('textobjects')
|
||||
finish
|
||||
endif
|
||||
|
||||
set belloff=all
|
||||
function! CpoM(line, useM, expected)
|
||||
func CpoM(line, useM, expected)
|
||||
new
|
||||
|
||||
if a:useM
|
||||
@ -29,16 +28,127 @@ function! CpoM(line, useM, expected)
|
||||
call assert_equal(getreg('"'), a:expected[2])
|
||||
|
||||
q!
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
function! Test_inner_block_without_cpo_M()
|
||||
func Test_inner_block_without_cpo_M()
|
||||
call CpoM('(red \(blue) green)', 0, ['red \(blue', 'red \(blue', ''])
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
function! Test_inner_block_with_cpo_M_left_backslash()
|
||||
func Test_inner_block_with_cpo_M_left_backslash()
|
||||
call CpoM('(red \(blue) green)', 1, ['red \(blue) green', 'blue', 'red \(blue) green'])
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
function! Test_inner_block_with_cpo_M_right_backslash()
|
||||
func Test_inner_block_with_cpo_M_right_backslash()
|
||||
call CpoM('(red (blue\) green)', 1, ['red (blue\) green', 'blue\', 'red (blue\) green'])
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
func Test_quote_selection_selection_exclusive()
|
||||
new
|
||||
call setline(1, "a 'bcde' f")
|
||||
set selection=exclusive
|
||||
exe "norm! fdvhi'y"
|
||||
call assert_equal('bcde', @")
|
||||
set selection&vim
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
" Tests for string and html text objects
|
||||
func Test_string_html_objects()
|
||||
enew!
|
||||
|
||||
let t = '"wo\"rd\\" foo'
|
||||
put =t
|
||||
normal! da"
|
||||
call assert_equal('foo', getline('.'))
|
||||
|
||||
let t = "'foo' 'bar' 'piep'"
|
||||
put =t
|
||||
normal! 0va'a'rx
|
||||
call assert_equal("xxxxxxxxxxxx'piep'", getline('.'))
|
||||
|
||||
let t = "bla bla `quote` blah"
|
||||
put =t
|
||||
normal! 02f`da`
|
||||
call assert_equal("bla bla blah", getline('.'))
|
||||
|
||||
let t = 'out " in "noXno"'
|
||||
put =t
|
||||
normal! 0fXdi"
|
||||
call assert_equal('out " in ""', getline('.'))
|
||||
|
||||
let t = "\"'\" 'blah' rep 'buh'"
|
||||
put =t
|
||||
normal! 03f'vi'ry
|
||||
call assert_equal("\"'\" 'blah'yyyyy'buh'", getline('.'))
|
||||
|
||||
set quoteescape=+*-
|
||||
let t = "bla `s*`d-`+++`l**` b`la"
|
||||
put =t
|
||||
normal! di`
|
||||
call assert_equal("bla `` b`la", getline('.'))
|
||||
|
||||
let t = 'voo "nah" sdf " asdf" sdf " sdf" sd'
|
||||
put =t
|
||||
normal! $F"va"oha"i"rz
|
||||
call assert_equal('voo "zzzzzzzzzzzzzzzzzzzzzzzzzzzzsd', getline('.'))
|
||||
|
||||
let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
|
||||
put =t
|
||||
normal! fXdit
|
||||
call assert_equal('-<b>asdf<i></i>asdf</b>-', getline('.'))
|
||||
|
||||
let t = "-<b>asdX<i>a<i />sdf</i>asdf</b>-"
|
||||
put =t
|
||||
normal! 0fXdit
|
||||
call assert_equal('-<b></b>-', getline('.'))
|
||||
|
||||
let t = "-<b>asdf<i>Xasdf</i>asdf</b>-"
|
||||
put =t
|
||||
normal! fXdat
|
||||
call assert_equal('-<b>asdfasdf</b>-', getline('.'))
|
||||
|
||||
let t = "-<b>asdX<i>as<b />df</i>asdf</b>-"
|
||||
put =t
|
||||
normal! 0fXdat
|
||||
call assert_equal('--', getline('.'))
|
||||
|
||||
let t = "-<b>\ninnertext object\n</b>"
|
||||
put =t
|
||||
normal! dit
|
||||
call assert_equal('-<b></b>', getline('.'))
|
||||
|
||||
set quoteescape&
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
" Tests for match() and matchstr()
|
||||
func Test_match()
|
||||
call assert_equal("b", matchstr("abcd", ".", 0, 2))
|
||||
call assert_equal("bc", matchstr("abcd", "..", 0, 2))
|
||||
call assert_equal("c", matchstr("abcd", ".", 2, 0))
|
||||
call assert_equal("a", matchstr("abcd", ".", 0, -1))
|
||||
call assert_equal(-1, match("abcd", ".", 0, 5))
|
||||
call assert_equal(0 , match("abcd", ".", 0, -1))
|
||||
call assert_equal(0 , match('abc', '.', 0, 1))
|
||||
call assert_equal(1 , match('abc', '.', 0, 2))
|
||||
call assert_equal(2 , match('abc', '.', 0, 3))
|
||||
call assert_equal(-1, match('abc', '.', 0, 4))
|
||||
call assert_equal(1 , match('abc', '.', 1, 1))
|
||||
call assert_equal(2 , match('abc', '.', 2, 1))
|
||||
call assert_equal(-1, match('abc', '.', 3, 1))
|
||||
call assert_equal(3 , match('abc', '$', 0, 1))
|
||||
call assert_equal(-1, match('abc', '$', 0, 2))
|
||||
call assert_equal(3 , match('abc', '$', 1, 1))
|
||||
call assert_equal(3 , match('abc', '$', 2, 1))
|
||||
call assert_equal(3 , match('abc', '$', 3, 1))
|
||||
call assert_equal(-1, match('abc', '$', 4, 1))
|
||||
call assert_equal(0 , match('abc', '\zs', 0, 1))
|
||||
call assert_equal(1 , match('abc', '\zs', 0, 2))
|
||||
call assert_equal(2 , match('abc', '\zs', 0, 3))
|
||||
call assert_equal(3 , match('abc', '\zs', 0, 4))
|
||||
call assert_equal(-1, match('abc', '\zs', 0, 5))
|
||||
call assert_equal(1 , match('abc', '\zs', 1, 1))
|
||||
call assert_equal(2 , match('abc', '\zs', 2, 1))
|
||||
call assert_equal(3 , match('abc', '\zs', 3, 1))
|
||||
call assert_equal(-1, match('abc', '\zs', 4, 1))
|
||||
endfunc
|
||||
|
@ -3,7 +3,6 @@
|
||||
" undo-able pieces. Do that by setting 'undolevels'.
|
||||
" Also tests :earlier and :later.
|
||||
|
||||
set belloff=all
|
||||
func Test_undotree()
|
||||
exe "normal Aabc\<Esc>"
|
||||
set ul=100
|
||||
@ -266,3 +265,26 @@ func Test_undofile_earlier()
|
||||
call delete('Xfile')
|
||||
call delete('Xundofile')
|
||||
endfunc
|
||||
|
||||
" Test for undo working properly when executing commands from a register.
|
||||
" Also test this in an empty buffer.
|
||||
func Test_cmd_in_reg_undo()
|
||||
enew!
|
||||
let @a="Ox\<Esc>jAy\<Esc>kdd"
|
||||
edit +/^$ test_undo.vim
|
||||
normal @au
|
||||
call assert_equal(0, &modified)
|
||||
return
|
||||
new
|
||||
normal @au
|
||||
call assert_equal(0, &modified)
|
||||
only!
|
||||
let @a=''
|
||||
endfunc
|
||||
|
||||
func Test_redo_empty_line()
|
||||
new
|
||||
exe "norm\x16r\x160"
|
||||
exe "norm."
|
||||
bwipe!
|
||||
endfunc
|
||||
|
@ -1,7 +1,6 @@
|
||||
" Tests for user defined commands
|
||||
|
||||
" Test for <mods> in user defined commands
|
||||
set belloff=all
|
||||
function Test_cmdmods()
|
||||
let g:mods = ''
|
||||
|
||||
|
@ -3,7 +3,6 @@ if !has('visual')
|
||||
finish
|
||||
endif
|
||||
|
||||
set belloff=all
|
||||
|
||||
func Test_block_shift_multibyte()
|
||||
" Uses double-wide character.
|
||||
@ -52,3 +51,104 @@ func Test_Visual_inner_quote()
|
||||
normal vki'
|
||||
bwipe!
|
||||
endfunc
|
||||
|
||||
" Test for visual block shift and tab characters.
|
||||
func Test_block_shift_tab()
|
||||
enew!
|
||||
call append(0, repeat(['one two three'], 5))
|
||||
call cursor(1,1)
|
||||
exe "normal i\<C-G>u"
|
||||
exe "normal fe\<C-V>4jR\<Esc>ugvr1"
|
||||
call assert_equal('on1 two three', getline(1))
|
||||
call assert_equal('on1 two three', getline(2))
|
||||
call assert_equal('on1 two three', getline(5))
|
||||
|
||||
enew!
|
||||
call append(0, repeat(['abcdefghijklmnopqrstuvwxyz'], 5))
|
||||
call cursor(1,1)
|
||||
exe "normal \<C-V>4jI \<Esc>j<<11|D"
|
||||
exe "normal j7|a\<Tab>\<Tab>"
|
||||
exe "normal j7|a\<Tab>\<Tab> "
|
||||
exe "normal j7|a\<Tab> \<Tab>\<Esc>4k13|\<C-V>4j<"
|
||||
call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
|
||||
call assert_equal('abcdefghij', getline(2))
|
||||
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
|
||||
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(4))
|
||||
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
|
||||
|
||||
%s/\s\+//g
|
||||
call cursor(1,1)
|
||||
exe "normal \<C-V>4jI \<Esc>j<<"
|
||||
exe "normal j7|a\<Tab>\<Tab>"
|
||||
exe "normal j7|a\<Tab>\<Tab>\<Tab>\<Tab>\<Tab>"
|
||||
exe "normal j7|a\<Tab> \<Tab>\<Tab>\<Esc>4k13|\<C-V>4j3<"
|
||||
call assert_equal(' abcdefghijklmnopqrstuvwxyz', getline(1))
|
||||
call assert_equal('abcdefghij', getline(2))
|
||||
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(3))
|
||||
call assert_equal(" abc\<Tab>\<Tab>defghijklmnopqrstuvwxyz", getline(4))
|
||||
call assert_equal(" abc\<Tab> defghijklmnopqrstuvwxyz", getline(5))
|
||||
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
" Tests Blockwise Visual when there are TABs before the text.
|
||||
func Test_blockwise_visual()
|
||||
enew!
|
||||
call append(0, ['123456',
|
||||
\ '234567',
|
||||
\ '345678',
|
||||
\ '',
|
||||
\ 'test text test tex start here',
|
||||
\ "\t\tsome text",
|
||||
\ "\t\ttest text",
|
||||
\ 'test text'])
|
||||
call cursor(1,1)
|
||||
exe "normal /start here$\<CR>"
|
||||
exe 'normal "by$' . "\<C-V>jjlld"
|
||||
exe "normal /456$\<CR>"
|
||||
exe "normal \<C-V>jj" . '"bP'
|
||||
call assert_equal(['123start here56',
|
||||
\ '234start here67',
|
||||
\ '345start here78',
|
||||
\ '',
|
||||
\ 'test text test tex rt here',
|
||||
\ "\t\tsomext",
|
||||
\ "\t\ttesext"], getline(1, 7))
|
||||
|
||||
enew!
|
||||
endfunc
|
||||
|
||||
" Test Virtual replace mode.
|
||||
func Test_virtual_replace()
|
||||
throw 'skipped: TODO: '
|
||||
exe "set t_kD=\<C-V>x7f t_kb=\<C-V>x08"
|
||||
enew!
|
||||
exe "normal a\nabcdefghi\njk\tlmn\n opq rst\n\<C-D>uvwxyz"
|
||||
call cursor(1,1)
|
||||
set ai bs=2
|
||||
exe "normal gR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR"
|
||||
call assert_equal([' 1',
|
||||
\ ' A',
|
||||
\ ' BCDEFGHIJ',
|
||||
\ ' KL',
|
||||
\ ' MNO',
|
||||
\ ' PQR',
|
||||
\ ], getline(1, 6))
|
||||
normal G
|
||||
mark a
|
||||
inoremap <C-D> <Del>
|
||||
exe "normal o0\<C-D>\nabcdefghi\njk\tlmn\n opq\trst\n\<C-D>uvwxyz\n"
|
||||
exe "normal 'ajgR0\<C-D> 1\nA\nBCDEFGHIJ\n\tKL\nMNO\nPQR" . repeat("\<BS>", 29)
|
||||
call assert_equal([' 1',
|
||||
\ 'abcdefghi',
|
||||
\ 'jk lmn',
|
||||
\ ' opq rst',
|
||||
\ 'uvwxyz'], getline(7, 11))
|
||||
normal G
|
||||
exe "normal iab\tcdefghi\tjkl"
|
||||
exe "normal 0gRAB......CDEFGHI.J\<Esc>o"
|
||||
exe "normal iabcdefghijklmnopqrst\<Esc>0gRAB\tIJKLMNO\tQR"
|
||||
call assert_equal(['AB......CDEFGHI.Jkl',
|
||||
\ 'AB IJKLMNO QRst'], getline(12, 13))
|
||||
enew!
|
||||
endfunc
|
||||
|
124
src/nvim/testdir/test_winbuf_close.vim
Normal file
124
src/nvim/testdir/test_winbuf_close.vim
Normal file
@ -0,0 +1,124 @@
|
||||
" Test for commands that close windows and/or buffers:
|
||||
" :quit
|
||||
" :close
|
||||
" :hide
|
||||
" :only
|
||||
" :sall
|
||||
" :all
|
||||
" :ball
|
||||
" :buf
|
||||
" :edit
|
||||
"
|
||||
func Test_winbuf_close()
|
||||
enew | only
|
||||
|
||||
call writefile(['testtext 1'], 'Xtest1')
|
||||
call writefile(['testtext 2'], 'Xtest2')
|
||||
call writefile(['testtext 3'], 'Xtest3')
|
||||
|
||||
next! Xtest1 Xtest2
|
||||
call setline(1, 'testtext 1 1')
|
||||
|
||||
" test for working :n when hidden set
|
||||
set hidden
|
||||
next
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
|
||||
" test for failing :rew when hidden not set
|
||||
set nohidden
|
||||
call setline(1, 'testtext 2 2')
|
||||
call assert_fails('rewind', 'E37')
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
call assert_equal('testtext 2 2', getline(1))
|
||||
|
||||
" test for working :rew when hidden set
|
||||
set hidden
|
||||
rewind
|
||||
call assert_equal('Xtest1', bufname('%'))
|
||||
call assert_equal('testtext 1 1', getline(1))
|
||||
|
||||
" test for :all keeping a buffer when it's modified
|
||||
set nohidden
|
||||
call setline(1, 'testtext 1 1 1')
|
||||
split
|
||||
next Xtest2 Xtest3
|
||||
all
|
||||
1wincmd w
|
||||
call assert_equal('Xtest1', bufname('%'))
|
||||
call assert_equal('testtext 1 1 1', getline(1))
|
||||
|
||||
" test abandoning changed buffer, should be unloaded even when 'hidden' set
|
||||
set hidden
|
||||
call setline(1, 'testtext 1 1 1 1')
|
||||
quit!
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
call assert_equal('testtext 2 2', getline(1))
|
||||
unhide
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
call assert_equal('testtext 2 2', getline(1))
|
||||
|
||||
" test ":hide" hides anyway when 'hidden' not set
|
||||
set nohidden
|
||||
call setline(1, 'testtext 2 2 2')
|
||||
hide
|
||||
call assert_equal('Xtest3', bufname('%'))
|
||||
call assert_equal('testtext 3', getline(1))
|
||||
|
||||
" test ":edit" failing in modified buffer when 'hidden' not set
|
||||
call setline(1, 'testtext 3 3')
|
||||
call assert_fails('edit Xtest1', 'E37')
|
||||
call assert_equal('Xtest3', bufname('%'))
|
||||
call assert_equal('testtext 3 3', getline(1))
|
||||
|
||||
" test ":edit" working in modified buffer when 'hidden' set
|
||||
set hidden
|
||||
edit Xtest1
|
||||
call assert_equal('Xtest1', bufname('%'))
|
||||
call assert_equal('testtext 1', getline(1))
|
||||
|
||||
" test ":close" not hiding when 'hidden' not set in modified buffer
|
||||
split Xtest3
|
||||
set nohidden
|
||||
call setline(1, 'testtext 3 3 3')
|
||||
call assert_fails('close', 'E37')
|
||||
call assert_equal('Xtest3', bufname('%'))
|
||||
call assert_equal('testtext 3 3 3', getline(1))
|
||||
|
||||
" test ":close!" does hide when 'hidden' not set in modified buffer;
|
||||
call setline(1, 'testtext 3 3 3 3')
|
||||
close!
|
||||
call assert_equal('Xtest1', bufname('%'))
|
||||
call assert_equal('testtext 1', getline(1))
|
||||
|
||||
set nohidden
|
||||
|
||||
" test ":all!" hides changed buffer
|
||||
split Xtest4
|
||||
call setline(1, 'testtext 4')
|
||||
all!
|
||||
1wincmd w
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
call assert_equal('testtext 2 2 2', getline(1))
|
||||
|
||||
" test ":q!" and hidden buffer.
|
||||
bwipe! Xtest1 Xtest2 Xtest3 Xtest4
|
||||
split Xtest1
|
||||
wincmd w
|
||||
bwipe!
|
||||
set modified
|
||||
bot split Xtest2
|
||||
set modified
|
||||
bot split Xtest3
|
||||
set modified
|
||||
wincmd t
|
||||
hide
|
||||
call assert_equal('Xtest2', bufname('%'))
|
||||
quit!
|
||||
call assert_equal('Xtest3', bufname('%'))
|
||||
call assert_fails('silent! quit!', 'E162')
|
||||
call assert_equal('Xtest1', bufname('%'))
|
||||
|
||||
call delete('Xtest1')
|
||||
call delete('Xtest2')
|
||||
call delete('Xtest3')
|
||||
endfunc
|
@ -313,4 +313,8 @@ enum { FOLD_TEXT_LEN = 51 }; //!< buffer size for get_foldtext()
|
||||
# define OPEN_CHR_FILES
|
||||
#endif
|
||||
|
||||
// Replacement for nchar used by nv_replace().
|
||||
#define REPLACE_CR_NCHAR -1
|
||||
#define REPLACE_NL_NCHAR -2
|
||||
|
||||
#endif // NVIM_VIM_H
|
||||
|
@ -222,20 +222,19 @@ describe('argument list commands', function()
|
||||
eq({'a', 'b'}, eval('argv()'))
|
||||
eq('b', eval('expand("%:t")'))
|
||||
command('argedit a')
|
||||
eq({'a', 'b'}, eval('argv()'))
|
||||
eq({'a', 'b', 'a'}, eval('argv()'))
|
||||
eq('a', eval('expand("%:t")'))
|
||||
command('argedit c')
|
||||
eq({'a', 'c', 'b'}, eval('argv()'))
|
||||
eq({'a', 'b', 'a', 'c'}, eval('argv()'))
|
||||
command('0argedit x')
|
||||
eq({'x', 'a', 'c', 'b'}, eval('argv()'))
|
||||
eq({'x', 'a', 'b', 'a', 'c'}, eval('argv()'))
|
||||
command('enew! | set modified')
|
||||
assert_fails('argedit y', 'E37:')
|
||||
command('argedit! y')
|
||||
eq({'x', 'y', 'a', 'c', 'b'}, eval('argv()'))
|
||||
eq({'x', 'y', 'y', 'a', 'b', 'a', 'c'}, eval('argv()'))
|
||||
command('%argd')
|
||||
-- Nvim allows unescaped spaces in filename on all platforms. #6010
|
||||
command('argedit a b')
|
||||
eq({'a b'}, eval('argv()'))
|
||||
eq({'a', 'b'}, eval('argv()'))
|
||||
end)
|
||||
|
||||
it('test for :argdelete command', function()
|
||||
|
25
test/functional/legacy/edit_spec.lua
Normal file
25
test/functional/legacy/edit_spec.lua
Normal file
@ -0,0 +1,25 @@
|
||||
-- Test for edit functions
|
||||
-- See also: src/nvim/testdir/test_edit.vim
|
||||
|
||||
local helpers = require('test.functional.helpers')(after_each)
|
||||
local source = helpers.source
|
||||
local eq, eval = helpers.eq, helpers.eval
|
||||
local funcs = helpers.funcs
|
||||
local clear = helpers.clear
|
||||
|
||||
describe('edit', function()
|
||||
before_each(clear)
|
||||
|
||||
it('reset insertmode from i_ctrl-r_=', function()
|
||||
source([=[
|
||||
call setline(1, ['abc'])
|
||||
call cursor(1, 4)
|
||||
call feedkeys(":set im\<cr>ZZZ\<c-r>=setbufvar(1,'&im', 0)\<cr>",'tnix')
|
||||
]=])
|
||||
eq({'abZZZc'}, funcs.getline(1,'$'))
|
||||
eq({0, 1, 1, 0}, funcs.getpos('.'))
|
||||
eq(0, eval('&im'))
|
||||
end)
|
||||
|
||||
end)
|
||||
|
@ -6,6 +6,7 @@ local eq = helpers.eq
|
||||
local eval = helpers.eval
|
||||
local feed = helpers.feed
|
||||
local funcs = helpers.funcs
|
||||
local wait = helpers.wait
|
||||
|
||||
describe('search cmdline', function()
|
||||
local screen
|
||||
@ -471,4 +472,113 @@ describe('search cmdline', function()
|
||||
coladd = 0, skipcol = 0, curswant = 0},
|
||||
funcs.winsaveview())
|
||||
end)
|
||||
|
||||
it("CTRL-G with 'incsearch' and ? goes in the right direction", function()
|
||||
-- oldtest: Test_search_cmdline4().
|
||||
screen:detach()
|
||||
screen = Screen.new(40, 4)
|
||||
screen:attach()
|
||||
screen:set_default_attr_ids({
|
||||
inc = {reverse = true},
|
||||
err = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
|
||||
more = { bold = true, foreground = Screen.colors.SeaGreen4 },
|
||||
tilde = { bold = true, foreground = Screen.colors.Blue1 },
|
||||
})
|
||||
command('enew!')
|
||||
funcs.setline(1, {' 1 the first', ' 2 the second', ' 3 the third'})
|
||||
command('set laststatus=0 shortmess+=s')
|
||||
command('set incsearch')
|
||||
command('$')
|
||||
-- Send the input in chunks, so the cmdline logic regards it as
|
||||
-- "interactive". This mimics Vim's test_override("char_avail").
|
||||
-- (See legacy test: test_search.vim)
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 the first |
|
||||
2 the second |
|
||||
3 ^the third |
|
||||
?the |
|
||||
]])
|
||||
|
||||
command('$')
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 ^the first |
|
||||
2 the second |
|
||||
3 the third |
|
||||
?the |
|
||||
]])
|
||||
|
||||
command('$')
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<c-g>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 the first |
|
||||
2 ^the second |
|
||||
3 the third |
|
||||
?the |
|
||||
]])
|
||||
|
||||
command('$')
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 ^the first |
|
||||
2 the second |
|
||||
3 the third |
|
||||
?the |
|
||||
]])
|
||||
|
||||
command('$')
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 the first |
|
||||
2 the second |
|
||||
3 ^the third |
|
||||
?the |
|
||||
]])
|
||||
|
||||
command('$')
|
||||
feed('?the')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<c-t>')
|
||||
wait()
|
||||
feed('<cr>')
|
||||
screen:expect([[
|
||||
1 the first |
|
||||
2 ^the second |
|
||||
3 the third |
|
||||
?the |
|
||||
]])
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user