Biraz daha etrafta dolaştıktan sonra, vim'in komut dosyası olmadan tek bir komutla yapabileceği ortaya çıkıyor. Örneğin, aşağıdaki tüm sayılara 50 eklemek için şunu <obj param="
kullanabilirsiniz:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Bırakın onu yıkayım.
:
vim'de komut satırı moduna girmenin / göstermenin genel yoludur.
%
tüm belgenin kapsamında anlamına gelir; bir sayı aralığına koyabilirsiniz, örneğin, 1,50
bunu sadece ilk 50 satır içinde yapmak için.
s
yerine kısayol (tercih ederseniz tüm kelimeyi yazabilirsiniz)
@
sınırlayıcı; aradığınız şeyde olmadığı sürece başka bir karakter kullanabilirsiniz. Sadece üç kez kullanın. (Sözdizimi şuna benzer sed
.)
Sınırlayıcı @ 'ın bir sonraki oluşumuna kadar her şey, bu durumda, <obj param="
ardından \d\+
herhangi bir sayı basamağı aranacak reg ex modelidir . \(
Ve \)
tek reg ex gibi geribaşvuruları eşleşir grup olarak rakam tüm bu diziyi orada ayarlamak için vardır \1
, ya Vim submatch
komutu.
Daha sonra sınırlayıcı @
, yerine geçen metni izler.
Buradaki \=
başlangıç, burada anahtar olan reg ex paterni veya dizesi yerine değerlendirilmiş ifadenin sonucunu ikame etmek anlamına gelir.
Sonra '<obj param="'
yedek metnin başlangıcı var . .
Aşağıdaki hangi dizeyi birleştirmekten için Vim fonksiyonudur.
submatch(1)
yalnızca bir ikame komutu içinde kullanılabilen ve regex ile aynı dizeyi döndüren bir vim yerleşik işlevidir \1
; submatch(2)
regex'ler ve benzeri eşdeğeri için kullanabilirsiniz \2
. ( \0
eşleşen tüm modeldir, ancak bunu burada istemiyoruz.) Arama modelinde \(
ve \)
içindeki sayıları işaretlemek için kullanılır submatch(1)
.
Bu nedenle , arama deseni formunda (submatch(1) + 50)
takip eden rakamlara 50 eklenmesinin sonucunu verir <obj param="
.
Sınırlayıcı @
, değiştirilen metnin sonunu işaretlemek için tekrar kullanılır.
Bayrak g
, oyuncu değişikliklerini global yapmak için kullanılır; yalnızca her satırdaki ilk örneği değiştirmek istiyorsanız bunu atlayabilirsiniz.
Muhtemelen oradan nasıl farklı numaralar ekleyeceğinizi, çıkarabileceğinizi veya ayırabileceğinizi vb.
vim
veemacs
bu tür bir şey yapabilirim, ancak tek bir komut kullanmak yerine bir komut dosyası yazmayı gerektirebilir.