2011-10-20 23 views
33

Có một cụm từ mà tôi muốn tìm trong VIM. Khi tìm thấy, tôi muốn xóa cụm từ này. Cách dễ nhất để chu kỳ cho tất cả các trường hợp (n) và xóa từng đối sánh (tôi không muốn xóa tất cả các trường hợp).Xóa mẫu tìm kiếm phù hợp trong VIM

LƯU Ý: Tôi biết tôi có thể xóa một số ký tự nhất định hoặc một số từ, nhưng tôi muốn xóa 'kết quả' cụ thể cho tìm kiếm của mình. Điều này có thể không?

Trả lời

51

http://vim.wikia.com/wiki/Search_and_replace

Thử tìm kiếm và thay thế:

:% s/foo/bar/gc

Thay đổi mỗi 'foo' thành 'bar', nhưng yêu cầu xác nhận đầu tiên .

Nhấn y hoặc n để thay đổi hoặc giữ văn bản của bạn.

+21

Bí quyết là để thanh trống:% s/foo // gc – Sedrik

20

Có 3 cách tôi có thể nghĩ:

Cách đó là đơn giản nhất để giải thích được

:%s/phrase to delete//gc 

nhưng bạn cũng có thể (cá nhân tôi sử dụng một thứ hai này thường xuyên hơn) làm một tìm kiếm thông thường cho cụm từ để xóa

/phrase to delete 

Vim sẽ đưa bạn đến đầu sự xuất hiện tiếp theo của cụm từ.

Chuyển sang chế độ chèn (nhấn i) và sử dụng phím Xóa để xóa cụm từ.

Nhấn thoát khi bạn đã xóa tất cả cụm từ.

Bây giờ bạn đã làm điều này một lần, bạn có thể nhấn n để chuyển đến lần xuất hiện tiếp theo của cụm từ và sau đó nhấn dấu chấm/dấu chấm "." để thực hiện thao tác xóa bạn vừa thực hiện

Tiếp tục nhấn n và dấu chấm cho đến khi bạn hoàn tất.

Cuối cùng bạn có thể thực hiện tìm kiếm cho cụm từ để xóa (như trong phương pháp thứ hai) nhưng lần này, thay vì đi vào chế độ chèn, bạn

Đếm số ký tự mà bạn muốn xóa

gõ số đó trong (với các phím số)

Nhấn phím x - nhân vật nên được xóa

tiếp tục thông qua với n và rải rác như trong phương pháp thứ hai.

PS - Và nếu bạn không biết thì bạn có thể thực hiện một vốn n để di chuyển ngược qua các kết quả tìm kiếm.

+0

Thay vì chuyển sang chế độ chèn, sau đó nhấn xóa, sau đó thoát, bạn có thể tiết kiệm khoảng 4 tổng số lần nhấn phím bằng cách không đi vào chế độ chèn và chỉ sử dụng 'x' để xóa ký tự bên dưới con trỏ. – chown

+3

@chưa có nhưng sử dụng x được tính là một lệnh duy nhất vì vậy nếu bạn muốn xóa toàn bộ cụm từ bằng cách chỉ cần nhấn dấu chấm, thì bạn phải chuyển sang chế độ chèn và xóa số ký tự. NHƯNG bạn có thể đếm số ký tự cần xóa, nhập số đó và sau đó x - Tôi sẽ thêm số đó vào câu trả lời của tôi, cảm ơn nguồn cảm hứng, nếu không đề xuất. – ghbarratt

+3

Tại sao không sử dụng phím d (xóa) để xóa? Vì cụm từ này luôn giống nhau, hãy tìm cách xóa bằng cách sử dụng một phím chuyển động sau d (dw để xóa từ, dt 'để xóa mọi thứ sang lần xuất hiện tiếp theo của') nó sẽ vẫn được tính là một lệnh và làm việc với. – Sedrik

8

Một giải pháp đơn giản là sử dụng lệnh :substitute với xác nhận:

:%s///gc 

lệnh này thay thế xuất hiện của mô hình tìm kiếm cuối cùng (được sử dụng nếu mô hình được bỏ qua) với chuỗi rỗng.

Ngoài ra, người ta có thể xác định ánh xạ lựa chọn đối tượng văn bản để hoạt động cụ thể trên kết quả của mẫu tìm kiếm cuối cùng bên dưới con trỏ. Các sau hai ánh xạ có thể được sử dụng trong chế độ Visual hoặc Operator đang chờ xử lý để chọn văn bản từ đầu của kết quả trước đó của tìm kiếm cuối cùng mẫu để kết thúc.

vnoremap <silent> i/ :<c-u>call SelectMatch()<cr> 
onoremap <silent> i/ :call SelectMatch()<cr> 
function! SelectMatch() 
    if search(@/, 'bcW') 
     norm! v 
     call search(@/, 'ceW') 
    else 
     norm! gv 
    endif 
endfunction 

Sử dụng những ánh xạ người ta có thể xóa các trận đấu dưới con trỏ với di/, áp dụng bất kỳ nhà điều hành khác hoặc trực quan chọn nó bằng cách vi/.

0

Cách tốt nhất có lẽ là để sử dụng:

:%s/phrase//gc 

c yêu cầu xác nhận trước khi mỗi xóa. g cho phép nhiều thay thế xảy ra trên cùng một dòng.

Bạn cũng có thể chỉ cần tìm kiếm bằng cách sử dụng /phrase, chọn kết quả phù hợp tiếp theo với gn và xóa nó bằng d.

Các vấn đề liên quan