Emacs dosyalarında sürekli olarak görünen bu ^ M nedir?


157

Bu yüzden metin arkadaşıyla ilgili olabileceğini düşünüyorum, ancak küçük bir ekipte çalışıyoruz ve git'te neredeyse aynı dosyaların tam dosya çakışmalarıyla ilgili bazı sorunlar yaşıyoruz, çünkü bir dalın her satırında bir ^ M eklenmiş.

Bu gizemli ^Mkarakterin ne yapması gerekiyordu ve nereden geliyor olabilir?

Geliştiricilerimiz Windows / Mac'te emacs, Mac'te TextMate, Mac'te coda ve bazen wp-admin metin düzenleyicisini kullanıyor.

Hiç kimse bu sorunlardan birinden kaynaklanıyor mu?


3
Değer için: ^ yerine
Broam

3
Daha büyük sorun, bu konuda ne yapacaksınız? Şansı vardır, Emacs onları tanıtmıyor. Ekibiniz dosyaların DOS biçiminde (^ M) veya Unix biçiminde (^ ^ olmayan) olup olmadığına karar vermeli ve bunu uygulamalıdır.
Trey Jackson

Yanıtlar:


111

In git-yapılandırmasına , set core.autocrlfiçin truegit otomatik Örneğin sizin platformu için doğru satır sonları dönüştürmek küresel ayar için bu komutu çalıştırmak yapmak:

git config --global core.autocrlf true

6
Bence bu en iyi cevap çünkü soruyu OP bağlamında, yani git şeklinde cevaplıyor.
neontapir

'~ / .Gitconfig' dosyamda zaten "[core] \ n autocrlf = true" var, ama yine de bana '^ m' karakterlerle git klon code.google.com/p/pytomtom '?? ??
Büyük Zengin

11
Bu cevap SADECE platformunuz Windows ise geçerlidir! Mac / Linux üzerinde çalışıyorsanız "true", "input" haline gelmelidir! Help.github.com/articles/dealing-with-line-endings ve buraya bakın : stackoverflow.com/questions/9225599/…
K.-Michael Aye

UYARI: git, satır sonlarının önemsiz olduğunu ve değiştirilmesi gerektiğini yanlış bir şekilde "tahmin" ettiğinde, bu yanıt daha sonra birçok dosyayı bozar. Bu, bu karakterlerin bir veri dosyasında bulunduğu yazılım projeleri için öldürücüdür (evet, bununla yakıldım, kırılmaya acı verdim). Bu korkunç bir çözüm IMHO.
Adam

@Adam Satır sonlarındaki değişikliği tam olarak kırmak nedir? Verilerle çalışırken nerede sorun yaşadınız? Hiçbir şeyi etkilememelidir, satır sonunu işaretlemenin sadece farklı bir yoludur. Sadece merak ediyorum.
MBI

97

Birisi satır sonu karakterlerini doğru bir şekilde dönüştürmüyor .

Onların CRLF sevdikleri gibi Windows halk olduğunu varsayalım. Unix, LF'yi ve Mac, Unix yolu gösterilinceye kadar CR'yi seviyordu.


12
Açıklığa kavuşturmak için: Mac sürüm 10'a (OS X) kadar CR kullandı, şimdi LF kullanıyor.
Mikael S

34
CR ve LF terimleri daktilo günlerinden geldiğinden, Windows yolunun daha mantıklı olduğunu hissediyorum. Her ikisini de yapmak zorundaydınız: a Satır noktasını satırın başına getirmek için Satır Başı ve bir satır aşağı kaydırmak için Satır Besleme. Bir daktilodaki Mac OS Classic yolu (CR) aynı satırın üzerine yazmaya devam edecekti. Bir daktilodaki Unix yolu (LF), sayfanın tam genişliğine ulaşana kadar kademeli metin çıktısı verir. :)
Diğerleri

114
@ Diğer: sadece "daktiloya benzetmek istiyoruz" anlamında daha mantıklı. Bunun neden uzaktan bile faydalı olduğunu anlamaya başlayamıyorum.
Bryan Oakley

29
@ Diğerleri neden bir karakterle temsil edilebildiğinde iki karakterli bir şeyi temsil edesiniz?
Matthew G

13
@Matthew G: Birçoğumuz üzerinde anlaştığımız sürece her şey bir karakterle temsil edilebilir. Bu demek oluyor ki? Tüm mesajlarımızı noktalama işaretleri, büyük harfler ve yeni bir satırdaki her cümle olmadan yazabiliriz ve herkes bunu anlardı. Bu demek oluyor ki? "Yapabileceğimiz bir şey yapmak" ile ilgili değil. Bununla birlikte, LF'yi de tercih ederim.
jaffog

33

^Molduğu 0x0d, satırbaşı karakteri yani. Ekranınız şöyle görünüyorsa

satır 1 ^ M
satır 2 ^ M

Windows'taki yeni satırsonu dizisi CR LF( 0x0d 0x0a) olduğu için dosyanın Windows'dan gelmiş olması gerekirken standart satırsonu dizisi yalnızca LFUnices'ten oluşur .

Dosya bir Mac OS 9 veya daha eski bir sistemden gelmiş olsaydı,

satır 1 ^ Mline 2 ^ M

çünkü satır başlarını izleyen satır beslemeleri olmazdı.


29

^ M'nin git'te kaybolması için şunu yazın:

git config --global core.whitespace cr-at-eol

Kredi: https://lostechies.com/keithdahlby/2011/04/06/windows-git-tip-hide-carriage-return-in-diff/


1
hiçbir şeyi değiştirmez.
Vivex

3
Git dif kullanıldığında sadece ^ M ekrandan kayboluyor, ancak hala orada
FernandoZ

1
Gerçekten de, ^ M'yi boşluk olarak görüntüler, ancak git diffdosyaları karşılaştırırken ^ M'yi de dikkate alır. Bu ayarı git config --global --unset core.whitespace( bu iş parçacığından ) ile kaldırın .
miguelmorin

1
Ayrıca --global, yalnızca geçerli repo'yu yapılandırmayı da ihmal edebilirsiniz .
Derek Veit

8

DOS stili satır sonları ve Unix stili arasındaki farkla ilgilidir. Wikipedia makalesine göz atın . Yardım etmek için bir dos2unix aracı bulabilir veya bunları kendiniz düzeltmek için küçük bir komut dosyası yazabilirsiniz.

Düzenleme : Aşağıdaki Python örnek kodunu burada buldum :

string.replace( str, '\r', '' )

3
Emacs'ta bu <code> M-: (replace-string "\ r" "") </code> olur.
huaiyuan

7

Mac OS'de Android Studio (JetBrains IntelliJ IDEA ) kullanıyorum ve sorunum ^ M'nin GitHub'daki çekme isteğimdeki bazı dosyalarda görünmeye başlamasıydı . Benim için çalışan bir dosya için satır ayırıcısını değiştirmekti.

Editör istenen dosyayı açın etmek halindeyken Dosya için halindeyken Hattı Ayırıcı sonra sizin için en iyi seçeneği (benim için öyleydi LF - Unix ve OS X (\ n) )

Bir sonraki makaleye göre, bu sorun işletim sistemleri arasındaki karışık satır sonlarının bir sonucudur: http://jonathonstaff.com/blog/issues-with-line-endings/

Ve daha fazla bilgiyi burada bulabilirsiniz: https://www.jetbrains.com/help/idea/configuring-line-separators.html#d84378e48

resim açıklamasını buraya girin


6

query-replace yerine Mx delete-trailing-whitespace'i de kullanabilirsiniz.


bu benim için işe yaramadı ... Tüm metni seçtim ve komutu çalıştırdım.
ᐅ devrimbaris

bu benim için çalıştı. Teşekkürler. @devrimbaris, hiçbir şey seçmenize gerek yok, sadece komutu çalıştırın. 'M' meta anahtar veya çıkış anahtarıdır. Yani Mx kaçar, sonra x olur. Sonra delete-trailing-whitespace yazın ve return tuşuna basın.
astromax

5

Pot sizin aşağıdaki ~/.emacs(veya eqiuvalent)

(defun dos2unix ()
  "Replace DOS eolns CR LF with Unix eolns CR"
  (interactive)
    (goto-char (point-min))
      (while (search-forward "\r" nil t) (replace-match "")))

ve sonra sadece kullanabilirsiniz M-x dos2unix.


4

^MEmacs satırın sonunda satır başı (\ r) ve ardından satır beslemesi (\ n) gösterilir. Bir kişi Windows'ta dosyaları düzenlerse (satır sonu satır başı ve satırsonu karakterlerinin birleşimi ise) ve Unix veya Linux'ta (satır sonu yalnızca satırsonu karakteriyse) bunu sık sık görürsünüz.

Karakterlerin kombinasyonu genellikle zararlı değildir. Kaynak denetimi kullanıyorsanız, metin dosyası teslim etme biçimini satırların sizin için sihirli bir şekilde ayarlanması için yapılandırabilirsiniz. Alternatif olarak, dosyaları sizin için otomatik olarak "düzelten" check-in ve check-out tetikleyicileri kullanabilirsiniz. Veya işleri manuel olarak ayarlamak için dos2unix gibi bir araç kullanabilirsiniz .


2

Herkesin bahsettiği gibi. Farklı çizgi sonlandırma tarzı. MacOSX, Unix satır sonlarını kullanır - yani LF (satır besleme).

Windows, satır sonu olarak hem CR (satır başı) hem de LF (satır besleme) kullanır. Hem pencereleri hem de mac'u kullandığınızdan beri sorunun kaynaklandığı yer budur.

Pencerelerde bir dosya oluşturup mac'a getirirseniz, satırların sonunda bu ^ M karakterlerini görebilirsiniz.

Bunları kaldırmak istiyorsanız emacs'ta bunu çok kolay yapabilirsiniz. Sadece ^ M karakterini vurgulayın ve kopyalayın ve bir query-replace ^ M ile yapın ve bitirdiniz.

EDIT: Yardımcı olabilecek diğer bazı bağlantılar. http://xahlee.org/emacs/emacs_adv_tips.html

Bu, emac'ları belirli bir satır sonu stili kullanacak şekilde yapılandırmanıza yardımcı olur. http://www.emacswiki.org/emacs/EndOfLineTips


2

Bu konuyla bir süre önce karşılaştım. ^ M, bir Satır Başı'nı temsil eder ve Ctrl-Q Ctrl-M(Bu bir değişmez ^ M oluşturur) üzerinde arama yapmak Emacs içindeki bu karakterle başa çıkmanızı sağlar. Bu çizgiler boyunca bir şeyler yaptım:

M-x replace-string [ENTER] C-q C-m [ENTER] \n [ENTER]

2

Sisteminizde dos2unix yardımcı programı yüklü değilse, Windows bitiş karakterlerinden kurtulmak için kendiniz bir tane oluşturabilirsiniz:

vi ~/dos2unix.bash:

aşağıdaki içeriğe sahip

#!/bin/bash
tr -d '\r' < $1 > repl.tmp
mv -f repl.tmp $1

~ / .Bashrc'nize satırı ekleyin:

alias 'dos2unix=~/dos2unix.bash'

uygulama

dos2unix file_from_PC.txt

file_from_PC.txt dosyasındaki satır sonlarında ^ M karakterlerini kaldıracak. Bunlara sahip olup olmadığınızı kedi kullanarak kontrol edebilirsiniz:

cat -v file_from_PC.txt

1

Ayrıca bakınız:

Emacs ^ M gizleme

^ M karakterlerini kaldırmayı ve ekibinize yeniden göndermeyi seçerseniz dikkatli olun. Daha sonra satır başı olmayan bir dosya görebilirler.


0

Benim için çözüm, bu Emacs Wiki Makalesinde bulunan aşağıdaki elisp işlevini kullanmaktı .

 (defun dos2unix ()
      "Not exactly but it's easier to remember"
      (interactive)
      (set-buffer-file-coding-system 'unix 't) )

M-x dos2unixArabelleği işlevini yürütün ve dosyayı kaydedin, hepsi ^Mkaybolacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.