Saya memiliki masalah yang saya bisa memikirkan dua pendekatan umum untuk menyelesaikan, tetapi saya tidak tahu secara spesifik untuk kedua pendekatan tersebut.
...
Level 1: cũng also
Level 1: và and
Level 1: như like; such as
Level 2: các plural marker
Level 2: của belonging to
...
Untuk setiap baris mulai "Level n" Saya ingin memasukkan angka, dimulai dengan "01". Untuk kesederhanaan, mari kita tambahkan dulu jumlahnya.
Pendekatan 1: Pilih secara manual semua garis dengan Level yang sama. Meminta sihir, saya akan segera belajar.
Pendekatan 2: Tulis pencarian dan ganti yang cocok dengan semua baris dengan Level yang diberikan yang pada setiap pertandingan menyertakan angka dalam teks ganti, yang bertambah satu dengan setiap pertandingan.
Saya telah menemukan pertanyaan serupa di StackOverflow atau di situs Vim lainnya, tetapi masing-masing tampaknya memiliki satu atau lebih masalah berikut:
- Apakah tentang memasukkan nomor baris saat ini daripada nomor yang sewenang-wenang tetapi bertambah.
- Tidak memasukkan angka ke angka nol.
- Tidak benar-benar berfungsi untuk pilihan pada Vim 7.4 saya yang berjalan pada Windows 7. (Yang ini menghasilkan kesalahan
E481: No range allowed
.)
Saya menjalankan gVim di Windows dengan mswin.vim tetapi solusi yang berfungsi pada semua pemasangan vanilla Vim tanpa harus menyesuaikan pengaturan mungkin yang terbaik.
Jawaban:
Mirip dengan jawaban di https://vi.stackexchange.com/a/818/227 , Anda dapat menggunakan perintah global.
Dengannya Anda dapat menginstruksikan vim untuk mencari garis yang cocok dengan suatu pola, dan kemudian melakukan perintah di atasnya.
Dalam kasus Anda, Anda ingin menambahkan teks ke baris yang dimulai dengan "Level N:", sehingga perintah global kami bisa
Menggunakan perintah pengganti (penggantian ekspresi reguler) untuk perintah
Perintahnya lebih menyenangkan. Saya biasanya suka melakukan penggantian ekspresi reguler untuk hal-hal seperti ini, karena mudah digunakan variabel.
Contoh untuk pertanyaan Anda
Bagaimana itu bekerja
Di bagian penggantian perintah substitusi dapat berupa ekspresi.
Hal pertama yang akan kita lakukan adalah mengatur variabel
i
menjadi angka awal. Saya memilih 1, tetapi nomor berapa pun akan berhasil.let i = 1
Kemudian kami menjalankan perintah global kami, yang membuat kami melakukan tindakan pada baris yang cocok.
g/^Level \d:/
Kami akan meminta perintah global kami memasukkan nilai dan meningkatkan penghitung kami menggunakan perintah substitusi dan perintah let.
s/^/\=printf("%02d ", i)/ | let i = i+1
Ekspresi reguler perintah substitusi menemukan awal baris
^
dan menggantinya dengan ekspresi, dan ekspresi kita akan menjadi hasil dari cetakan yang diformat. Seperti dalam bahasa C, printf vim mengambil parameter format.%02d
berarti mengonversi argumen seolah-olah itu angka desimald
, menempati setidaknya 2 spasi2
dan pad dengan 00
. Untuk detail dan opsi konversi lainnya (termasuk pemformatan titik mengambang), lihat:help printf
. Kami memberikan printf variabel penghitungan kamii
dan itu memberi kami01
pertama kali,02
kedua kalinya, dll. Ini digunakan oleh perintah substitusi untuk mengganti awal baris, secara efektif memasukkan hasil printf di awal.Perhatikan bahwa saya menempatkan spasi setelah d:
"%02d "
. Anda tidak menanyakannya dalam pertanyaan (dan saya tidak melihat contoh output), tetapi saya curiga Anda ingin memisahkan nomor dari kata "Level". Hapus spasi dari string yang diberikan ke printf agar angka yang dimasukkan tepat di sebelah L di Level.Akhirnya, itu
let i = i + 1
menambah penghitung kami setelah setiap penggantian.Ini dapat diterapkan secara umum untuk mengganti bagian-bagian garis yang cocok dengan kriteria lain dengan data fungsional yang arbitrer.
Menggunakan perintah normal gabungan
Ini bagus untuk penyisipan sederhana atau pengeditan kompleks. Seperti halnya dengan pengganti, kami akan menggunakan global untuk mencocokkan, tetapi alih-alih substitusi ekspresi reguler, kami akan menjalankan serangkaian operasi seolah diketik oleh pengguna.
Contoh untuk pertanyaan Anda
Bagaimana itu bekerja
Nilai yang digunakan sangat mirip dengan pengganti (kami masih menggunakan printf untuk memformat nomor kami untuk membuatnya 0 diisi dengan 2 digit), tetapi operasinya berbeda.
Di sini kita menggunakan perintah eksekusi, yang mengambil string dan menjalankan string sebagai perintah ex (
:help :exe
). Kami membuat string yang menggabungkan "normal! I" dengan data kami, yang akan menjadi "normal! I01" pertama kali dan "normal! I02" kedua kalinya, dll.The
normal
perintah melakukan operasi seperti dalam mode normal. Dalam contoh ini, perintah normal kita adalahI
, yang menyisipkan di awal baris. Jika kita menggunakannyadd
akan menghapus baris,o
akan membuka baris baru setelah baris yang cocok. Seolah-olah Anda mengetikI
(atau operasi lainnya) sendiri dalam mode normal. kami menggunakan!
afternormal
untuk memastikan tidak ada pemetaan yang menghalangi jalan kami. Lihat:help :normal
.Apa yang dimasukkan kemudian adalah nilai printf kami, seperti pada contoh pertama menggunakan pengganti.
Metode ini bisa lebih bagus daripada regex, karena Anda dapat melakukan hal-hal seperti
execute "normal! ^2wy" . i . "th$p"
, yang akan pergi ke awal teks^
, bergerak maju 2 kata2w
, menarik sampai karakter 'h'y" . i . "th
, pindah ke akhir baris$
, dan tempelp
.Ini hampir seperti menjalankan makro, tetapi sebenarnya tidak menggunakan register dan dapat menggabungkan string dari ekspresi apa pun. Saya menemukan ini sangat kuat.
Pendekatan di mana setiap level memiliki counter sendiri
Anda mungkin ingin setiap level mendapatkan penghitungnya sendiri. Jika Anda mengetahui jumlah maksimum level sebelumnya, Anda dapat melakukan hal berikut (menambahkan kode tambahan untuk menemukan level terbesar mungkin tidak terlalu sulit, tetapi akan membuat jawaban ini terlalu lama. Ini semakin lama karena itu).
Pertama, mari kita bebaskan, jika kita sudah menggunakannya sebagai integer. Kami tidak dapat mengonversi saya ke daftar, kami harus membuatnya seperti itu.
Selanjutnya, mari atur i menjadi daftar yang berisi jumlah level. Anda menunjukkan 2 pada pertanyaan Anda, tetapi mari asumsikan 10 untuk bersenang-senang. Karena pengindeksan daftar didasarkan pada 0, dan saya tidak ingin repot mengoreksi untuk 1 berdasarkan daftar Anda, kami hanya akan membuat elemen yang cukup (11) dan tidak pernah menggunakan indeks 0.
Selanjutnya, kita perlu cara untuk mendapatkan nomor level. Untungnya, pengganti juga tersedia sebagai fungsi, jadi kami akan memberikannya baris kami dan mengekstrak nomor level
substitute(getline("."), "^Level \\(\\d\\):.*", "\\=submatch(1)", "")
Karena saya sekarang adalah daftar 11
1
s (setiap indeks adalah penghitung untuk level kami), sekarang kami dapat menyesuaikan salah satu contoh di atas untuk menggunakan hasil dari substitusi ini:Melalui perintah pengganti:
Melalui perintah normal:
Input contoh:
Contoh output:
sumber
Anda dapat membangun dari https://stackoverflow.com/a/4224454/15934 ke nol pad nomor Anda.
Tetapi untuk menyederhanakan tindakan nomor padding, saya akan pergi untuk sepasang fungsi dan perintah:
Daripada, pilih baris dan jenis
:PrependNumber
Anda (Anda akan lihat:'<,'>PrependNumber
. [Catatan: Perintah ini mengambil parameter opsional: pola sebelum nomor tersebut dimasukkan]sumber
line(".")
berarti "menggunakan nomor baris saat ini"? Itu adalah masalah saya 1. dengan jawaban sebelumnya yang dapat saya temukan.$HOME/vimfiles/plugin/whatevernameyouwish.vim
. Atau bahkan$HOME/_vimrc
(nama file windows) Anda jika Anda inginkan (pertama kali). Jika Anda tidak yakin apa $ HOME pada mesin Anda, tanyakan apa yang ia pikirkan ->:echo $HOME
:source
jika skrip vim dipasang dengan benar di direktori yang benar ({rtp} / plugin, atau {rtp} / ftplugin / {filetype} / ftplugin untuk plugins spesifik filetype).:source
adalah apa yang harus kami mainkan lebih dari satu setengah dekade yang lalu.Anda bisa mendekatinya dengan merekam makro. Dimulai dengan file asli Anda, tambahkan contoh pertama dengan nomor tersebut.
Pindahkan kursor Anda ke
01
, pilih dan tarik denganyiw
. Sekarang Anda ingin merekam tindakan Anda dari titik ini.qq/^Level 1<CR>P<C-A>A<space><esc>0yiwq
qq
Mulai makro dalam register q/^Level 1<CR>
Cari garis yang dimulai dengan "Level 1"P
rekatkan sebelum kursor (berisi nomor Anda)<C-A>
menambah nomorA<space><esc>
Masukkan spasi setelah nomor0
Pindah ke awalyiw
tarik nomor saat iniq
Akhiri makroKemudian ulangi makro ini dengan menggunakan
@q
.sumber
<C-A>
kontrol + a? Itu memilih semua yang ada di Vim di Windows.