^ M ở cuối mỗi dòng trong vim


132

Khi tôi chỉnh sửa các tệp nguồn bằng vim và các trình soạn thảo khác đôi khi ở cuối dòng, tôi nhận được các ký tự ^ M này ở cuối mỗi dòng. Tôi nghĩ rằng nó có một cái gì đó để làm với việc chỉnh sửa một tập tin trong windows và sau đó trong linux. Làm thế nào tôi có thể tự động loại bỏ tất cả những thứ này?


18
Đó là bởi vì Windows sử dụng chuỗi hai ký tự (thường được viết là "\ r \ n") để thể hiện ngắt dòng, nhưng UNIX / Linux chỉ sử dụng ký tự thứ hai "\ n" để thể hiện ngắt dòng. Vì vậy, khi bạn chỉnh sửa tệp văn bản Windows trên trình soạn thảo Linux, trình soạn thảo sẽ thấy các ký tự bổ sung mà nó không xem là một phần của ngắt dòng, vì vậy nó cố gắng hiển thị chúng và cái xuất hiện là ^ M.
David Z

13
Có nhiều hơn thế, David. Vim sẽ vui vẻ chỉnh sửa một tệp văn bản với các kết thúc dòng DOS mà không hiển thị tất cả các tệp đó ^M. Các dấu hiệu duy nhất mà bạn có khi chỉnh sửa một tập tin văn bản DOS trong Vim là nếu bạn có %{&ff}trong bạn statuslinegiá trị tùy chọn. Vim hiển thị ^Mkhi kiểu kết thúc dòng được trộn lẫn . Điều đó có nghĩa là bạn đã sử dụng trình soạn thảo văn bản không hiểu biết như Vim, trình duyệt này không tuân theo kiểu kết thúc dòng hiện tại, như Vim sẽ mặc định. Nếu bạn sử dụng Vim hoặc một cái gì đó khác tầm cỡ của nó trên Windows, bạn sẽ không nhận được các kết thúc dòng bị hỏng như thế.
Warren Young

Câu trả lời:


128

Như một lệnh, gõ

:%s/^M$//

(Để nhận ^ M, nhấn ^ V ^ M, trong đó ^ là CTRL trên hầu hết các bàn phím)


62
đồng thời:% s / \ r $ // để tránh rắc rối ^ V ^ M
glenn jackman

8
Hoặc, lưu một ký tự::%s/\r$
sehe

2
@sehe về mặt kỹ thuật lưu 2 ký tự :)
Chris

@glennjackman, mẹo của bạn dễ dàng hơn nhiều, vì tôi đã phải vật lộn để có được ^ V + ^ M là điều đó hoàn toàn không xảy ra. Tất cả những gì tôi nhận được là nội dung trong bảng tạm (vì ^ V luôn hiệu quả, bất chấp những nỗ lực lặp đi lặp lại của tôi với các chiến lược khác nhau để có được cả hai).
itraghz

86

Một cách dễ dàng để loại bỏ các kết thúc dòng DOS là sử dụng fftùy chọn:

:set ff=unix
:wq

Bây giờ tệp của bạn đã trở lại theo cách tốt của Unix.

Nếu bạn muốn thêm các kết thúc dòng DOS (để giữ cho máy in hài lòng hoặc truyền tệp với những người bạn Windows không có công cụ đẹp), bạn có thể dễ dàng đi theo hướng ngược lại:

:set ff=dos
:wq

8
vim đã không tìm thấy bất kỳ ^ m, hoặc \ r, hoặc bất kỳ kết thúc dòng nào khác, nhưng điều này đã làm việc. Cảm ơn :)
SgtPooki

2
Vim sẽ không tìm thấy bất kỳ ^ M hay \ r, nhưng điều này đã làm việc cho tôi! Cảm ơn @sarnold
7ochem

có vẻ như git quá ngu ngốc khi phát hiện ra điều này khi một nhân vật thay đổi. Tôi đã chạy nó trong Vim và các git diffchương trình đã bị xóa và mỗi dòng được thêm vào: /
Tommy

Tommy, đó là một hạn chế diff, không phải trên git.
Spidey

34

Bạn có thể làm được việc này:

:set fileformats=dos

Nó sẽ ẩn các ^M, mà không cần chạm vào tập tin.


17

Có một chương trình gọi là dos2unix sẽ loại bỏ chúng cho bạn. Windows sử dụng các ký tự kết thúc dòng khác nhau, đó là lý do tại sao điều đó xảy ra.


6

Điều này làm việc cho tôi trong một tệp có tất cả mọi thứ trên một dòng:

Đầu tiên tìm tất cả các trận đấu

:%s/^M//

(Để nhận ^M, nhấn ^ V ^ M, trong đó ^ nằm Ctrltrên hầu hết các bàn phím)

Sau đó thay thế bằng dòng mới

:%s//\r/g

Lệnh kết hợp sẽ là:

:%s/^M/\r/g

Cảm ơn, tự hỏi làm thế nào để thực sự nhập Ctrl-M trong tìm kiếm thay thế!
Roboprog

2

Tôi có xu hướng chạy các tệp bị ảnh hưởng thông qua fromdostrước khi mở lại chúng. fromdoslà một phần của gói tofrodos .


1

Nguồn gốc của vấn đề có thể là thông qua chuyển FTP. Khi bạn FTP các tệp này từ hộp này sang hộp khác, hãy đảm bảo sử dụng chuyển ASCII. Sử dụng lệnh "ASC."


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

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.