Vi & Vim

คำถามและคำตอบสำหรับผู้ที่ใช้ตระกูล vi และ Vim ของเครื่องมือแก้ไขข้อความ

2
การใช้เครื่องหมายด้วยกุญแจที่ตายแล้ว
ฉันใช้รูปแบบแป้นพิมพ์ที่ backtick ( `) เป็นกุญแจสำคัญที่ตายแล้ว ซึ่งหมายความว่าเมื่อฉันพิมพ์ backtick ตามด้วยสระ (ตัวอย่าง`a) สิ่งที่ Vim เห็นคืออักขระที่เน้นเสียง ( à) ดังนั้นถ้าฉันทำเครื่องหมายไว้กับฉันสามารถข้ามไปยังบรรทัดของเครื่องหมายที่มีma 'aแต่การกระโดดไปยังตำแหน่งเฉพาะของเครื่องหมายด้วย`aจะไม่ทำงาน ฉันพบวิธีแก้ปัญหาสำหรับสิ่งนี้: เมื่อพิมพ์คีย์ที่ตายแล้วฉันสามารถทำให้ Vim รับ backtick ได้โดยการกด backtick และสเปซบาร์ ดังนั้นถ้าฉันต้องการที่จะไปทำเครื่องหมายฉันประเภทa`␣a มีวิธีที่จะข้ามไปที่เครื่องหมายโดยไม่ต้องกดช่องว่างนั้นหรือไม่? ไม่มีผลข้างเคียงหรือไม่

1
ฉันสามารถบังคับให้การจับคู่วงเล็บปรากฏขึ้นในหลาย ๆ หน้าต่างได้หรือไม่
ฉันมีไฟล์ต้นฉบับที่มีรายการโครงสร้าง heterogenous ที่ซ้อนกันยาว เนื่องจากโครงสร้างมีความยาวฉันจึงต้องการ: ใช้:splitคำสั่งเพื่อแบ่งหน้าจอเป็นสอง เลื่อนลงหนึ่งหน้าต่างและอีกหน้าต่างหนึ่ง เมื่อเคอร์เซอร์บนหน้าต่างที่ 1 อยู่เหนือวงเล็บและมองเห็นวงเล็บอื่น ๆ ในหน้าต่างอื่นฉันต้องการให้วงเล็บอื่นในหน้าต่างอื่นกลายเป็นไฮไลต์ (เช่นเดียวกับที่มันแสดงในหน้าต่างเดียวกัน) ฉันจะทำขั้นตอนที่สองให้สำเร็จได้อย่างไร

2
การพับล้มเหลว: เป็นกลุ่มไม่พบการพับใด ๆ
ฉันกำลังพยายามพับโค้ด PHP บางส่วนและฉันได้รวมโค้ดบางเวอร์ชันที่ตัดทอนลงฉันพยายามพับครึ่งท้ายโพสต์ ฉันได้ลองใช้คำสั่ง vim ต่อไปนี้ แต่เพียงคำสั่ง ex ด้านล่างใช้งานได้ คำสั่งที่ไม่ใช่ ex ไม่ทำงานและสร้างข้อความ white-on-red ในบรรทัดสถานะว่า: ฉันไม่พบรอยพับ :help folding :help fold-commands :help foldmethod :set foldmethod=syntax zi - toggle folding zj - move to top of next fold zk - move to bottom of previous fold za - toggle current fold open and …

1
ฉันจะทำให้ความยาวของข้อความเป็นเรื่องง่ายได้อย่างไร
บางครั้งฉันต้องการตรวจสอบความยาวของข้อความตัวอย่างในตัวอย่างนี้: str = 'Hello, world!' if len(str) == 13: print('Hello back to you!') Hello, world!ฉันอยากจะรู้ว่าความยาวของสตริง สิ่งที่ฉันทำตอนนี้คือมีหมายเลขคอลัมน์rulerformatด้วย%cฉันวางเคอร์เซอร์บนอักขระตัวแรกจากนั้นไปที่สุดท้ายและย่อท้ายด้วยตนเอง แม้ว่ามันจะค่อนข้างงุ่มง่าม สิ่งที่ฉันต้องการคือความยาวของการเลือกของฉันในโหมดเสมือนจริงในไม้บรรทัด แต่ไม่มีตัวเลือกสำหรับสิ่งนี้เท่าที่ฉันเห็น สามารถทำได้หรือไม่ หรือด้วยวิธีอื่นที่ง่ายกว่านี้?

1
Regex ที่ชอบการแข่งขันที่สั้นกว่าในการแข่งขัน? (สิ่งนี้เกี่ยวข้องมากกว่าการไม่โลภ)
ฉันพยายามสร้างสคริปต์เพื่อทำการค้นหาแบบฟัซซีภายในบัฟเฟอร์ แนวคิดหลักคือการใช้การป้อนข้อมูลบางส่วนและแทรก.\{-}ระหว่างคู่ของตัวละครทุกเช่นกลายเป็นfoof.\{-}o.\{-}o วิธีนี้ใช้งานได้ดี แต่มีการจับคู่ที่ไม่เหมาะเป็นจำนวนมาก ฉันคิดว่าการค้นหาที่คลุมเครือควรให้ผลการแข่งขันที่สั้นที่สุดก่อน ลองพิจารณาตัวอย่างต่อไปนี้: public void put() การค้นหาคลุมเครือput(เช่นนั้นp.\{-}u.\{-}t) จะจับคู่สตริงทั้งหมดpublic void putแต่การย่อตัวputภายในนั้นจะมีประโยชน์มากกว่า ผู้ดำเนินการที่ไม่ใช่โลภเก่งในการค้นหาการแข่งขันที่สิ้นสุดก่อนหน้านี้ แต่ฉันต้องการบางสิ่งที่สามารถทำได้ในเวลาเดียวกันต้องการการแข่งขันที่เริ่มต้นในภายหลัง ตามหลักการแล้วมันไม่ควรโลภทั้งสองทิศทาง เป็นไปได้ไหม

1
กำหนดคำสั่งที่กำหนดเองสำหรับการลงทะเบียน * และ +
หากฉันใช้ build Vim พร้อมxterm_clipboardฟีเจอร์เนื้อหาคลิปบอร์ดของระบบจะพร้อมใช้งานผ่านการ+ลงทะเบียน หากบิลด์ที่ฉันใช้อยู่ไม่มีคุณสมบัตินี้ฉันจะทำให้การ"+ลงทะเบียนเรียกโปรแกรมที่กำหนดเองของฉันเพื่อดึงข้อมูลและตั้งค่าคลิปบอร์ดของระบบ ( xsel -boและxsel -biหรือด้วยxclipหรือไม่) ในทำนองเดียวกันกับ"*ที่จะเรียกและxsel -poxsel -pi ประเด็นคือสามารถพิมพ์สิ่งที่ชอบ"+pโดยไม่ต้องกังวลว่าคุณลักษณะนั้นจะพร้อมใช้งานหรือไม่ พิมพ์ดีด:r !xsel -b<Enter>ไม่ได้เป็นสิ่งที่ฉันกำลังมองหา: ฉันต้องการการกดแป้นพิมพ์เดียวกันในการทำงานและฉันต้องการวางสายพันธุ์ที่จะทำตามสิ่งที่มีอยู่สำหรับการลงทะเบียน“จริง” ( P, gp, ... ) โบนัส: ฉันสามารถกำหนดคำสั่งที่กำหนดเองสำหรับชื่อการลงทะเบียนอื่น ๆ ได้หรือไม่

4
ฉันสามารถใช้ตัวเลือกทรีไฟล์ที่มีอยู่บน IDE กราฟิกส์ได้หรือไม่?
ปกติแล้วจะอยู่ทางด้านซ้ายและช่วยให้สามารถสลับระหว่างไฟล์ในลำดับชั้นของไดเรกทอรีที่ซับซ้อนได้อย่างรวดเร็ว

4
การเพิ่มบล็อกส่วนหัวความคิดเห็นแบบกว้าง 80 คอลัมน์พร้อมข้อความกึ่งกลาง
ด้วยเหตุผลบางอย่างฉันมักจะแบ่งรหัสออกเป็นส่วนย่อยโดยแยกส่วนหัวดังนี้: ################################################################################ #################################### LOAD ###################################### ################################################################################ เหล่านี้คือบรรทัดที่มีความกว้าง 80 คอลัมน์จำนวน 3 คอลัมน์#โดยมีหัวเรื่องอยู่กึ่งกลาง จนถึงตอนนี้ฉันยังไม่พบวิธีที่รวดเร็วในการสร้างสิ่งเหล่านี้ในกลุ่ม สิ่งที่ฉันมักจะทำคือบางสิ่งบางอย่างตามแนวของ80i#แล้วyyppให้ฉัน 3 บรรทัด แต่จากนั้นฉันต้องนำทางไปที่ตรงกลางและเพิ่มข้อความ ฉันมักจะทำสิ่งนี้ด้วยการแทนที่ แต่การแทนที่ไม่ได้อยู่ตรงกลางส่วนหัวด้านใน#... #ดังนั้นฉันจึงลบส่วนเกินของ#ด้วยตนเอง วิธีการจัดกึ่งกลางข้อความในแถวกลาง? และอะไรจะเป็นวิธีที่เร็วกว่าเพื่อให้ได้ผลลัพธ์นี้?

1
ฉันจะสร้างปุ่มบนแถบเครื่องมือเพื่อเพิ่มและลดขนาดตัวอักษรได้อย่างไร
ระบบจำนวนมากมีปุ่ม + และ - ซูม ใครช่วยกรุณาสาธิตวิธีที่สองปุ่มสามารถเลียนแบบด้วยgvim? ซึ่งหมายความว่าการคลิกปุ่ม + จะเพิ่มขนาดตัวอักษรทีละขั้นตอน ปุ่ม - ทำงานตรงข้ามกัน
8 gvim  font 

4
การสลับบัฟเฟอร์. c / .h
ปกติฉันทำงานกับ 2 windows แยกในแนวตั้ง ปัญหาที่ฉันต้องการแก้ไขคือ: ข้ามไปมาอย่างง่ายดายจากส่วนหัวของไฟล์การใช้งาน <-> ฉันกำลังตรวจสอบโดยไม่มีโชค 2 วิธีในการทำสิ่งนี้: เปิดไฟล์สำรองในหน้าต่างปัจจุบัน : มีหลายวิธีในการทำเช่นนี้อย่างไรก็ตามฉันไม่สามารถหาวิธีที่จำตำแหน่งที่ฉันอยู่ในไฟล์ก่อนหน้าได้ (เช่นข้ามไปที่ส่วนหัวข้ามกลับ แต่ไม่ใช่ตำแหน่งเดียวกับที่ฉันเป็น ) เปิดไฟล์ทางเลือกในหน้าต่างอื่น : นี่เป็นคำจำกัดความที่ดีเนื่องจากฉันใช้งานได้เพียง 2 windows เท่านั้น แต่ฉันไม่มีความรู้เรื่องการทำสิ่งนี้

5
Vim สามารถเขียนบรรทัดเพิ่มเติมได้หรือไม่? เช่นในแต่ละบรรทัด A กลายเป็น B และ 1 กลายเป็น 2
ฉันต้องการเขียนสิ่งนี้: A = mapping[0] B = mapping[1] C = mapping[2] D = mapping[3] E = mapping[4] F = mapping[5] G = mapping[6] H = mapping[7] I = mapping[8] J = mapping[9] K = mapping[10] L = mapping[11] M = mapping[12] N = mapping[13] O = mapping[14] P = mapping[15] Q …
8 macro 

1
ลบหลายบรรทัดตามที่อยู่
ฉันกำลังดูความท้าทายของ vimgolfและฉันคิดว่ามันเป็นการดีที่จะลบบรรทัดที่เฉพาะเจาะจงตามที่อยู่ ฉันรู้ว่าฉันสามารถทำได้ด้วย:<line_number>dแต่จะมีวิธีในการแสดงรายการหมายเลขโทรศัพท์หลายสายเพื่อdให้ทำงานได้หรือไม่ ฉันจินตนาการถึงสิ่งนี้: :1,4,32dแต่แน่นอนว่ามันไม่ทำงาน สิ่งนี้จะเกิดขึ้นได้อย่างไร?

1
การทำความเข้าใจความแตกต่างของการอ้างอิงบรรทัดผ่าน: g / ^ / norm และถึง:% norm
สมมติว่าฉันมีไฟล์ง่าย ๆ ดังต่อไปนี้ a b c d e และฉันตัดสินใจว่าฉันต้องการเพิ่มบรรทัดว่างหลังจากแต่ละบรรทัด วิธีการที่แตกต่างกันหลายอย่างข้ามไปยังใจของฉันทันที เราอาจทำเช่นนั้น (และยอมรับความล้มเหลว) เราอาจบันทึกมาโครที่ชอบqqo<ESC>jqแล้วทำซ้ำหลาย ๆ ครั้ง ในขณะนั้นมีวิธีการสองวิธีที่ชัดเจนกว่าสำหรับฉัน ประการแรกฉันคิดว่าฉันจะออก:normคำสั่งoในแต่ละบรรทัด :%norm oดังนั้นผมจึงวิ่ง แต่สิ่งที่เกิดขึ้นจริงคือเราได้ 5 บรรทัดว่างตามด้วยบรรทัดที่ไม่ได้แยกดังที่กล่าวมา ฉันตีความสิ่งนี้เพื่อหมายความว่าโดย%normvim หยิบข้อความออกมาคำสั่งปกติต่อไปนี้ในห้าบรรทัดแรกของไฟล์ห้าบรรทัดนี้ oคำสั่งสร้างบรรทัดใหม่และเป็นกลุ่มคือ "โง่" ในแง่ที่ว่ามันอ้างอิงจากจำนวน line และไม่จริงโดยระบุอื่น ๆ ฉันเขิน แน่ใจ ฉันลองอีกสองสามอย่างเพื่อดูว่าฉันสามารถใช้วิธีการด้านบนได้หรือไม่ แต่ฉันไม่สามารถทำได้ ด้วยความอยากรู้ฉันได้ลองวิธีการนวดแบบที่ฉันโปรดปราน :g/^/norm oนี้ทำให้ฉันจะลอง ฉันประหลาดใจนี่ใช้งานได้ดี! ดังนั้นสำหรับดวงตาของฉันดูเหมือนว่าเสียงเรียกเข้าไม่ได้ "โง่" ที่นี่ในลักษณะเดียวกับข้างบนและอ้างอิงบรรทัดมากกว่าหมายเลขบรรทัด เกิดอะไรขึ้นกันแน่?
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.