2014-09-05 15 views
14

hôm nay tôi bắt đầu sử dụng vim. Tôi bị nhầm lẫn tại các lệnh :g:%s. Vì vậy, sự khác nhau giữa các lệnh :g hoặc :%s là gì?Sự khác biệt giữa: g và:% s lệnh trong vim

+0

':% s' là lệnh thay thế được áp dụng cho toàn bộ tài liệu chứ không phải tiền tố chung chung là': g'. –

+1

@ Jean-KarimBockstael Tôi nghĩ bạn đang bối rối với lệnh ': g [lobal]' với tiền tố 'g: [name]' cho các tùy chọn và biến. –

+0

Nếu bạn bắt đầu sử dụng vim hôm nay, tôi khuyên bạn nên sử dụng vim-tutor. Bạn có thể tìm thông tin về nó trực tiếp trong vim, với ': help tutor'. – mMontu

Trả lời

23

:g thực hiện một lệnh trên tất cả các dòng phù hợp với một regex:

:g/LinesThatMatchThisRegex/ExecuteThisCommand 

Ví dụ:

:g/hello/d 

này sẽ xóa (d) tất cả các dòng có chứa hello.

Mặt khác, :%s chỉ thực hiện tìm kiếm (trên một regex) và thay thế trong suốt file:

:%s/hello/world/g 

(Các g có nghĩa là toàn cầu vì vậy nó sẽ thay thế tất cả trong số họ, không chỉ là một cho mỗi , bạn cũng có thể sử dụng cờ c (:%s/hello/world/gc) nếu bạn muốn xác nhận từng thay thế theo cách thủ công).

Điều này thay thế tất cả các lần xuất hiện của hello bằng world.

Cả hai lệnh :g:%s đều hỗ trợ cụm từ thông dụng.

Lệnh s có nghĩa là substitute% có nghĩa là trong suốt bộ đệm. Vì vậy, %s có nghĩa là thay thế trong toàn bộ bộ đệm. Bạn cũng có thể cung cấp một phạm vi dòng:

:10,15s/hello/world/g 

Điều này sẽ thực hiện tìm kiếm và thay thế được thấy trước đó trên các dòng chỉ từ 10 đến 15 (bao gồm).

+1

': g' chỉ thực hiện trên bộ đệm hiện tại, theo cùng cách của': s'. Chúng chỉ có sự khác biệt trong phạm vi mặc định: ': s' giống với': .s' trong khi ': g' là':% g'. Do đó ':% s/pat/subs' và':% g/pat/cmd' (hoặc ': g/...') sẽ hoạt động trên tất cả các dòng trên vùng đệm khớp với dấu vỗ và ': .s/pat/subs' (hoặc ': s/...') và ': .g/pat/cmd' sẽ hoạt động trên dòng hiện tại nếu nó khớp với pat. – mMontu

6

Chúng khác nhau.

:g có thể thực hiện lệnh cho các dòng khớp. :s là một trong những lệnh đó. Bạn có thể kết hợp :g and s

:%s chỉ thực hiện tìm kiếm và thay thế toàn bộ bộ đệm, mặc dù nó có thể thực hiện một số thứ khác với biểu thức, nhưng không đơn giản như :g.

ví dụ .:

:g/foo/s/bar/blah/g 

này sẽ làm bar->blah thay vào dòng có chứa foo. Với :s chúng tôi có thể:

:%s/foo/\=substitute(getline('.'), 'bar','blah','g') 

vì vậy :g dễ dàng hơn.

Vì vậy, nếu bạn đang xử lý tác vụ thay thế, thường là :s sẽ xuất hiện trước tiên. Nếu bạn muốn làm điều gì đó như cho tất cả các dòng khớp với xxx, tôi muốn xóa/tham gia/thụt lề/.......:g có thể hữu ích cho bạn.

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