^ M no final de cada linha no vim

132

Quando estou editando arquivos de origem usando o vim e outros editores, às vezes no final da linha, recebo esses caracteres ^ M no final de cada linha. Eu acho que tem algo a ver com a edição de um arquivo no Windows e depois no Linux. Como posso remover tudo isso automaticamente?

DHamrick
fonte
18
Isso ocorre porque o Windows usa uma sequência de dois caracteres (normalmente escrita "\ r \ n") para representar uma quebra de linha, mas o UNIX / Linux usa apenas o segundo caractere "\ n" para representar uma quebra de linha. Portanto, quando você edita um arquivo de texto do Windows em um editor Linux, o editor vê caracteres extras que não consideram parte das quebras de linha e, portanto, tenta renderizá-los e o que sai é ^ M.
22660 David Z
13
Há um pouco mais do que isso, David. O Vim editará felizmente um arquivo de texto com terminações de linha do DOS sem mostrar todos esses ^Ms. A única indicação que você tem ao editar um arquivo de texto DOS no Vim é se você possui %{&ff}o statuslinevalor da opção. O Vim mostra ^Mquando o estilo de final de linha é misto . Isso significa que você usou um editor de texto que não é tão experiente quanto o Vim, que não segue o estilo de final de linha existente, como o Vim por padrão. Se você usa o Vim ou qualquer outra coisa de seu calibre no Windows, não terá terminações de linhas destruídas assim.
Warren Young

Respostas:

128

Como um comando, digite

:%s/^M$//

(Para obter ^ M, pressione ^ V ^ M, onde ^ é CTRL na maioria dos teclados)

Tobias Baaz
fonte
62
Também,:% s / \ r $ // para evitar o ^ V ^ aborrecimento M
Glenn Jackman
8
Ou, salvando um personagem::%s/\r$
veja
2
@sehe tecnicamente salva 2 caracteres :)
Chris
@glennjackman, sua dica foi muito mais fácil, pois eu estava lutando para obter o ^ V + ^ M onde isso não estava acontecendo. Tudo o que eu estava recebendo era o conteúdo da área de transferência (como ^ V era eficaz o tempo todo, apesar de minhas repetidas tentativas com estratégias diferentes para obter os dois).
itsraghz 24/03
86

Uma maneira fácil de eliminar as terminações de linha do DOS é usar a ffopção:

:set ff=unix
:wq

Agora seu arquivo está de volta à boa e velha maneira Unix.

Se você deseja adicionar as terminações de linha do DOS (para manter uma impressora feliz ou transferir arquivos com os amigos do Windows que não possuem boas ferramentas), você pode ir na direção oposta facilmente:

:set ff=dos
:wq
sarnold
fonte
8
O vim não estava encontrando ^ m, ou \ ou qualquer outra terminação de linha, mas funcionou. Obrigado :)
SgtPooki
2
Vim não encontraria ^ M ou \, mas isso funcionou para mim! Obrigado @sarnold
7ochem
parece que o git é burro demais para detectar isso como uma única mudança de caractere. Eu executei isso no Vim e os git diffshows todas as linhas excluídas e todas as linhas adicionadas: /
Tommy
Tommy, isso é uma limitação diff, não git.
Spidey
34

Você consegue fazer isso:

:set fileformats=dos

Ele ocultará ^Mos arquivos sem tocar no arquivo.

jqno
fonte
17

Existe um programa chamado dos2unix que deve remover esses para você. O Windows usa diferentes caracteres de final de linha, e é por isso que isso acontece.

Adam Lassek
fonte
6

Isso funcionou para mim em um arquivo que tinha tudo em uma linha:

Encontre primeiro todos os jogos

:%s/^M//

(Para obter ^M, pressione ^ V ^ M, onde ^ está Ctrlna maioria dos teclados)

Em seguida, substitua por novas linhas

:%s//\r/g

O comando combinado seria:

:%s/^M/\r/g
TheRealKingK
fonte
Obrigado, queria saber como realmente inserir Ctrl-M na busca e substituição!
Roboprog
2

Costumo executar arquivos afetados fromdosantes de reabri-los. fromdosfaz parte do pacote tofrodos .

Ted Percival
fonte
1

A origem do problema pode ter sido através de uma transferência FTP. Ao enviar esses arquivos por FTP de uma caixa para outra, use transferências ASCII. Use o comando "ASC".

Spencer Ruport
fonte
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
fonte
0

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

Vasily Chapaev
fonte