phát lại macro vim cho đến khi kết thúc bộ đệm


85

Tôi muốn chạy macro mà tôi vừa ghi trong sổ đăng ký " x" trên mọi dòng đơn của bộ đệm đang mở, từ con trỏ của tôi đến cuối bộ đệm, trong vim. Làm thế nào để làm điều đó?

Tôi biết tôi có thể phát lại macro n lần:

15@x

... hoặc chỉ cần nhấn giữ @cho đến khi tôi đến dòng cuối cùng, nhưng tôi chỉ muốn nhấn một vài lần nhấn phím và hoàn thành nó.

Cảm ơn trước.


15 @ x không làm việc trên Windows gvim
Mingjiang Shi

Câu trả lời:


101

Cá nhân tôi sẽ làm

VG:normal @x

Chỉnh sửa: đã thay đổi đăng ký thành một đăng ký bạn đã chỉ định.


Tốt lắm. Tôi thích rằng giải pháp này chỉ hoạt động trên khu vực đã chọn.
Kevin

Tôi đã ánh xạ điều này tới nnoremap <C - @> VG: norm @ q <CR>
PAS

Tôi đã thử điều này với macro "1z =] s" nhưng nó chỉ sửa lỗi chính tả từ đầu tiên của mỗi dòng, bỏ qua phần còn lại.
elig

@elig bạn có thể muốn tạo một macro đệ quy sẽ tìm thấy các từ bị thiếu trên tất cả các dòng.
raman

67

Bạn có thể làm (ở chế độ lệnh)

:%normal @x

Tôi thích giải pháp này, nhưng tôi sẽ thực thi macro trên mọi dòng của bộ đệm, OP chỉ hỏi từ con trỏ đến cuối.
Porunga

24

tạo macro đệ quy:

qa@aq

Ví dụ:

qa0gUwj@aq

Nó sẽ CẬP NHẬT từ đầu tiên từ dòng hiện tại đến cuối tệp với @a duy nhất. Nhưng hãy đảm bảo rằng "thanh ghi trống:

let @a=""

3
Thông minh. Cách tiếp cận này hữu ích hơn %:normalcách tiếp cận vì nó tôn vinh bất kỳ chuyển động đường nào trong macro, do đó rất hữu ích khi các đường không giống nhau về hình thức. Tôi thấy việc tạo macro 'a' để xác định hành động dễ dàng hơn và sau đó có macro 'b' thực hiện bit đệ quy, tức là qb @ a @ bq.
Paul Ruane

3
Tránh điều này nếu macro của bạn liên quan đến tìm kiếm, vì nó sẽ tiếp tục từ trên xuống. ctrl-cdừng lại nếu điều đó xảy ra!
Iain Ballard

3
@IainBallard, :set nowrapscanlàm cho nó bị lỗi và dừng lại khi đến cuối tệp.
ericbn

1
để xóa đăng ký một, chỉ cần làm qaqtrước khi vĩ mô: qaqqa0gUwj@aq. Ngoài ra, nếu bạn quên đặt @qở cuối, bạn luôn có thể qAbắt đầu thêm một sổ đăng ký và sau đó thực hiện @q. Tôi thường ghi lại để reg q vì một số lý do vì nó dễ dàng (đặc biệt là đối với macro đệ quy) và thường kết thúc qqqqqgUiwj@qqthay vì hai macro. Ba qgiây đầu tiên xóa reg q, hai giây thứ hai qbắt đầu ghi. Xem vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc

tôi nghĩ rằng để xóa amột đăng ký có thể loại đơn giảnqaq
Peter Perháč

11

999999@x, trừ khi bạn có một bộ đệm rất lớn ...


6
tại sao không chỉ %:normal @xhoặc 1,$:normal @x?
Nathan Fellman

3
điều này chắc chắn là giải pháp thanh lịch hơn - tôi đoán 99999@xchỉ là điều tự nhiên mà bạn gặp phải khi bạn đang ở trong một vội vàng :)
Peter

2
9999999 @ x sẽ không chạy nó nhiều lần trên dòng cuối cùng trừ khi bạn có chính xác 999999 dòng?
David Oneill

2
Chỉ cần thử nó. Treo phiên. Có thể tiếp tục chạy nó trong một triệu lần mà không dừng lại ở cuối dòng.
CDR

1
Ít nhất trong một số trường hợp, điều này sẽ không hoạt động như mong đợi. Hãy xem xét có một macro với tìm tiếp theo / tìm trước trong đó. Vì vậy, một khi lặp lại macro đến cuối tệp, nó sẽ tiếp tục từ đầu. vim doc về chủ đề . Để ngăn chặn tìm kiếm gói, người ta có thể muốn sử dụng : set nowrapscan . Đây là một ví dụ tôi có thể đưa ra, nhưng điều đó không có nghĩa là không còn nữa. :% normal @x là một cách để thực hiện như @ryan_s đã đề xuất trong câu trả lời của anh ấy ở trên.
Sergey Markelov

-1

Từ vim wiki, phiên bản rút gọn: qqqqq để ghi macro @qq để kết thúc ghi @q để thực thi nó (và sẽ chạy cho đến cuối tệp)


1
Xin vui lòng, bạn có thể thêm một tham chiếu vào tài liệu?
aturegano

2
@aturegano Tôi nghĩ rằng tác giả muốn sử dụng một macro đệ quy. Xem The Vim Wiki: Ghi lại Macro đệ quy để biết thêm thông tin.
dylnmc
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.