¿Cómo hacer que vim agregue automáticamente una nueva línea al final de un archivo?

16

Vim normalmente escribe <EOL>para la última línea solo cuando había una en el archivo original.

¿Cómo hacer que vim escriba una nueva línea al final de un archivo todo el tiempo (cuando el archivo no es binario y no hay uno)?

He probado la eolopción, pero no funcionó como se esperaba.

Consulte también: Conservar el final de línea faltante al final de los archivos de texto , pero al contrario. Y: ¿Por qué los archivos deben terminar con una nueva línea?

kenorb
fuente

Respuestas:

17

Información básica

Vim no muestra la última línea nueva en el búfer, pero en realidad vim siempre coloca EOL al final del archivo cuando lo escribe, porque es estándar para archivos de texto en sistemas Unix. Puede encontrar más información sobre esto aquí . En resumen, no tiene que preocuparse por la ausencia de nuevas líneas al final del archivo en vim.

Experimento 1

Puede hacer este pequeño experimento para verificar este comportamiento. En la terminal ejecute:

$ vim test_test

Ingrese el carácter 1y guarde el archivo :wq.

Solo tienes un personaje en el archivo, ¿verdad? En realidad no :) Ahora tienes en tu archivo 1y LFpersonajes. Vamos a verlo, con la utilidad hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31es el código ASCII para el carácter 1y 0aes el código ASCII para el LFcarácter que no se imprime , que para UNIX, como ya conoce el código para el final de línea.

Experimento 2

Pero, ¿qué pasa si abrimos un archivo que no tiene eolsímbolo al final del archivo? Vamos a verlo también. Creemos un archivo sin eol al final, por ejemplo así:

$ echo -n "1" > test_without_eol

Entonces, nuevamente miremos dentro con hexdump:

$ hexdump test_without_eol
000000 31
0000001

Entonces no hay ningún eolpersonaje aquí. Abramos este archivo en vim:

$ vim test_without_eol

En la parte inferior del editor, verá:

"test_without_eol" [noeol] 1L, 1C

Y si guarda este archivo, el eolcarácter se pondrá automáticamente.

¿Qué podemos hacer al respecto?

Si realmente necesita ver el final del archivo. Intenta usar este comando:

:set listchars=eol:$

mostrará todos los eolcaracteres como $signo.

Alexander Myshov
fuente
Excelente. Llegué a la misma conclusión después de mi confusión, porque Vim en realidad no me estaba mostrando esta nueva línea, pero estaba allí después de guardar.
kenorb
1
@kenorb, por cierto, puedes mostrar todos los personajes de EOL usando este comando:set listchars=eol:$
Alexander Myshov
"en realidad no me estaba mostrando esta nueva línea" - en Unix, no hay línea. Una línea se define como "número de caracteres no LF, que terminan en un carácter LF". Si piensa en LF no como "ir a la línea siguiente" sino como "fin de línea", lo que hace Vim de repente tiene mucho más sentido.
Amadan
8

Vim solo omite la EOL si el archivo se abre como 'binary' y la 'endofline'opción se restablece (cuando el archivo binario no tenía una EOL al abrir, o restablece explícitamente la opción). En otras palabras, Vim solo honra una EOL faltante para los archivos binarios. Para archivos de texto, siempre escribe con una EOL (agregada). (Es por eso que necesita soluciones como mi complemento PreserveNoEOL para mantener archivos de texto sin EOL). Puede encontrar todos los detalles en :help 'endofline'.

Por lo tanto, solo necesita asegurarse de abrir el archivo como no binario para que Vim escriba automáticamente una EOL.

Ingo Karkat
fuente
5

Como Alexander mencionó, Vim no muestra EOL en EOF, por eso es tan confuso (especialmente con una nueva línea vacía / en blanco, que es otra cosa), por lo tanto, en realidad escribe todo el tiempo en guardar archivos.

Aquí hay una prueba simple de cómo probar si eso funciona:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Observe cómo se comporta el indicador de comandos de shell cuando no hay EOL (se mezcla con la siguiente línea). Al volver a guardar el archivo con Vim, lo agrega.

Usando wcpodemos contar líneas, palabras y caracteres antes de guardar y después, para que podamos ver que realmente cambia.

¿Por qué esto es tan importante? Para mantener nuestros archivos compatibles con POSIX .

kenorb
fuente