O que significa ^ M no Vim?

500

Eu continuo recebendo ^Mcaracteres no meu vimrc e isso quebra minha configuração.

Máx.
fonte
35
Entre este é um ótimo recurso.
Lightness Races in Orbit
@LightnessRacesinOrbit - Hm, agora funciona de formas também. Retirei meu comentário dizendo que o link estava morto.
ArtOfWarfare
3
Espelho para o link @LightnessRacesinOrbit, que está em baixo no momento: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls
4
Digitar :digraphsno vim mostra a tabela do dígrafo à qual @LightnessRacesinOrbit vinculou.
askewchan
1
Ao tentar substituir esse tipo de caractere usando php, tente esta preg_replace('/[\x01]/', ' ' ,$str); Espero que ajude.
Rachel Geller

Respostas:

561

O Unix usa 0xA para um caractere de nova linha. O Windows usa uma combinação de dois caracteres: 0xD 0xA. 0xD é o caractere de retorno de carro. ^Macontece que o vim exibe 0xD (0x0D = 13, M é a 13ª letra do alfabeto inglês).

Você pode remover todos os ^Mcaracteres executando o seguinte:

:%s/^M//g

Onde ^Mé inserido pressionando Ctrle digitando, vseguido de me soltando Ctrl. Às vezes, isso é abreviado como ^V^M, mas observe que você deve inseri-lo como descrito na frase anterior, em vez de digitá-lo literalmente.

Esta expressão substituirá todas as ocorrências de ^Mcom a sequência vazia (ou seja, nada). Eu uso isso para se livrar de ^Marquivos copiados do Windows para Unix (Solaris, Linux, OSX).

Tomasz Stanczak
fonte
9
Caso você esteja no Windows, Ctrl + V provavelmente será mapeado para colar. Se for esse o caso, os padrões remapearão a tecla "escape de caractere especial" para Ctrl + Q.
R. Martinho Fernandes
8
A verdadeira questão é por que o Vim algumas vezes detecta automaticamente as terminações da linha e é exibido corretamente, outras vezes não.
24513 Scott
10
Você verá o ^Mcaractere se o arquivo tiver terminações de linhas incompatíveis. Use o comando fornecido pelo Tomasz e digite, :fileformat={unix|dos|mac}dependendo do sistema operacional que você está alvejando. Se houver apenas algumas linhas sem o ^Mpersonagem, você provavelmente desejará :fileformat=dos. Se você estiver editando arquivos em um editor que não seja o vim, verifique se ele está configurado para corresponder às terminações de linha (o Bloco de Notas não fará isso, mas qualquer editor respeitável como o Notepad ++ ou o TextMate fará).
Mikkel Paulson 27/05
9
Nota para iniciantes vi, esse comando precisa ser digitado manualmente. Apenas colá-lo em um terminal aberto com a viexecução resultará em um erro "padrão não encontrado".
IQAndreas 9/10
51
@bluesm Na verdade, eu precisava usar :%s/\r//gpara substituir os retornos de carro no meu arquivo. O padrão ^ V ^ M não pode ser encontrado no arquivo que eu tinha um monte de ^ personagens M no.
jonnybot
139
:%s/\r//g 

trabalhou para mim hoje. Mas minha situação pode ter sido um pouco diferente.

dlk5730
fonte
1
a opção g não é necessária, existe apenas uma nova linha por linha. :%s/\r//seria suficiente.
Frogcoder
7
A opção g pode muito bem ser necessária, porque um retorno de carro não é necessariamente uma nova linha. Quando aberto no modo Unix, o retorno de carro é apenas outro caractere e, quando aberto no modo Windows, o retorno de carro é especial apenas imediatamente seguido pelo avanço de linha.
Jonathan Baldwin
65

Para converter a nova linha em vez de removê-la:

:%s/\r/\r/g
Mori
fonte
2
O que isso realmente deveria fazer? Para mim, parece que está fazendo uma substituição de like por like, o que eu não posso imaginar mudaria alguma coisa. Estou perdendo algo especial sobre como a sintaxe funciona aqui?
Platinum Azure
16
@PlatinumAzure Não sei por que ninguém nunca pensou em responder sua pergunta. \rtem um comportamento diferente na parte de pesquisa versus a parte de substituição. Consulte stackoverflow.com/a/3834303, por exemplo.
Ou :%s/^V^M/^V^M/g veja aqui
tomd
@ TomD O link se refere à resposta que você está comentando.
precisa saber é o seguinte
Para mim, isso substituiu os caracteres irritantes por uma nova linha adicional. Resposta @ dlk5730 funcionou melhor para mim. ie:%s/\r//g
marcusshep
37

Provavelmente significa que você tem retornos de carro (sistemas operacionais diferentes usam maneiras diferentes de sinalizar o final da linha).

Use dos2unixpara corrigir os arquivos ou definir os formatos de arquivo no vim:

set ffs=unix,dos
cnicutar
fonte
19

Digamos que seu arquivo de texto seja - file.txt, e execute este comando -

dos2unix file.txt 

Ele converte o arquivo de texto dos para o formato unix.

akritaag
fonte
Funciona perfeitamente !
robe007
9

Eu obtive um arquivo de texto originalmente gerado em uma máquina Windows por meio de um usuário Mac e precisava importá-lo para um banco de dados MySQL Linux usando o load datacomando

Embora o VIM exibisse o caractere '^ M', nenhuma das opções acima funcionava para o meu problema específico, os dados eram importados, mas sempre estavam corrompidos. A solução foi bastante fácil no final (depois de muita frustração).

Solução: A execução de dos2unix DUAS VEZES no mesmo arquivo fez o truque! O uso do filecomando mostra o que está acontecendo ao longo do caminho.

$ file 'file.txt'
file.txt: ASCII text, with CRLF, CR line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text, with CRLF line terminators

$ dos2unix 'file.txt'
dos2unix: converting file file.txt to UNIX format ...
$ file 'file.txt'
file.txt: ASCII text

E a versão final do arquivo foi importada perfeitamente para o banco de dados.

Anthony Palmer
fonte
9

No Unix, é provavelmente mais fácil usar o comando 'tr'.

cat file1.txt | tr "\r" "\n" > file2.txt
Irving Rabin
fonte
9

Eu os removi com o sed:

sed -i -e 's/\r//g' <filename>

Também pode substituir por uma sequência ou caractere diferente:

sed -i -e 's/\r/string/g' <filename>

Esses sedcomandos funcionam na versão GNU / Linux, sedmas podem precisar de ajustes nos BSDs (incluindo o macOS).

Freedom_Ben
fonte
4

Você pode corrigir isso no vim usando

:1,$s/^V^M//g

onde ^ é o caractere de controle.

Scott C Wilson
fonte
2
Isso não explica o que ^Mé.
Lightness Races in Orbit
2
Ele não está realmente perguntando o que é, ele está perguntando como consertar. O que é um caractere de retorno de carro do DOS.
scott wilson.
3
Eu sei o que é isso O título da pergunta é "O que o caractere ^ M significa no Vim".
Lightness Races in Orbit
3

Esta é a única coisa que funcionou no meu caso:

:e ++ff=dos

:wq

Sardeep Lakhera
fonte
2

Se ele interromper sua configuração e os caracteres ^ M forem necessários nos mapeamentos, você poderá simplesmente substituir os caracteres ^ M por <Enter>ou mesmo <C-m>(ambos digitados como sequências simples de caracteres, com 7 e 5 caracteres, respectivamente).

Esta é a maneira única e portátil recomendada de armazenar códigos de chave especiais em mapeamentos

ver
fonte
2

No FreeBSD, você pode limpar o ^Mmanual digitando o seguinte:

:%s/ Ctrl+ V, depois Ctrl+ M, depois Ctrl+ Mnovamente.

Victor Ong
fonte
1

Se você não especificou um fileformatintencionalmente diferente (por exemplo, :e ++ff=unixpara um arquivo do Windows), é provável que o arquivo de destino tenha EOLs mistos.

Por exemplo, se um arquivo tiver algumas linhas com <CR><NL>finais e outros com <NL>finais, e fileformatfor definido unixautomaticamente pelo Vim ao lê-lo, ^M (<CR>)aparecerá. Nesses casos, fileformatsentra em jogo. Veja :help ffspara os detalhes.

ebk
fonte
0

Descobri que polui arquivos há semanas devido ao fato de que minha instância do Homebrew Mvim foi configurada para usar filetype = dos. Fez a alteração necessária em .vimrc ....

nichg
fonte
0

tente :%s/\^M//Pelo menos isso funcionou para mim.

xuc
fonte