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ề patternstring

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