^ M di akhir setiap baris dalam vim

132

Ketika saya mengedit file sumber menggunakan vim dan editor lain kadang-kadang di akhir baris saya mendapatkan karakter ^ M ini di akhir setiap baris. Saya pikir itu ada hubungannya dengan mengedit file di windows dan kemudian di linux. Bagaimana saya bisa menghapus semua ini secara otomatis?

DHamrick
sumber
18
Itu karena Windows menggunakan urutan dua karakter (biasanya ditulis "\ r \ n") untuk mewakili jeda baris, tetapi UNIX / Linux hanya menggunakan karakter kedua "\ n" untuk mewakili jeda baris. Jadi ketika Anda mengedit file teks Windows pada editor Linux, editor melihat karakter tambahan yang tidak dianggap sebagai bagian dari jeda baris, jadi itu mencoba untuk membuat mereka dan apa yang keluar adalah ^ M.
David Z
13
Ada sedikit lebih dari itu, David. Vim akan dengan senang hati mengedit file teks dengan ujung baris DOS tanpa menunjukkan semua ^Mitu. Satu-satunya indikasi yang Anda miliki saat mengedit file teks DOS di Vim adalah jika Anda memiliki nilai opsi %{&ff}Anda statusline. Vim menunjukkan ^Mkapan gaya garis akhir dicampur . Itu berarti Anda telah menggunakan editor teks yang tidak sepengetahuan Vim, yang belum mengikuti gaya pengakhiran baris yang ada, seperti yang Vim akan secara default. Jika Anda menggunakan Vim atau yang lain kaliber di Windows, Anda tidak akan mendapatkan ujung garis yang rusak seperti itu.
Warren Young

Jawaban:

128

Sebagai perintah, ketik

:%s/^M$//

(Untuk mendapatkan ^ M, tekan ^ V ^ M, di mana ^ adalah CTRL pada sebagian besar keyboard)

Tobias Baaz
sumber
62
juga,:% s / \ r $ // untuk menghindari kerumitan ^ V ^ M
glenn jackman
8
Atau, menyelamatkan karakter::%s/\r$
lihat
2
@sehe secara teknis menyimpan 2 karakter :)
Chris
@ glennjackman, tip Anda jauh lebih mudah, karena saya telah berjuang untuk mendapatkan ^ V + ^ M kalau itu tidak terjadi sama sekali. Yang saya dapatkan hanyalah konten di clipboard (karena ^ V efektif setiap kali, meskipun saya berulang kali mencoba dengan strategi yang berbeda untuk mendapatkan keduanya).
itsraghz
86

Salah satu cara mudah untuk menghapus akhir baris DOS adalah dengan menggunakan ffopsi:

:set ff=unix
:wq

Sekarang file Anda kembali ke cara lama-baik-Unix.

Jika Anda ingin menambahkan akhir baris DOS (untuk menjaga printer tetap bahagia, atau mentransfer file dengan teman Windows yang tidak memiliki alat bagus), Anda dapat pergi ke arah yang berlawanan dengan mudah:

:set ff=dos
:wq
sarnold
sumber
8
vim tidak menemukan ^ m, atau, atau akhiran baris lainnya, tetapi ini berhasil. Terima kasih :)
SgtPooki
2
Vim tidak akan menemukan ^ M atau apa pun, tetapi ini berhasil bagi saya! Terima kasih @sarnold
7ochem
tampaknya git terlalu bodoh untuk mendeteksi ini sebagai perubahan karakter tunggal. Saya menjalankan ini di Vim dan git diffmenunjukkan setiap baris dihapus dan setiap baris menambahkan: /
Tommy
Tommy, itu batasan diff, bukan pada git.
Spidey
34

Kamu bisa melakukan ini:

:set fileformats=dos

Ini akan menyembunyikan file ^M, tanpa menyentuh file.

jqno
sumber
17

Ada sebuah program bernama dos2unix yang harus menghapusnya untuk Anda. Windows menggunakan karakter akhir baris yang berbeda itulah sebabnya hal itu terjadi.

Adam Lassek
sumber
6

Ini berfungsi untuk saya dalam file yang memiliki segalanya dalam satu baris:

Pertama temukan semua kecocokan

:%s/^M//

(Untuk mendapatkan ^M, tekan ^ V ^ M, di mana ^ ada Ctrldi sebagian besar keyboard)

Kemudian ganti dengan baris baru

:%s//\r/g

Perintah gabungan adalah:

:%s/^M/\r/g
TheRealKingK
sumber
Terima kasih, bertanya-tanya bagaimana cara memasukkan Ctrl-M di search-replace!
Roboprog
2

Saya cenderung menjalankan file yang fromdosbermasalah sebelum membuka kembali. fromdosadalah bagian dari paket tofrodos .

Ted Percival
sumber
1

Asal usul masalah mungkin melalui transfer FTP. Saat Anda FTP file-file ini dari satu kotak ke yang lain, pastikan untuk menggunakan transfer ASCII. Gunakan perintah "ASC."

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

mcedit: shift + f2, atur format unix (LF), ok

Dengan mudah Chapaev
sumber