ปัญหาเกี่ยวกับVimของคุณก็คือคุณไม่ต้องกังวลเลยvi
คุณพูดถึงการตัดyy
และบ่นว่าคุณแทบไม่อยากตัดทั้งบรรทัด ในความเป็นจริงโปรแกรมเมอร์เขียนการแก้ไขซอร์สโค้ดบ่อยมากต้องการทำงานกับทั้งบรรทัดช่วงของบรรทัดและบล็อกของรหัส อย่างไรก็ตามyy
เป็นเพียงหนึ่งในหลายวิธีในการดึงข้อความลงในบัฟเฟอร์การคัดลอกแบบไม่ระบุชื่อ (หรือ "ลงทะเบียน" ตามที่เรียกว่าเป็นvi )
"Zen" ของviคือคุณกำลังพูดภาษา เริ่มต้นy
เป็นคำกริยา คำสั่งเป็นคำพ้องสำหรับyy
เป็นสองเท่าขึ้นเพื่อให้ง่ายต่อการพิมพ์เพราะมันเป็นเช่นการดำเนินงานร่วมกันy_
y
สิ่งนี้สามารถแสดงเป็นdd
P
(ลบบรรทัดปัจจุบันและวางสำเนากลับเข้าที่โดยปล่อยสำเนาไว้ในการลงทะเบียนแบบไม่ระบุชื่อเป็นผลข้างเคียง) y
และd
"คำกริยา" ใช้การเคลื่อนไหวใด ๆ ที่เป็นของพวกเขา "เรื่อง." ดังนั้นจึงyW
เป็น "งัดจากที่นี่ (เคอร์เซอร์) ไปยังจุดสิ้นสุดของคำปัจจุบัน / ถัดไป (ใหญ่)" และy'a
เป็น "งัดจากที่นี่ไปยังบรรทัดที่มีเครื่องหมาย ' a '
หากคุณเข้าใจการเคลื่อนไหวเคอร์เซอร์ขึ้นลงซ้ายขวาและขั้นพื้นฐานเท่านั้นviจะไม่ทำงานได้ดีไปกว่าสำเนา "notepad" สำหรับคุณ (โอเคคุณยังคงมีการเน้นไวยากรณ์และความสามารถในการจัดการไฟล์ที่มีขนาดใหญ่กว่า piddling ~ 45KB หรือมากกว่านั้น แต่ทำงานกับฉันได้ที่นี่)
viมี 26 "เครื่องหมาย" และ 26 "ลงทะเบียน" เครื่องหมายถูกตั้งไว้ที่ตำแหน่งเคอร์เซอร์โดยใช้m
คำสั่ง แต่ละเครื่องหมายถูกกำหนดโดยอักษรตัวพิมพ์เล็กตัวเดียว ดังนั้นma
ตั้งค่าเครื่องหมาย ' a ' เป็นตำแหน่งปัจจุบันและmz
ตั้งค่าเครื่องหมาย ' z ' คุณสามารถย้ายไปยังบรรทัดที่มีเครื่องหมายโดยใช้'
คำสั่ง (คำพูดเดียว) ดังนั้น'a
ย้ายไปที่จุดเริ่มต้นของบรรทัดที่มีเครื่องหมาย ' a ' คุณสามารถย้ายไปยังตำแหน่งที่แม่นยำของเครื่องหมายใด ๆ โดยใช้`
คำสั่ง (backquote) ดังนั้น`z
จะย้ายไปยังตำแหน่งที่แน่นอนของเครื่องหมาย ' z '
เนื่องจากสิ่งเหล่านี้คือ "การเคลื่อนไหว" จึงสามารถใช้เป็นหัวเรื่องสำหรับคำสั่งอื่น ๆ ได้
ดังนั้นวิธีหนึ่งในการตัดข้อความที่เลือกโดยพลการคือการทำเครื่องหมาย (ฉันมักจะใช้ ' a ' เป็นเครื่องหมาย "แรก" ของฉัน ' z ' เป็นเครื่องหมายถัดไปของฉัน ' b ' เป็นอีกวิธีหนึ่งและ ' e ' เป็น อีกอันหนึ่ง (ฉันจำไม่ได้ว่าเคยใช้เครื่องหมายมากกว่าสี่ครั้งใน 15 ปีของการใช้viคนหนึ่งสร้างอนุสัญญาของตัวเองเกี่ยวกับการใช้เครื่องหมายและการลงทะเบียนโดยมาโครที่ไม่รบกวนบริบทเชิงโต้ตอบ) จากนั้นเราไป ไปยังส่วนอื่น ๆ ของข้อความที่เราต้องการเราสามารถเริ่มต้นที่ปลายทั้งสองไม่สำคัญจากนั้นเราสามารถใช้d`a
เพื่อตัดหรือy`a
คัดลอกดังนั้นกระบวนการทั้งหมดมี 5 ค่าใช้จ่ายการกดแป้นพิมพ์ (หกถ้าเราเริ่มใน "แทรก" "โหมดและจำเป็นต้องEscโหมดคำสั่งออก) p
เมื่อเราได้ตัดหรือคัดลอกแล้ววางในการคัดลอกคือการกดแป้นพิมพ์เดียว:
ฉันบอกว่านี่เป็นวิธีหนึ่งในการตัดหรือคัดลอกข้อความ อย่างไรก็ตามมันเป็นเพียงหนึ่งในหลาย ๆ บ่อยครั้งที่เราสามารถอธิบายช่วงของข้อความได้อย่างชัดเจนมากขึ้นโดยไม่ต้องเลื่อนเคอร์เซอร์ไปรอบ ๆ และทำเครื่องหมาย ตัวอย่างเช่นถ้าฉันอยู่ในย่อหน้าของข้อความฉันสามารถใช้{
และ}
เคลื่อนไหวไปที่จุดเริ่มต้นหรือจุดสิ้นสุดของย่อหน้าตามลำดับ ดังนั้นเพื่อย้ายย่อหน้าของข้อความฉันตัดมันโดยใช้{
d}
(3 การกดแป้น) (ถ้าฉันเกิดขึ้นแล้วในบรรทัดแรกหรือย่อหน้าสุดท้ายของย่อหน้าฉันสามารถใช้d}
หรือd{
ตามลำดับ
ความคิดของ "ย่อหน้า" เป็นค่าเริ่มต้นสำหรับสิ่งที่มักจะมีเหตุผลอย่างสังหรณ์ใจ ดังนั้นจึงมักใช้งานได้กับรหัสเช่นเดียวกับร้อยแก้ว
บ่อยครั้งที่เรารู้รูปแบบ (การแสดงออกปกติ) ที่ทำเครื่องหมายปลายด้านหนึ่งหรือส่วนอื่น ๆ ของข้อความที่เราสนใจ ค้นหาไปข้างหน้าหรือถอยหลังมีการเคลื่อนไหวในvi ดังนั้นพวกเขายังสามารถใช้เป็น "วิชา" ในคำสั่ง "ของเรา" ดังนั้นฉันสามารถใช้d/foo
ตัดจากบรรทัดปัจจุบันไปยังบรรทัดถัดไปที่มีสตริง "foo" และy?bar
คัดลอกจากบรรทัดปัจจุบันไปยังบรรทัดล่าสุด (ก่อนหน้า) บรรทัดที่มี "bar" หากฉันไม่ต้องการทั้งบรรทัดฉันยังคงสามารถใช้การเคลื่อนไหวการค้นหา (เป็นคำสั่งของตนเอง) วางเครื่องหมายของฉันและใช้`x
คำสั่งตามที่อธิบายไว้ก่อนหน้านี้
นอกเหนือจาก "คำกริยา" และ "วิชา" viยังมี "วัตถุ" (ในแง่ของไวยากรณ์ของคำศัพท์) จนถึงตอนนี้ฉันอธิบายการใช้ทะเบียนที่ไม่ระบุชื่อเท่านั้น อย่างไรก็ตามฉันสามารถใช้การลงทะเบียน 26 "ชื่อ" ใด ๆ โดยคำนำหน้าการอ้างอิง "วัตถุ" ด้วย"
(ตัวแก้ไขอัญประกาศคู่) ดังนั้นถ้าฉันใช้"add
ฉันกำลังตัดบรรทัดปัจจุบันลงในการลงทะเบียน ' a ' และถ้าฉันใช้"by/foo
แล้วฉันจะคัดลอกข้อความจากที่นี่ไปยังบรรทัดถัดไปที่มีบรรทัด "foo" ลงในการลงทะเบียน ' b ' ในการวางจากการลงทะเบียนฉันเพียงนำหน้าการวางด้วยลำดับตัวดัดแปลงเดียวกัน: "ap
วางสำเนาของ ' a ' register '"bP
วางสำเนาจาก ' b ' ถึงหน้าบรรทัดปัจจุบัน
แนวคิดนี้ของ "คำนำหน้า" ยังเพิ่ม analogs ของ "คำคุณศัพท์" ไวยากรณ์และ "คำวิเศษณ์" ในการจัดการข้อความของเรา "ภาษา" คำสั่งส่วนใหญ่ (คำกริยา) และการเคลื่อนไหว (คำกริยาหรือวัตถุขึ้นอยู่กับบริบท) ยังสามารถใช้คำนำหน้าตัวเลข3J
หมายถึง "เข้าร่วมสามบรรทัดถัดไป" และd5}
หมายถึง "ลบออกจากบรรทัดปัจจุบันจนถึงท้ายย่อหน้าที่ห้าลงมาจากที่นี่"
ทั้งหมดนี้เป็นระดับกลางvi ไม่มีของเฉพาะเจาะจงที่เป็นกลุ่มและมีเทคนิคขั้นสูงในviหากคุณพร้อมที่จะเรียนรู้ หากคุณต้องเชี่ยวชาญเพียงแค่แนวคิดระดับกลางเหล่านี้คุณอาจพบว่าคุณไม่จำเป็นต้องเขียนมาโครใด ๆ เพราะภาษาการจัดการข้อความมีความกระชับและแสดงออกเพียงพอที่จะทำสิ่งต่าง ๆ ได้ง่ายพอโดยใช้ภาษา "ดั้งเดิม" ของตัวแก้ไข
ตัวอย่างของเทคนิคขั้นสูงเพิ่มเติม:
มี:
คำสั่งจำนวนมากโดยเฉพาะอย่างยิ่ง:% s/foo/bar/g
เทคนิคการทดแทนระดับโลก (นั่นไม่ใช่ขั้นสูง แต่:
สามารถใช้คำสั่งอื่นได้) ทั้ง:
ชุดของคำสั่งเป็นมรดกทางประวัติศาสตร์โดยvi 's ก่อนแปลงเป็นเอ็ด (แก้ไขบรรทัด) และต่อมาอดีต (แก้ไขบรรทัดขยาย) สาธารณูปโภค ในความเป็นจริงviตั้งชื่อให้เพราะมันเป็นอินเตอร์เฟซที่ภาพเพื่ออดีต
:
คำสั่งปกติทำงานมากกว่าบรรทัดของข้อความ เอ็ดและอดีตถูกเขียนขึ้นในยุคที่หน้าจอเทอร์มินัลเป็นเรื่องแปลกและเทอร์มินัลจำนวนมากเป็นอุปกรณ์ "โทรพิมพ์" (TTY) ดังนั้นจึงเป็นเรื่องธรรมดาที่จะทำงานจากสำเนาของข้อความที่พิมพ์โดยใช้คำสั่งผ่านทางอินเทอร์เฟซที่สั้นมาก (ความเร็วในการเชื่อมต่อทั่วไปคือ 110 baud หรือประมาณ 11 ตัวอักษรต่อวินาที - ซึ่งช้ากว่าพิมพ์ดีดเร็ว; เซสชันแบบโต้ตอบผู้ใช้หลายคนนอกจากนี้มักจะมีแรงจูงใจในการประหยัดกระดาษ)
ดังนั้นไวยากรณ์ของ:
คำสั่งส่วนใหญ่จึงมีที่อยู่หรือช่วงของที่อยู่ (หมายเลขบรรทัด) ตามด้วยคำสั่ง โดยปกติเราสามารถใช้หมายเลขบรรทัดตามตัวอักษร: :127,215 s/foo/bar
เพื่อเปลี่ยนการเกิดขึ้นครั้งแรกของ "foo" เป็น "bar" ในแต่ละบรรทัดระหว่าง 127 และ 215 นอกจากนี้ยังสามารถใช้ตัวย่อบางอย่างเช่น.
หรือ$
สำหรับบรรทัดปัจจุบันและบรรทัดสุดท้ายตามลำดับ หนึ่งสามารถใช้คำนำหน้าญาติ+
และ-
เพื่ออ้างถึง offsets หลังหรือก่อนเส้น curent ตามลำดับ ดังนั้น: :.,$j
ความหมาย "จากบรรทัดปัจจุบันไปยังบรรทัดสุดท้ายเข้าร่วมทั้งหมดเป็นหนึ่งบรรทัด" :%
มีความหมายเหมือนกันกับ:1,$
(ทุกบรรทัด)
:... g
และ:... v
คำสั่งแบกคำอธิบายบางอย่างที่พวกเขาจะมีประสิทธิภาพอย่างเหลือเชื่อ :... g
เป็นคำนำหน้าสำหรับ "global" โดยใช้คำสั่งที่ตามมากับทุกบรรทัดที่ตรงกับรูปแบบ (นิพจน์ปกติ) ในขณะที่:... v
ใช้คำสั่งดังกล่าวกับทุกบรรทัดที่ไม่ตรงกับรูปแบบที่กำหนด ("v" จาก "conVerse") เช่นเดียวกับคำสั่งexอื่น ๆสิ่งเหล่านี้สามารถนำหน้าด้วยการอ้างอิงที่อยู่ / ช่วง ดังนั้น:.,+21g/foo/d
หมายความว่า "ลบบรรทัดใด ๆ ที่มีสตริง" foo "จากบรรทัดปัจจุบันถึง 21 บรรทัดถัดไป" ในขณะที่:.,$v/bar/d
หมายถึง "จากที่นี่ไปยังจุดสิ้นสุดของไฟล์ให้ลบบรรทัดใด ๆ ที่ไม่ประกอบด้วยสตริง" บาร์ "
เป็นที่น่าสนใจว่าgrepคำสั่ง Unix ทั่วไปได้รับแรงบันดาลใจจากคำสั่งexนี้(และตั้งชื่อตามวิธีที่บันทึกไว้) อดีตคำสั่ง:g/re/p
(grep) เป็นวิธีที่พวกเขาได้รับการบันทึกวิธีการ "ทั่วโลก" "พิมพ์" บรรทัดที่มี "การแสดงออกปกติ" (อีกครั้ง) เมื่อเอ็ดและอดีตถูกนำมาใช้ใน:p
คำสั่งเป็นหนึ่งในครั้งแรกที่ทุกคนได้เรียนรู้และมักจะเป็นคนแรกที่นำมาใช้เมื่อมีการแก้ไขไฟล์ใด ๆ มันเป็นวิธีการที่คุณพิมพ์เนื้อหาปัจจุบัน (มักจะเต็มหน้าเดียวในเวลาโดยใช้:.,+25p
หรือบางอย่าง)
โปรดทราบว่า:% g/.../d
หรือ (ของคู่กัน / กลับกัน: :% v/.../d
เป็นรูปแบบการใช้งานทั่วไปอย่างไรก็ตามมีสองex
คำสั่งอื่น ๆที่น่าจดจำ:
เราสามารถใช้m
เพื่อย้ายเส้นรอบ ๆ และj
เพื่อเข้าร่วมสาย ตัวอย่างเช่นถ้าคุณมีรายการและคุณต้องการแยกสิ่งที่ตรงกันทั้งหมด (หรือตรงกันข้ามไม่ตรงกับบางรูปแบบ) โดยไม่ต้องลบพวกเขาคุณสามารถใช้สิ่งที่ชอบ: :% g/foo/m$
... และบรรทัด "foo" ทั้งหมดจะถูกย้ายไป จุดสิ้นสุดของไฟล์ (หมายเหตุเคล็ดลับอื่น ๆ เกี่ยวกับการใช้จุดสิ้นสุดไฟล์ของคุณเป็นพื้นที่เริ่มต้น) สิ่งนี้จะรักษาลำดับสัมพัทธ์ของบรรทัด "foo" ทั้งหมดในขณะที่แยกออกจากรายการที่เหลือ (นี่จะเทียบเท่ากับการทำสิ่งที่ชอบ: 1G!GGmap!Ggrep foo<ENTER>1G:1,'a g/foo'/d
(คัดลอกไฟล์ไปยังหางของมันเองกรองหางผ่านgrep
และลบทุกอย่างออกจากหัว)
ในการเข้าร่วมไลน์โดยปกติฉันสามารถหารูปแบบสำหรับทุกบรรทัดที่ต้องเข้าร่วมกับบรรพบุรุษของพวกเขา (ทุกบรรทัดที่ขึ้นต้นด้วย "^" แทนที่จะเป็น "^ *" ในรายการหัวข้อย่อยบางรายการ) สำหรับกรณีนี้ฉันจะใช้: :% g/^ /-1j
(สำหรับทุก ๆ คู่ที่ตรงกันให้เพิ่มขึ้นหนึ่งบรรทัดและเข้าร่วม) (BTW: สำหรับรายการ bullet พยายามที่จะค้นหาสายกระสุนและเข้าร่วมการต่อไปไม่ได้ทำงานด้วยเหตุผลสองสาม ... มันสามารถเข้าร่วมสายกระสุนหนึ่งไปยังอีกและมันจะไม่เข้าร่วมสายกระสุนใด ๆ ที่จะทั้งหมดของ การดำเนินการต่อไปของมันจะทำงานได้โดยจับคู่ในการแข่งขัน
แทบไม่จำเป็นต้องพูดถึงคุณสามารถใช้เพื่อนเก่าของเราs
(ทดแทน) กับคำสั่งg
และv
(ทั่วโลก / สนทนาทั่วโลก) โดยปกติแล้วคุณไม่จำเป็นต้องทำเช่นนั้น อย่างไรก็ตามพิจารณาบางกรณีที่คุณต้องการทำการทดแทนเฉพาะในบรรทัดที่ตรงกับรูปแบบอื่น ๆ บ่อยครั้งที่คุณสามารถใช้รูปแบบที่ซับซ้อนพร้อมการจับภาพและใช้การอ้างอิงย้อนกลับเพื่อรักษาส่วนต่าง ๆ ของบรรทัดที่คุณไม่ต้องการเปลี่ยน อย่างไรก็ตามมักจะง่ายกว่าในการแยกการจับคู่ออกจากการเปลี่ยนตัว: :% g/foo/s/bar/zzz/g
- สำหรับทุกบรรทัดที่มี "foo" แทน "bar" ทั้งหมดด้วย "zzz" (สิ่งที่ต้องการ:% s/\(.*foo.*\)bar\(.*\)/\1zzz\2/g
จะใช้งานได้ในกรณีที่อินสแตนซ์ของ "bar" ซึ่งถูก PRECEDED โดย "foo" ในบรรทัดเดียวกันเท่านั้น มันค่อนข้างไม่เรียบร้อยแล้วและจะต้องมีการจัดการเพิ่มเติมเพื่อจับทุกกรณีที่ "bar" นำหน้า "foo")
ประเด็นก็คือว่ามีมากกว่าเพียงp
, s
และd
สายในex
ชุดคำสั่ง
ที่:
อยู่ยังสามารถอ้างถึงเครื่องหมาย ดังนั้นคุณสามารถใช้: :'a,'bg/foo/j
เพื่อเข้าร่วมบรรทัดใด ๆ ที่มีสตริง foo ไปยังบรรทัดถัดไปหากอยู่ระหว่างบรรทัดระหว่างเครื่องหมาย ' a ' และ ' b ' (ใช่ex
ตัวอย่างคำสั่งก่อนหน้านี้ทั้งหมดสามารถ จำกัด เฉพาะชุดย่อยของบรรทัดของไฟล์โดยนำหน้าด้วยนิพจน์การกำหนดแอดเดรสประเภทเหล่านี้)
มันค่อนข้างคลุมเครือ (ฉันใช้บางอย่างเช่นนั้นสองสามครั้งในช่วง 15 ปีที่ผ่านมา) อย่างไรก็ตามฉันจะยอมรับอย่างอิสระว่าฉันมักจะทำสิ่งต่าง ๆ ซ้ำ ๆ และโต้ตอบที่อาจจะทำได้อย่างมีประสิทธิภาพมากขึ้นถ้าฉันใช้เวลาคิดว่าคาถาที่ถูกต้อง
คำสั่งviหรือex ที่มีประโยชน์มากคือ:r
อ่านเนื้อหาของไฟล์อื่น ดังนั้น: :r foo
แทรกเนื้อหาของไฟล์ชื่อ "foo" ที่บรรทัดปัจจุบัน
มีประสิทธิภาพมากขึ้นคือ:r!
คำสั่ง สิ่งนี้จะอ่านผลลัพธ์ของคำสั่ง มันเหมือนกับการหยุดเซสชันviเรียกใช้คำสั่งเปลี่ยนทิศทางเอาต์พุตไปที่ไฟล์ชั่วคราวการเริ่มเซสชันvi ต่อและอ่านเนื้อหาจาก temp ไฟล์.
ที่มีประสิทธิภาพยิ่งขึ้นคือคำสั่ง!
(bang) และ:... !
( ex bang) เหล่านี้ยังรันคำสั่งภายนอกและอ่านผลลัพธ์ลงในข้อความปัจจุบัน อย่างไรก็ตามพวกเขายังกรองการเลือกข้อความของเราผ่านคำสั่ง! นี่เราสามารถเรียงลำดับบรรทัดทั้งหมดในไฟล์ของเราโดยใช้1G!Gsort
( G
คือคำสั่งvi "goto" โดยค่าเริ่มต้นจะไปที่บรรทัดสุดท้ายของไฟล์ แต่สามารถนำหน้าด้วยหมายเลขบรรทัดเช่น 1 บรรทัดแรก) นี่คือเทียบเท่ากับอดีต:1,$!sort
ที่แตกต่าง นักเขียนมักใช้!
กับยูทิลิตี้Unix fmtหรือfoldสำหรับการปฏิรูปหรือการเลือก "ตัดคำ" ของข้อความ แมโครที่ใช้กันทั่วไปคือ{!}fmt
(ฟอร์แมตย่อหน้าปัจจุบัน) บางครั้งโปรแกรมเมอร์ใช้มันเพื่อรันโค้ดหรือเพียงบางส่วนผ่านการเยื้องหรือเครื่องมือการฟอร์แมตโค้ดอื่น ๆ
การใช้:r!
และ!
คำสั่งหมายความว่ายูทิลิตี้หรือตัวกรองภายนอกใด ๆ สามารถใช้เป็นส่วนเสริมของโปรแกรมแก้ไขของเรา ฉันเคยใช้สิ่งเหล่านี้กับสคริปต์ที่ดึงข้อมูลจากฐานข้อมูลหรือด้วยคำสั่งwgetหรือlynxที่ดึงข้อมูลออกจากเว็บไซต์หรือคำสั่งsshที่ดึงข้อมูลจากระบบระยะไกล
คำสั่งex ที่มีประโยชน์อื่นคือ:so
(ย่อมาจาก:source
) สิ่งนี้จะอ่านเนื้อหาของไฟล์เป็นชุดคำสั่ง เมื่อคุณเริ่มviปกติโดยปริยายดำเนินการ:source
ใน~/.exinitrc
ไฟล์ (และเป็นกลุ่มมักจะไม่เกี่ยวกับเรื่องนี้~/.vimrc
อย่างเป็นธรรมชาติพอ) การใช้สิ่งนี้คือคุณสามารถเปลี่ยนโปรไฟล์บรรณาธิการของคุณได้อย่างง่ายดายเพียงแค่จัดหามาโครชุดย่อและตัวแก้ไขใหม่ หากคุณมีเล่ห์เหลี่ยมคุณสามารถใช้สิ่งนี้เป็นเคล็ดลับในการจัดเก็บลำดับของคำสั่งการแก้ไขอดีตเพื่อนำไปใช้กับไฟล์ตามต้องการ
ตัวอย่างเช่นฉันมีไฟล์เจ็ดบรรทัด (36 ตัวอักษร) ซึ่งเรียกใช้ไฟล์ผ่านwcและแทรกความคิดเห็นสไตล์ C ที่ด้านบนของไฟล์ที่มีข้อมูลนับจำนวนคำ ฉันสามารถใช้ "แมโคร" กับไฟล์โดยใช้คำสั่งเช่น:vim +'so mymacro.ex' ./mytarget
( โดยปกติแล้ว+
ตัวเลือกบรรทัดคำสั่งเพื่อviและVimจะใช้เพื่อเริ่มเซสชันการแก้ไขที่หมายเลขบรรทัดที่กำหนดอย่างไรก็ตามมีข้อเท็จจริงเล็กน้อยที่ทราบว่าสามารถปฏิบัติตามคำสั่ง / นิพจน์ex ที่+
ถูกต้องเช่นคำสั่ง "source" เช่น ฉันทำที่นี่แล้วสำหรับตัวอย่างง่ายๆฉันมีสคริปต์ที่เรียกใช้: vi +'/foo/d|wq!' ~/.ssh/known_hosts
เพื่อลบรายการออกจาก SSH ที่รู้จักกันว่าโฮสต์ไฟล์ไม่โต้ตอบในขณะที่ฉันกำลังถ่ายภาพชุดของเซิร์ฟเวอร์)
โดยปกติแล้วมันง่ายกว่าที่จะเขียน "มาโคร" ดังกล่าวโดยใช้ Perl, AWK, sed (ซึ่งอันที่จริงแล้วเช่นgrepยูทิลิตี้ที่ได้รับแรงบันดาลใจจากคำสั่งed )
@
คำสั่งน่าจะเป็นมากที่สุดปิดบังviคำสั่ง ในการสอนหลักสูตรการบริหารระบบขั้นสูงเป็นครั้งคราวเกือบหนึ่งทศวรรษฉันได้พบกับคนจำนวนน้อยมากที่เคยใช้ @
ดำเนินการเนื้อหาของการลงทะเบียนราวกับว่ามันเป็นคำสั่งviหรือex
ตัวอย่าง: ฉันมักจะใช้: :r!locate ...
ค้นหาไฟล์บางไฟล์ในระบบของฉันและอ่านชื่อลงในเอกสารของฉัน จากตรงนั้นฉันจะลบสิ่งที่ไม่เกี่ยวข้องออกไปทิ้งเฉพาะเส้นทางที่เต็มไปยังไฟล์ที่ฉันสนใจแทนที่จะใช้Tabวิธีผ่านแต่ละองค์ประกอบของเส้นทาง (หรือแย่กว่านั้นถ้าฉันติดอยู่บนเครื่องโดยไม่รองรับ ในสำเนาของvi ) ฉันเพิ่งใช้:
0i:r
(เพื่อเปลี่ยนบรรทัดปัจจุบันเป็นคำสั่งที่ถูกต้อง: r )
"cdd
(เพื่อลบบรรทัดในการลงทะเบียน "c") และ
@c
รันคำสั่งนั้น
นั่นคือการกดแป้นพิมพ์เพียง 10 ครั้ง (และการแสดงออก"cdd
@c
เป็นมาโครแบบนิ้วได้อย่างมีประสิทธิภาพสำหรับฉันดังนั้นฉันสามารถพิมพ์ได้เกือบเร็วเท่ากับคำหกตัวอักษรทั่วไปใด ๆ )
ความคิดที่มีสติ
ฉันมีรอยขีดข่วนเพียงแค่แสดงถึงพลังของviและไม่มีสิ่งใดที่ฉันได้อธิบายไว้ที่นี่เป็นส่วนหนึ่งของ "การปรับปรุง" ที่ชื่อเสียงเรียกเข้า ! ทุกสิ่งที่ฉันอธิบายที่นี่ควรใช้กับสำเนาviเก่า ๆจาก 20 หรือ 30 ปีก่อน
มีคนที่ใช้พลังของviมากกว่าที่ฉันจะเป็น