คุณสามารถลองคำสั่งต่อไปนี้:
:let c=0 | g/^* /let c+=1 | s//\=c.'. '
ก่อนอื่นมันจะเริ่มต้นตัวแปรc
( let c=0
) จากนั้นมันจะรันคำสั่งโกลบอลg
ซึ่งมองหารูปแบบ^*
(จุดเริ่มต้นของบรรทัดตามด้วยเครื่องหมายดอกจันและเว้นวรรค)
เมื่อใดก็ตามที่พบบรรทัดที่มีรูปแบบนี้คำสั่งโกลบอลจะเรียกใช้งานคำสั่ง:
let c+=1 | s//\=c.'. '
เพิ่มค่าของตัวแปรc
( let c+=1
) จากนั้น ( |
) แทนที่ด้วย ( s
) รูปแบบการค้นหาก่อนหน้า ( //
) ด้วยการประเมินผลของนิพจน์ ( \=
):
เนื้อหาของตัวแปรที่c
ต่อกัน ( .
) ด้วยสตริง'. '
หากคุณไม่ต้องการแก้ไขบรรทัดทั้งหมดจากบัฟเฟอร์ แต่เฉพาะย่อหน้าที่เฉพาะเจาะจงคุณสามารถส่งช่วงไปยังคำสั่งโกลบอลได้ ตัวอย่างเช่นหากต้องการแก้ไขเฉพาะบรรทัดที่มีหมายเลขอยู่ระหว่าง 5 ถึง 10:
:let c=0 | 5,10g/^* /let c+=1 | s//\=c.'. '
หากคุณมีไฟล์ที่มีรายการที่คล้ายกันหลายรายการซึ่งคุณต้องการแปลงตัวอย่างเช่นสิ่งนี้:
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
คุณสามารถทำได้ด้วยคำสั่งต่อไปนี้:
:let [c,d]=[0,0] | g/^* /let [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')] | s//\=c.'. '
มันเป็นเพียงตัวแปรของคำสั่งก่อนหน้าซึ่งจะรีเซ็ตตัวแปรc
เมื่อคุณเปลี่ยนเป็นรายการอื่น เพื่อตรวจสอบว่าคุณอยู่ในรายการอื่นหรือไม่ตัวแปรd
จะถูกใช้เพื่อเก็บหมายเลขของบรรทัดสุดท้ายที่มีการแทนที่
คำสั่งเปรียบเทียบระดับโลกจำนวนบรรทัดปัจจุบัน ( line('.')
) d+1
ด้วย หากพวกเขาเหมือนกันก็หมายความว่าเราอยู่ในรายการเดียวกันเหมือนก่อนที่c
จะเพิ่มขึ้น ( c+1
) มิฉะนั้นก็หมายความว่าเราอยู่ในรายการที่แตกต่างกันดังนั้นจึงc
ถูกรีเซ็ต ( 1
)
ภายในฟังก์ชั่นคำสั่งlet [c,d]=[line('.')==d+1 ? c+1 : 1, line('.')]
สามารถเขียนใหม่ได้เช่นนี้
let c = line('.') == d+1 ? c+1 : 1
let d = line('.')
หรือเช่นนี้
if line('.') == d+1
let c = c+1
else
let c = 1
endif
let d = line('.')
ในการบันทึกการกดแป้นบางตัวคุณสามารถกำหนดคำสั่งที่กำหนดเอง:NumberedLists
ซึ่งยอมรับช่วงที่ค่าเริ่มต้นคือ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.'. '
เมื่อ:NumberedLists
ใดจะถูกดำเนินการ<line1>
และ<line2>
จะถูกแทนที่โดยอัตโนมัติด้วยช่วงที่คุณใช้
ดังนั้นหากต้องการแปลงรายการทั้งหมดในบัฟเฟอร์คุณจะต้องพิมพ์: :NumberedLists
เฉพาะรายการระหว่างบรรทัด 10 และ 20: :10,20NumberedLists
เฉพาะการเลือกภาพ: :'<,'>NumberedLists
สำหรับข้อมูลเพิ่มเติมดู:
:help :range
:help :global
:help :substitute
:help sub-replace-expression
:help list-identity (section list unpack)
:help expr1
:help :command