Apa arti karakter M dalam Vim?

500

Saya terus mendapatkan ^Mkarakter di vimrc saya dan itu merusak konfigurasi saya.

Maks
sumber
35
BTW ini adalah sumber yang bagus.
Lightness Races dalam Orbit
@LightnessRacesinOrbit - Hm, ia berfungsi juga sekarang. Saya telah menarik kembali komentar saya mengatakan tautannya sudah mati.
ArtOfWarfare
3
Mirror untuk tautan @LightnessRacesinOrbit, yang sedang down saat ini: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls
4
Mengetik :digraphsdalam vim menunjukkan tabel-digraf yang terhubung dengan @LightnessRacesinOrbit.
askewchan
1
Ketika mencoba mengganti karakter semacam ini menggunakan php, coba preg_replace('/[\x01]/', ' ' ,$str); Semoga ini bisa membantu.
Rachel Geller

Jawaban:

561

Unix menggunakan 0xA untuk karakter baris baru. Windows menggunakan kombinasi dua karakter: 0xD 0xA. 0xD adalah karakter carriage return.^Mkebetulan cara vim menampilkan 0xD (0x0D = 13, M adalah huruf ke-13 dalam alfabet bahasa Inggris).

Anda dapat menghapus semua ^Mkarakter dengan menjalankan yang berikut:

:%s/^M//g

Di mana ^Mdimasukkan dengan menahan Ctrldan mengetik vdiikuti oleh m, dan kemudian melepaskan Ctrl. Ini terkadang disingkat ^V^M, tetapi perhatikan bahwa Anda harus memasukkannya seperti yang dijelaskan dalam kalimat sebelumnya, daripada mengetiknya secara harfiah.

Ekspresi ini akan menggantikan semua kemunculan ^Mdengan string kosong (yaitu tidak ada). Saya menggunakan ini untuk menyingkirkan ^Mfile yang disalin dari Windows ke Unix (Solaris, Linux, OSX).

Tomasz Stanczak
sumber
9
Untuk berjaga-jaga jika Anda menggunakan Windows, Ctrl + V mungkin akan dipetakan untuk menempel. Jika itu yang terjadi maka defaultnya memetakan kembali "special character escape" untuk Ctrl + Q.
R. Martinho Fernandes
8
Pertanyaan sebenarnya adalah mengapa Vim terkadang secara otomatis mendeteksi ujung garis dan menampilkannya dengan benar, dan terkadang tidak.
Scott
10
Anda akan melihat ^Mkarakternya jika file tersebut memiliki ujung garis yang tidak cocok. Gunakan perintah yang disediakan oleh Tomasz, lalu ketik :fileformat={unix|dos|mac}tergantung pada OS yang Anda targetkan. Jika hanya ada beberapa baris tanpa ^Mkarakter, Anda mungkin ingin :fileformat=dos. Jika Anda mengedit file dalam editor selain vim, pastikan itu dikonfigurasi untuk mencocokkan akhir baris (Notepad tidak akan melakukan ini, tetapi editor yang memiliki reputasi baik seperti Notepad ++ atau TextMate akan).
Mikkel Paulson
9
Catatan untuk pemula vi, perintah itu harus diketik secara manual. Hanya menempelkannya ke terminal terbuka dengan vimenjalankan akan menghasilkan kesalahan "pola tidak ditemukan".
IQAndreas
51
@ Bluesm saya benar-benar perlu digunakan :%s/\r//guntuk mengganti carriage return dalam file saya. Pola ^ V ^ M tidak dapat ditemukan dalam file yang saya punya banyak karakter ^ M.
jonnybot
139
:%s/\r//g 

bekerja untuk saya hari ini. Tetapi situasi saya mungkin sedikit berbeda.

dlk5730
sumber
1
opsi g tidak diperlukan, hanya ada satu baris baru per baris. :%s/\r//sudah cukup.
frogcoder
7
Opsi g mungkin sangat dibutuhkan, karena carriage return belum tentu merupakan baris baru. Ketika dibuka dalam mode Unix, carriage return hanyalah karakter lain, dan ketika dibuka dalam mode Windows, carriage return hanya spesial segera diikuti oleh umpan baris.
Jonathan Baldwin
65

Untuk menerjemahkan baris baru alih-alih menghapusnya:

:%s/\r/\r/g
Mori
sumber
2
Apa yang sebenarnya harus dilakukan? Bagi saya sepertinya melakukan substitusi like for like, yang saya tidak bisa bayangkan akan mengubah apa pun. Apakah saya melewatkan sesuatu yang istimewa tentang bagaimana sintaks bekerja di sini?
Platinum Azure
16
@PlatinumAzure Saya tidak tahu mengapa tidak ada yang pernah berpikir untuk menjawab pertanyaan Anda. \rmemiliki perilaku yang berbeda di bagian pencarian vs bagian ganti. Lihat stackoverflow.com/a/3834303 misalnya.
Atau :%s/^V^M/^V^M/g lihat di sini
tomd
@TomD Tautan merujuk ke jawaban yang Anda komentari.
bzeaman
Bagi saya ini menggantikan karakter yang mengganggu dengan baris baru tambahan. @ dlk5730 jawaban bekerja lebih baik untuk saya. yaitu:%s/\r//g
marcusshep
37

Ini mungkin berarti Anda mendapatkan carriage return (sistem operasi yang berbeda menggunakan berbagai cara menandakan ujung saluran).

Gunakan dos2unixuntuk memperbaiki file atau mengatur format file di vim:

set ffs=unix,dos
cnicutar
sumber
19

Katakanlah file teks Anda adalah - file.txt, lalu jalankan perintah ini -

dos2unix file.txt 

Itu mengkonversi file teks dari dos ke format unix.

akritaag
sumber
Bekerja dengan sempurna!
robe007
9

Saya mendapat file teks yang awalnya dibuat di Mesin Windows melalui pengguna Mac dan perlu mengimpornya ke Linux MySQL DB menggunakan load data perintah.

Meskipun VIM menampilkan karakter '^ M', tidak ada yang di atas berfungsi untuk masalah khusus saya, data akan diimpor tetapi selalu rusak dalam beberapa cara. Solusinya cukup mudah pada akhirnya (setelah banyak frustrasi).

Solusi: Menjalankan dos2unix DUA KALI pada file yang sama berhasil! Menggunakan fileperintah menunjukkan apa yang terjadi di sepanjang jalan.

$ 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

Dan versi final file diimpor dengan sempurna ke dalam basis data.

Anthony Palmer
sumber
9

Di Unix mungkin lebih mudah menggunakan perintah 'tr'.

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

Saya menghapus semuanya dengan sed:

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

Bisa juga diganti dengan string atau karakter yang berbeda:

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

sedPerintah - perintah itu berfungsi pada versi GNU / Linux sedtetapi mungkin perlu mengubah pada BSD (termasuk macOS).

Freedom_Ben
sumber
4

Anda dapat memperbaikinya di vim menggunakan

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

di mana ^ adalah karakter kontrol.

Scott C Wilson
sumber
2
Ini tidak menjelaskan apa ^Mitu.
Lightness Races dalam Orbit
2
Dia tidak benar-benar bertanya apa itu, dia bertanya bagaimana cara memperbaikinya. Apa itu karakter carriage return dari DOS.
Scott C Wilson
3
Saya tahu apa itu. Judul pertanyaannya adalah "Apa arti karakter M dalam Vim".
Lightness Races dalam Orbit
3

Ini adalah satu-satunya hal yang berhasil dalam kasus saya:

:e ++ff=dos

:wq

Sardeep Lakhera
sumber
2

Jika itu merusak konfigurasi Anda, dan karakter ^ M diperlukan dalam pemetaan, Anda dapat dengan mudah mengganti karakter ^ M dengan <Enter>atau bahkan<C-m> (keduanya diketikkan sebagai urutan karakter sederhana, jadi masing-masing 7 dan 5 karakter).

Ini adalah cara portabel yang disarankan untuk menyimpan kode kunci khusus dalam pemetaan

lihat
sumber
2

Di FreeBSD, Anda dapat menghapus ^Msecara manual dengan mengetik berikut ini:

:%s/ Ctrl+ V, lalu Ctrl+ M, lalu Ctrl+ Mlagi.

Victor Ong
sumber
1

Jika Anda tidak secara spesifik menentukan yang berbeda fileformat(misalnya, :e ++ff=unixuntuk file Windows), kemungkinan file target memiliki EOL campuran.

Misalnya, jika file memiliki beberapa baris dengan <CR><NL>ujung dan lainnya dengan <NL>ujung, dan fileformatdiatur unixsecara otomatis oleh Vim ketika membacanya, ^M (<CR>)akan muncul. Dalam kasus seperti itu, fileformatsikut bermain. Lihat :help ffsdetailnya.

surut
sumber
0

Saya telah menemukan bahwa saya telah mencemari file selama berminggu-minggu karena fakta bahwa instance Homebrew Mvim saya diatur untuk menggunakan filetype = dos. Membuat perubahan yang diperlukan dalam .vimrc ....

nichg
sumber
0

coba :%s/\^M//Setidaknya ini bekerja untuk saya.

xuc
sumber