Trong Vim, làm cách nào để áp dụng macro cho một tập hợp các dòng?


222

Tôi có một tập tin với một loạt các dòng. Tôi đã ghi lại một macro thực hiện một thao tác trên một dòng duy nhất. Tôi muốn lặp lại macro đó trên tất cả các dòng còn lại trong tệp. Có một cách nhanh chóng để làm điều này?

Tôi đã thử Ctrl + Q, tô sáng một tập hợp các dòng và nhấn @@, nhưng dường như điều đó không thực hiện được.


Câu hỏi không chính thức: Tôi không biết về macro VIM (hoặc không muốn biết: P) Bạn có một số liên kết định hướng "người đọc lười biếng" đẹp trên macro VIM không?
OscarRyz

Chắc chắn, điều này: oreillynet.com/mac/blog/2006/07/. Tổng kết nó khá tốt.
Jordan Parmer

Bạn cũng có thể kiểm tra: anh ấy lặp lại phức tạp từ bên trong vim
Sam

Câu trả lời:


354

Sử dụng lệnh bình thường trong chế độ Ex để thực thi macro trên nhiều / tất cả các dòng:

Thực hiện macro được lưu trữ trong đăng ký a trên dòng 5 đến 10.

:5,10norm! @a

Thực hiện macro được lưu trữ trong đăng ký a trên dòng 5 đến cuối tệp.

:5,$norm! @a

Thực hiện macro được lưu trữ trong đăng ký a trên tất cả các dòng.

:%norm! @a

Thực hiện lưu trữ macro trong đăng ký a trên tất cả các dòng khớp mẫu .

:g/pattern/norm! @a

Để thực thi macro trên các dòng được chọn trực quan, nhấn Vj hoặc k cho đến khi vùng mong muốn được chọn. Sau đó nhập :norm! @avà quan sát dòng đầu vào sau được hiển thị.

:'<,'>norm! @a

Nhập : giúp bình thường trong vim để đọc thêm.


1
Có ,: giúp bình thường trong vim hoặc liên kết tôi vừa thêm.
Thẩm phán Maygarden

1
Bất cứ điều gì để giúp đỡ một người dùng không phải là emacs!
Thẩm phán Maygarden

48
Đẹp!! Mẹo cho người mới bắt đầu: sử dụng V rồi j / k để tô sáng các dòng bạn muốn, sau đó nhập chỉ:norm! @a
Kevin Bourrillion

7
Để thêm vào mẹo rất hữu ích từ @KevinBourrillion, khi nhấn :sau khi tô sáng các dòng, dòng đầu vào Ex thay vào đó sẽ đọc phần :'<,'>mà sau đó bạn sẽ thêm phần còn lại của những gì Kevin đề xuất. Điều này sẽ làm cho lệnh cuối cùng được đọc : :'<,'>norm! @a.
Deiwin

3
@GabeMoothart Việc !tránh ánh xạ lại của người dùng. Bạn có thể không cần nó, nhưng một câu trả lời phù hợp với tất cả mọi người đòi hỏi nó.
Thẩm phán Maygarden

60

Sử dụng toàn cầu để chạy macro 'a' trên tất cả các dòng có chứa 'mẫu'

:g/pattern/normal! @a

Để được giúp đỡ, kiểm tra : :help global.


4
Chỉ để làm rõ cho người dùng trong tương lai: đây là lệnh Ex toàn cầu.
atp

39

Bạn cũng có thể làm điều này:

Ở chế độ bình thường:

[number of times to apply the macro] @ [register]

Ví dụ:

1000@q

Áp dụng macro trong thanh ghi q cho 1000 dòng tiếp theo.

Cập nhật: câu trả lời được chấp nhận tốt hơn rất nhiều

Cập nhật: như @kevinliu đã chỉ ra, bạn có thể muốn kết thúc macro bằng cách jđi đến dòng tiếp theo.


4
Điều này dừng ở dòng cuối cùng và không thực hiện nhiều lần trên dòng cuối cùng, điều mà tôi sợ.
Hubro

@Hubro, những câu trả lời từ những người dùng khác đã làm việc cho tôi: :%norm! @avGG :norm! @a
Max Heiber

2
Vì một số lý do, điều này đã làm việc một cách tuyệt vời và câu trả lời được chấp nhận là không. Macro của tôi liên quan đến việc chèn một dòng mới, làm công cụ và chuyển sang dòng tiếp theo.
jasonszhao

@jasonszhao có giống ở đây. nhưng dù sao cũng không nói 1000 nhưng tất cả các dòng cho đến hết .. và vẫn chăm sóc dòng mới, làm công việc, v.v.
ihightower

2
Tôi nghĩ rằng cần phải chỉ ra rằng macro của bạn phải kết thúc bằng một jlệnh để đi xuống dòng tiếp theo nếu không nó sẽ cố gắng áp dụng nó cho cùng một dòng.
Kevin Liu

2

Ngoài ra còn có một plugin có tên RangeMacro, thực hiện chính xác những gì bạn muốn! Đối với tất cả mọi người không thể đoán theo tên, nó làm gì: nó lặp lại một macro được ghi lại cho mỗi dòng trong một phạm vi nhất định, bất kể là bằng cách chọn trực quan hoặc theo: 40,50 /: +10

Xem http://www.vim.org/scripts/script.php?script_id=3271

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.