Vim mostra i simboli ^ M e non stanno scomparendo


1

Uso Vim 7.3 su Windows 7 e ho riscontrato un problema. I simboli ^Mnon scompaiono nonostante i miei sforzi, :e ++ff=dosnon aiuta.

Eventuali suggerimenti?

Risposte:


2

^ M di solito appare quando il file non è coerente rispetto ai terminatori di linea utilizzati. Prova quanto segue:

  • Crea testfileusando vim con poche righe casuali e scrivilo in modalità dos.
  • Quindi esegui (spero che tu abbia installato cygwin):

     sed '2s/.$//' testfile > corruptfile
    

    Ciò rimuoverà l'ultimo carattere della seconda riga, creando un'incoerenza nei terminatori di riga utilizzati.

  • Apri corruptfilecon vim. ^ Verranno visualizzati i simboli M in modo da renderti consapevole dell'incongruenza.

Nella vita reale, i programmi che sono stati scritti pensando a un solo tipo di terminatore di riga possono produrre tali incoerenze. Mentre queste incoerenze sembrano innocenti, possono causare problemi con altri programmi. Ad esempio, sovversione non consente l'aggiunta di file con terminatori di riga incoerenti a un repository. Altri programmi potrebbero semplicemente fallire silenziosamente.

Per far sparire ^ M basta fare una sostituzione globale:

:% s/^M//g

Il ^Mè prodotto premendo:Ctrl+v <Enter>

Quindi riscrivere il file nel formato desiderato:

:set ff=dos
:w

Conosco questo trucco e funziona. Ma perché questi simboli ^ M compaiono nei file creati su Windows (non in Vim) durante l'accesso da Windows? L'ho incontrato molte volte e non capisco il logick.
OlegG,

Il problema esiste per il completamento del file nella riga di comando , non nell'editor archiviato. Ad esempio, quando scrivo e: filenam<tab>e aspetto che Vim sia stato digitato filenam, Vim non viene completato.
OlegG,

Ho aggiunto una spiegazione per la comparsa di ^ M. Potresti approfondire di più su quale riga di comando intendi? Windows shell (cmd)? Bash shell sotto Cygwin? Qualcos'altro?
m000,

È la shell di Windows (cmd). Non ho Cygwin (invece Mingw). E riguardo a ^ M: i file sono stati creati in Code :: Blocks e poi ho provato a modificarli in Vim. Ho suggerito che ^ M sono apparsi a causa della presenza di diverse non- CRLFlinee. Ma non ha trovato tali righe.
OlegG,

Se la parte 1 riguarda la shell di Windows, consiglio vivamente di suddividere questa domanda in due domande separate. Hai verificato, ad esempio, hexdump -cche tutte le righe del tuo file utilizzano lo stesso terminatore di riga? Un oneliner per questo sarebbe sed -e 's/[[:print:]]*//g' file | hexdump -c. Con un file coerente, lo stesso modello di caratteri di terminazione di riga verrà ripetuto sull'output. (scusate il gergo unix :-))
m000,

1

Il carattere che vim viene visualizzato come ^ M è CR(ritorno a capo, carattere ASCII 13). Windows utilizza sia CRe LF(nuova riga, carattere ASCII 10) per codificare le interruzioni di riga nei file di testo. Linux / Unix usano solo LFper codificare le interruzioni di riga e solo Mac OS usa CR.

Se si apre un file di testo creato su un computer Windows su una casella Linux, è possibile che vengano visualizzati CRcaratteri finali in ogni riga. Esistono diversi modi per rimuoverli. Uno è di sostituirli in vim come suggerito m000, un altro sarebbe al recodefile:

recode ibmpc..latin1 SOME.TXT

Se leggerai la mia domanda in modo più accurato, vedrai che uso Vim in Windows per modificare anche i file creati in Windows.
OlegG,

1
Può succedere anche su Windows se almeno una linea usa solo LFsenza CR. Vedi questa risposta a una domanda simile su StackTranslate.it.
Ansgar Wiechers,

"Se apri un file di testo creato su un computer Windows su una scatola Linux, vedrai un trailing ...": Questo vale solo per gli editor di classe b che non sono in grado di gestire correttamente i terminatori di linea non nativi. Sicuramente non vero per Vim.
m000,

@ m000 L'ho cambiato in "may see". E anche vim verrà visualizzato CRquando almeno una riga usa solo LF, vedi il mio altro commento sopra.
Ansgar Wiechers,

2
@AnsgarWiechers Ie vim mostrerà i terminatori di linea quando non sono coerenti attraverso il file :-)
m000
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.