^ 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?


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)


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

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.


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.


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

Obrigado, queria saber como realmente inserir Ctrl-M na busca e substituição!
Roboprog


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".


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()

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.