Si abro Vim y itest<Esc>:wq
escribo, obtengo un archivo que no tiene líneas nuevas en Vim pero parece tener una línea nueva en el código:
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a |test.|
00000005
Si abro Vim y escribo, itest<Return><Esc>:wq
obtengo un archivo que tiene una nueva línea en Vim pero dos nuevas líneas en el código:
$ rm test.txt
$ vim -u NONE test.txt
$ cat test.txt | hd
00000000 74 65 73 74 0a 0a |test..|
00000006
Tenga en cuenta que estoy abriendo Vim con, -u NONE
por lo que no se está utilizando ninguna configuración local. Tenga en cuenta también que esto podría estar relacionado con una pregunta anterior mía .
Esta es la información de mi sistema:
$ uname -a
Linux awsAlpha 3.2.0-60-virtual #91-Ubuntu SMP Wed Feb 19 04:13:28 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled May 4 2012 04:25:35)
Included patches: 1-429
Modified by [email protected]
Compiled by buildd@
Puedo confirmar exactamente el mismo comportamiento en este sistema también:
$ uname -a
Linux bruno 3.5.0-48-generic #72-Ubuntu SMP Mon Mar 10 23:18:29 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ vim --version
VIM - Vi IMproved 7.3 (2010 Aug 15, compiled Oct 26 2012 16:45:33)
Included patches: 1-547
Modified by [email protected]
Compiled by buildd@
¿Por qué Vim agrega una nueva línea? ¿Es esto una convención?
Aquí hay algunas aclaraciones sobre el hd
comando instalado en Ubuntu Server:
$ man hd | head -4
HEXDUMP(1) BSD General Commands Manual HEXDUMP(1)
NAME
hexdump, hd — ASCII, decimal, hexadecimal, octal dump
Respuestas:
La convención para los archivos de texto Unix es que cada línea termina con una nueva línea, y que las nuevas líneas son terminadores de línea, no separadores de línea.
Cuando Vim guarda un búfer como archivo, termina cada línea con la secuencia de fin de línea para ese formato de archivo, que para Unix es una nueva línea. Ver
Si está utilizando herramientas de procesamiento de texto Unix, es mejor cumplir con esta convención. Sin embargo, si tiene alguna necesidad de no poner una nueva línea al final de la última línea de un archivo, puede hacerlo. Vim considera que dichos archivos son "binarios". Ver
fuente
Vim no agrega nada que no hayas puesto allí.
Un carácter de "nueva línea" no es una "nueva línea" y ambos ejemplos son perfectamente normales:
fuente
printf "\x41" > /tmp/test.txt
luego verifique que solo tenga un carácter 'A' conxxd /tmp/test.txt
. Ahoravim /tmp/test.txt<ENTER>:wq
. Verifique nuevamente para ver que el archivo tiene dos bytes: 'A \ n'.printf
aquí no tuve "líneas" bien formadas. Después de vim tengo uno. Entonces, agrega algo que no puse allí.printf
no es una línea a menos que agregue\n
. Al ser un editor de texto, Vim se ocupa de las líneas de forma predeterminada, y cualquier texto que inserte en el archivo está , como mínimo, en una línea, a menos que le diga explícitamente a Vim que no haga eso.Los archivos de texto no terminados son malos por múltiples razones; Aquí hay uno que no he visto mencionado todavía:
En un mundo hipotético donde los archivos de texto sin una nueva línea final son aceptables, no habría diferencia entre un archivo que contiene 0 líneas y un archivo que contiene 1 línea en blanco. Ambos estarían representados por un archivo de 0 bytes.
La incapacidad para decidir cuántas líneas hay en un archivo sería mala.
fuente
Vim 8.0 ahora proporciona esto con la
fixeol
opción. Específicamente si haces:entonces Vim no agregará un carácter de línea nueva al final de la línea final si el archivo aún no tiene uno.
Eso podría ir en un complemento de tipo de archivo, o posiblemente incluso en su
.vimrc
.(Esta es una mejora
:set binary
porque solo afecta el carácter final de salto de línea, mientras quebinary
también cambia un montón de otros comportamientos, que probablemente no desee a menos que esté editando un archivo binario).Un archivo recién creado seguirá teniendo un carácter de salto de línea final de forma predeterminada. Puede cambiar eso (y cambiar un archivo que ya tiene una nueva línea final a no tener una) haciendo además:
Eso tiene que establecerse específicamente para cada archivo que desea cambiar: cargar un archivo en un búfer siempre se configurará
eol
para que coincida con el estado actual del archivo.fuente
Usando el comando 'j' puedes unir todas las líneas en una.
Si también desea eliminar el LF o el CRLF en la última línea, haga lo siguiente en vi.
fuente