vim-patch:8.0.1053: setline() does not work on startup

Problem:    setline() does not work on startup. (Manuel Ortega)
Solution:   Do not check for ml_mfp to be set for the current buffer.
            (Christian Brabandt)
9d954207e2
This commit is contained in:
Daniel Hahler
2019-06-18 00:09:45 +02:00
parent 9485061baa
commit 8db93d0d83
3 changed files with 29 additions and 5 deletions

View File

@@ -14854,7 +14854,10 @@ static void set_buffer_lines(buf_T *buf, linenr_T lnum, typval_T *lines,
buf_T *curbuf_save; buf_T *curbuf_save;
int is_curbuf = buf == curbuf; int is_curbuf = buf == curbuf;
if (buf == NULL || buf->b_ml.ml_mfp == NULL || lnum < 1) { // When using the current buffer ml_mfp will be set if needed. Useful when
// setline() is used on startup. For other buffers the buffer must be
// loaded.
if (buf == NULL || (!is_curbuf && buf->b_ml.ml_mfp == NULL) || lnum < 1) {
rettv->vval.v_number = 1; // FAIL rettv->vval.v_number = 1; // FAIL
return; return;
} }

View File

@@ -190,12 +190,18 @@ func s:feedkeys(timer)
endfunc endfunc
" Get the command to run Vim, with -u NONE and --headless arguments. " Get the command to run Vim, with -u NONE and --headless arguments.
" If there is an argument use it instead of "NONE".
" Returns an empty string on error. " Returns an empty string on error.
func GetVimCommand() func GetVimCommand(...)
if a:0 == 0
let name = 'NONE'
else
let name = a:1
endif
let cmd = v:progpath let cmd = v:progpath
let cmd = substitute(cmd, '-u \f\+', '-u NONE', '') let cmd = substitute(cmd, '-u \f\+', '-u ' . name, '')
if cmd !~ '-u NONE' if cmd !~ '-u '. name
let cmd = cmd . ' -u NONE' let cmd = cmd . ' -u ' . name
endif endif
let cmd .= ' --headless -i NONE' let cmd .= ' --headless -i NONE'
let cmd = substitute(cmd, 'VIMRUNTIME=.*VIMRUNTIME;', '', '') let cmd = substitute(cmd, 'VIMRUNTIME=.*VIMRUNTIME;', '', '')

View File

@@ -1,5 +1,7 @@
" Tests for setbufline() and getbufline() " Tests for setbufline() and getbufline()
source shared.vim
func Test_setbufline_getbufline() func Test_setbufline_getbufline()
new new
let b = bufnr('%') let b = bufnr('%')
@@ -24,3 +26,16 @@ func Test_setbufline_getbufline()
call assert_equal([], getbufline(b, 6)) call assert_equal([], getbufline(b, 6))
exe "bwipe! " . b exe "bwipe! " . b
endfunc endfunc
func Test_setline_startup()
let cmd = GetVimCommand('Xscript')
if cmd == ''
return
endif
call writefile(['call setline(1, "Hello")', 'w Xtest', 'q!'], 'Xscript')
call system(cmd)
call assert_equal(['Hello'], readfile('Xtest'))
call delete('Xscript')
call delete('Xtest')
endfunc