2012-01-22 10 views
6

Quiero añadir una lista de cadenas a un archivo en VIML Aquí está mi código de solución:¿Cómo añado una lista a un archivo en vim?

let lines = ["line1\n", "line2\n", "line3\n"] 
call writefile(lines, "/tmp/tmpfile") 
call system("cat /tmp/tmpfile >> file_to_append_to") 

Cualquier forma de añadir al archivo directamente en vim? Debería haber, pero no puedo encontrar nada

Respuesta

7

Try usando readfile() + writefile().

Si está utilizando Vim 7.3.150+, (o si está absolutamente seguro de que el archivo en cuestión termina con \n):

function AppendToFile(file, lines) 
    call writefile(readfile(a:file)+a:lines, a:file) 
endfunction 

Para Vim mayores de 7.3.150:

" lines must be a list without trailing newlines. 
function AppendToFile(file, lines) 
    call writefile(readfile(a:file, 'b')+a:lines, a:file, 'b') 
endfunction 

" Version working with file *possibly* containing trailing newline 
function AppendToFile(file, lines) 
    let fcontents=readfile(a:file, 'b') 
    if !empty(fcontents) && empty(fcontents[-1]) 
     call remove(fcontents, -1) 
    endif 
    call writefile(fcontents+a:lines, a:file, 'b') 
endfunction 
+0

Estoy confundido por tu última oración. ': h readfile()' dice que sin 'b', "No importa si la última línea termina en NL o no". (Vim 7.4.26) –

+1

@ JustinM.Keyes Actualice a la versión 7.2.446 (confirme http://code.google.com/p/vim/source/detail?r=9577a28005e10fab0a0cada6c41b96c9a3e1bfe9). Tenga en cuenta que el archivo no debe contener exactamente nuevas líneas para ver el error (lista vacía devuelta por 'readfile()'). También tenga en cuenta que puede no ser la última versión con un error. – ZyX

+1

@ JustinM.Keyes Se arregló en la versión 7.3.150 (1 de abril de 2011). AFAIR cuando estaba escribiendo esto, acabo de utilizar mi experiencia con 'readfile()', VAM y la versión 7.2 * que era estable sin volver a verificar. Fue el 4 de julio de 2010 cuando modifiqué VAM para usar siempre 'readfile (, 'b')' y la versión más reciente en ese momento era 7.2.445 (aparte de los cambios en la rama vim73). Definitivamente estaba usando Gentoo (ya sea estable o '~ arch') lo que significa que tenía una versión más o menos obsoleta. No importa, ya que el error residió hasta 7.3.150. – ZyX

3

Esto puede ser útil, pero agrega contenido al archivo actual.

Crea una matriz eliminando \n de cada campo.

:let lines = ["line1", "line2", "line3"] 

y añadir al final de archivo actual:

:call append(line('$'), lines) 
+0

el clavo, si En entendido bien la pregunta – sehe

6

El comando write se puede utilizar para anexar toda la memoria intermedia actual en un archivo:

:write >> append_file.txt 

Puede limitarlo al rango de líneas en el búfer actual si lo desea. Por ejemplo, esto podría añadir líneas 1 a 8 para fines de append_file.txt:

:1,8write >> append_file.txt 
+0

Esta es una forma mucho mejor y más fácil de hacer las cosas. – theCuriousOne

4

Vim 7.4.503 added support para anexar a un archivo con writefile usando la bandera "a":

:call writefile(["foo"], "event.log", "a") 

De :h writefile:

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 {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") 
Cuestiones relacionadas