Apa arti karakter M dalam Vim?


500

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


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).


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.


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

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

19

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

dos2unix file.txt 

Itu mengkonversi file teks dari dos ke format unix.


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.


9

Di Unix mungkin lebih mudah menggunakan perintah 'tr'.

cat file1.txt | tr "\r" "\n" > file2.txt

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).




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


2

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

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


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.


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 ....


0

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.