การทำความเข้าใจความแตกต่างของการอ้างอิงบรรทัดผ่าน: g / ^ / norm และถึง:% norm


8

สมมติว่าฉันมีไฟล์ง่าย ๆ ดังต่อไปนี้

a
b
c
d
e

และฉันตัดสินใจว่าฉันต้องการเพิ่มบรรทัดว่างหลังจากแต่ละบรรทัด วิธีการที่แตกต่างกันหลายอย่างข้ามไปยังใจของฉันทันที เราอาจทำเช่นนั้น (และยอมรับความล้มเหลว) เราอาจบันทึกมาโครที่ชอบqqo<ESC>jqแล้วทำซ้ำหลาย ๆ ครั้ง

ในขณะนั้นมีวิธีการสองวิธีที่ชัดเจนกว่าสำหรับฉัน

ประการแรกฉันคิดว่าฉันจะออก:normคำสั่งoในแต่ละบรรทัด :%norm oดังนั้นผมจึงวิ่ง แต่สิ่งที่เกิดขึ้นจริงคือเราได้ 5 บรรทัดว่างตามด้วยบรรทัดที่ไม่ได้แยกดังที่กล่าวมา ฉันตีความสิ่งนี้เพื่อหมายความว่าโดย%normvim หยิบข้อความออกมาคำสั่งปกติต่อไปนี้ในห้าบรรทัดแรกของไฟล์ห้าบรรทัดนี้ oคำสั่งสร้างบรรทัดใหม่และเป็นกลุ่มคือ "โง่" ในแง่ที่ว่ามันอ้างอิงจากจำนวน line และไม่จริงโดยระบุอื่น ๆ

ฉันเขิน แน่ใจ ฉันลองอีกสองสามอย่างเพื่อดูว่าฉันสามารถใช้วิธีการด้านบนได้หรือไม่ แต่ฉันไม่สามารถทำได้ ด้วยความอยากรู้ฉันได้ลองวิธีการนวดแบบที่ฉันโปรดปราน :g/^/norm oนี้ทำให้ฉันจะลอง ฉันประหลาดใจนี่ใช้งานได้ดี! ดังนั้นสำหรับดวงตาของฉันดูเหมือนว่าเสียงเรียกเข้าไม่ได้ "โง่" ที่นี่ในลักษณะเดียวกับข้างบนและอ้างอิงบรรทัดมากกว่าหมายเลขบรรทัด

เกิดอะไรขึ้นกันแน่?


2
สังเกตด้านบน: คุณยังสามารถทำเช่นนี้หรือเช่นนี้:%s/$/\r/ :%s/\n/\r\r/สิ่งที่ควรหลีกเลี่ยงคือการขึ้นบรรทัดใหม่สามารถจับคู่\nได้ แต่ต้องเขียน\rแทนค่า
lcd047

คำตอบ:


9

ดี%คือชวเลข1,$(ช่วงจากบรรทัดแรกที่ผ่านมา) จาก:he :%:

Line numbers may be specified with:             :range E14 {address}
        {number}        an absolute line number
        .               the current line                          :.
        $               the last line in the file                 :$
        %               equal to 1,$ (the entire file)            :%

และสำหรับ:global:

The global commands work by first scanning through the [range] lines and
marking each line where a match occurs (for a multi-line pattern, only the
start of the match matters).
In a second scan the [cmd] is executed for each marked line with its line
number prepended.  For ":v" and ":g!" the command is executed for each not
marked line.  If a line is deleted its mark disappears.

ดังนั้นกรณีแรกจึงเหมือนกับการสำรวจรายการในขณะที่แก้ไขดังนั้นตัวนับรายการองค์ประกอบจึงไม่ถูกต้อง ในกรณีที่สองเราทำเครื่องหมายองค์ประกอบที่เราต้องการกำหนดเป้าหมายในรอบเดียวดังนั้นแม้ว่ารายการจะถูกแก้ไขในรอบที่สองเรายังคงทราบว่าองค์ประกอบใดที่เราต้องการทำงาน


อามันยังอยู่ในไฟล์ช่วยเหลือสำหรับทั่วโลก ฉันช่างโง่เหลือเกิน ขอบคุณ
davidlowryduda

man - g overkill นั้นมีประโยชน์มาก ฉันต้องใช้เวลามากขึ้นในการเปลี่ยนจากผู้ใช้เฉลี่ยไปเป็นผู้ใช้ระดับสูง
javadba
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.