^ M có nghĩa là gì trong Vim?


500

Tôi tiếp tục nhận được ^Mký tự trong vimrc của tôi và nó phá vỡ cấu hình của tôi.


35
BTW đây là một nguồn tài nguyên tuyệt vời.
Các cuộc đua nhẹ nhàng trong quỹ đạo

@LightnessRacesinOrbit - Hừm, giờ nó cũng hoạt động. Tôi đã rút lại nhận xét của mình nói rằng liên kết đã chết.
ArtOfWarfare

3
Gương cho liên kết @LightnessRacesinOrbit, đó là xuống vào lúc này: fifi.org/doc/vim/html/digraph.html#digraph-table
alexpls

4
Nhập vào :digraphstrong vim hiển thị bảng sơ đồ mà @LightnessRacesinOrbit liên kết đến.
askewchan

1
Khi cố gắng thay thế loại nhân vật này bằng php, hãy thử preg_replace('/[\x01]/', ' ' ,$str); Hy vọng điều này có ích.
Rachel Geller

Câu trả lời:


561

Unix sử dụng 0xA cho một ký tự dòng mới. Windows sử dụng kết hợp hai ký tự: 0xD 0xA. 0xD là ký tự trở lại vận chuyển. ^Mtình cờ là cách vim hiển thị 0xD (0x0D = 13, M là chữ cái thứ 13 trong bảng chữ cái tiếng Anh).

Bạn có thể xóa tất cả các ^Mký tự bằng cách chạy như sau:

:%s/^M//g

Nơi ^Mđược nhập bằng cách giữ Ctrlvà gõ vtheo sau m, và sau đó phát hành Ctrl. Điều này đôi khi được viết tắt là ^V^M, nhưng lưu ý rằng bạn phải nhập nó như được mô tả trong câu trước, thay vì gõ nó ra theo nghĩa đen.

Biểu thức này sẽ thay thế tất cả các lần xuất hiện ^Mbằng chuỗi rỗng (nghĩa là không có gì). Tôi sử dụng điều này để loại bỏ các ^Mtệp được sao chép từ Windows sang Unix (Solaris, Linux, OSX).


9
Chỉ trong trường hợp bạn đang ở trên Windows, Ctrl + V có thể sẽ được ánh xạ để dán. Nếu đó là trường hợp mặc định, ánh xạ lại phím "thoát ký tự đặc biệt" thành Ctrl + Q.
R. Martinho Fernandes

8
Câu hỏi thực sự là tại sao đôi khi Vim tự động phát hiện các kết thúc dòng và hiển thị chính xác, và đôi khi không.
Scott

10
Bạn sẽ thấy ^Mký tự nếu tệp có kết thúc dòng không khớp. Sử dụng lệnh được cung cấp bởi Tomasz, sau đó nhập :fileformat={unix|dos|mac}tùy thuộc vào hệ điều hành bạn đang nhắm mục tiêu. Nếu chỉ có một vài dòng mà không có ^Mnhân vật, có lẽ bạn muốn :fileformat=dos. Nếu bạn đang chỉnh sửa các tệp trong trình soạn thảo không phải là vim, hãy chắc chắn rằng nó được cấu hình để khớp với các kết thúc dòng (Notepad sẽ không làm điều này, nhưng bất kỳ trình chỉnh sửa có uy tín nào như Notepad ++ hoặc TextMate sẽ).
Mikkel Paulson

9
Lưu ý cho người mới bắt đầu vi, lệnh đó cần phải được nhập bằng tay. Chỉ cần dán nó vào một thiết bị đầu cuối mở với viviệc chạy sẽ dẫn đến lỗi "không tìm thấy mẫu".
IQAndreas

51
@bluesm Tôi thực sự cần sử dụng :%s/\r//gđể thay thế trả lại vận chuyển trong tệp của mình. Không thể tìm thấy mẫu ^ V ^ M trong tệp Tôi có một loạt các ký tự ^ M trong
jonnybot

139
:%s/\r//g 

làm việc cho tôi ngày hôm nay. Nhưng tình hình của tôi có thể hơi khác một chút.


1
tùy chọn g không bắt buộc, chỉ có một dòng mới trên mỗi dòng. :%s/\r//sẽ đủ.
ếch mã hóa

7
Tùy chọn g rất có thể được yêu cầu, bởi vì lợi nhuận vận chuyển không nhất thiết phải là một dòng mới. Khi được mở ở chế độ Unix, trở về vận chuyển chỉ là một ký tự khác và khi được mở ở chế độ Windows, trở lại vận chuyển chỉ đặc biệt ngay lập tức theo dòng cấp dữ liệu.
Jonathan Baldwin

65

Để dịch dòng mới thay vì xóa nó:

:%s/\r/\r/g

2
Điều này thực sự cần phải làm gì? Đối với tôi có vẻ như nó đang thay thế like cho thích, điều mà tôi không thể tưởng tượng được sẽ thay đổi bất cứ điều gì. Tôi có thiếu điều gì đặc biệt về cách cú pháp hoạt động ở đây không?
Bạch kim Azure

16
@PlatinumAzure Tôi không biết tại sao không ai nghĩ sẽ trả lời câu hỏi của bạn. \rcó hành vi khác nhau trong phần tìm kiếm so với phần thay thế. Xem stackoverflow.com/a/3834303 chẳng hạn.

Hoặc :%s/^V^M/^V^M/g thấy ở đây
tomd

@TomD Liên kết đề cập đến câu trả lời bạn đang bình luận.
bzeaman

Đối với tôi điều này đã thay thế các nhân vật gây phiền nhiễu bằng một dòng mới bổ sung. @ dlk5730 câu trả lời làm việc tốt hơn cho tôi. tức là:%s/\r//g
marcusshep

37

Điều này có thể có nghĩa là bạn đã nhận được tiền vận chuyển (các hệ điều hành khác nhau sử dụng các cách báo hiệu khác nhau về cuối dòng).

Sử dụng dos2unixđể sửa các tệp hoặc đặt định dạng tệp trong vim:

set ffs=unix,dos

19

Giả sử tệp văn bản của bạn là - file.txt, sau đó chạy lệnh này -

dos2unix file.txt 

Nó chuyển đổi tập tin văn bản từ định dạng sang định dạng unix.


Hoạt động hoàn hảo!
robe007

9

Tôi đã nhận được một tệp văn bản ban đầu được tạo trên Windows Machine bằng cách sử dụng máy Mac và cần nhập tệp đó vào Linux MySQL DB bằng cách sử dụng load data lệnh.

Mặc dù VIM hiển thị ký tự '^ M', nhưng không có cách nào ở trên hoạt động cho vấn đề cụ thể của tôi, dữ liệu sẽ nhập nhưng luôn bị hỏng theo một cách nào đó. Giải pháp cuối cùng khá dễ dàng (sau nhiều thất vọng).

Giải pháp: Thực hiện dos2unix TWICE trên cùng một tệp đã thực hiện thủ thuật! Sử dụng filelệnh cho thấy những gì đang xảy ra trên đường đi.

$ 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

Và phiên bản cuối cùng của tệp được nhập hoàn hảo vào cơ sở dữ liệu.


9

Trong Unix có lẽ dễ sử dụng lệnh 'tr' hơn.

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

9

Tôi loại bỏ tất cả chúng bằng sed:

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

Cũng có thể thay thế bằng một chuỗi hoặc ký tự khác:

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

Các sedlệnh này hoạt động trên phiên bản GNU / Linux sednhưng có thể cần điều chỉnh trên BSD (bao gồm cả macOS).


4

Bạn có thể sửa lỗi này trong vim bằng

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

Trong đó ^ là nhân vật điều khiển.


2
Điều này không giải thích những gì ^M.
Cuộc đua nhẹ nhàng trong quỹ đạo

2
Anh ấy không thực sự hỏi nó là gì, anh ấy hỏi làm thế nào để sửa nó. Nó là một nhân vật trở về vận chuyển từ DOS.
Scott C Wilson

3
Tôi biết nó là gì. Tiêu đề của câu hỏi là "Nhân vật ^ M có nghĩa gì trong Vim".
Các cuộc đua nhẹ nhàng trong quỹ đạo

3

Đây là điều duy nhất hoạt động trong trường hợp của tôi:

:e ++ff=dos

:wq


2

Nếu nó phá vỡ cấu hình của bạn và các ký tự ^ M được yêu cầu trong ánh xạ, bạn chỉ cần thay thế các ký tự ^ M bằng <Enter>hoặc thậm chí<C-m> (cả hai được nhập dưới dạng các chuỗi ký tự đơn giản, tương ứng là 7 và 5 ký tự).

Đây là cách duy nhất được đề xuất, lưu trữ mã khóa đặc biệt trong ánh xạ


2

Trong FreeBSD, bạn có thể xóa ^Mthủ công bằng cách nhập như sau:

:%s/ Ctrl+ V, sau đó Ctrl+ M, sau đó Ctrl+ Mmột lần nữa.


1

Nếu bạn không chỉ định một cách fileformatcố ý khác (giả sử :e ++ff=unixđối với tệp Windows), có khả năng tệp đích đã trộn EOL.

Ví dụ: nếu một tệp có một số dòng có <CR><NL>kết thúc và các dòng khác có <NL>kết thúc và fileformatđược unixVim đặt thành tự động khi đọc nó, ^M (<CR>)sẽ xuất hiện. Trong trường hợp như vậy, fileformatsđi vào chơi. Xem :help ffsđể biết chi tiết.


0

Tôi đã phát hiện ra rằng tôi đã làm ô nhiễm các tệp trong nhiều tuần do thực tế là ví dụ Homebrew Mvim của tôi đã được đặt để sử dụng filetype = dos. Đã thực hiện thay đổi bắt buộc trong .vimrc ....


0

Hãy thử :%s/\^M//ít nhất điều này làm việc cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.