Bagaimana cara menerapkan serangkaian penekanan tombol pada setiap kemunculan kata?

13

Jika saya ingin menghapus setiap kata, itu mudah, karena saya akan melakukan sesuatu seperti ini:

:s%/WORD//g

Tetapi bagaimana jika saya ingin melakukan xyzsetiap kemunculan "WORD"? Misalnya, katakanlah saya ingin menghapus setiap baris yang berisi "WORD". Saya dapat memikirkan beberapa cara untuk melakukan ini, tetapi tidak satupun dari mereka yang tampak ideal.

1)

/WORD

dan kemudian tekan secara manual ddnddnddnddn...sampai tidak ada lagi kejadian. Tapi ini memakan waktu jika ada banyak jalur untuk melakukan ini.

2)

qd/WORD<enter>ddq

lalu tebak berapa kali KATA muncul, lalu, misalnya:

500@d 

Tapi ini akan baik A) kehilangan banyak baris atau B) menghapus banyak baris tambahan.

Apakah ada cara yang lebih baik untuk melakukan ini?

James
sumber
3
Asal tahu saja, 500@dseperti yang Anda jelaskan sebenarnya aman. Pemutaran makro akan berhenti setelah istilah pencarian tidak ditemukan. Jadi Anda hanya akan melihat kesalahan "Pola tidak ditemukan: KATA" setelah semua baris yang mengandungnya telah dihapus.
Wildcard
@ Kartu Ucapan Terima kasih, itu benar-benar baik untuk diketahui!
James

Jawaban:

17

Anda dapat menggunakan :globaldan :normalmemerintahkan untuk ini. The :globalperintah memiliki sintaks berikut:

:global/{pattern}/{command}

Ini akan menjalankan "perintah" pada setiap kemunculan "pola". Anda kemudian dapat menggunakan :normalperintah untuk menjalankan serangkaian penekanan tombol pada setiap kemunculan kata menggunakan :global. Seperti itu:

:g/WORD/normal {keystrokes}

Jika penekanan tombol tersebut melibatkan tombol khusus seperti <Ctrl>, Anda dapat menggabungkannya dengan :executeperintah seperti ini:

:g/WORD/exe "normal {keystrokes}"

Perhatikan bahwa Anda harus meletakkan backslash sebelum setiap kemunculan kunci khusus.

Untuk lebih lanjut tentang perintah ini, lihat :help :normaldan :help :global.

Pohon cemara
sumber
Kalahkan aku untuk itu; Saya kira saya mengetik terlalu lambat. :)
Wildcard
3

Hanya untuk kelengkapan, Anda dapat menggunakan :substitute, jika Anda cocok - dalam contoh Anda (hapus seluruh baris yang memiliki KATA) - seluruh baris yang berisi KATA, misalnya:

:%s/^.*\<WORD\>.*\n

Ini memiliki implisit "ganti kecocokan dengan apa-apa", yaitu bentuk yang lebih pendek dari:

:%s/^.*\<WORD\>.*\n//

Dikombinasikan dengan \zs, \ze, \(- \)(pengelompokan), dan \=(di bagian penggantian) dengan submatch(), :substitutebisa sangat kuat.

VanLaser
sumber
2

Sepertinya Anda sedang mencari :global.

:g/WORD/d_
Luc Hermitte
sumber
Apa yang garis bawah lakukan?
Wildcard
Ini bekerja, tetapi tidak ada perintah yang saya tahu berfungsi. Saya terus mendapatkan "bukan perintah editor".
James
1
@ Kartu Memori: Garis bawah membuang apa yang sedang dipotong. Perintah yang dijalankan sebenarnya :deletedan bukan operasi mode normal d.
Luc Hermitte
@DJMcMayhem: untuk operasi normal lainnya, Anda harus :normal. Dan jika Anda memerlukan kunci khusus, Anda bahkan mungkin perlu :exe-> `exe" aFooFar normal \ <esc> "
Luc Hermitte