Bagaimana saya bisa merekam makro bersarang?

11

Saya ingin merekam makro dalam makro, seperti:

qa
    [ first macro ... ]
    qb
        [ second macro ... ]
    q
    [ some more stuff, involving @b ... ]
q

Namun, yang kedua qditafsirkan sebagai permintaan untuk menghentikan makro pertama, dan sisanya ditafsirkan sebagai perintah.

Apakah ada cara untuk mulai merekam makro kedua di dalam makro?

Jika tidak, apakah ada cara lain untuk mencapai efek yang diinginkan dari mengulangi urutan penekanan tombol tertentu, sementara sudah di dalam makro?

Gagang pintu
sumber
1
Tidak bisakah Anda pertama kali merekam makro bdan kemudian merekam apanggilan makro @b?
statox
@statox Masalahnya adalah befek yang merusak, jadi saya tidak dapat merekamnya terlebih dahulu (kecuali jika saya ingin merekamnya, tekan ubeberapa kali, lalu mulai merekam a).
Gagang pintu
1
Saya pikir itu adalah solusi terbaik Anda. Perhatikan bahwa Anda juga dapat merekamnya di buffer lain ( enew, merekam, bd) atau secara langsung mengedit bregister dengan menulis dalam file Anda konten makro Anda dan kemudian "merekam" dengan menempatkan karakter dalam register "by.
statox

Jawaban:

10

AFAIK, Anda tidak dapat merekam dua makro dengan qx...qsatu tembakan. Untuk kebutuhan Anda, Anda harus membuat makro bdengan qb....q, lalu qa...@bq.

Jika Anda tidak ingin "merekam" byang dapat Anda lakukan let @b='whatever'maka @bakan memutar ulang makro. Misalnya, let @b='ggdG'tentukan makro buntuk menghapus semua konten buffer Anda saat ini tanpa "merekam".

Ada trik definisi makro, yang mungkin tidak relevan dengan pertanyaan Anda. Ini adalah makro rekursif, bukan makro bersarang. Artinya, Anda bisa melakukan:

qa..whatever..@aq

ini secara rekursif akan memutar ulang makro a. Terkadang berguna, ketika kita tidak tahu berapa kali kita ingin memutar ulang makro. Karena ketika kesalahan terjadi, replay makro akan otomatis berhenti. Menghemat 999@amisalnya.

Kent
sumber
1

Merekam penekanan tombol ke makro @a adalah hal yang sama seperti menarik teks yang sesuai dengan penekanan tombol untuk mendaftar a. Setelah sesuatu disimpan dalam register, Anda bisa meletakkannya atau memainkannya sebagai makro / penekanan tombol. Jadi Anda bisa mulai merekam makro ke @a melalui qa, lalu saat makro merekam, tarik beberapa teks untuk mendaftar b, mungkin menggunakan sesuatu seperti "bye. Yang perlu dilakukan hanyalah teks tarik ke register yang berbeda dari yang akan Anda lakukan jika Anda tidak menentukan register b. Sekarang register b memiliki beberapa teks di dalamnya, Anda dapat memutar teks itu sebagai keystoke dengan menekan @b. Anda bahkan dapat melakukannya saat makro @a masih direkam. Ini metamacrolicious!

Kerugian utama dari ini adalah mungkin akan lebih mudah untuk menulis beberapa fungsi vimscript yang melakukan apa yang Anda inginkan, dan kemudian mungkin menyebutnya selama perekaman makro. Keindahan makro adalah bahwa Anda dapat melihat efek dari apa yang Anda rekam saat Anda merekamnya, tetapi teknik perekaman makro meta ini agak menghilangkannya.

still_dreaming_1
sumber