Saya ingin membuat skrip Vim dasar yang hanya menghapus n baris, melompati 1 baris dan mengulangi hingga akhir dokumen. Saya tidak peduli dengan pertandingan tertentu, saya hanya ingin menghapus garis. Sebagai contoh; Jadi saya ingin mengulangi perintah 3ddj
untuk seluruh dokumen.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Text I want to keep.
Text I want to delete.
Text I want to delete.
Text I want to delete.
Jadi sepertinya ...
Text I want to keep.
Text I want to keep.
Text I want to keep.
Terima kasih.
regular-expression
normal-mode
repeated-commands
Max Copley
sumber
sumber
regular-expression
pada pertanyaan Anda, tetapi pertanyaan itu tampaknya tidak menentukan alasan untuk melakukan ini dengan ekspresi reguler. Jika Anda benar-benar mencari sesuatu yang memang menggunakan ekspresi reguler, stackoverflow.com/questions/17735289/… mungkin menarik. Pertanyaan itu adalah tentang Notepad ++, tetapi jawabannya tidak menggunakan apa pun kecuali regre pcre. (Penafian: Saya menulis jawaban itu.)Jawaban:
Pendekatan yang sangat sederhana:
qa3ddjq
Langkah tiga akan mengulangi makro seribu kali atau sampai kesalahan terjadi. Memukul ujung file (karenanya tidak ada baris untuk dihapus) menghasilkan kesalahan dan pengulangan makro dibatalkan.
Lihat
:help recording
.sumber
q
(dalam mode perintah, dan dalam vim atau versi alternatif terbaru lainnya [neovim, dll], tetapi tidak dalam vi asli) berarti "mulai merekam, dan letakkan di buffer 'huruf berikutnya'". karenanya:qa
berarti "mulai merekam ke dalam buffer 'a'". Kemudian setiap tombol yang diketik setelah ini (hinggaq
mode perintah berikutnya ) direkam (Anda bahkan dapat merekam: masuk ke mode edit, mengetikkan sesuatu, Melarikan diri ke mode perintah, dll). Kemudian12@a
akan mengulangi tindakan apa pun yang dicatat dalam buffer "a" 12 kali.1000@q
pada akhirnya, Anda dapat membuat makro rekursif:,qa3ddj@aq@a
meskipun Anda mungkin perlu melakukanqaq
terlebih dahulu untuk memastikan"a
mulai kosong.Solusi termudah bagi saya adalah:
Itu adalah:
%
: untuk setiap barisnorm
: jalankan kunci berikut seolah-olah dalam mode normalj3dd
: turunkan baris kemudian hapus 3 barisJadi dari baris pertama, turun ke yang kedua dan hapus 3 baris berikutnya. Yang kedua
Text I want to keep.
sekarang di baris kedua. Turun satu baris, hapus 3. Bilas dan ulangi.Catatan: jika Anda tidak ingin memproses seluruh file, Anda dapat mengganti
%norm
dengan misalnya5,$norm
untuk memproses dari baris ke-5 hingga akhir file.sumber
Anda memiliki beberapa solusi hebat yang sudah tersedia. Ini satu lagi:
Pertama, kami melakukan tindakan pada setiap baris (
:g
cocok dengan^
(awal baris)) dan untuk setiap nomor baris melakukan hasillinenumber % 4
. Jika hasilnya tidak sama dengan1
, kami menambahkanDELETE ME
di awal baris, menandai baris yang akan dihapus oleh perintah berikutnya.Perintah selanjutnya adalah perintah reguler (
:g
), yang cocok dengan semua baris yang dimulai denganDELETE ME
dan melakukannya.Catatan, Anda tidak dapat langsung menghapus baris menggunakan
:g
perintah pertama , karena ini akan mengubah perhitungan modulo yang dihasilkan dan karenanya, kita harus terlebih dahulu menandai baris dan pada langkah kedua menghapusnya.sumber
Saya tahu ini
vi
salurannya, tetapi bagi saya ini adalahsed
masalah.Jadi Anda bisa menekuknya menjadi
vi
solusi:sumber
Alternatif (saya kira kita mulai pada baris 1, dan menghapus baris 2-4, 6-8 dan seterusnya, sesuai contoh teks):
Jika lebih suka melakukan ini secara interaktif, Anda dapat menggunakan "register baris perintah". Yaitu, tekan
:+1del 3<CR>
lalu1000@:
sumber
sebuah alternatif: Anda ingin mempertahankan garis: 1, 4, dll. Anda dapat menggunakan:
alternatif lain: jika Anda tahu garis yang Anda inginkan cocok dengan beberapa pola unik:
sumber