Kết hợp các chuỗi lệnh với nhau để lặp lại (.)


10

Xem xét:

apple
pear

Đặt con trỏ của bạn trên dòng đầu tiên và gõ Yp, tạo ra:

apple
apple
pear

Đặt con trỏ của bạn trên peardòng và gõ .để lặp lại lệnh cuối cùng. Điều này chỉ lặp lại p(chứ không phải kết hợp Yp), tạo ra:

apple
apple
pear
apple

Tôi muốn một cách để nói .để lặp lại các lệnh N cuối cùng. Một cái gì đó muốn 2.lặp lại sự kết hợp Ypđể sản xuất:

apple
apple
pear
pear

Ofc sẽ không hoạt động - nó lặp lại phai lần. Nhưng ý tưởng sẽ là "lặp lại trình tự của 2 lệnh cuối".

Tôi biết tôi có thể điều qchỉnh các chuỗi lệnh và lặp lại chúng @@, nhưng giải pháp này không lý tưởng, vì nó đòi hỏi bạn phải lên kế hoạch từ trước, trong khi thực tế, bạn thường không nhận ra mình cần lặp lại điều gì cho đến sau bạn đã làm nó

Có cách nào để đạt được những gì tôi muốn?

Giải khuyến khích: Nếu điều trên là không thể, có cách nào để lặp lại phát lại macro cuối cùng không? Ví dụ: nếu tôi đã nhập @@để phát lại macro cuối cùng của mình, tôi muốn phần tiếp theo .tương đương với việc gõ @@lại - điều đó không phải (ví dụ: nếu kết quả @@phụ thuộc vào dòng bạn đang bật)


Tôi không biết giải pháp cho phần đầu tiên của vấn đề của bạn, nhưng đối với phần thứ hai, bạn có thể thử ánh xạ này: nno <silent> @@ @@:sil! call repeat#set('@@', v:count1)<CR>Nhưng để nó hoạt động, bạn cần cài đặt plugin này: github.com/tpope/vim-repeat
người dùng9433424

Câu trả lời:


4

Vim chỉ lưu trữ lệnh được thực hiện cuối cùng và chỉ được lặp lại bởi .; theo tôi, bất cứ điều gì khác sẽ khó xử lý.

Nếu bạn cảm thấy cần phải lặp lại Ypkết hợp dưới dạng một thực thể duy nhất, bạn phải tạo cho nó một lệnh duy nhất. Plugin repeat.vim của Tim Pope cho phép thực hiện điều đó một cách dễ dàng cho các ánh xạ tùy chỉnh. Tất nhiên, nếu bạn chọn một khóa [trình tự] ngắn để ánh xạ, bạn có thể nhanh chóng gõ lại (thay vì .) và thậm chí tránh tích hợp repeat.vim.

BTW, plugin LineJuggler của tôi cung cấp ]dánh xạ để nhân đôi dòng hiện tại và nó hỗ trợ lặp lại thông qua repeat.vim.


2

Trong Yp, "thay đổi" duy nhất để lặp lại là p. Cách duy nhất tôi biết để thay đổi hành vi của .chế độ bình thường là thêm yvào cpoptionstùy chọn:

set cpoptions+=y

cho phép bạn lặp lại lần cuối cùng cũng như thay đổi cuối cùng.

Nhưng điều đó không thay đổi bất cứ điều gì đối với vấn đề của bạn bởi vì Ypvẫn còn hai lệnh: một yank theo sau là một thay đổi.

Tôi không nghĩ rằng bạn có thể có được những gì bạn muốn mà không cần một số kịch bản không tầm thường. Bạn đã xem phần kịch bản của vim.org chưa?


1

Tôi thường xuyên sử dụng mapđể đạt được hiệu ứng này. Ví dụ:

map <F12> Yp

Sau đó nhấn F12liên tục sẽ thực thi, YpYpYpv.v ... Nếu bạn muốn di chuyển đến dòng tiếp theo sau mỗi lần dán, hãy ánh xạ một phím để Yp+thay thế.


1

Mâu thuẫn đáng chú ý đó là plugin Lặp lại (bởi chính @joeytwiddle của chúng tôi ) chỉ cung cấp chức năng này, thông qua phương pháp ghi lại mọi thứ bạn làm dưới dạng macro.

Nó cung cấp một số ánh xạ mới, nhưng, nếu tôi đọc tài liệu một cách chính xác, để thực hiện các chỉnh sửa mà bạn mô tả bạn có thể sử dụng chuỗi các lệnh (giả sử bạn đang sử dụng mặc định <leader>của \):

  • YpYank và đặt / dán dòng apple,
  • jDi chuyển xuống một dòng để con trỏ hiện trên peardòng,
  • \Dquên jlệnh
  • 2\.Lặp lại hai lệnh Yp

Thật bất hạnh! Nhưng tôi đánh giá cao tham vọng.
Giô-na
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.