Làm cách nào tôi có thể xem và chỉnh sửa bản ghi của mình (tức là macro đã ghi)?


39

Tôi đang sử dụng lặp lại phức tạp để ghi lại các hoạt động của mình ( qqđể ghi lại, một số thao tác , qđể dừng lại) và tôi đã làm sai.

Có thể xem những gì tôi đã ghi lại và sửa lỗi, thay vì làm lại?

Gọi các ký tự được ghi bằng @qcác tác phẩm, nhưng tôi không thể nhìn thấy nó trong ánh xạ của mình ( :map q- No mapping found).

Và không có nhiều thông tin trợ giúp bằng cách gõ : :help recording.

Câu trả lời:


42

Lưu ý: Tôi giả sử bạn đang sử dụng ađăng ký cho toàn bộ câu trả lời này, nhưng bạn có thể sử dụng bất kỳ đăng ký nào

Lưu ý2: <1b>Esc; bạn có thể chèn cái này với Ctrl+vvà sau đó Esc. Nó cũng có thể hiển thị dưới dạng ^[(tùy thuộc vào displaycài đặt).


Nó không phải là một bản đồ; Vì vậy, nó có ý nghĩa mà :mapkhông làm việc. Nó được ghi lại trong một đăng ký, và bạn có thể thấy và chỉnh sửa nó như bất kỳ đăng ký nào.

Tất cả những gì qlàm là "xóa thanh ghi này và nối thêm bất kỳ tổ hợp phím nào vào nó" và tất cả những gì @làm là "đánh giá một thanh ghi dưới dạng các lệnh" .

Không có gì "khác biệt" về một macro, bạn có thể gọi bất kỳ đăng ký nào dưới dạng macro.


Để xem chỉ sử dụng:

:echo @a

Cũng giống như bất kỳ đăng ký.

Bạn cũng có thể sử dụng :registersđể xem tất cả các thanh ghi.


Để chỉnh sửa, bạn có thể thực hiện một số điều:

Cách đơn giản nhất bạn chỉ cần gán cho @a, như vậy:

:let @a='iasd<1b>'

Điều này sẽ bắt đầu chế độ chèn ( i), chèn asdvà Thoát trở lại chế độ bình thường.

Điều này không hữu ích cho việc chỉnh sửa mở rộng; bạn có thể sử dụng các hàm (ví dụ. substitute()) hoặc có thể nối thêm thứ gì đó ( :let @a=@a . 'more'), nhưng thay đổi thứ gì đó ở giữa không dễ dàng như vậy.

Tôi đã thấy rằng cách tốt nhất cho việc này, là bắt đầu một bộ đệm mới bằng :splithoặc :tabnewchỉnh sửa thanh ghi bằng cách chèn nó vào đó, chỉnh sửa nó, sau đó sao chép lại.

Bạn có thể sử dụng "apsẽ chèn văn bản vào bộ đệm (nơi ađăng ký của bạn):

iThis is A<1b>

Bây giờ tôi chỉ có thể thay đổi dòng thành có thể:

iThis is an edited macro<1b>

Sau đó, tôi làm ^v$"ayđể kéo (sao chép) dòng này vào asổ đăng ký:

  • ^ để bắt đầu dòng
  • v cho chế độ trực quan
  • $ cho cuối dòng
  • "ay chọn lựa để đăng ký a

Nếu bạn muốn, bạn có thể làm điều này mà không cần sử dụng chế độ trực quan với ^"ay$.

Bây giờ bạn có thể sử dụng @a, như thể đây là những gì bạn đã ghi lại ban đầu.

Bạn cũng có thể chỉ cần sử dụng yy, và sau đó @", nhanh hơn một chút. Tuy nhiên, điều này cũng sẽ sao chép dòng mới, và có thể gây ra tác dụng phụ ... Một cách khác để làm điều này nhanh hơn là sử dụng macro :-)


2
Tôi sẽ lưu ý rằng việc kéo một chuyển động thẳng hàng vào thanh ghi của bạn sẽ có tác dụng phụ bao gồm một ký tự dòng mới, như thể bạn đã nhấn Entervào cuối bản ghi. Trong nhiều trường hợp, điều này có thể là lành tính, nhưng trong các trường hợp bạn đã cẩn thận tạo vị trí con trỏ ở cuối bản ghi, nó có thể ảnh hưởng đến độ lặp lại.
tommcdo

@tommcdo Phải; bạn chỉ có thể sử dụng vvà chọn toàn bộ dòng (không có dòng mới).
Martin Tournoij

@Carpetsmoker " v^$"ayđể yank (sao chép) dòng này vào asổ đăng ký." Không nên ^đến trước v$không phải bạn vẫn sao chép dòng mới sao? Tôi nghĩ rằng nó nên là: 0v$h"ay(vâng đau đớn quá lâu!)
joeytwiddle

2
@joeytwiddle không, $di chuyển đến cuối dòng, nhưng không bao gồm dòng mới. Đó là sự khác biệt giữa 0y$yy. Đặt hsau $sẽ chỉ có nghĩa là bạn bỏ lỡ nhân vật cuối cùng.
evilsoup

Một điều bạn có thể làm để thực hiện chỉnh sửa: let @ a = type dễ chỉnh sửa hơn là gõ: <Ctrl-f>, chọn và chỉnh sửa dòng liên quan (dòng cuối cùng, mặc định, nếu bạn đang chỉnh sửa dòng cuối cùng bạn đã nhập) bằng cách sử dụng vim như bình thường. Nhấn return khi bạn hoàn thành việc thực thi dòng hoặc <Ctrl-c> để thoát.

9

Để có được thứ gì đó để làm việc với ...

qajjjq

Sẽ bắt đầu ghi một macro vào asổ đăng ký.

Bạn có thể thấy nhiều thanh ghi hiện tại của mình (được sử dụng cho macro, kéo dài, xóa, v.v.) bằng :reglệnh hoặc bạn có thể chỉ định một thanh ghi để hiển thị bằng cách cung cấp tên của nó. Ví dụ, để hiển thị đăng ký a:

:reg a

sản lượng

--- Registers ---
"a   jjj

Bạn có thể nối vào một thanh ghi có tên bằng cách sử dụng chữ in hoa tương ứng. Điều này hoạt động không chỉ để ghi macro, mà còn để kéo dài. Ví dụ:

qAkkkq
:reg a

sản lượng

--- Registers ---
"a   jjjkkk

Nếu bạn muốn sử dụng cú pháp let để chỉnh sửa macro hiện có, bạn có thể thực hiện:

let @a='<C-r>a'

sẽ mở rộng sang

let @a='jjjkkk'

và sau đó bạn có thể thay đổi tổ hợp phím riêng lẻ.

Lưu ý rằng bạn có thể sử dụng <C-r>(nghĩa là điều khiển + r) để dán từ bất kỳ thanh ghi nào vào chế độ dòng lệnh (hoặc trong chế độ chèn, đối với vấn đề đó).

Hơn nữa, khi bạn ở chế độ dòng lệnh, nếu bạn nhập <C-f>nó sẽ bật lên cửa sổ dòng lệnh, trong đó bạn có thể thấy / chỉnh sửa các lệnh trong quá khứ đã ban hành và bạn có thể chỉnh sửa lệnh hiện tại của mình trước khi gọi nó. Nhấn enter trên lệnh bạn muốn gửi.

Lợi ích của việc này là bạn có thể sử dụng các lệnh di chuyển / thay thế thông thường bên trong bộ đệm này để chỉnh sửa macro của mình. Ví dụ:

let @a='<C-r>a'<C-f>

sẽ đưa lên:

:118 reg
:119 reg a
:120 let @a='jjjkkk'

Nếu bạn đang sử dụng lệnh 120, bạn có thể làm:

s/kkk/}
<return>
:reg a

sản lượng

--- Registers ---
"a   jjj}

Tất nhiên, bạn có thể dán nội dung của thanh ghi vào bộ đệm của mình và thay đổi nó ở đó. Nhưng bạn có thể làm mọi thứ bạn cần mà không làm ô nhiễm bộ đệm làm việc của bạn.

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.