Tại sao \ ra dòng mới cho Vim?


254

Từ câu hỏi Làm thế nào để thay thế một nhân vật cho một dòng mới trong Vim? . Bạn phải sử dụng \ r khi thay thế văn bản cho một dòng mới, như thế này

:%s/%/\r/g

Nhưng khi thay thế cuối dòng và dòng mới cho một ký tự, bạn có thể làm như sau:

:%s/\n/%/g 

Phần nào trong tài liệu hướng dẫn sử dụng những hành vi này, và lý do đằng sau chúng là gì?


1
Điều gì %khi tìm kiếm và thay thế?
— qed

7
@qed: theo mặc định :ssẽ chỉ áp dụng thay thế cho dòng hiện tại. :%slàm cho nó giải quyết toàn bộ tập tin. Hơn nữa .
— c24w

3
+ c24w Tôi nghĩ rằng anh ta đang đề cập đến '%' giữa các dấu gạch chéo, ví dụ đầu tiên '%' nằm ở vị trí tìm kiếm và ở vị trí thay thế trong ví dụ thứ hai, nhưng @qed để trả lời câu hỏi của bạn, đó là '% Được kết hợp theo đúng nghĩa đen.
— RastaJedi

Câu trả lời:


155

Từ các tài liệu vim trên các mẫu :

\r phù hợp với <CR>

\n khớp với một dòng cuối - Khi khớp trong một chuỗi thay vì văn bản đệm, một ký tự dòng mới theo nghĩa đen được khớp.


41
Đối với tôi, điểm khó hiểu là \ r và \ n có nghĩa là những thứ khác nhau khi được sử dụng là mẫu tìm kiếm và mẫu thay thế.
— dlamblin

3
@dlamblin Yup! Xem câu trả lời của tôi :)
— Chuộc tội có giới hạn


114

Một khía cạnh khác của vấn đề này là \0, theo truyền thống NULL, được s//\0/hiểu là "toàn bộ mô hình phù hợp". (Mà, nhân tiện, là dư thừa với, và dài hơn, &).

  • Vì vậy, bạn không thể sử dụng \0để có nghĩa là NULL, vì vậy bạn sử dụng\n
  • Vì vậy, bạn không thể sử dụng \ncó nghĩa là \n, vì vậy bạn sử dụng \r.
  • Vì vậy, bạn không thể sử dụng \rđể nói \r, nhưng tôi không biết ai muốn thêm char đó vào mục đích.

Mùi


1
Điểm tốt! Vì vậy, đây là một bản hack xung quanh \ 0 - phản hồi cho nhóm lồng nhau 0 - toàn bộ regrec. Đây là một câu trả lời rất hay, nhưng nó khiến tôi thất vọng, rằng tôi không thể sử dụng thay thế ... (nghĩa là: chèn # (13), ví dụ như trong tệp "bình thường" (== unix EOLs).
— Tomasz Gandor

3
OK, câu trả lời là trong các tài liệu Vim. Chỉ cần thoát \ ^ M hoặc \ <CR>, với dấu gạch chéo ngược bình thường. Đẹp. ----- <CR> chia dòng thành hai tại thời điểm này (Nhập <CR> là CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> chèn trả lại vận chuyển (CTRL-M) (Nhập <CR> là CTRL-V <Enter>) s / \ <CR>
— Tomasz Gandor

16
"Một khía cạnh khác"? Bạn quá khiêm tốn! Giải thích chính xác_why_ điều này xảy ra làm cho một câu trả lời vượt trội cho tất cả những người chỉ nói cách làm việc xung quanh nó. +1
— gạch dưới

Đây thực sự là cái nhìn sâu sắc thực sự tuyệt vời về lý do tại sao \ncó ý nghĩa khác nhau trong tìm kiếm và thay thế các mẫu. Câu trả lời tuyệt vời.
— ZeroKnight

47

:help NL-used-for-Nul

Chi tiết kỹ thuật:

<Nul>các ký tự trong tệp được lưu trữ như <NL>trong bộ nhớ. Trong màn hình, chúng được hiển thị là " ^@". Bản dịch được thực hiện khi đọc và ghi tập tin. Để khớp <Nul>với mẫu tìm kiếm, bạn chỉ cần nhập CTRL- @ hoặc " CTRL-V 000". Đây có lẽ chỉ là những gì bạn mong đợi. Bên trong nhân vật được thay thế bằng một <NL>mẫu tìm kiếm. Điều bất thường là gõ CTRL-V CTRL-J cũng chèn a <NL>, do đó cũng tìm kiếm một <Nul> trong tệp. {Vi không thể xử lý các <Nul>ký tự trong tệp}



10

Trước hết, mở :h :sđể xem phần "4.2 Thay thế" tài liệu về "Thay đổi". Đây là những gì lệnh chấp nhận:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

Lưu ý mô tả về patternvàstring

Để {pattern}xem |pattern|.
{string}có thể là một chuỗi nghĩa đen, hoặc một cái gì đó
đặc biệt; thấy |sub-replace-special|.

Vì vậy, bây giờ bạn biết rằng mẫu tìm kiếm và mẫu thay thế tuân theo các quy tắc khác nhau. Nếu bạn theo liên kết đến |pattern|, nó sẽ đưa bạn đến phần giải thích toàn bộ các mẫu biểu thức chính quy được sử dụng trong Vim.

Trong khi đó, |sub-replace-special|đưa bạn đến phần phụ của "4.2 Thay thế", trong đó có các mẫu để thay thế, trong số đó là \rcho ngắt / tách dòng.

(Phím tắt cho phần này của hướng dẫn là :h :s%)

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 cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.