Anda dapat mencoba perintah berikut:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
Pertama ia menginisialisasi variabel c( let c=0), kemudian mengeksekusi perintah global gyang mencari pola ^*(awal garis, diikuti oleh tanda bintang dan spasi).
Setiap kali baris yang mengandung pola ini ditemukan, perintah global mengeksekusi perintah:
let c+=1 | s//\=c.'. '
Itu menambah variabel c( let c+=1), lalu ( |) menggantikan ( s) pola pencarian sebelumnya ( //) dengan evaluasi ekspresi ( \=):
isi variabel cdigabungkan ( .) dengan string'. '
Jika Anda tidak ingin mengubah semua baris dari buffer Anda, tetapi hanya paragraf tertentu, Anda bisa melewati rentang ke perintah global. Misalnya, untuk memodifikasi hanya garis yang jumlahnya antara 5 dan 10:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Jika Anda memiliki file yang berisi beberapa daftar serupa yang ingin Anda konversi, misalnya sesuatu seperti ini:
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
some other random stuff some other random stuff
==>
some random stuff some random stuff
* foo 1. foo
* bar 2. bar
* baz 3. baz
* qux 4. qux
some other random stuff some other random stuff
Anda dapat melakukannya dengan perintah berikut:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Itu hanya varian dari perintah sebelumnya, yang me-reset variabel cketika Anda beralih ke daftar lain. Untuk mendeteksi apakah Anda berada di daftar lain, variabel ddigunakan untuk menyimpan nomor baris terakhir tempat substitusi dibuat.
Perintah global membandingkan nomor baris saat ini ( line('.')) dengan d+1. Jika mereka sama, itu berarti kita berada di daftar yang sama seperti sebelumnya jadi cbertambah ( c+1), kalau tidak berarti kita berada di daftar yang berbeda, begitu cjuga reset ( 1).
Di dalam suatu fungsi, perintah let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]dapat ditulis ulang seperti ini:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
Atau seperti ini:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Untuk menyimpan beberapa penekanan tombol, Anda juga bisa menentukan perintah khusus :NumberedLists, yang menerima rentang dengan nilai default adalah 1,$( -range=%):
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Kapan :NumberedListsakan dieksekusi, <line1>dan <line2>akan secara otomatis diganti dengan rentang yang Anda gunakan.
Jadi, untuk mengonversi semua daftar di buffer, Anda harus mengetik: :NumberedLists
Hanya daftar di antara baris 10 dan 20: :10,20NumberedLists
Hanya pemilihan visual: :'<,'>NumberedLists
Untuk informasi lebih lanjut, lihat:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command