2008-12-10 28 views
86

Tôi biết rằng trong Vim tôi thường có thể lặp lại một lệnh bằng cách thêm một số ở phía trước nó. Ví dụ, người ta có thể xóa 5 dòng theo:Làm cách nào để lặp lại chỉnh sửa trên nhiều dòng trong Vim?

5dd 

Nó cũng thường có thể xác định một loạt các dòng để áp dụng một lệnh, ví dụ

:10,20s:hello:goodbye:gc 

Làm thế nào tôi có thể thực hiện một 'chỉnh sửa dọc '? Ví dụ, tôi muốn chèn một biểu tượng cụ thể, giả sử dấu phẩy, khi bắt đầu (bỏ qua khoảng trống, nghĩa là bạn sẽ nhận được gì nếu bạn nhập dấu phẩy sau khi Shift-I ở chế độ lệnh) của mỗi dòng trong một phạm vi. Làm thế nào điều này có thể đạt được (mà không cần đến thời gian xuống-giai đoạn-xuống-thời kỳ-xuống-thời gian)?

Trả lời

83

:10,20s/^/,/

Hoặc sử dụng một macro, kỷ lục với:

q a i , ESC j h q

sử dụng với:

@ a

Giải thích: q a bắt đầu ghi một macro để đăng ký a, q kết thúc ghi âm. Có đăng ký a đến z có sẵn cho việc này.

+0

Cảm ơn. Nếu tôi muốn tương đương với một ca-i thì sao? Đó là, bỏ qua khoảng trắng ban đầu? – saffsd

+1

: s/^ \ (\ s * \)/\ 1,/ – Svante

+1

Giải thích: '^ \ (\ s * \)' nắm bắt khoảng trắng ban đầu và lưu vào sổ đăng ký, sau đó bạn có thể đọc bằng '\ 1' . – Svante

10

Tôi nghĩ dễ nhất là ghi lại macro và sau đó lặp lại macro bao nhiêu lần tùy thích. Ví dụ để thêm một dấu phẩy ở đầu mỗi dòng, bạn gõ:

q a I , ESC j q 

lặp lại rằng 5 lần, bạn nhập

5 @ a 
1

Ngoài các macro, như đã trả lời, cho cụ thể trường hợp chèn một dấu phẩy trong một loạt các dòng (nói từ dòng 10 đến 20), bạn có thể làm điều gì đó như:

:10,20s/\(.*\)/,\1 

Đó là, bạn có thể tạo ra một trận đấu nhóm đánh số với \ (và \), và sử dụng \ 1 trong các s thay thế tring để nói "thay thế bằng nội dung của trận đấu".

90

Ctrl - v chuyển sang chế độ trực quan theo chiều kim đồng hồ. Sau đó bạn có thể di chuyển (hjkl -wise, như bình thường), và nếu bạn muốn chèn một cái gì đó trên nhiều dòng, sử dụng phím Shift - i.

Vì vậy, cho các văn bản:

abc123abc 
def456def 
ghi789ghi 

nếu bạn nhấn Ctrl - v với con trỏ chuột lên 1, nhấn j hai lần để đi xuống hai cột, sau đó phím Shift - i,ESC, văn bản của bạn sẽ trông giống như sau:

abc,123abc 
def,456def 
ghi,789ghi 

(chèn nhiều dòng có độ trễ nhỏ và sẽ không hiển thị cho đến SAU KHI bạn nhấn ESC).

+3

Tốt. Ctrl-V có nghĩa là chữ hoa, bằng cách này, bạn có thể nói Ctrl-Shift-v – Svante

+8

thực sự, đó là CTRL-v hoặc CTRL-V. Vim không phân biệt chữ hoa chữ thường cho mã CTRL (xem: help CTRL- {char}). – rampion

+2

sau khi tìm kiếm một chút lý do tại sao phương pháp này không hoạt động là vì nó sử dụng vốn I (shift-i) thay vì i (cũng chỉ là ctrl-v, vì ctrl-shift-v đã chuyển tôi đến cuối) – Willyfrog

44

Đó là những gì: Định mức (al) lệnh dành cho:

 
:10,20 normal I, 
2

tôi sử dụng block visual mode. Điều này cho phép bạn thực hiện chèn/chỉnh sửa trên nhiều dòng (aka 'chỉnh sửa theo chiều dọc').

+0

liên kết của bạn bị hỏng –

17

Tôi tin rằng cách dễ nhất để làm điều này là

1) ghi lại macro cho một dòng, gọi nó là 'a'; trong trường hợp này một loại

qa tôi, ESC JQ

2) chọn khối đường mà bạn muốn áp dụng các macro để

3) sử dụng chức năng 'tiêu chuẩn' để thực hiện vĩ mô 'a' trên khối này của dòng, ví dụ:

:'<,'>[email protected] 
36

tôi f bạn đã sử dụng '.' để lặp lại lệnh cuối cùng của bạn rất nhiều, sau đó tôi thấy this là giải pháp tiện lợi nhất cho đến nay. Nó cho phép bạn lặp lại lệnh cuối cùng của bạn trên mỗi dòng của một khối hình ảnh bằng cách sử dụng

" allow the . to execute once for each line of a visual selection 
vnoremap . :normal .<CR> 
+2

rất thú vị CẢM ƠN BẠN! – cmcginty

+1

Điều này hữu ích nhưng cũng bị giới hạn vì '.' hoạt động tốt trong chế độ trực quan. Tôi nghĩ rằng chế độ hình ảnh trong trường hợp này đôi khi có thể thuận tiện để chọn một phạm vi dòng. Nhưng các lệnh và macro linh hoạt hơn và mạnh mẽ hơn trong trường hợp này. – Bohr

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