diff options
-rw-r--r-- | runtime/doc/eval.txt | 6 | ||||
-rw-r--r-- | src/Makefile | 1 | ||||
-rw-r--r-- | src/evalfunc.c | 35 | ||||
-rw-r--r-- | src/testdir/Make_all.mak | 1 | ||||
-rw-r--r-- | src/testdir/test_system.vim | 20 | ||||
-rw-r--r-- | src/version.c | 2 |
6 files changed, 60 insertions, 5 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt index 1f54372e9..f5ea0780a 100644 --- a/runtime/doc/eval.txt +++ b/runtime/doc/eval.txt @@ -7561,7 +7561,11 @@ system({expr} [, {input}]) *system()* *E677* If {input} is given and is a |List| it is written to the file in a way |writefile()| does with {binary} set to "b" (i.e. with a newline between each list item with newlines inside - list items converted to NULs). + list items converted to NULs). + When {input} is given and is a number that is a valid id for + an existing buffer then the content of the buffer is written + to the file line by line, each line terminated by a NL and + NULs characters where the text has a NL. Pipes are not used, the 'shelltemp' option is not used. diff --git a/src/Makefile b/src/Makefile index 4b29ae118..3f61de652 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2164,6 +2164,7 @@ test_arglist \ test_substitute \ test_syn_attr \ test_syntax \ + test_system \ test_tabline \ test_tabpage \ test_tagcase \ diff --git a/src/evalfunc.c b/src/evalfunc.c index 10f6b182e..f66fa9a8e 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -11817,7 +11817,6 @@ get_cmd_output_as_rettv( char_u *res = NULL; char_u *p; char_u *infile = NULL; - char_u buf[NUMBUFLEN]; int err = FALSE; FILE *fd; list_T *list = NULL; @@ -11831,7 +11830,7 @@ get_cmd_output_as_rettv( if (argvars[1].v_type != VAR_UNKNOWN) { /* - * Write the string to a temp file, to be used for input of the shell + * Write the text to a temp file, to be used for input of the shell * command. */ if ((infile = vim_tempname('i', TRUE)) == NULL) @@ -11846,14 +11845,42 @@ get_cmd_output_as_rettv( EMSG2(_(e_notopen), infile); goto errret; } - if (argvars[1].v_type == VAR_LIST) + if (argvars[1].v_type == VAR_NUMBER) + { + linenr_T lnum; + buf_T *buf; + + buf = buflist_findnr(argvars[1].vval.v_number); + if (buf == NULL) + { + EMSGN(_(e_nobufnr), argvars[1].vval.v_number); + goto errret; + } + + for (lnum = 1; lnum <= buf->b_ml.ml_line_count; lnum++) + { + for (p = ml_get_buf(buf, lnum, FALSE); *p != NUL; ++p) + if (putc(*p == '\n' ? NUL : *p, fd) == EOF) + { + err = TRUE; + break; + } + if (putc(NL, fd) == EOF) + { + err = TRUE; + break; + } + } + } + else if (argvars[1].v_type == VAR_LIST) { if (write_list(fd, argvars[1].vval.v_list, TRUE) == FAIL) err = TRUE; } else { - size_t len; + size_t len; + char_u buf[NUMBUFLEN]; p = get_tv_string_buf_chk(&argvars[1], buf); if (p == NULL) diff --git a/src/testdir/Make_all.mak b/src/testdir/Make_all.mak index 072c61c79..63a1b051f 100644 --- a/src/testdir/Make_all.mak +++ b/src/testdir/Make_all.mak @@ -184,6 +184,7 @@ NEW_TESTS = test_arglist.res \ test_stat.res \ test_substitute.res \ test_syntax.res \ + test_system.res \ test_textobjects.res \ test_undo.res \ test_usercommands.res \ diff --git a/src/testdir/test_system.vim b/src/testdir/test_system.vim new file mode 100644 index 000000000..5e8d68b14 --- /dev/null +++ b/src/testdir/test_system.vim @@ -0,0 +1,20 @@ +" Tests for system() and systemlist() + +function! Test_System() + if !executable('echo') || !executable('cat') || !executable('wc') + return + endif + call assert_equal("123\n", system('echo 123')) + call assert_equal(['123'], systemlist('echo 123')) + call assert_equal('123', system('cat', '123')) + call assert_equal(['123'], systemlist('cat', '123')) + call assert_equal(["as\<NL>df"], systemlist('cat', ["as\<NL>df"])) + new Xdummy + call setline(1, ['asdf', "pw\<NL>er", 'xxxx']) + call assert_equal("3\n", system('wc -l', bufnr('%'))) + call assert_equal(['3'], systemlist('wc -l', bufnr('%'))) + call assert_equal(['asdf', "pw\<NL>er", 'xxxx'], systemlist('cat', bufnr('%'))) + bwipe! + + call assert_fails('call system("wc -l", 99999)', 'E86:') +endfunction diff --git a/src/version.c b/src/version.c index 0c16c2897..3be6cbbfc 100644 --- a/src/version.c +++ b/src/version.c @@ -765,6 +765,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 151, +/**/ 150, /**/ 149, |