aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPerry Hung <iperry@gmail.com>2015-03-18 22:41:51 -0400
committerJustin M. Keyes <justinkz@gmail.com>2015-03-20 17:54:28 -0400
commit26e6bca769ca5972063657bb01f157523d51c44f (patch)
treef7dc1cc76feeae4c39740ef256f63998e404ec77
parent2d0f7fa95d9d106d74c24538d6723072c62266d3 (diff)
downloadrneovim-26e6bca769ca5972063657bb01f157523d51c44f.tar.gz
rneovim-26e6bca769ca5972063657bb01f157523d51c44f.tar.bz2
rneovim-26e6bca769ca5972063657bb01f157523d51c44f.zip
vim-patch:7.4.503 #2178
Problem: Cannot append a list of lines to a file. Solution: Add the append option to writefile(). (Yasuhiro Matsumoto) https://code.google.com/p/vim/source/detail?r=v7-4-503 -Ported old legacy test over to test/functional/legacy/writefile_spec.lua -Tests for mapping and signs from the original patch were removed since they have nothing to do this with feature Tested with: make oldtest, make test on OS X. Signed-off-by: Perry Hung <iperry@gmail.com>
-rw-r--r--runtime/doc/eval.txt12
-rw-r--r--src/nvim/eval.c14
-rw-r--r--src/nvim/version.c2
-rw-r--r--test/functional/legacy/writefile_spec.lua30
4 files changed, 50 insertions, 8 deletions
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 8994c313b3..3c789e1155 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -2049,7 +2049,7 @@ winrestcmd() String returns command to restore window sizes
winrestview( {dict}) none restore view of current window
winsaveview() Dict save view of current window
winwidth( {nr}) Number width of window {nr}
-writefile( {list}, {fname} [, {binary}])
+writefile( {list}, {fname} [, {flags}])
Number write list of lines to file {fname}
xor( {expr}, {expr}) Number bitwise XOR
@@ -6593,13 +6593,19 @@ winwidth({nr}) *winwidth()*
:endif
<
*writefile()*
-writefile({list}, {fname} [, {binary}])
+writefile({list}, {fname} [, {flags}])
Write |List| {list} to file {fname}. Each list item is
separated with a NL. Each list item must be a String or
Number.
- When {binary} is equal to "b" binary mode is used: There will
+ When {flags} contains "b" then binary mode is used: There will
not be a NL after the last list item. An empty item at the
end does cause the last line in the file to end in a NL.
+
+ When {flags} contains "a" then append mode is used, lines are
+ appended to the file: >
+ :call writefile(["foo"], "event.log", "a")
+ :call writefile(["bar"], "event.log", "a")
+
All NL characters are replaced with a NUL character.
Inserting CR characters needs to be done before passing {list}
to writefile().
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index a716bb66ab..ad2a0b2bb2 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -15453,16 +15453,22 @@ static void f_writefile(typval_T *argvars, typval_T *rettv)
}
bool binary = false;
- if (argvars[2].v_type != VAR_UNKNOWN
- && STRCMP(get_tv_string(&argvars[2]), "b") == 0) {
- binary = true;
+ bool append = false;
+ if (argvars[2].v_type != VAR_UNKNOWN) {
+ if (vim_strchr(get_tv_string(&argvars[2]), 'b')) {
+ binary = true;
+ }
+ if (vim_strchr(get_tv_string(&argvars[2]), 'a')) {
+ append = true;
+ }
}
// Always open the file in binary mode, library functions have a mind of
// their own about CR-LF conversion.
char_u *fname = get_tv_string(&argvars[1]);
FILE *fd;
- if (*fname == NUL || (fd = mch_fopen((char *)fname, WRITEBIN)) == NULL) {
+ if (*fname == NUL || (fd = mch_fopen((char *)fname,
+ append ? APPENDBIN : WRITEBIN)) == NULL) {
EMSG2(_(e_notcreate), *fname == NUL ? (char_u *)_("<empty>") : fname);
rettv->vval.v_number = -1;
} else {
diff --git a/src/nvim/version.c b/src/nvim/version.c
index f876e78388..a957d844be 100644
--- a/src/nvim/version.c
+++ b/src/nvim/version.c
@@ -337,7 +337,7 @@ static int included_patches[] = {
//506 NA
//505 NA
//504 NA
- //503,
+ 503,
//502,
//501 NA
500,
diff --git a/test/functional/legacy/writefile_spec.lua b/test/functional/legacy/writefile_spec.lua
new file mode 100644
index 0000000000..e7a260bcd9
--- /dev/null
+++ b/test/functional/legacy/writefile_spec.lua
@@ -0,0 +1,30 @@
+-- Tests for writefile()
+
+local helpers = require('test.functional.helpers')
+local feed, insert, source = helpers.feed, helpers.insert, helpers.source
+local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
+
+describe('writefile', function()
+ setup(clear)
+
+ it('is working', function()
+ execute('%delete _')
+ execute('let f = tempname()')
+ execute('call writefile(["over","written"], f, "b")')
+ execute('call writefile(["hello","world"], f, "b")')
+ execute('call writefile(["!", "good"], f, "a")')
+ execute('call writefile(["morning"], f, "ab")')
+ execute('call writefile(["", "vimmers"], f, "ab")')
+ execute('bwipeout!')
+ execute('$put =readfile(f)')
+ execute('1 delete _')
+
+ -- Assert buffer contents.
+ expect([[
+ hello
+ world!
+ good
+ morning
+ vimmers]])
+ end)
+end)