mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
Merge #9970 from janlazo/vim-8.1.0794
vim-patch:8.0.1708,8.1.{369,794,1242}
This commit is contained in:
commit
6891d8aeca
@ -432,6 +432,16 @@ flag when defining the function, it is not relevant when executing it. >
|
||||
.
|
||||
:endfunction
|
||||
:set cpo-=C
|
||||
<
|
||||
*line-continuation-comment*
|
||||
To add a comment in between the lines start with '\" '. Notice the space
|
||||
after the double quote. Example: >
|
||||
let array = [
|
||||
"\ first entry comment
|
||||
\ 'first',
|
||||
"\ second entry comment
|
||||
\ 'second',
|
||||
\ ]
|
||||
|
||||
Rationale:
|
||||
Most programs work with a trailing backslash to indicate line
|
||||
@ -440,6 +450,14 @@ Rationale:
|
||||
:map xx asdf\
|
||||
< Therefore the unusual leading backslash is used.
|
||||
|
||||
Starting a comment in a continuation line results in all following
|
||||
continuation lines to be part of the comment. Since it was like this
|
||||
for a long time, when making it possible to add a comment halfway a
|
||||
sequence of continuation lines, it was not possible to use \", since
|
||||
that was a valid continuation line. Using '"\ ' comes closest, even
|
||||
though it may look a bit weird. Requiring the space after the
|
||||
backslash is to make it very unlikely this is a normal comment line.
|
||||
|
||||
==============================================================================
|
||||
5. Using Vim packages *packages*
|
||||
|
||||
|
@ -10,7 +10,7 @@ endif
|
||||
let b:did_indent = 1
|
||||
|
||||
setlocal indentexpr=GetVimIndent()
|
||||
setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\
|
||||
setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\,0=\"\\\
|
||||
|
||||
let b:undo_indent = "setl indentkeys< indentexpr<"
|
||||
|
||||
@ -31,15 +31,17 @@ function GetVimIndent()
|
||||
endtry
|
||||
endfunc
|
||||
|
||||
let s:lineContPat = '^\s*\(\\\|"\\ \)'
|
||||
|
||||
function GetVimIndentIntern()
|
||||
" Find a non-blank line above the current line.
|
||||
let lnum = prevnonblank(v:lnum - 1)
|
||||
|
||||
" If the current line doesn't start with '\' and below a line that starts
|
||||
" with '\', use the indent of the line above it.
|
||||
" If the current line doesn't start with '\' or '"\ ' and below a line that
|
||||
" starts with '\' or '"\ ', use the indent of the line above it.
|
||||
let cur_text = getline(v:lnum)
|
||||
if cur_text !~ '^\s*\\'
|
||||
while lnum > 0 && getline(lnum) =~ '^\s*\\'
|
||||
if cur_text !~ s:lineContPat
|
||||
while lnum > 0 && getline(lnum) =~ s:lineContPat
|
||||
let lnum = lnum - 1
|
||||
endwhile
|
||||
endif
|
||||
@ -51,10 +53,10 @@ function GetVimIndentIntern()
|
||||
let prev_text = getline(lnum)
|
||||
|
||||
" Add a 'shiftwidth' after :if, :while, :try, :catch, :finally, :function
|
||||
" and :else. Add it three times for a line that starts with '\' after
|
||||
" a line that doesn't (or g:vim_indent_cont if it exists).
|
||||
" and :else. Add it three times for a line that starts with '\' or '"\ '
|
||||
" after a line that doesn't (or g:vim_indent_cont if it exists).
|
||||
let ind = indent(lnum)
|
||||
if cur_text =~ '^\s*\\' && v:lnum > 1 && prev_text !~ '^\s*\\'
|
||||
if cur_text =~ s:lineContPat && v:lnum > 1 && prev_text !~ s:lineContPat
|
||||
if exists("g:vim_indent_cont")
|
||||
let ind = ind + g:vim_indent_cont
|
||||
else
|
||||
|
@ -12880,33 +12880,36 @@ static void f_mkdir(typval_T *argvars, typval_T *rettv, FunPtr fptr)
|
||||
char buf[NUMBUFLEN];
|
||||
const char *const dir = tv_get_string_buf(&argvars[0], buf);
|
||||
if (*dir == NUL) {
|
||||
rettv->vval.v_number = FAIL;
|
||||
} else {
|
||||
if (*path_tail((char_u *)dir) == NUL) {
|
||||
// Remove trailing slashes.
|
||||
*path_tail_with_sep((char_u *)dir) = NUL;
|
||||
}
|
||||
|
||||
if (argvars[1].v_type != VAR_UNKNOWN) {
|
||||
if (argvars[2].v_type != VAR_UNKNOWN) {
|
||||
prot = tv_get_number_chk(&argvars[2], NULL);
|
||||
}
|
||||
if (prot != -1 && strcmp(tv_get_string(&argvars[1]), "p") == 0) {
|
||||
char *failed_dir;
|
||||
int ret = os_mkdir_recurse(dir, prot, &failed_dir);
|
||||
if (ret != 0) {
|
||||
EMSG3(_(e_mkdir), failed_dir, os_strerror(ret));
|
||||
xfree(failed_dir);
|
||||
rettv->vval.v_number = FAIL;
|
||||
return;
|
||||
} else {
|
||||
rettv->vval.v_number = OK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
rettv->vval.v_number = prot == -1 ? FAIL : vim_mkdir_emsg(dir, prot);
|
||||
return;
|
||||
}
|
||||
|
||||
if (*path_tail((char_u *)dir) == NUL) {
|
||||
// Remove trailing slashes.
|
||||
*path_tail_with_sep((char_u *)dir) = NUL;
|
||||
}
|
||||
|
||||
if (argvars[1].v_type != VAR_UNKNOWN) {
|
||||
if (argvars[2].v_type != VAR_UNKNOWN) {
|
||||
prot = tv_get_number_chk(&argvars[2], NULL);
|
||||
if (prot == -1) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (strcmp(tv_get_string(&argvars[1]), "p") == 0) {
|
||||
char *failed_dir;
|
||||
int ret = os_mkdir_recurse(dir, prot, &failed_dir);
|
||||
if (ret != 0) {
|
||||
EMSG3(_(e_mkdir), failed_dir, os_strerror(ret));
|
||||
xfree(failed_dir);
|
||||
rettv->vval.v_number = FAIL;
|
||||
return;
|
||||
} else {
|
||||
rettv->vval.v_number = OK;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
rettv->vval.v_number = vim_mkdir_emsg(dir, prot);
|
||||
}
|
||||
|
||||
/// "mode()" function
|
||||
|
@ -3403,13 +3403,18 @@ char_u *getsourceline(int c, void *cookie, int indent)
|
||||
// Get the next line and concatenate it when it starts with a
|
||||
// backslash. We always need to read the next line, keep it in
|
||||
// sp->nextline.
|
||||
// Also check for a comment in between continuation lines: "\ .
|
||||
sp->nextline = get_one_sourceline(sp);
|
||||
if (sp->nextline != NULL && *(p = skipwhite(sp->nextline)) == '\\') {
|
||||
if (sp->nextline != NULL
|
||||
&& (*(p = skipwhite(sp->nextline)) == '\\'
|
||||
|| (p[0] == '"' && p[1] == '\\' && p[2] == ' '))) {
|
||||
garray_T ga;
|
||||
|
||||
ga_init(&ga, (int)sizeof(char_u), 400);
|
||||
ga_concat(&ga, line);
|
||||
ga_concat(&ga, p + 1);
|
||||
if (*p == '\\') {
|
||||
ga_concat(&ga, p + 1);
|
||||
}
|
||||
for (;; ) {
|
||||
xfree(sp->nextline);
|
||||
sp->nextline = get_one_sourceline(sp);
|
||||
@ -3417,15 +3422,16 @@ char_u *getsourceline(int c, void *cookie, int indent)
|
||||
break;
|
||||
}
|
||||
p = skipwhite(sp->nextline);
|
||||
if (*p != '\\') {
|
||||
if (*p == '\\') {
|
||||
// Adjust the growsize to the current length to speed up
|
||||
// concatenating many lines.
|
||||
if (ga.ga_len > 400) {
|
||||
ga_set_growsize(&ga, (ga.ga_len > 8000) ? 8000 : ga.ga_len);
|
||||
}
|
||||
ga_concat(&ga, p + 1);
|
||||
} else if (p[0] != '"' || p[1] != '\\' || p[2] != ' ') {
|
||||
break;
|
||||
}
|
||||
// Adjust the growsize to the current length to speed up
|
||||
// concatenating many lines.
|
||||
if (ga.ga_len > 400) {
|
||||
ga_set_growsize(&ga, (ga.ga_len > 8000) ? 8000 : ga.ga_len);
|
||||
}
|
||||
ga_concat(&ga, p + 1);
|
||||
}
|
||||
ga_append(&ga, NUL);
|
||||
xfree(line);
|
||||
|
@ -4505,8 +4505,8 @@ static int get_tabpage_arg(exarg_T *eap)
|
||||
tab_number = 0;
|
||||
} else {
|
||||
tab_number = eap->line2;
|
||||
if (!unaccept_arg0 && **eap->cmdlinep == '-') {
|
||||
--tab_number;
|
||||
if (!unaccept_arg0 && *skipwhite(*eap->cmdlinep) == '-') {
|
||||
tab_number--;
|
||||
if (tab_number < unaccept_arg0) {
|
||||
eap->errmsg = e_invarg;
|
||||
}
|
||||
|
@ -21,3 +21,31 @@ func Test_E963()
|
||||
call assert_fails("let v:oldfiles=''", 'E963:')
|
||||
call assert_equal(v_o, v:oldfiles)
|
||||
endfunc
|
||||
|
||||
func Test_mkdir_p()
|
||||
call mkdir('Xmkdir/nested', 'p')
|
||||
call assert_true(isdirectory('Xmkdir/nested'))
|
||||
try
|
||||
" Trying to make existing directories doesn't error
|
||||
call mkdir('Xmkdir', 'p')
|
||||
call mkdir('Xmkdir/nested', 'p')
|
||||
catch /E739:/
|
||||
call assert_report('mkdir(..., "p") failed for an existing directory')
|
||||
endtry
|
||||
" 'p' doesn't suppress real errors
|
||||
call writefile([], 'Xfile')
|
||||
call assert_fails('call mkdir("Xfile", "p")', 'E739')
|
||||
call delete('Xfile')
|
||||
call delete('Xmkdir', 'rf')
|
||||
endfunc
|
||||
|
||||
func Test_line_continuation()
|
||||
let array = [5,
|
||||
"\ ignore this
|
||||
\ 6,
|
||||
"\ more to ignore
|
||||
"\ more moreto ignore
|
||||
\ ]
|
||||
"\ and some more
|
||||
call assert_equal([5, 6], array)
|
||||
endfunc
|
||||
|
@ -1,5 +1,6 @@
|
||||
" Tests for tabpage
|
||||
|
||||
" source screendump.vim
|
||||
|
||||
function Test_tabpage()
|
||||
bw!
|
||||
@ -105,6 +106,14 @@ function Test_tabpage()
|
||||
call assert_equal(4, tabpagenr())
|
||||
7tabmove 5
|
||||
call assert_equal(5, tabpagenr())
|
||||
-tabmove
|
||||
call assert_equal(4, tabpagenr())
|
||||
+tabmove
|
||||
call assert_equal(5, tabpagenr())
|
||||
-2tabmove
|
||||
call assert_equal(3, tabpagenr())
|
||||
+3tabmove
|
||||
call assert_equal(6, tabpagenr())
|
||||
|
||||
" The following are a no-op
|
||||
norm! 2gt
|
||||
@ -547,4 +556,27 @@ func Test_tabs()
|
||||
bw!
|
||||
endfunc
|
||||
|
||||
func Test_tabpage_cmdheight()
|
||||
if !CanRunVimInTerminal()
|
||||
throw 'Skipped: only works with terminal'
|
||||
endif
|
||||
call writefile([
|
||||
\ 'set laststatus=2',
|
||||
\ 'set cmdheight=2',
|
||||
\ 'tabnew',
|
||||
\ 'set cmdheight=3',
|
||||
\ 'tabnext',
|
||||
\ 'redraw!',
|
||||
\ 'echo "hello\nthere"',
|
||||
\ 'tabnext',
|
||||
\ 'redraw',
|
||||
\ ], 'XTest_tabpage_cmdheight')
|
||||
" Check that cursor line is concealed
|
||||
let buf = RunVimInTerminal('-S XTest_tabpage_cmdheight', {'statusoff': 3})
|
||||
call VerifyScreenDump(buf, 'Test_tabpage_cmdheight', {})
|
||||
|
||||
call StopVimInTerminal(buf)
|
||||
call delete('XTest_conceal')
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -3793,6 +3793,9 @@ static void enter_tabpage(tabpage_T *tp, buf_T *old_curbuf, int trigger_enter_au
|
||||
* the frames for that. When the Vim window was resized need to update
|
||||
* frame sizes too. Use the stored value of p_ch, so that it can be
|
||||
* different for each tab page. */
|
||||
if (p_ch != curtab->tp_ch_used) {
|
||||
clear_cmdline = true;
|
||||
}
|
||||
p_ch = curtab->tp_ch_used;
|
||||
if (curtab->tp_old_Rows != Rows || (old_off != firstwin->w_winrow
|
||||
))
|
||||
|
Loading…
Reference in New Issue
Block a user