gVim mostrando retorno de carro (^ M) incluso cuando el modo de archivo es explícitamente DOS

78

Estoy usando gVim en Windows. Mi código muestra ^Mcaracteres al final de las líneas. Solía :set ff=dosen vano. Los ^Mcaracteres permanecen para las líneas existentes, pero no aparecen para las líneas nuevas que ingrese. Cambié de modo a mac (muestra ^Jcaracteres) y unix (también muestra ^Mcaracteres) y volví a dos. ¿Alguien más ha visto esto?

Jerph
fuente
Consulte vim.wikia.com/wiki/File_format para obtener una explicación completa de los finales de línea en vim / gvim. Este enlace también explica cómo solucionar el problema.
axiopisty

Respuestas:

139

Esto sucede cuando tiene una mezcla de finales de línea de Windows y de Unix. Si tiene 100 líneas, 99 son \ r \ ny una es \ n, verá 99 ^ M caracteres. La solución es encontrar esa línea y reemplazarla. O ejecute dos2unix en el archivo. Puede reemplazar los finales de línea de Windows con:

:%s/\r\(\n\)/\1/g

richq
fuente
Encontré esa línea justo antes de que escribiera esto. :) ¡Gracias!
Jerph
1
Je, típico. Vim es genial, ¡así que quédate con él! :-)
richq
2
Ojalá pudiera darte +1000 por esto
the_e
3
Normalmente los golpeo con:%s/^M//
TMN
1
Debería agregar :set ff=dossi quiere que sea dos cuando haya terminado, ala respuesta de Evan.
Merlyn Morgan-Graham
19

Por lo general, uso lo siguiente para limpiar mis finales de línea:

:g/^M$/s///

Para obtener el ctrl-M, generalmente escribo ctrl-Q, luego ctrl-M y lo coloca. (En algunos entornos puede ser ctrl-V y luego ctrl-M.) No sé por qué, pero encuentro que uno más fácil de recordar que el de rq .

No olvide hacerlo :set ff=dostambién, o terminará ahorrando aún con los finales de línea de UNIX.

Evan
fuente
Sí, normalmente uso la versión ^ M con Ctrl-Q y todo eso. Pero es más difícil de explicar ;-) y la versión de coincidencia de grupo es compatible con copiar y pegar.
richq
15

Sé que esto ya ha sido respondido, pero un truco que utilizo es

:%s/\r/\r/g

Esto reemplaza los retornos de carro de Unix con el CRLF de Windows. Solo se agregó en caso de que alguien más tuviera problemas.

dsrekab
fuente
6

¡Puedes ignorar estos caracteres!

pon esto en tu vimrc

coincidencia Ignorar / \ r $ /

IvanM
fuente
1
Es bueno saber que esto está ahí, pero ¿hay un buen caso de uso para dejar finales de línea no coincidentes en un archivo? Parece que está buscando problemas.
Jerph
1
Esto es más de lo que necesitaba (cambiar el archivo no siempre es aconsejable cuando causa cambios masivos en un archivo que aparecen en algunos sistemas de control de revisión)
RunHolt
Desafortunadamente, esto cambia los finales de línea tan pronto como guarde el archivo. Por lo tanto, produce exactamente estos grandes cambios no deseados en los espacios en blanco, solo que sin mostrarte. Al menos para mi. :(
peschü
4

En realidad, lo que funcionó para mí (en Windows de 64 bits, gVIM: 7.2) fue:

:set ffs=dos

no solo: ff

ra170
fuente
4

Ejecutando Vim 7.3 en Windows 7. Usé el siguiente comando:

:%s/^M/\r/g

Para crear el ^ MI escribe CTRL + Q y luego CTRL + M.

ddelrio1986
fuente
2

Probablemente esto sea un poco simple para muchos de ustedes, pero en la remota posibilidad de que sea útil.

Según la respuesta de richq, encontré que estos son útiles en mi vimrc. Tenga en cuenta que el segundo se comenta normalmente porque hace que dd sea un poco confuso, ya que Vim esperará a que otra pulsación de tecla funcione si es el comando ex mapeado.

¡función! D2u ()
    ejecutar '% s / \ r \ (\ n \) / \ 1 / g'
función final
"mapa d2u:% s / \ r \ (\ n \) / \ 1 / g

El primero se ejecuta escribiendo call D2u()en ex y el segundo presionando D2uen modo de edición.

Peter Shannon
fuente
2

Estos son finales de línea CR adicionales generalmente debido al uso de un archivo en sistemas UNIX / DOS mixtos.

Posiblemente, la respuesta más corta para eliminar un solo ^ M del final de cada línea, y lo que uso, es:

:%s/\r

que es equivalente a:

:%s/\r//

pero las barras diagonales finales no son necesarias (se asumen).

thebriguy
fuente
1

intenté muchas cosas, pero lo siguiente funcionó

:%s/\r/\r/g

nota: use g si desea el efecto en todo el archivo

Atul Subhash
fuente