Bagaimana saya bisa melihat dan mengedit rekaman saya (mis. Rekaman makro)?

39

Saya menggunakan pengulangan yang kompleks untuk merekam operasi saya ( qquntuk merekam, beberapa operasi , quntuk berhenti) dan saya melakukan kesalahan.

Dimungkinkan untuk melihat apa yang telah saya rekam dan memperbaiki kesalahan, alih-alih melakukannya lagi?

Memanggil karakter yang direkam oleh @qkarya, tetapi saya tidak dapat melihatnya di pemetaan saya ( :map q- No mapping found).

Dan tidak ada banyak informasi dalam membantu dengan mengetik: :help recording.

kenorb
sumber

Jawaban:

42

Catatan: Saya berasumsi Anda menggunakan aregister untuk keseluruhan jawaban ini, tetapi Anda dapat menggunakan register apa pun

Note2: <1b>adalah Esc; Anda dapat menyisipkan ini dengan Ctrl+vlalu Esc. Mungkin juga muncul sebagai ^[(tergantung pada displaypengaturan).


Ini bukan pemetaan; jadi masuk akal kalau :mapitu tidak berhasil. Itu direkam dalam register, dan Anda dapat melihat & mengeditnya seperti register apa pun.

Yang perlu qdilakukan adalah "menghapus register ini, dan menambahkan penekanan tombol apa pun untuk itu" , dan semua yang @dilakukan adalah "mengevaluasi register sebagai perintah" .

Tidak ada yang "berbeda" tentang makro, Anda bisa memanggil register apa pun sebagai makro.


Untuk melihat gunakan saja:

:echo @a

Sama seperti register apa pun.

Anda juga dapat menggunakan :registersuntuk melihat semua register.


Untuk mengedit, Anda dapat melakukan beberapa hal:

Cara paling sederhana yang Anda pilih @a, seperti:

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

Ini akan mulai memasukkan mode ( i), menyisipkan asd, dan Melarikan kembali ke mode normal.

Ini tidak terlalu berguna untuk pengeditan ekstensif; Anda bisa menggunakan fungsi (mis. substitute()), atau mungkin menambahkan sesuatu ( :let @a=@a . 'more'), tetapi mengubah sesuatu di tengah tidak mudah.

Saya telah menemukan bahwa cara terbaik untuk ini, adalah memulai buffer baru dengan :splitatau :tabnewdan mengedit register dengan memasukkannya di sana, mengeditnya, dan kemudian menyalinnya kembali.

Anda dapat menggunakan "apteks yang akan dimasukkan ke dalam buffer (di mana aAnda mendaftar):

iThis is A<1b>

Sekarang saya bisa mengubah baris ke mungkin:

iThis is an edited macro<1b>

Kemudian saya lakukan ^v$"ayuntuk menarik (menyalin) baris ini ke aregister:

  • ^ untuk memulai jalur
  • v untuk mode visual
  • $ untuk akhir baris
  • "ay tarik pilihan untuk mendaftar a

Jika mau, Anda dapat melakukan ini tanpa menggunakan mode visual dengan ^"ay$.

Anda sekarang dapat menggunakan @a, seolah-olah ini adalah apa yang awalnya Anda rekam.

Anda juga bisa menggunakan yy, dan kemudian @", yang sedikit lebih cepat. Ini juga akan menyalin baris tambahan, dan dapat menyebabkan efek samping ... Cara lain untuk membuat ini lebih cepat adalah dengan menggunakan makro :-)

Martin Tournoij
sumber
2
Saya akan mencatat bahwa menarik gerakan garis ke dalam register Anda akan memiliki efek samping termasuk karakter baris baru, seolah-olah Anda telah menekan Enterpada akhir rekaman Anda. Dalam banyak kasus ini mungkin jinak, tetapi dalam skenario di mana Anda dengan hati-hati membuat posisi kursor di akhir rekaman, ini dapat memengaruhi pengulangan.
tommcdo
@tempuh Benar; Anda cukup menggunakan vdan memilih seluruh baris (tanpa baris baru).
Martin Tournoij
@Carpetsmoker " v^$"ayuntuk menarik (menyalin) baris ini ke aregister." Bukankah seharusnya itu ^datang sebelum v, dan dengan $apakah Anda masih menyalin baris baru? Saya pikir itu harus: 0v$h"ay(ya panjangnya menyakitkan!)
joeytwiddle
2
@ joeytwiddle no, $pindah ke akhir baris, tetapi tidak termasuk baris baru. Perbedaan antara 0y$dan yy. Menempatkan hsetelah $hanya akan berarti bahwa Anda akan kehilangan karakter terakhir.
evilsoup
Satu hal yang dapat Anda lakukan untuk membuat pengeditan: biarkan @ a = ketik perintah lebih mudah diedit adalah mengetik: <Ctrl-f>, pilih dan edit baris yang bersangkutan (baris terakhir, yang menjadi defaultnya, jika Anda mengedit baris terakhir yang Anda masukkan) menggunakan vim seperti biasa. Tekan kembali ketika Anda selesai menjalankan baris, atau <Ctrl-c> untuk keluar.
9

Untuk mendapatkan sesuatu untuk dikerjakan ...

qajjjq

Akan mulai merekam makro ke dalam aregister.

Anda dapat melihat banyak register Anda saat ini (digunakan untuk makro, menarik, menghapus, dll.) Dengan :regperintah, atau Anda dapat menentukan register untuk ditampilkan dengan memberikan namanya. Misalnya, untuk menampilkan daftar a:

:reg a

hasil panen

--- Registers ---
"a   jjj

Anda dapat menambahkan ke register bernama yang ada dengan menggunakan huruf kapital yang sesuai. Ini berfungsi tidak hanya untuk merekam makro, tetapi juga untuk menariknya. Sebagai contoh:

qAkkkq
:reg a

hasil panen

--- Registers ---
"a   jjjkkk

Jika Anda ingin menggunakan sintaks let untuk mengedit makro yang ada, Anda dapat melakukan:

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

yang akan diperluas ke

let @a='jjjkkk'

dan Anda kemudian dapat mengubah penekanan tombol individual.

Perhatikan bahwa Anda dapat menggunakan <C-r>(yaitu, kontrol + r) untuk menempelkan dari register apa pun ke mode baris perintah (atau dalam mode insert, dalam hal ini).

Selain itu, ketika Anda berada dalam mode baris perintah, jika Anda mengetik <C-f>ini akan muncul jendela baris perintah, di mana Anda dapat melihat / mengedit perintah masa lalu yang dikeluarkan, dan Anda dapat mengedit perintah Anda saat ini sebelum memanggilnya. Tekan enter pada perintah yang ingin Anda kirim.

Manfaatnya adalah Anda dapat menggunakan perintah pergerakan / substitusi normal di dalam buffer ini untuk mengedit makro Anda. Sebagai contoh:

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

akan memunculkan:

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

Jika Anda menggunakan perintah 120, Anda dapat melakukan:

s/kkk/}
<return>
:reg a

hasil panen

--- Registers ---
"a   jjj}

Anda tentu saja dapat menempelkan isi register ke buffer Anda, dan mengubahnya di sana. Tetapi Anda dapat melakukan semua yang Anda butuhkan tanpa mencemari buffer kerja Anda.

Zach Ingbretsen
sumber