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 g
yang 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 c
digabungkan ( .
) 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 c
ketika Anda beralih ke daftar lain. Untuk mendeteksi apakah Anda berada di daftar lain, variabel d
digunakan 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 c
bertambah ( c+1
), kalau tidak berarti kita berada di daftar yang berbeda, begitu c
juga 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 :NumberedLists
akan 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