Tìm kiếm tương tác / thay thế regex trong Vim?


265

Tôi biết regex để thực hiện thay thế toàn cầu,

     %s/old/new/g

Làm thế nào để bạn thực hiện một thay thế tìm kiếm tương tác trong Vim ?

Câu trả lời:


462

Thêm cờ c (trong dấu nhắc lệnh vim):

:%s/old/new/gc

sẽ cung cấp cho bạn lời nhắc có / không tại mỗi lần xuất hiện của 'cũ'.

"cũ" được tô sáng trong văn bản;  ở dưới cùng của cửa sổ, nó nói "thay thế bằng mới (y / n / a / q / l / ^ E / ^ y)?)"

Trợ giúp tích hợp của Vim cung cấp thông tin hữu ích về các tùy chọn khả dụng sau khi thay thế bằng xác nhận đã được chọn. Sử dụng:

:h :s

Sau đó cuộn đến phần trên tùy chọn xác nhận. Ảnh chụp màn hình bên dưới:

Văn bản có nội dung "[C] Xác nhận từng thay thế. [...] CTRL-Y để cuộn màn hình xuống"

Ví dụ, để thay thế điều này và tất cả các kết quả khớp còn lại, hãy sử dụng a.


30
+1, tôi đã học được một cái gì đó mới ngày hôm nay! vim có rất nhiều bí mật ẩn giấu .. :)
Marc Novakowski

10
Học các lệnh vim hơi giống như chơi Nethack. Bạn không bao giờ biết điều kỳ diệu mà một nhân vật sẽ nắm giữ.
Đánh dấu Biek

22
Tôi tưởng tượng "c" là "xác nhận"
matpie

8
Tôi thực sự không cố tình bắt gặp một cách lén lút, nhưng tất cả những điều này có thể được tìm thấy bằng cách thực hiện ": help: s" sẽ đưa bạn thẳng tới ": help: s_flags".
Jeremy Cantrell

13
@jeremy: điều đó đòi hỏi phải biết rằng lệnh trợ giúp tồn tại và biết rằng người ta cần gõ "dấu hai chấm" để đưa bạn đến tệp trợ giúp có liên quan. Làm thế nào hoặc ở đâu một người sẽ học được điều đó?
Dennis

79

Mark Biek đã chỉ ra bằng cách sử dụng:

%s/old/new/gc

cho một tìm kiếm toàn cầu thay thế với xác nhận cho mỗi thay thế. Nhưng, tôi cũng thích xác minh tương tác rằng văn bản cũ sẽ khớp chính xác. Trước tiên tôi thực hiện tìm kiếm với biểu thức chính quy, sau đó tôi sử dụng lại mẫu đó:

/old.pattern.to.match
%s//replacement/gc

Các s//sẽ sử dụng mô hình tìm kiếm cuối cùng.


9
Một trong những điều tuyệt vời nhất khi sử dụng / học vim là lỗ thỏ đi sâu đến đâu!
ken

2
Thật tuyệt, tôi luôn thực hiện tìm kiếm, sau đó sử dụng <Cr> / để dán tìm kiếm cuối cùng vào lệnh thay thế.
Atilla Filiz 04/07 '

Chính xác những gì tôi bỏ lỡ từ văn bản tuyệt vời!
Xenofex

Câu trả lời này đặc biệt hữu ích, vì tôi tưởng tượng rất nhiều lần bạn quyết định thay thế các từ của một từ, đó là từ bạn vừa tìm kiếm.
M_M

20

Tôi nghĩ rằng bạn đang tìm kiếm c, ví dụ s/abc/123/gc, điều này sẽ khiến VIM xác nhận thay thế. Xem: trợ giúp: thay thế để biết thêm thông tin.


9

Tôi thường sử dụng lệnh find / thay thế / next / repeat :-)

/old<CR>3snew<ESC>n.n.n.n.n.n.n.

Đó là của find "old", substitute 3 characters for "new", find next, repeat substitute, và vân vân.

Đó là một nỗi đau cho sự thay thế lớn nhưng nó cho phép bạn chọn lọc bỏ qua một số sự cố cũ (bằng cách nhấn nmột lần nữa để tìm cái tiếp theo thay vì .lặp lại thay thế).


Tôi sử dụng điều này là tốt, ngay cả đối với các văn bản tương tự. (3cW <texthere> <ESC> <di chuyển đến vị trí mới>. <Di chuyển>. <Di chuyển>.)
strager

1
Nó không phải là một antipotype! Thật ngọt ngào. Và bạn có thể tìm kiếm theo hướng ngược lại bằng cách sử dụng N. Thực sự tốt nếu bạn thấy một từ và muốn thay đổi nó. * cwNewText <ESC> Nnn (Điều này sẽ nhảy ra khỏi từ dưới con trỏ, nhưng sau đó sẽ quay lại ngay khi bạn thay đổi lần xuất hiện tiếp theo.
PEZ

<CR>
Sàng

9

Nếu bạn chỉ muốn đếm số lần xuất hiện của 'abc' thì bạn có thể làm %s/abc//gn. Điều này không thay thế bất cứ điều gì mà chỉ báo cáo số lần xuất hiện của 'abc'.


3

Nếu văn bản thay thế của bạn cần thay đổi cho từng lần xuất hiện phù hợp (nghĩa là không chỉ đơn giản là chọn Có / Không để áp dụng thay thế số ít), bạn có thể sử dụng plugin Vim mà tôi đã gọi là tương tác thay thế .


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.