2009-03-06 21 views
7

Tôi muốn lưu hành động lặp lại một lần (đây là những gì xảy ra khi bạn nhấn.), Sau đó chạy macro và sau đó khôi phục lại. hành động (vì macro thường thay đổi nó).Sao lưu-khôi phục hành động lặp lại hiện tại (.) Trong VIM

Điều này có khả thi không?

Ngoài ra, có thể viết macro mà không thay đổi hiện tại. hoạt động? Tôi đoán tôi có thể cố gắng làm mọi thứ trong Command Mode, nhưng tôi không chắc liệu điều đó có thể xảy ra hay không.

Bối cảnh: Tôi đang viết chức năng trình duyệt tệp (như lệnh-T trong TextMate, xem http://github.com/mdemare/fuzzy_file_finder) và tôi muốn thực hiện ít thay đổi nhất có thể đối với môi trường của người dùng, vì vậy các thay đổi phải xảy ra trong hàm . Hiện tại, khi bạn chuyển đổi tệp bằng chức năng này, bạn. hành động được ghi đè, rất không mong muốn.

Trả lời

10

Trong VIM bạn có thể tạo một macro mà sẽ thực hiện bất kỳ sửa đổi bạn thường sẽ làm gì trong chế độ normal mà không làm phiền các chức năng redo [.] bằng cách gói những chỉnh sửa trong một người sử dụng định nghĩa :function và sau đó thực hiện chức năng đó với một chìa khóa :map PED.

Ví dụ

Cách tốt nhất để xem đó là ví dụ. Giả sử bạn muốn thêm văn bản yyy vào cuối dòng hiện tại mỗi khi bạn nhấn phím F2, nhưng bạn không muốn điều này ảnh hưởng đến lệnh làm lại [.].

Dưới đây là làm thế nào để làm điều đó:

  1. mở một cửa sổ vim mới và thực hiện các lệnh sau:

    :fu JL() 
        normal Ayyy 
        endfu 
    :map <F2> :call JL()<Enter> 
    
  2. Bây giờ thêm một số văn bản, chúng ta hãy nói xxx, bằng cách gõ Axxx<Esc>

  3. Bây giờ, nhấn phím [F2] và bạn sẽ thấy xxxyyy

  4. Cuối cùng, bấm [.] chìa khóa và bạn sẽ thấy xxxyyyxxx

Chỉ cần những gì bạn muốn!

Tại sao điều này hoạt động

Điều này hoạt động vì bản chất của cách VIM thực hiện lệnh làm lại. VIM theo dõi các ký tự của một lệnh khi bạn gõ nó. Khi bạn nhấn phím [.], nó sẽ đưa các ký tự đó trở lại bộ đệm bàn phím để thực thi lại chúng. Thật không may, một đơn giản q vĩ mô hoạt động theo cùng một cách - nó nhét các ký tự vào bộ đệm và bằng cách làm như vậy sẽ ghi đè bộ đệm làm lại. Lệnh :normal thực hiện điều này, nhưng khi được đặt bên trong một hàm do người dùng định nghĩa, chúng ta sẽ gặp phải giới hạn này bởi vì mã thực thi hàm do người dùng định nghĩa lưu và khôi phục bộ đệm làm lại trong hàm do người dùng định nghĩa.

Tất cả điều này xảy ra trong eval.cgetchar.c trong mã nguồn VIM. Tìm kiếm saveRedobuff để xem điều gì đang xảy ra.

4

Bạn có thể ghi lại hành động vào sổ đăng ký để sử dụng sau này. Nhấn q tiếp theo một thanh ghi (az, AZ, 0-9 hoặc " là những định danh đăng ký hợp lệ), áp dụng các lệnh mong muốn/hành động và báo chí q để dừng ghi âm . lệnh có thể được thu hồi bằng cách nhấn @ tiếp theo là đăng ký.

Để được hướng dẫn chi tiết hơn, xem phần complex repeat của Vim documentation.

LƯU Ý: Thật không may, trình tự qa.qu sẽ không thực hiện chính xác những gì bạn muốn từ . lệnh sẽ lặp lại hành động cuối cùng hiện tại và không phải là hành động cuối cùng tại thời điểm lệnh được ghi lại.

+0

Tôi biết rằng, đó không phải là ý của tôi. Đó là những gì tôi gọi là một vĩ mô, và nó thay đổi. hoạt động. –

+0

Vâng, sau đó tôi cho rằng bạn trả lời là không ... –

4

Cách duy nhất tôi có thể nghĩ để giúp bạn: Remap '.' để lưu lịch sử hành động, bạn có thể nhớ lại điều này nếu cần. Để biết ý tưởng về các dòng này, hãy xem plugin repeat.vim.

+0

Làm cách nào để truy xuất hành động cuối cùng bằng cách ánh xạ lại '.'? Hành động cuối cùng được lưu trữ/sửa đổi như thế nào? –

+0

@monjardin: Tôi không thực sự biết những câu trả lời đó, nhưng tôi đã xem qua plugin vim có vẻ như đang làm những thứ đó, vì vậy tôi đã đề cập nó như một nguồn cảm hứng có thể. –

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