Làm cách nào để thêm văn bản vào cuối mỗi dòng trong Vim?


116

Trong Vim, tôi có văn bản sau:

key => value1
key => value2
key => value1111
key => value12
key => value1122222

Tôi muốn thêm "," vào cuối mỗi dòng. Văn bản trước sẽ trở thành như sau:

key => value1,
key => value2,
key => value1111,
key => value12,
key => value1122222,

Có ai biết cách để làm điều này không? Có thể sử dụng chế độ khối trực quan để thực hiện điều này không?


Câu hỏi tương tự ở đây .
glts

Câu trả lời:


163

Thao tác này sẽ thực hiện với mọi dòng trong tệp:

:%s/$/,/

Nếu bạn muốn thực hiện một tập hợp con các dòng thay vì toàn bộ tệp, bạn có thể chỉ định chúng thay cho %.

Một cách là thực hiện một lựa chọn trực quan và sau đó nhập :. Nó sẽ điền :'<,'>cho bạn, sau đó bạn nhập phần còn lại của nó (Chú ý bạn chỉ cần thêm s/$/,/)

:'<,'>s/$/,/

4
Hàng cuối cùng có một thừa ', nên được :'<,'>s/$/,/.
cjg 23/12/14

tại sao không cần a g? ( :'<,'>s/$/,/g)
Thorbjørn EK Christensen

@ ThorbjørnE.K.Christensen vì /$/dù sao cũng chỉ khớp một lần.
Bubaya

156

Trên thực tế, có một cách để làm điều này bằng cách sử dụng chế độ Khối trực quan. Chỉ cần nhấn $Atrong chế độ khối Trực quan sẽ thêm vào cuối tất cả các dòng trong vùng chọn. Văn bản nối sẽ xuất hiện trên tất cả các dòng ngay khi bạn nhấn Esc.

Vì vậy, đây là một giải pháp khả thi:

vip<C-V>$A,<Esc>

Tức là, ở chế độ Bình thường, Trực quan chọn một đoạn văn vip, chuyển sang chế độ Khối trực quan CTRLV, thêm $Adấu phẩy vào tất cả các dòng ,, sau đó nhấn Escđể xác nhận.

Tài liệu có tại :h v_b_A. Thậm chí còn có một minh hoạ về cách hoạt động trong phần ví dụ: :h v_b_A_example.


1
Không, đây là Vim tiêu chuẩn: Chọn một số dòng ở chế độ Khối trực quan (với C-V) sau đó di chuyển con trỏ đến cuối dòng $và thêm vào tất cả chúng A. Bạn sẽ thích :h v_b_A, đó là thực sự kỹ lưỡng.
glts

1
Ồ, tôi hiểu chuyện gì đang xảy ra! Tôi thường sử dụng Ctrl-C thay vì <Esc> để thoát khỏi chế độ chèn và dường như với Ctrl-C, điều này không hoạt động! Thật kỳ quặc.
weronika

3
Bạn có thể lưu một lần gõ phím bằng cách sử dụng <C-V>ipthay cho vip<C-V>.
Aaron Thoma

1
@accolade, không chuyển sang chế độ chặn trực quan theo cách đó và sẽ không hoạt động. <CV> cần phải diễn ra sau một lần nữa nếu bạn làm theo cách đó.
ImagineerThat

@imagineerĐiều đó thật kỳ lạ - nó phù hợp với tôi - phải là do một số tùy chọn không mặc định. (Không phải 'virtualedit'- Tôi đã kiểm tra điều đó.) Tôi xác nhận rằng nó không hoạt động trong một môi trường sạch sẽ. Cảm ơn đã lưu ý!
Aaron Thoma

44

Một giải pháp khác, sử dụng một tính năng tuyệt vời khác:

:'<,'>norm A,

Thấy chưa :help :normal.


1
@Swiss, bạn sẽ thích nhận xét này .
romainl

1
@Swiss, bạn cũng có thể thích udioca's exposé on :normal. Tôi thấy nó có nhiều thông tin!
Conner

1
Không biết về subreddit này. Cảm ơn.
romainl

33

chế độ cũ là dễ nhất:

:%s/$/,

: - enter command mode
% - for every line
s/ - substitute
$ - the end of the line
/ - and change it to
, - a comma

10

Lệnh thay thế có thể được áp dụng cho một lựa chọn trực quan. Thực hiện một khối hình ảnh qua đường dây mà bạn muốn thay đổi, và gõ :, và thông báo rằng dòng lệnh được khởi tạo như thế này: :'<,'>. Điều này có nghĩa là lệnh thay thế sẽ hoạt động trên vùng chọn trực quan, như sau:

:'<,'>s/$/,/

Và đây là một sự thay thế sẽ phù hợp với ví dụ của bạn, giả sử rằng bạn thực sự muốn có dấu phẩy ở cuối mỗi dòng như bạn đã đề cập. Nếu có khoảng trắng ở cuối, thì bạn có thể cần phải điều chỉnh lệnh cho phù hợp:

:'<,'>s/\s*$/,/

Thao tác này sẽ thay thế bất kỳ khoảng trắng nào đứng trước cuối dòng bằng dấu phẩy, giúp loại bỏ khoảng trắng ở cuối một cách hiệu quả.

Các lệnh tương tự có thể hoạt động trên một loạt các dây chuyền, ví dụ như đối với 5 dòng tiếp theo: :,+5s/$/,/, hoặc cho toàn bộ đệm: :%s/$/,/.


3

Nếu bạn muốn thêm ',' vào cuối các dòng bắt đầu bằng 'key', hãy sử dụng:

:%s/key.*$/&,

Hoặc :g/key/s/$/,. Thấy chưa :help :global.
romainl

2

Tôi đã <M-DOWN>ánh xạ (mũi tên xuống alt) để <DOWN>.tôi có thể lặp lại lệnh cuối cùng trên một loạt dòng rất nhanh chóng. với ánh xạ này, tôi có thể:

A,<ESC>

Và sau đó giữ alt trong khi nhấn xuống liên tục để thêm dấu phẩy vào cuối mỗi dòng.
Điều này hoạt động tốt đối với tôi vì nó cho phép kiểm soát rất tốt những gì các dòng làm và không nhận được sự thay đổi.
(Tôi cũng có các mũi tên khác được ánh xạ tương tự để cho phép lặp lại dễ dàng .)

Đây là dòng ánh xạ để dán vào vimrc của bạn:

map <M-DOWN> <DOWN>.

1
:%s/$/,/g

$ khớp với cuối dòng


2
Điều đó cũng sẽ thêm $vào dòng, không chỉ ,.
ZyX

2
/gđược sử dụng để thực hiện thay thế mỗi lần xuất hiện trong một dòng. Bởi vì chỉ có một $trong một hàng bạn có thể thả nó một cách an toàn.
romainl

Vâng, sai lầm của tôi về, $. và / g là từ habbit, và có, nó là tùy chọn.
kalhartt

1

Macro sau cũng có thể được sử dụng để hoàn thành nhiệm vụ của bạn.

qqA,^[0jq4@q
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.