^ M al final de cada línea en vim

132

Cuando estoy editando archivos fuente usando vim y otros editores a veces al final de la línea, obtengo estos caracteres ^ M al final de cada línea. Creo que tiene algo que ver con editar un archivo en Windows y luego en Linux. ¿Cómo puedo eliminar todo esto automáticamente?

DHamrick
fuente
18
Esto se debe a que Windows usa una secuencia de dos caracteres (normalmente escrita "\ r \ n") para representar un salto de línea, pero UNIX / Linux usa solo el segundo carácter "\ n" para representar un salto de línea. Entonces, cuando edita un archivo de texto de Windows en un editor de Linux, el editor ve caracteres adicionales que no considera parte de los saltos de línea, por lo que intenta representarlos y lo que sale es ^ M.
David Z
13
Hay un poco más que eso, David. Vim felizmente editará un archivo de texto con terminaciones de línea de DOS sin mostrar todos esos ^Ms. La única indicación que tiene al editar un archivo de texto de DOS en Vim es si tiene %{&ff}el statuslinevalor de su opción. Vim muestra ^Mcuándo se mezcla el estilo de final de línea . Significa que ha utilizado un editor de texto que no es tan inteligente como Vim, que no ha seguido el estilo de finalización de línea existente, como lo hará Vim por defecto. Si usa Vim o algo más de su calibre en Windows, no obtendrá terminaciones de línea arruinadas como esa.
Warren Young

Respuestas:

128

Como comando, escriba

:%s/^M$//

(Para obtener ^ M, presione ^ V ^ M, donde ^ es CTRL en la mayoría de los teclados)

Tobias Baaz
fuente
62
también,:% s / \ r $ // para evitar la molestia ^ V ^ M
glenn jackman
8
O bien, el ahorro de un personaje::%s/\r$
sehe
2
@sehe técnicamente ahorra 2 caracteres :)
Chris
@glennjackman, tu sugerencia fue mucho más fácil, ya que había estado luchando por obtener el ^ V + ^ M donde no estaba sucediendo en absoluto. Todo lo que estaba obteniendo era el contenido en el portapapeles (ya que ^ V era efectivo cada vez, a pesar de mis repetidos intentos con diferentes estrategias para obtenerlos a ambos).
itsraghz
86

Una forma fácil de eliminar las terminaciones de línea de DOS es usar la ffopción:

:set ff=unix
:wq

Ahora su archivo está de vuelta a la buena forma de Unix.

Si desea agregar los finales de línea de DOS (para mantener feliz a una impresora o transferir archivos con amigos de Windows que no tienen buenas herramientas), puede ir en la dirección opuesta fácilmente:

:set ff=dos
:wq
sarnold
fuente
8
vim no encontraba ningún ^ m, o \ r, ni ninguna de las otras terminaciones de línea, pero esto funcionó. Gracias :)
SgtPooki
2
Vim no encontraría ningún ^ M o \ r, ¡pero esto funcionó para mí! Gracias @sarnold
7ochem
parece que git es demasiado tonto para detectar esto como un cambio de carácter único. Ejecuté esto en Vim y git diffmuestra cada línea eliminada y cada línea agregada: /
Tommy
Tommy, eso es una limitación diff, no en git.
Spidey
34

Puedes hacerlo:

:set fileformats=dos

Ocultará los ^M's, sin tocar el archivo.

jqno
fuente
17

Hay un programa llamado dos2unix que debería eliminarlos por ti. Windows usa diferentes caracteres de final de línea, por eso sucede eso.

Adam Lassek
fuente
6

Esto funcionó para mí en un archivo que tenía todo en una línea:

Primero encuentra todos los partidos

:%s/^M//

(Para obtener ^M, presione ^ V ^ M, donde ^ está Ctrlen la mayoría de los teclados)

Luego reemplace con saltos

:%s//\r/g

El comando combinado sería:

:%s/^M/\r/g
TheRealKingK
fuente
Gracias, se preguntó cómo ingresar Ctrl-M en la búsqueda de reemplazo.
Roboprog
2

Tiendo a ejecutar archivos afectados fromdosantes de volver a abrirlos. fromdoses parte del paquete tofrodos .

Ted Percival
fuente
1

El origen del problema puede haber sido a través de una transferencia FTP. Cuando envíe estos archivos FTP de un cuadro a otro, asegúrese de usar transferencias ASCII. Use el comando "ASC".

Spencer Ruport
fuente
0
" put this in your ~/.vimrc file and :source ~/.vimrc
" then you can do: Dos2Unix
" dos2unix ^M
fun! Dos2unixFunction()
    let _s=@/
    let l = line(".")
    let c = col(".")
    try
        set ff=unix
        w!
        "%s/\%x0d$//e
    catch /E32:/
        echo "Sorry, first save the file."
    endtry
    let @/=_s
    call cursor(l, c)
endfun
com! Dos2Unix keepjumps call Dos2unixFunction()
SergioAraujo
fuente
0

mcedit: shift + f2, establecer formato unix (LF), ok

Vasily Chapaev
fuente