Di Vim, bagaimana cara menerapkan makro ke serangkaian garis?


222

Saya punya file dengan banyak baris. Saya telah merekam makro yang melakukan operasi pada satu baris. Saya ingin mengulangi makro itu di semua baris yang tersisa di file. Apakah ada cara cepat untuk melakukan ini?

Saya mencoba Ctrl + Q, menyoroti satu set garis, dan menekan @@, tapi itu sepertinya tidak berhasil.


Pertanyaan offtopic: Saya tidak mengetahui makro VIM (atau tidak ingin mewaspadai: P) Apakah Anda memiliki tautan berorientasi "pemalas" yang bagus di makro VIM?
OscarRyz

Tentu, ini: oreillynet.com/mac/blog/2006/07/… merangkumnya dengan cukup baik.
Jordan Parmer

Anda juga dapat memeriksa: dia pengulangan-rumit dari dalam vim
Sam

Jawaban:


354

Gunakan perintah normal dalam mode Ex untuk menjalankan makro pada banyak / semua baris:

Jalankan makro disimpan dalam register sebuah pada baris 5 sampai 10.

:5,10norm! @a

Jalankan makro yang disimpan dalam register a pada baris 5 hingga akhir file.

:5,$norm! @a

Jalankan makro yang disimpan dalam register a di semua baris.

:%norm! @a

Mengeksekusi toko makro dalam register yang di semua lini cocok pola .

:g/pattern/norm! @a

Untuk menjalankan makro pada garis yang dipilih secara visual, tekan V dan j atau k hingga daerah yang diinginkan dipilih. Kemudian ketik :norm! @adan amati baris input berikut ditampilkan.

:'<,'>norm! @a

Masukkan : bantu normal dalam vim untuk membaca lebih lanjut.


1
Ya,: bantu normal dalam vim atau tautan yang baru saja saya tambahkan.
Hakim Maygarden

1
Apa pun untuk membantu sesama pengguna non-emacs!
Hakim Maygarden

48
Bagus!! Kiat pemula: gunakan V lalu j / k untuk menyorot garis yang Anda inginkan, lalu ketikkan saja:norm! @a
Kevin Bourrillion

7
Untuk menambahkan tip yang sangat membantu dari @KevinBourrillion, ketika menekan :setelah menyoroti garis-garis, baris input Ex sebaliknya akan membaca :'<,'>yang kemudian akan Anda tambahkan apa yang disarankan Kevin. Ini akan membuat perintah akhir baca: :'<,'>norm! @a.
Deiwin

3
GGabeMoothart av !Menghindari remapping kunci oleh pengguna. Anda mungkin tidak membutuhkannya, tetapi jawaban yang berfungsi untuk semua orang membutuhkannya.
Hakim Maygarden

60

Gunakan global untuk menjalankan makro 'a' di semua baris yang berisi 'pola'

:g/pattern/normal! @a

Untuk bantuan, periksa: :help global.


4
Hanya untuk klarifikasi untuk pengguna masa depan: ini adalah perintah Ex global.
atp

39

Anda juga dapat melakukan ini:

Dalam mode normal:

[number of times to apply the macro] @ [register]

Sebagai contoh:

1000@q

Terapkan makro dalam register q ke 1000 baris berikutnya.

Pembaruan: jawaban yang diterima jauh lebih baik

Pembaruan: seperti yang ditunjukkan @kevinliu, Anda mungkin ingin mengakhiri makro dengan jpergi ke baris berikutnya.


4
Ini berhenti pada baris terakhir, dan tidak mengeksekusi beberapa waktu pada baris terakhir, yang saya takuti.
Hubro

@Ubro, jawaban ini dari pengguna lain bekerja untuk saya: :%norm! @adanvGG :norm! @a
Max Heiber

2
Untuk beberapa alasan, ini bekerja dengan sangat baik, dan jawaban yang diterima tidak. Makro saya melibatkan memasukkan baris baru, melakukan hal-hal, dan pindah ke baris berikutnya.
jasonzhao

@jasonzhao ya sama di sini. tetapi apakah ada juga untuk tidak mengatakan 1000 tetapi semua baris sampai akhir .. dan masih menjaga baris baru, melakukan hal-hal, dll.
ihightower

2
Saya pikir itu harus menunjukkan bahwa makro Anda harus diakhiri dengan jperintah untuk turun ke baris berikutnya kalau tidak ia akan mencoba menerapkannya ke baris yang sama.
Kevin Liu

2

Ada juga sebuah plugin bernama RangeMacro, melakukan apa yang Anda inginkan! Untuk semua orang yang tidak bisa menebak namanya, apa fungsinya: ia mengulangi makro yang direkam untuk setiap baris dalam rentang tertentu, tidak peduli apakah dengan seleksi visual atau dengan: 40,50 /: +10

Lihat http://www.vim.org/scripts/script.php?script_id=3271

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.