¿Por qué no veo la diferencia entre dos archivos diferentes en modo de inserción en vim?

8

Vamos a crear dos archivos:

$ echo -n 'test' > test.txt
$ wc test.txt 
0 1 4 test.txt

El archivo test.txtno contiene la nueva línea final.

$ echo 'test' > test_n.txt
$ wc test_n.txt 
1 1 5 test_n.txt

El archivo test_n.txtcontiene la nueva línea final.

Los dos archivos anteriores son obviamente diferentes, pero la vista previa de archivos en ambos vimen el modo de inserción no contiene ningún diferencias:

$ vim test.txt

ingrese la descripción de la imagen aquí

$ vim test_n.txt

ingrese la descripción de la imagen aquí

¿Por qué no hay diferencia (nueva línea o alguna distinción especial)?

¿Y qué puedo hacer para agregar o eliminar dicho carácter adicional vimen el modo de inserción ?

simhumileco
fuente
44
": set list" mostraría la diferencia, y hay un modo que puede inspeccionar. Ambos están en los archivos de ayuda.
Thomas Dickey
Gracias @ThomasDickey No conocía esta opción antes.
simhumileco
1
@ThomasDickey si desea agregar una respuesta, probablemente será la respuesta aceptada. Gracias.
simhumileco
2
@filbranden, por favor no publique respuestas en los comentarios. Las respuestas en los comentarios no pueden ser votadas por la comunidad y no marcan la pregunta como respondida.
terdon
2
@ThomasDickey ver arriba. Por favor publique eso como respuesta.
terdon

Respuestas:

12

vim tiene un modo "eol" (para fin de línea) para indicar qué hacer si la última línea del archivo carece de un carácter de nueva línea . Puede ver todas las configuraciones de modo en vim (o cualquier programa como vi) por

:set all

POSIX vi no tiene una característica para esto: los archivos son de longitud cero o tienen una nueva línea final. Esto se debe a que POSIX vi solo trata con archivos de texto, que por definición son líneas que terminan con líneas nuevas. En una comprobación rápida, nvi y elvis no tienen modos para esto. En mi comentario, me había olvidado de un detalle de vim: a diferencia de vile, una ": set list" no muestra fácilmente la nueva línea que falta. Esto es lo que veo en vim:

ssss$
test$
~
~

mientras que en vil:

ssss^J
test
~
~

Para cualquiera de los editores, puede leer el archivo, cambiar el modo , por ejemplo,

:set noeol

y escriba el archivo para obtener una nueva línea en el archivo actualizado. En lugar de mostrarlo directamente, puede modificar la línea de estado de vim para mostrar esta información. Por defecto, no parece hacer esto, pero algunos empaquetadores lo han personalizado, por ejemplo,

"foo" [noeol] 2L, 9C                                          1,1           All

Uno de los comentarios sugiere usar el "?" modificador del setcomando, por ejemplo,

:set eol?

que podría mostrar algo como esto:

noendofline                                                   2,1           All

pero en modo de inserción, eso se reemplaza por

-- INSERT --                                                  2,1           All

entonces la línea de estado parece el lugar correcto para mantener esta información.

Las características han estado allí por un tiempo:

  • La eolfunción apareció por primera vez en vim 2.4 (julio de 1994), según un comentario en su código fuente.

  • El newlinemodo de vile apareció en julio de 1993 .

( nvi, elvis, vim y vile manejan todos los archivos binarios además de los archivos de texto de POSIX vi ).

Thomas Dickey
fuente
2
casi 20 años usando vim, y todavía aprendo cosas nuevas al respecto. y todavía tengo miedo de emacs. : D
Tim Kennedy el
1
En vim, también puede hacer :set eol?para ver si eol está activado o desactivado, por lo que no tiene que mirar a través de toda la salida de :set all.
Kevin
Una forma menos confusa de decir "los archivos son de longitud cero o tienen una nueva línea final" es "todas las líneas terminan con una nueva línea y un archivo de texto es una secuencia de cero o más líneas".
R .. GitHub DEJA DE AYUDAR AL HIELO