Aşağıdaki komutu deneyebilirsiniz:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
Önce değişkeni c
( let c=0
) başlatır , daha sonra g
deseni ^*
(satır başlangıcı, ardından yıldız işareti ve boşluk) arayan global komutu yürütür .
Bu kalıbı içeren bir satır bulunduğunda, global komut şu komutu yürütür:
let c+=1 | s//\=c.'. '
Değişken c
( let c+=1
) 'i arttırır , sonra |
( s
), önceki aranan kalıbı ( //
) bir ifadenin ( \=
) değerlendirmesiyle değiştirir ( ): birleştirilmiş
değişkenin içeriği c
( .
) dizesiyle'. '
Tamponunuzdaki tüm satırları değiştirmek istemiyorsanız, yalnızca belirli bir paragrafı değiştirmek istiyorsanız, global komuta bir aralık iletebilirsiniz. Örneğin, yalnızca sayısı 5 ile 10 arasında olan satırları değiştirmek için:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
Dönüştürmek istediğiniz birkaç benzer listeyi içeren bir dosyanız varsa, örneğin şöyle bir şey:
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
Aşağıdaki komutla yapabilirsiniz:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
c
Başka bir listeye geçtiğinizde değişkeni sıfırlayan önceki komutun sadece bir varyantıdır . Başka bir listede olup olmadığınızı tespit etmek için, değişken d
, bir değişiklik yapılan son satırın numarasını saklamak için kullanılır.
Global komut geçerli satır numarasını ( line('.')
) ile karşılaştırır d+1
. Bunlar aynıysa, bu c
arttıkça ( c+1
) olduğu gibi aynı listede olduğumuz anlamına gelir, aksi takdirde farklı bir listede olduğumuz anlamına gelir, yani c
reset ( 1
).
Bir işlevin içinde, komut let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
şu şekilde yeniden yazılabilir:
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
Veya bunun gibi:
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
Bazı tuş vuruşlarını kaydetmek için :NumberedLists
, varsayılan değeri 1,$
( -range=%
) olan bir aralığı kabul eden özel komutu da tanımlayabilirsiniz :
command! -range=% NumberedLists let [c,d]=[0,0] | <line1>,<line2>g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
Ne zaman :NumberedLists
yürütülür <line1>
ve <line2>
otomatik olarak kullandığınız aralıkla değiştirilir.
Bu nedenle, arabellekteki tüm listeleri dönüştürmek için şunu yazarsınız: :NumberedLists
Yalnızca 10. ve 20. satırlar arasındaki listeler: :10,20NumberedLists
Sadece görsel seçim: :'<,'>NumberedLists
Daha fazla bilgi için bakınız:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command