ทางลัดที่ให้ผลดีที่สุดกับ Vim ของคุณคืออะไร?


1126

ฉันเคยได้ยินเรื่องเกี่ยวกับVim มามากทั้งข้อดีและข้อเสีย ดูเหมือนว่าคุณควรเร็วกว่า Vim มากกว่าบรรณาธิการคนอื่น ๆ ฉันใช้ Vim เพื่อทำสิ่งพื้นฐานบางอย่างและฉันทำได้ดีที่สุดน้อยกว่า Vim ถึง 10 เท่า

สองสิ่งเดียวที่คุณควรใส่ใจเมื่อคุณพูดถึงความเร็ว (คุณอาจไม่สนใจพวกเขามากพอ แต่คุณควร) คือ:

  1. การใช้มือซ้ายหรือขวาเป็นวิธีที่เร็วที่สุดในการใช้แป้นพิมพ์
  2. ไม่เคยแตะเมาส์เป็นวิธีที่สองเพื่อให้เร็วที่สุดเท่าที่จะทำได้ ใช้เวลานานสำหรับคุณในการขยับมือคว้าเมาส์เคลื่อนย้ายแล้วนำกลับไปที่แป้นพิมพ์ (และคุณมักจะต้องดูที่แป้นพิมพ์เพื่อให้แน่ใจว่าคุณกลับมืออย่างถูกต้อง)

นี่คือตัวอย่างสองตัวอย่างที่แสดงให้เห็นว่าทำไมฉันถึงมีประสิทธิผลน้อยกว่าด้วย Vim

คัดลอก / ตัดและวาง ฉันทำมันตลอดเวลา ด้วยเครื่องมือแก้ไขร่วมสมัยทั้งหมดที่คุณกดShift ด้วยมือซ้ายและคุณเลื่อนเคอร์เซอร์ด้วยมือขวาเพื่อเลือกข้อความ จากนั้นคัดลอกCtrl+ Cคุณย้ายเคอร์เซอร์และCtrl+ Vวาง

ด้วยเสียงเรียกเข้ามันน่ากลัว:

  • yy เพื่อคัดลอกหนึ่งบรรทัด (คุณแทบจะไม่ต้องการทั้งบรรทัดเลย!)
  • [number xx]yyเพื่อคัดลอกxxบรรทัดลงในบัฟเฟอร์ แต่คุณไม่มีทางรู้แน่ถ้าคุณเลือกสิ่งที่คุณต้องการ ผมมักจะต้องทำ[number xx]ddแล้วuจะเลิก!

ตัวอย่างอื่น? ค้นหาและแทนที่

  • ในPSPad : Ctrl+ แล้วพิมพ์สิ่งที่คุณต้องการคุณค้นหากดแล้วfEnter
  • ในกลุ่ม: /แล้วพิมพ์สิ่งที่คุณต้องการค้นหาแล้วถ้ามีตัวอักษรพิเศษบางอย่างใส่\ก่อนที่แต่ละEnterอักขระพิเศษจากนั้นกด

และทุกอย่างที่มี Vim เป็นเช่นนั้นดูเหมือนว่าฉันไม่รู้วิธีจัดการกับวิธีที่ถูกต้อง

NB: ฉันได้อ่านแผ่นโกง Vim แล้ว :)

คำถามของฉันคือ:

อะไรคือวิธีที่คุณใช้ Vim ที่ทำให้คุณมีประสิทธิผลมากกว่าบรรณาธิการร่วมสมัย?


"การใช้มือซ้ายหรือขวาเป็นวิธีที่เร็วที่สุดในการใช้แป้นพิมพ์" ไม่ใช่สำหรับฉันอย่างแปลก เมื่อฉันสามารถพิมพ์คำด้วยมือเดียวฉันพบว่าฉันเร็วกว่ามาก
Ben Mordecai

คำตอบ:


2860

ปัญหาเกี่ยวกับ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 ) ฉันเพิ่งใช้:

  1. 0i:r(เพื่อเปลี่ยนบรรทัดปัจจุบันเป็นคำสั่งที่ถูกต้อง: r )
  2. "cdd (เพื่อลบบรรทัดในการลงทะเบียน "c") และ
  3. @c รันคำสั่งนั้น

นั่นคือการกดแป้นพิมพ์เพียง 10 ครั้ง (และการแสดงออก"cdd @cเป็นมาโครแบบนิ้วได้อย่างมีประสิทธิภาพสำหรับฉันดังนั้นฉันสามารถพิมพ์ได้เกือบเร็วเท่ากับคำหกตัวอักษรทั่วไปใด ๆ )


ความคิดที่มีสติ

ฉันมีรอยขีดข่วนเพียงแค่แสดงถึงพลังของviและไม่มีสิ่งใดที่ฉันได้อธิบายไว้ที่นี่เป็นส่วนหนึ่งของ "การปรับปรุง" ที่ชื่อเสียงเรียกเข้า ! ทุกสิ่งที่ฉันอธิบายที่นี่ควรใช้กับสำเนาviเก่า ๆจาก 20 หรือ 30 ปีก่อน

มีคนที่ใช้พลังของviมากกว่าที่ฉันจะเป็น


440
รหัสลิงศักดิ์สิทธิ์ .. นั่นเป็นคำตอบเดียวในเชิงลึก สิ่งที่ดีคือคุณอาจเขียนเป็นกลุ่มในประมาณ 10 keystrokes
EightyOne Unite

48
@ Wahnfieden - grok เป็นสิ่งที่ฉันหมายถึง: en.wikipedia.org/wiki/Grok (เห็นได้ชัดว่าแม้จะอยู่ใน OED --- ยิ่งใกล้เคียงที่สุดที่แองโกลโฟนต้องเป็นพจนานุกรมมาตรฐาน) ในการ "grok" เครื่องมือแก้ไขคือค้นหาตัวเองโดยใช้คำสั่งอย่างคล่องแคล่ว ... ราวกับว่าพวกเขาเป็นภาษาธรรมชาติของคุณ
จิมเดนนิส

22
ว้าวคำตอบที่เขียนได้ดีมาก! ฉันไม่สามารถยอมรับมากขึ้นถึงแม้ว่าฉันจะใช้@คำสั่งจำนวนมาก (ร่วมกับq: บันทึกแมโคร)
knittl

63
คำตอบที่ยอดเยี่ยมที่สุดที่แลกเป็นคำถามที่น่ากลัวจริงๆ ฉันจะยกระดับคำถามนี้ขึ้นมาซึ่งโดยปกติฉันจะลดระดับลงเพื่อให้คำตอบนี้ง่ายต่อการค้นหา (และฉันเป็นผู้ชายของ Emacs! แต่ด้วยวิธีนี้ฉันจะมีที่ไหนสักแห่งที่จะชี้ผู้คนใหม่ที่ต้องการคำอธิบายที่ดีเกี่ยวกับสิ่งที่ผู้ใช้อำนาจ vi พบว่าสนุกเกี่ยวกับ vi จากนั้นฉันจะบอกพวกเขาเกี่ยวกับ Emacs และพวกเขาสามารถตัดสินใจได้)
แบรนดอนโรดส์

8
คุณสามารถสร้างเว็บไซต์และใส่บทช่วยสอนนี้ไว้ที่นั่นได้ดังนั้นจึงไม่ฝังใน stackoverflow ที่นี่ ฉันยังไม่ได้อ่านคำแนะนำเบื้องต้นเกี่ยวกับ vi ดีกว่านี้
Marko

504

คุณกำลังพูดคุยเกี่ยวกับการเลือกข้อความและการคัดลอกผมคิดว่าคุณควรจะให้ดูเป็นภาพโหมดที่เป็นกลุ่ม

ในโหมดภาพคุณสามารถเลือกข้อความโดยใช้คำสั่ง Vim จากนั้นคุณสามารถทำสิ่งที่คุณต้องการด้วยการเลือก

พิจารณาสถานการณ์ทั่วไปต่อไปนี้:

คุณต้องเลือกวงเล็บที่ตรงกันถัดไป

คุณสามารถทำได้:

  • v% ถ้าเคอร์เซอร์อยู่ในวงเล็บเริ่มต้น / สิ้นสุด
  • vib ถ้าเคอร์เซอร์อยู่ในบล็อกวงเล็บ

คุณต้องการเลือกข้อความระหว่างคำพูด:

  • vi "สำหรับเครื่องหมายคำพูดคู่
  • vi 'สำหรับเครื่องหมายคำพูดเดี่ยว

คุณต้องการเลือกบล็อกรั้งแบบหยัก (พบได้บ่อยในภาษา C-style):

  • viB
  • vi{

คุณต้องการเลือกไฟล์ทั้งหมด:

  • ggVG

การเลือกบล็อกภาพเป็นอีกคุณสมบัติที่มีประโยชน์จริง ๆ ช่วยให้คุณเลือกพื้นที่สี่เหลี่ยมของข้อความคุณเพียงแค่ต้องกดCtrl- Vเพื่อเริ่มจากนั้นเลือกบล็อคข้อความที่คุณต้องการและทำการดำเนินการทุกประเภทเช่นงัดลบ วางแก้ไข ฯลฯ เป็นเรื่องที่ยอดเยี่ยมในการแก้ไขข้อความเชิงคอลัมน์


2
บรรณาธิการทุกคนมีบางอย่างเช่นนี้มันไม่เฉพาะเจาะจงเป็นกลุ่ม
finnw

22
ใช่ แต่มันเป็นการร้องเรียนเฉพาะของผู้โพสต์ โหมดภาพเป็นวิธีที่ดีที่สุดของ Vim ในการเลือกและจัดการข้อความโดยตรง และเนื่องจากวิธีการข้ามเส้นทางของบัฟเฟอร์นั้นยอดเยี่ยมมากฉันจึงพบว่าการเลือกข้อความในกลุ่มที่น่าพอใจอย่างเป็นธรรม
ปืน

9
ฉันคิดว่ามันก็คุ้มค่าที่จะกล่าวถึง Ctrl-V เพื่อเลือกบล็อก - นั่นคือข้อความสี่เหลี่ยมผืนผ้าโดยพลการ เมื่อคุณต้องการมันเป็นเครื่องช่วยชีวิต
Hamish Downer

6
@viksit: ฉันใช้ Camtasia แต่มีทางเลือกมากมาย: codinghorror.com/blog/2006/11/screencasting-for-windows.html
CMS

3
นอกจากนี้หากคุณมีการเลือกภาพและต้องการที่จะปรับมันoจะกระโดดไปที่ปลายอีกด้าน ดังนั้นคุณสามารถย้ายทั้งจุดเริ่มต้นและจุดสิ้นสุดของการเลือกได้มากเท่าที่คุณต้องการ
นาธานลอง

207

เคล็ดลับการเพิ่มผลผลิต:

การเคลื่อนไหวที่ชาญฉลาด

  • *และ #ค้นหาคำภายใต้เคอร์เซอร์ไปข้างหน้า / ถอยหลัง
  • w ไปยังคำถัดไป
  • W เป็นคำที่คั่นด้วยช่องว่างถัดไป
  • b/ eถึงจุดเริ่มต้น / สิ้นสุดของคำปัจจุบัน ( B/ Eสำหรับการแยกพื้นที่เท่านั้น)
  • gg/ Gข้ามไปยังจุดเริ่มต้น / สิ้นสุดของไฟล์
  • % ข้ามไปที่การจับคู่ {.. } หรือ (.. ) ฯลฯ
  • {/ }ข้ามไปยังย่อหน้าถัดไป
  • '. ข้ามกลับไปที่บรรทัดที่แก้ไขล่าสุด
  • g; ข้ามกลับไปที่ตำแหน่งที่แก้ไขล่าสุด

คำสั่งแก้ไขด่วน

  • I แทรกที่จุดเริ่มต้น
  • A ต่อท้าย
  • o/ Oเปิดบรรทัดใหม่หลังจาก / ก่อนปัจจุบัน
  • v/ V/ Ctrl+Vโหมดภาพ (เพื่อเลือกข้อความ!)
  • Shift+R แทนที่ข้อความ
  • C เปลี่ยนส่วนที่เหลือของบรรทัด

การรวมคำสั่ง

คำสั่งส่วนใหญ่ยอมรับจำนวนและทิศทางตัวอย่างเช่น:

  • cW = เปลี่ยนจนจบคำ
  • 3cW = เปลี่ยน 3 คำ
  • BcW = เพื่อเริ่มต้นของคำเต็มเปลี่ยนคำเต็ม
  • ciW = เปลี่ยนคำใน
  • ci" = เปลี่ยนด้านในระหว่าง ".. "
  • ci( = เปลี่ยนข้อความระหว่าง (.. )
  • ci<= เปลี่ยนข้อความระหว่าง <.. > (ต้องการเป็นset matchpairs+=<:>vimrc)
  • 4dd = ลบ 4 บรรทัด
  • 3x = ลบ 3 ตัวอักษร
  • 3s = แทน 3 ตัวอักษร

คำสั่งโปรแกรมเมอร์ที่มีประโยชน์

  • rแทนที่หนึ่งอักขระ (เช่นrdแทนที่อักขระปัจจุบันด้วยd)
  • ~ กรณีการเปลี่ยนแปลง
  • J รวมสองบรรทัด
  • Ctrl + A / Ctrl + X การเพิ่ม / ลดจำนวน
  • . ทำซ้ำคำสั่งสุดท้าย (แมโครง่าย ๆ )
  • == แก้ไขการเยื้องบรรทัด
  • > บล็อกการเยื้อง (ในโหมดภาพ)
  • < บล็อก unindent (ในโหมดภาพ)

การบันทึกมาโคร

  • กดq[ key ]เพื่อเริ่มการบันทึก
  • จากนั้นกดปุ่มqเพื่อหยุดการบันทึก
  • @[ key ]แมโครสามารถเล่นกับ

ด้วยการใช้คำสั่งและการเคลื่อนไหวที่เฉพาะเจาะจง VIM สามารถเล่นซ้ำการกระทำที่แน่นอนเหล่านั้นสำหรับบรรทัดถัดไป (เช่น A สำหรับผนวก - ต่อท้ายb/ eเพื่อเลื่อนเคอร์เซอร์ไปที่ต้นหรือท้ายของคำตามลำดับ)

ตัวอย่างของการตั้งค่าที่ดี

# reset to vim-defaults
if &compatible          # only if not set before:
  set nocompatible      # use vim-defaults instead of vi-defaults (easier, more user friendly)
endif

# display settings
set background=dark     # enable for dark terminals
set nowrap              # dont wrap lines
set scrolloff=2         # 2 lines above/below cursor when scrolling
set number              # show line numbers
set showmatch           # show matching bracket (briefly jump)
set showmode            # show mode in status bar (insert/replace/...)
set showcmd             # show typed command in status bar
set ruler               # show cursor position in status bar
set title               # show file in titlebar
set wildmenu            # completion with menu
set wildignore=*.o,*.obj,*.bak,*.exe,*.py[co],*.swp,*~,*.pyc,.svn
set laststatus=2        # use 2 lines for the status bar
set matchtime=2         # show matching bracket for 0.2 seconds
set matchpairs+=<:>     # specially for html

# editor settings
set esckeys             # map missed escape sequences (enables keypad keys)
set ignorecase          # case insensitive searching
set smartcase           # but become case sensitive if you type uppercase characters
set smartindent         # smart auto indenting
set smarttab            # smart tab handling for indenting
set magic               # change the way backslashes are used in search patterns
set bs=indent,eol,start # Allow backspacing over everything in insert mode

set tabstop=4           # number of spaces a tab counts for
set shiftwidth=4        # spaces for autoindents
#set expandtab           # turn a tabs into spaces

set fileformat=unix     # file mode is unix
#set fileformats=unix,dos    # only detect unix file format, displays that ^M with dos files

# system settings
set lazyredraw          # no redraws in macros
set confirm             # get a dialog when :q, :w, or :wq fails
set nobackup            # no backup~ files.
set viminfo='20,\"500   # remember copy registers after quitting in the .viminfo file -- 20 jump links, regs up to 500 lines'
set hidden              # remember undo after quitting
set history=50          # keep 50 lines of command history
set mouse=v             # use mouse in visual mode (not normal,insert,command,help mode


# color settings (if terminal/gui supports it)
if &t_Co > 2 || has("gui_running")
  syntax on          # enable colors
  set hlsearch       # highlight search (very useful!)
  set incsearch      # search incremently (search while typing)
endif

# paste mode toggle (needed when using autoindent/smartindent)
map <F10> :set paste<CR>
map <F11> :set nopaste<CR>
imap <F10> <C-O>:set paste<CR>
imap <F11> <nop>
set pastetoggle=<F11>

# Use of the filetype plugins, auto completion and indentation support
filetype plugin indent on

# file type specific settings
if has("autocmd")
  # For debugging
  #set verbose=9

  # if bash is sh.
  let bash_is_sh=1

  # change to directory of current file automatically
  autocmd BufEnter * lcd %:p:h

  # Put these in an autocmd group, so that we can delete them easily.
  augroup mysettings
    au FileType xslt,xml,css,html,xhtml,javascript,sh,config,c,cpp,docbook set smartindent shiftwidth=2 softtabstop=2 expandtab
    au FileType tex set wrap shiftwidth=2 softtabstop=2 expandtab

    # Confirm to PEP8
    au FileType python set tabstop=4 softtabstop=4 expandtab shiftwidth=4 cinwords=if,elif,else,for,while,try,except,finally,def,class
  augroup END

  augroup perl
    # reset (disable previous 'augroup perl' settings)
    au!  

    au BufReadPre,BufNewFile
    \ *.pl,*.pm
    \ set formatoptions=croq smartindent shiftwidth=2 softtabstop=2 cindent cinkeys='0{,0},!^F,o,O,e' " tags=./tags,tags,~/devel/tags,~/devel/C
    # formatoption:
    #   t - wrap text using textwidth
    #   c - wrap comments using textwidth (and auto insert comment leader)
    #   r - auto insert comment leader when pressing <return> in insert mode
    #   o - auto insert comment leader when pressing 'o' or 'O'.
    #   q - allow formatting of comments with "gq"
    #   a - auto formatting for paragraphs
    #   n - auto wrap numbered lists
    #   
  augroup END


  # Always jump to the last known cursor position. 
  # Don't do it when the position is invalid or when inside
  # an event handler (happens when dropping a file on gvim). 
  autocmd BufReadPost * 
    \ if line("'\"") > 0 && line("'\"") <= line("$") | 
    \   exe "normal g`\"" | 
    \ endif 

endif # has("autocmd")

การตั้งค่าสามารถเก็บไว้ใน~/.vimrcหรือทั้งระบบ/etc/vimrc.localแล้วโดยการอ่านจาก/etc/vimrcไฟล์โดยใช้:

source /etc/vimrc.local

(คุณจะต้องแทนที่#อักขระความคิดเห็นด้วย"เพื่อให้ทำงานใน VIM ได้ฉันต้องการให้เน้นสีที่เหมาะสมที่นี่)

คำสั่งที่ฉันแสดงไว้ที่นี่เป็นพื้นฐานที่ค่อนข้างดีและคำสั่งหลักที่ฉันใช้จนถึงตอนนี้ พวกเขาทำให้ฉันมีประสิทธิผลมากกว่าเดิมโดยไม่ต้องรู้เรื่องแฟนซีทั้งหมด


4
ดีกว่า'.มีที่ซึ่งกระโดดกลับผ่านg; changelistไปที่ตำแหน่งที่แก้ไขล่าสุดแทนที่จะเป็นบรรทัดที่แก้ไขล่าสุด
naught101

98

Control+ Rกลไกการเป็นประโยชน์อย่างมาก :-) ทั้งในโหมดแทรกหรือโหมดคำสั่ง (เช่นใน:บรรทัดคำสั่งเมื่อพิมพ์) ยังคงมีการลงทะเบียนหมายเลขหรือชื่อ:

  • a- zการลงทะเบียนที่มีชื่อ
  • " การลงทะเบียนที่ไม่มีชื่อที่มีข้อความของการลบล่าสุดหรือดึง
  • % ชื่อไฟล์ปัจจุบัน
  • # ชื่อไฟล์สำรอง
  • * เนื้อหาของคลิปบอร์ด (X11: ตัวเลือกหลัก)
  • + เนื้อหาของคลิปบอร์ด
  • / รูปแบบการค้นหาล่าสุด
  • : บรรทัดคำสั่งสุดท้าย
  • . ข้อความที่แทรกล่าสุด
  • - ขนาดเล็กล่าสุด (น้อยกว่าหนึ่งบรรทัด) ลบ
  • =5*5 แทรก 25 ลงในข้อความ (เครื่องคำนวณขนาดเล็ก)

ดู:help i_CTRL-Rและ:help c_CTRL-Rสำหรับรายละเอียดเพิ่มเติมและสอดแนมบริเวณใกล้เคียงเพื่อรับความดี CTRL-R เพิ่มเติม


10
FYI นี้หมายถึง Ctrl + R ในโหมดแทรก ในโหมดปกติ Ctrl + R จะทำซ้ำ
vdboor

2
+1 สำหรับชื่อไฟล์ปัจจุบัน / ทางเลือก Control-Aยังทำงานในโหมดแทรกสำหรับข้อความที่แทรกล่าสุดและControl-@เพื่อแทรกข้อความที่แทรกล่าสุดและเปลี่ยนเป็นโหมดปกติทันที
Aryeh Leib Taurog

91

ปลั๊กอินที่เป็นกลุ่ม

มีคำตอบที่ดีมากมายที่นี่และอีกอันที่น่าอัศจรรย์เกี่ยวกับเซนแห่ง vi สิ่งหนึ่งที่ฉันไม่เห็นกล่าวถึงก็คือเสียงเรียกเข้านั้นสามารถขยายได้อย่างมากผ่านปลั๊กอิน มีสคริปต์และปลั๊กอินที่จะทำให้สิ่งต่าง ๆ บ้าคลั่งที่ผู้เขียนต้นฉบับไม่เคยพิจารณา นี่คือตัวอย่างของปลั๊กอิน vim ที่มีประโยชน์อย่างไม่น่าเชื่อ:

rails.vim

Rails.vim เป็นปลั๊กอินที่เขียนโดย tpope มันเป็นเครื่องมือที่เหลือเชื่อสำหรับคนที่พัฒนาทางรถไฟ มันทำสิ่งที่ไวต่อบริบทที่มีมนต์ขลังที่ช่วยให้คุณสามารถกระโดดจากวิธีการในตัวควบคุมไปยังมุมมองที่เกี่ยวข้องไปยังแบบจำลองและลงสู่การทดสอบหน่วยสำหรับรูปแบบนั้นได้อย่างง่ายดาย มันประหยัดหลายสิบถ้าไม่ใช่หลายร้อยชั่วโมงในฐานะผู้พัฒนาราง

gist.vim

ปลั๊กอินนี้จะช่วยให้คุณสามารถเลือกพื้นที่ของข้อความในโหมดภาพและพิมพ์คำสั่งที่รวดเร็วในการโพสต์ไปgist.github.com วิธีนี้ช่วยให้สามารถเข้าถึง pastebin ได้ง่ายซึ่งมีประโยชน์อย่างเหลือเชื่อถ้าคุณร่วมมือกับใครบางคนผ่าน IRC หรือ IM

space.vim

ปลั๊กอินนี้มีฟังก์ชั่นพิเศษให้กับ spacebar มันเปลี่ยนสเปซบาร์เป็นสิ่งที่คล้ายคลึงกับช่วงเวลา แต่แทนที่จะเป็นการกระทำซ้ำ ๆ สิ่งนี้มีประโยชน์มากสำหรับการเคลื่อนที่อย่างรวดเร็วผ่านไฟล์ในแบบที่คุณกำหนดได้ทันที

surround.vim

ปลั๊กอินนี้ให้ความสามารถในการทำงานกับข้อความที่คั่นด้วยบางแบบ มันให้วัตถุที่แสดงถึงสิ่งที่อยู่ใน parens ของคุณสิ่งที่อยู่ในเครื่องหมายคำพูด ฯลฯ มันมีประโยชน์สำหรับการจัดการข้อความที่คั่นด้วย

supertab.vim

สคริปต์นี้นำเสนอฟังก์ชั่นการเติมเต็มของแถบแฟนซีให้เป็นกลุ่ม การเติมข้อความอัตโนมัติมีอยู่แล้วในแกนกลางของเสียงเรียกเข้า แต่สิ่งนี้นำไปสู่แท็บอย่างรวดเร็วแทนที่จะเป็นทางลัดหลายปุ่มที่แตกต่างกัน มีประโยชน์มากและสนุกกับการใช้อย่างไม่น่าเชื่อ แม้ว่าจะไม่ใช่ Intellisense ของ VS แต่ก็เป็นขั้นตอนที่ยอดเยี่ยมและนำเสนอฟังก์ชันการทำงานที่คุณคาดหวังจากเครื่องมือสร้างแท็บ

syntastic.vim

เครื่องมือนี้นำคำสั่งการตรวจสอบไวยากรณ์ภายนอกมาเป็นกลุ่ม ฉันไม่ได้ใช้มันเป็นการส่วนตัว แต่ฉันได้ยินสิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้และแนวคิดยากที่จะเอาชนะ การตรวจสอบไวยากรณ์โดยไม่ต้องทำด้วยตนเองเป็นตัวช่วยประหยัดเวลาที่ยอดเยี่ยมและสามารถช่วยให้คุณตรวจจับข้อบกพร่องทางไวยากรณ์ในขณะที่คุณแนะนำพวกเขามากกว่าเมื่อคุณหยุดทดสอบในที่สุด

fugitive.vim

เข้าถึง git โดยตรงจากด้านในของกลุ่ม อีกครั้งฉันไม่ได้ใช้ปลั๊กอินนี้ แต่ฉันสามารถดูยูทิลิตี้ น่าเสียดายที่ฉันอยู่ในวัฒนธรรมที่ svn ถูกพิจารณาว่าเป็น "ใหม่" ดังนั้นฉันจะไม่เห็นคอมไพล์ในที่ทำงานสักพัก

nerdtree.vim

เบราว์เซอร์ต้นไม้สำหรับเป็นกลุ่ม ฉันเริ่มใช้สิ่งนี้เมื่อเร็ว ๆ นี้และมันมีประโยชน์จริงๆ มันช่วยให้คุณวางมุมมองทรีในแนวตั้งและเปิดไฟล์ได้อย่างง่ายดาย นี่เป็นโครงการที่ยอดเยี่ยมสำหรับโครงการที่มีไฟล์ต้นฉบับจำนวนมากที่คุณข้ามไปมาบ่อยครั้ง

FuzzyFinderTextmate.vim

นี่เป็นปลั๊กอินที่ไม่มีการดูแล แต่ก็มีประโยชน์อย่างเหลือเชื่อ มันให้ความสามารถในการเปิดไฟล์โดยใช้ไวยากรณ์อธิบาย "ฝอย" หมายความว่าในต้นไม้ที่กระจัดกระจายคุณจำเป็นต้องพิมพ์ตัวอักษรมากพอที่จะแยกแยะความแตกต่างของไฟล์ที่คุณสนใจจากส่วนที่เหลือของ cruft

ข้อสรุป

มีเครื่องมือมากมายสำหรับ vim ฉันแน่ใจว่าฉันมีรอยขีดข่วนบนพื้นผิวที่นี่เท่านั้นและคุ้มค่ากับการค้นหาเครื่องมือที่ใช้กับโดเมนของคุณ การรวมกันของชุดเครื่องมืออันทรงพลังของ vi ดั้งเดิมการปรับปรุงของ vim และปลั๊กอินที่ขยายเสียงเรียกเข้าให้กว้างยิ่งขึ้นเป็นหนึ่งในวิธีที่ทรงพลังที่สุดในการแก้ไขข้อความที่เคยเกิดขึ้น Vim นั้นมีประสิทธิภาพเทียบเท่ากับ emacs, eclipse, visual studio และ textmate

ขอบคุณ

ขอบคุณduwanisสำหรับการกำหนดค่ากลุ่มของเขาซึ่งฉันได้เรียนรู้มากและยืมปลั๊กอินส่วนใหญ่ที่แสดงไว้ที่นี่


การนำทางไปยังชั้นเรียนแบบทดสอบที่มีมนต์ขลังใน rails.vim เป็นอีกสิ่งหนึ่งที่ฉันหวังว่า VIM จะมี TextMate ที่ใช้งานได้ทุกภาษา: ถ้าฉันทำงานกับ Person.scala และฉันทำ Cmd + T เป็นสิ่งแรก ในรายการคือ PersonTest.scala
Tom Morris

5
ฉันคิดว่าถึงเวลาที่ FuzzyFinderTextmate เริ่มถูกแทนที่ด้วยgithub.com/wincent/Command-T
Gavin Gilmour

2
+1 สำหรับ Syntastic เมื่อรวมกับ JSLint ทำให้ Javascript ของฉันมีข้อผิดพลาดน้อยลง ดูsuperuser.com/questions/247012/…เกี่ยวกับวิธีตั้งค่า JSLint เพื่อทำงานกับ Syntastic
Nathan Long

1
@Benson รายการที่ยอดเยี่ยม! ฉันจะโยนในsnipMateเช่นกัน ระบบอัตโนมัติที่มีประโยชน์มากในการเขียนโค้ดทั่วไป ถ้า <tab> ทันทีหากบล็อกเป็นต้น
AlG

2
ผมคิดว่า nerdcommenter ยังเป็นปลั๊กอินที่ดีที่นี่ เช่นเดียวกับชื่อของมันมันมีไว้สำหรับแสดงความคิดเห็นรหัสของคุณ
เตฟาน

53

. ทำซ้ำคำสั่งเปลี่ยนข้อความล่าสุด

ฉันประหยัดเวลาได้มากกับอันนี้

โหมดภาพถูกกล่าวถึงก่อนหน้านี้ แต่โหมดบล็อกภาพช่วยให้ฉันประหยัดเวลาได้มากเมื่อแก้ไขคอลัมน์ขนาดคงที่ในไฟล์ข้อความ (เข้าถึงด้วย Ctrl-V)


3
นอกจากนี้หากคุณใช้คำสั่งรัดกุม (เช่น A สำหรับการต่อท้าย - ท้าย) เพื่อแก้ไขข้อความเสียงเรียกเข้าสามารถทำซ้ำการกระทำเดียวกันนั้น ๆ สำหรับบรรทัดถัดไปที่คุณกด.ปุ่มที่
vdboor

48

กูเกิล

ไปที่ตำแหน่งที่แก้ไขล่าสุด (มีประโยชน์มากถ้าคุณทำการค้นหาบางอย่างและกว่าที่ต้องการกลับไปแก้ไข)

^ P และ ^ N

กรอกข้อความก่อนหน้า (^ P) หรือข้อความถัดไป (^ N) ให้สมบูรณ์

^ O และ ^ I

ไปที่ตำแหน่งก่อนหน้า ( ^O- "O"สำหรับเก่า) หรือถัดไป ( ^I- "I"ใกล้กับ"O") เมื่อคุณทำการค้นหาแก้ไขไฟล์ ฯลฯ คุณสามารถไปที่ "ข้าม" ไปข้างหน้าและข้างหลัง


4
@Kungi ` จะนำคุณไปสู่การแก้ไขล่าสุด `` จะนำคุณกลับไปยังตำแหน่งที่คุณอยู่ก่อนหน้า 'กระโดด' ครั้งสุดท้าย - ซึ่ง / / / อาจเป็นตำแหน่งของการแก้ไขล่าสุด
Grant McLean

46

ฉันเพิ่งค้นพบเว็บไซต์นี้: http://vimcasts.org/

มันค่อนข้างใหม่และดีจริงๆ คนที่ใช้งานเว็บไซต์นี้เปลี่ยนจาก textmate ไปเป็นกลุ่มและเป็นเจ้าภาพที่ดีมากและกระชับบรรยากาศในหัวข้อเฉพาะ ลองดูสิ!


3
หากคุณชอบบทช่วยสอนแบบกลุ่มให้ดูวิดีโอกลุ่มตัวอย่างของ Derek Wyattเช่นกัน พวกเขายอดเยี่ยม
Jeromy Anglim

42

CTRL+Aเพิ่มจำนวนที่คุณยืน


19
... และการลดลงของ CTRL-X
innaM

9
มันเป็นทางลัดที่เรียบร้อย แต่จนถึงตอนนี้ฉันไม่เคยพบประโยชน์ใด ๆ เลย
SolutionYogi

8
ถ้าคุณเรียกใช้กลุ่มในหน้าจอและสงสัยว่าทำไมมันไม่ทำงาน - ctrl + A, A
matja

13
@SolutionYogi: พิจารณาว่าคุณต้องการเพิ่มหมายเลขบรรทัดไปยังจุดเริ่มต้นของแต่ละบรรทัด โซลูชัน: ggI1 <space> <esc> 0qqyawjP0 <ca> 0q9999 @ q
hcs42

10
มีประโยชน์อย่างมากกับ Vimperator ซึ่งจะเพิ่ม (หรือลดลง, Ctrl-X) ตัวเลขสุดท้ายใน URL มีประโยชน์สำหรับการท่องอย่างรวดเร็วผ่านแกลเลอรี่ภาพ ฯลฯ
น้ำเงิน

38

ทั้งหมดในโหมดปกติ:

f <char>เพื่อย้ายไปยังอินสแตนซ์ถัดไปของอักขระเฉพาะบนบรรทัดปัจจุบันและ; ทำซ้ำ.

F <อักขระ>เพื่อย้ายไปยังอินสแตนซ์ก่อนหน้าของอักขระเฉพาะบนบรรทัดปัจจุบันและ; ทำซ้ำ.

หากใช้อย่างชาญฉลาดทั้งสองอย่างนี้จะทำให้คุณเคลื่อนไหวได้อย่างรวดเร็วในแถวเดียว

*ค้นหาคำเพื่อค้นหาอินสแตนซ์ถัดไป

#บนคำเพื่อค้นหาอินสแตนซ์ก่อนหน้า


6
อ๊ะฉันไม่รู้เกี่ยวกับการผูก * และ # (ค้นหาไปข้างหน้า / หลังเพื่อหาคำภายใต้เคอร์เซอร์) มันเยี่ยมมาก f / F และ t / T และ; คำสั่งข้ามอย่างรวดเร็วไปยังตัวละครในบรรทัดปัจจุบัน f / F วางเคอร์เซอร์บนตัวอักษรที่ระบุในขณะที่ t / T วางมันไว้ที่ "ถึง" ตัวละคร (ตัวละครก่อนหรือหลังตามทิศทางที่เลือกเพียงแค่ทำซ้ำ f / F / t / T ล่าสุด กระโดด (ไปในทิศทางเดียวกัน)
จิมเดนนิส

10
:) สโลแกนที่ด้านบนสุดของหน้าเคล็ดลับที่ vim.org: "คุณสามารถจินตนาการว่าการกดแป้นจำนวนกี่ครั้งจะได้รับการบันทึกถ้าฉันเพิ่งรู้จักคำสั่ง" * "ในเวลา? - Juergen Salk,
1/19/2001

1
ดังที่จิมกล่าวไว้คำสั่งผสม "t / T" มักจะดีเหมือนกันถ้าไม่ดีขึ้นเช่นct(จะลบคำและทำให้คุณอยู่ในโหมดแทรก แต่ให้คงอยู่ในประโยค
puk

34

เซสชั่น

บันทึกเซสชัน

: mks sessionname

ข บังคับให้บันทึกเซสชัน

: MKS! sessionname

ค. โหลดเซสชั่น

gvim หรือ vim -S sessionname


การเพิ่มและการลบ

การเพิ่มและการลบ

CTRL-A; เพิ่ม [count] ให้กับตัวเลขหรือตัวอักษรที่หรือหลังเคอร์เซอร์ {ไม่ใช่ใน Vi

CTRL-X; ลบ [นับ] จากตัวเลขหรือตัวอักษรที่หรือหลังเคอร์เซอร์ {ไม่ใช่ใน Vi}

ข เปิดหน้าต่างคีย์แมป

ในหน้าต่าง Ctrl-A ถูกแมปแล้วสำหรับการเลือกไฟล์ทั้งหมดที่คุณต้องการยกเลิกการแมปในไฟล์ rc ทำเครื่องหมาย mswin.vim CTRL-A ส่วนการทำแผนที่เป็นความคิดเห็นหรือเพิ่มไฟล์ rc ของคุณด้วย unmap

ค. ด้วยมาโคร

คำสั่ง CTRL-A มีประโยชน์มากในแมโคร ตัวอย่าง: ใช้ขั้นตอนต่อไปนี้เพื่อสร้างรายการที่มีหมายเลข

  1. สร้างรายการแรกให้แน่ใจว่ามันเริ่มต้นด้วยตัวเลข
  2. qa - เริ่มบันทึกลงในบัฟเฟอร์ 'a'
  3. Y - ดึงรายการ
  4. p - ใส่สำเนาของรายการด้านล่างหนึ่งรายการ
  5. CTRL-A - เพิ่มจำนวน
  6. q - หยุดการบันทึก
  7. @a - ทำซ้ำงัดใส่และเพิ่มครั้ง

1
มีความคิดใดบ้างที่ทางลัดใน Windows
Don Reba

32

สัปดาห์ที่แล้วโครงการของเราได้รับรหัส Python จำนวนมากจากโครงการอื่น น่าเสียดายที่รหัสไม่เหมาะกับสถาปัตยกรรมที่มีอยู่ของเรา - มันทำด้วยตัวแปรและฟังก์ชั่นระดับโลกซึ่งจะไม่ทำงานในสภาพแวดล้อมแบบมัลติเธรด

เรามีไฟล์ประมาณ 80 ไฟล์ที่จำเป็นต้องทำใหม่เพื่อให้เป็นวัตถุเชิง - ฟังก์ชั่นทั้งหมดถูกย้ายไปยังคลาส, พารามิเตอร์ที่เปลี่ยนแปลง, เพิ่มคำสั่งการนำเข้า, ฯลฯ ฉันคาดว่าการทำด้วยมือคนคนหนึ่งอาจทำได้ 2-4 ต่อวัน

ดังนั้นฉันจึงทำสิ่งแรกด้วยมือแล้วเขียนสคริปต์กลุ่มเพื่อทำให้การเปลี่ยนแปลงเป็นไปโดยอัตโนมัติ ส่วนใหญ่เป็นรายการคำสั่ง vim เช่น

" delete an un-needed function "
g/someFunction(/ d

" add wibble parameter to function foo "
%s/foo(/foo( wibble,/

" convert all function calls bar(thing) into method calls thing.bar() "
g/bar(/ normal nmaf(ldi(`aPa.

อันสุดท้ายสมควรได้รับการอธิบายเล็กน้อย:

g/bar(/  executes the following command on every line that contains "bar("
normal   execute the following text as if it was typed in in normal mode
n        goes to the next match of "bar(" (since the :g command leaves the cursor position at the start of the line)
ma       saves the cursor position in mark a
f(       moves forward to the next opening bracket
l        moves right one character, so the cursor is now inside the brackets
di(      delete all the text inside the brackets
`a       go back to the position saved as mark a (i.e. the first character of "bar")
P        paste the deleted text before the current cursor position
a.       go into insert mode and add a "." 

สำหรับการแปลงที่ซับซ้อนมากขึ้นสองสามอย่างเช่นการสร้างคำสั่งการนำเข้าทั้งหมดฉันได้ฝังไพ ธ อนลงในสคริปต์ vim

หลังจากทำงานไปสองสามชั่วโมงฉันก็มีสคริปต์ที่จะทำอย่างน้อย 95% ของการแปลง ฉันเพิ่งเปิดไฟล์ในกลุ่มแล้วเรียกใช้:source fixit.vimและไฟล์จะถูกแปลงในพริบตา

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

แน่นอนว่ามันเป็นไปได้ที่จะทำให้สิ่งนี้เป็นอัตโนมัติด้วยภาษาสคริปต์เช่น Python หรือ Ruby แต่มันใช้เวลานานกว่าในการเขียนและมีความยืดหยุ่นน้อยกว่า - ตัวอย่างสุดท้ายคงเป็นเรื่องยากเนื่องจาก regex เพียงอย่างเดียวไม่สามารถจัดการได้ วงเล็บซ้อนกันเช่นการแปลงไปbar(foo(xxx)) foo(xxx).bar()เป็นกลุ่มที่สมบูรณ์แบบสำหรับงาน


1
ขอบคุณมากสำหรับการแบ่งปันที่ดีมากที่ได้เรียนรู้จากมาโคร "ที่มีประโยชน์และไม่คลาสสิค"
Olivier Pons

%s/\(bar\)(\(.\+\))/\2.\1()/จะทำเช่นนั้นด้วย (Escapes เข้ากันได้กับ:set magic.) สำหรับการบันทึกเท่านั้น :)
Ipsquiggle

1
หากคุณไม่ชอบการหลบหนีแบบกลุ่มให้ใช้ \ v เพื่อเปิดใช้เวทย์มนตร์มาก:%s/\v(bar)\((.+)\)/\2.\1()/
Ipsquiggle

@lpsquiggle: ข้อเสนอแนะของคุณจะไม่จัดการนิพจน์ที่ซับซ้อนด้วยชุดวงเล็บมากกว่าหนึ่งชุด เช่น if bar(foo(xxx)) or wibble(xxx): กลายเป็น if foo(xxx)) or wibble(xxx.bar(): สิ่งที่ผิดอย่างสมบูรณ์
Dave Kirby

28

ใช้ตัวสำรวจไฟล์ builtin! คำสั่งคือ:Exploreและมันช่วยให้คุณนำทางไปยังซอร์สโค้ดของคุณได้อย่างรวดเร็วมาก ฉันมีแผนที่เหล่านี้ในของฉัน.vimrc:

map <silent> <F8>   :Explore<CR>
map <silent> <S-F8> :sp +Explore<CR>

สำรวจช่วยให้คุณสามารถแก้ไขไฟล์ได้เช่นกัน ฉันจะโพสต์คีย์โปรดบางรายการของฉันการกด<F1>จะให้รายการทั้งหมด:

  • - : มีประโยชน์มากที่สุด: เปลี่ยนเป็นไดเรกทอรีด้านบน ( cd ..)
  • mf : ทำเครื่องหมายไฟล์
  • D : ลบไฟล์ที่ทำเครื่องหมายไว้หรือไฟล์ที่เคอร์เซอร์เปิดอยู่หากไม่มีเครื่องหมายใดอยู่
  • R : เปลี่ยนชื่อไฟล์ที่เคอร์เซอร์เปิดอยู่
  • d : สร้างไดเรกทอรีใหม่ในไดเรกทอรีปัจจุบัน
  • % : สร้างไฟล์ใหม่ในไดเรกทอรีปัจจุบัน

1
ฉันมักจะคิดว่าวิธีการเริ่มต้นสำหรับการเรียกดูครับดูดสำหรับสิ่งส่วนใหญ่ มันช้าในการค้นหาถ้าคุณรู้ว่าคุณต้องการไปที่ไหน LustyExplorer จากส่วนสคริปต์ของ vim.org เป็นการปรับปรุงที่จำเป็นมาก
Svend

การทำแผนที่ครั้งที่สองของคุณอาจจะง่ายขึ้น: map <silent> <S-F8>: Sexplore <CR>
Taurus Olson

8
ฉันแนะนำ NERDtree แทน explorer ในตัว มันเปลี่ยนวิธีที่ฉันใช้เสียงเรียกเข้าสำหรับโครงการและทำให้ฉันมีประสิทธิผลมากขึ้น เพียง google เพื่อมัน
kprobst

ฉันไม่เคยรู้สึกถึงความจำเป็นในการสำรวจแหล่งต้นไม้ที่ฉันเพียงแค่ใช้:find, :tagและการกดแป้นพิมพ์ต่างๆที่เกี่ยวข้องที่จะกระโดดไปรอบ ๆ (อาจเป็นเพราะต้นไม้ต้นกำเนิดที่ฉันทำงานมีขนาดใหญ่และจัดระเบียบแตกต่างจากที่ฉันเคยทำมา :))
dash-tom-bang

25

ฉันเป็นสมาชิกของ American Cryptogram Association นิตยสารรายปักษ์รวมกว่า 100 cryptograms หลากหลายประเภท ประมาณ 15 ของเหล่านี้คือ "cryptarithms" - ปัญหาทางคณิตศาสตร์ประเภทต่างๆที่มีตัวอักษรแทนตัวเลข สองหรือสามอันนี้เป็นซูโดกุสยกเว้นตัวอักษรแทนที่จะเป็นตัวเลข เมื่อตารางเสร็จสมบูรณ์แล้วตัวอักษรที่แตกต่างกันเก้าตัวจะสะกดคำหรือคำในบรรทัดเส้นทแยงมุมเกลียว ฯลฯ ในบางตำแหน่ง

แทนที่จะทำงานด้วยดินสอหรือพิมพ์ปัญหาด้วยมือฉันดาวน์โหลดปัญหาจากพื้นที่สมาชิกของเว็บไซต์

เมื่อทำงานกับซูโดกุเหล่านี้ฉันใช้ vi เพราะฉันใช้สิ่งอำนวยความสะดวกที่ vi มีบรรณาธิการอยู่สองสามคน ส่วนใหญ่ในการแปลงกริดตัวอักษรเป็นกริดหมายเลขเพราะฉันคิดว่ามันง่ายกว่าที่จะแก้แล้วตารางกริดที่สมบูรณ์แล้วกลับไปเป็นกริดตัวอักษรเพื่อค้นหาคำหรือคำตอบ

ปัญหาได้รับการจัดรูปแบบเป็นเก้ากลุ่มของตัวอักษรเก้าตัวด้วย - s แทนช่องว่างที่เขียนในสองบรรทัด ขั้นตอนแรกคือการจัดรูปแบบเหล่านี้เป็นเก้าบรรทัดของอักขระเก้าตัว ไม่มีอะไรพิเศษเกี่ยวกับเรื่องนี้เพียงแค่แทรกการกระจายบรรทัดที่แปดในสถานที่ที่เหมาะสม

ผลลัพธ์จะเป็นดังนี้:

T-O-----C
-E-----S-
--AT--N-L
---NASO--
---E-T---
--SPCL---
E-T--OS--
-A-----P-
S-----C-T

ดังนั้นขั้นตอนแรกในการแปลงให้เป็นตัวเลขคือการทำรายการของตัวอักษรที่แตกต่างกัน ก่อนอื่นฉันทำสำเนาบล็อก :y}}pฉันวางเคอร์เซอร์ที่ด้านบนของบล็อกแล้วพิมพ์ :ทำให้ฉันอยู่ในโหมดคำสั่งyyanks คำสั่งการเคลื่อนไหวถัดไป เนื่องจาก}เป็นการย้ายไปยังจุดสิ้นสุดของย่อหน้าถัดไปy}yanks วรรค }จากนั้นเลื่อนเคอร์เซอร์ไปที่ส่วนท้ายของย่อหน้าและpวางสิ่งที่เราดึงไว้หลังเคอร์เซอร์ ดังนั้นy}}pสร้างสำเนาของย่อหน้าถัดไปและจบลงด้วยเคอร์เซอร์ระหว่างสองสำเนา

ต่อไปฉันจะเปลี่ยนหนึ่งในสำเนาเหล่านั้นเป็นรายการของตัวอักษรที่แตกต่างกัน คำสั่งนั้นซับซ้อนกว่านี้เล็กน้อย:

:!}tr -cd A-Z | sed 's/\(.\)/\1\n/g' | sort -u | tr -d '\n'

:ทำให้ฉันอยู่ในโหมดคำสั่งอีกครั้ง !ระบุว่าเนื้อหาของ yank ถัดไปควรถูกไพพ์ผ่านบรรทัดคำสั่ง }yanks ย่อหน้าถัดไปและบรรทัดคำสั่งจากนั้นใช้trคำสั่งเพื่อเอาออกทุกอย่างยกเว้นตัวอักษรตัวพิมพ์ใหญ่sedคำสั่งพิมพ์ตัวอักษรแต่ละตัวในบรรทัดเดียวและsortคำสั่งเพื่อเรียงลำดับบรรทัดเหล่านั้นเอารายการที่ซ้ำกันtrออก การขึ้นบรรทัดใหม่โดยปล่อยเก้าตัวอักษรที่แตกต่างกันในบรรทัดเดียวแทนที่เก้าบรรทัดที่สร้างขึ้นในย่อหน้าเดิม ในกรณีนี้ตัวอักษรคือ:ACELNOPSTในกรณีนี้ตัวอักษรที่มี:

ขั้นตอนต่อไปคือการทำสำเนาของตารางอื่น และจากนั้นใช้ตัวอักษรที่ฉันได้ระบุเพียงเพื่อแทนที่แต่ละตัวอักษรเหล่านั้นมีหลักจาก 1 ถึง 9 :!}tr ACELNOPST 0-9นั่นเป็นที่เรียบง่าย: ผลลัพธ์คือ:

8-5-----1
-2-----7-
--08--4-3
---4075--
---2-8---
--7613---
2-8--57--
-0-----6-
7-----1-8

วิธีนี้สามารถแก้ไขได้ด้วยวิธีปกติหรือป้อนตัวแก้ซูโดกุที่คุณอาจชอบ :!}tr 1-9 ACELNOPSTวิธีการแก้ปัญหาเสร็จแล้วสามารถกลับมาแปลงเป็นตัวอักษรที่มี

มีพลังใน vi ที่จับคู่กับคนอื่นน้อยมาก ปัญหาที่ใหญ่ที่สุดคือมีหนังสือกวดวิชา vi เว็บไซต์ไฟล์ความช่วยเหลือและอื่น ๆ เพียงไม่กี่เล่มที่ทำได้มากกว่าสัมผัสพื้นผิวของสิ่งที่เป็นไปได้


และการระคายเคืองคือ distros บางอย่างเช่นอูบุนตูมีนามแฝงจากคำว่า "vi" ถึง "vim" ดังนั้นผู้คนจะไม่เห็น vi ตัวอย่างที่ยอดเยี่ยมต้องลอง ... +1
hhh

1
ไม่เป็นกลุ่มตรวจสอบชื่อเริ่มต้นด้วยเพื่อให้สามารถมาในโหมด 'ใช่' ใช่ไหม
dash-tom-bang

3
ฉันงงกับข้อผิดพลาดซ้ำ ๆ นี้: คุณบอกว่าคุณต้อง:เข้าสู่โหมดคำสั่ง แต่แล้วคุณมักจะระบุคำสั่งโหมดปกติ (เช่นy}}p) ซึ่งไม่สามารถทำงานได้จากโหมดคำสั่ง?
sehe

การท้าทายตัวละครที่เป็นเอกลักษณ์ของฉัน: :se tw=1 fo=(การเตรียม) VG:s/./& /g(แทรกช่องว่าง), gvgq(แยกไปตามบรรทัดแยก), V{:sort u(เรียงลำดับและลบรายการที่ซ้ำกัน)
sehe

23

การปรับแต่งข้อความจำนวนมาก!

ทั้งผ่านมาโคร:

  • เริ่มด้วยการบันทึก: qq
  • ทำสิ่งต่างๆ
  • หยุดการบันทึก: q
  • ทำซ้ำ: @q(ครั้งแรก) @@หลังจากนั้น
  • ทำซ้ำ 20 ครั้ง: 20@@

หรือผ่านการแสดงผลปกติ:

  • แทนที่สิ่งต่างๆ: :%s/[fo]+/bar/g

(แต่ได้รับคำเตือน: ถ้าคุณทำอย่างหลังคุณจะมีปัญหา 2 ข้อ :))


5
+1 สำหรับการอ้างอิงJamie Zawinski (ไม่มีคะแนนนำกลับมาเพราะล้มเหลวในการเชื่อมโยงกับมันแม้) :)
Jim Dennis

1
@ จิมฉันไม่รู้ด้วยซ้ำว่าเป็นคำพูดของ Jamie Zawinski :) ฉันจะพยายามจำมันต่อจากนี้ไป
jqno

ฉันพบว่าเคล็ดลับต่อไปนี้มีประโยชน์มากขึ้น ... สำหรับกรณีที่คุณต้องการเข้าร่วมบรรทัดที่ตรงกับ (หรือที่ไม่ตรงกัน) บางรูปแบบกับบรรทัดก่อนหน้า: :% g/foo/-1jหรือ:'a,'z v/bar/-1jตัวอย่างเช่น (ที่อดีตคือ "ทุกบรรทัดและจับคู่รูปแบบ" ในขณะที่หลังคือ "เส้นระหว่างเครื่องหมาย a และทำเครื่องหมาย z ซึ่งไม่ตรงกับรูปแบบ") ส่วนหลัง patter ในคำสั่งa gหรือvex สามารถเป็นคำสั่ง ex อื่น ๆ ได้ -1j เป็นเพียงการเคลื่อนย้ายบรรทัดสัมพัทธ์และคำสั่งเข้าร่วม
จิมเดนนิส

แน่นอนถ้าคุณตั้งชื่อแมโครว่า '2' จากนั้นเมื่อถึงเวลาที่จะต้องใช้มันคุณไม่จำเป็นต้องขยับนิ้วจากปุ่ม '@' ไปยังปุ่ม 'q' อาจช่วยลด 50 ถึง 100 มิลลิวินาทีทุกครั้งที่มี = P
JustJeff

@JustJeff ขึ้นอยู่กับรูปแบบแป้นพิมพ์ของคุณทั้งหมดปุ่ม @ ของฉันอยู่ที่อีกด้านหนึ่งของแป้นพิมพ์จากปุ่ม 2 ของฉัน
Simon Steele

23

q:ฉันเพิ่งค้นพบ จะเปิด "หน้าต่างคำสั่ง" และแสดงคำสั่งโหมดอดีต (โหมดคำสั่ง) ล่าสุดของคุณ คุณสามารถย้ายตามปกติภายในหน้าต่างและกด<CR>ดำเนินการคำสั่ง คุณสามารถแก้ไข ฯลฯ ได้เช่นกัน ไม่มีค่าเมื่อคุณยุ่งกับคำสั่งที่ซับซ้อนหรือ regex และคุณไม่ต้องการพิมพ์ใหม่ทั้งหมดหรือถ้าสิ่งที่ซับซ้อนที่คุณต้องการทำคือ 3 คำสั่งกลับมา มันเกือบจะเหมือนกับของทุบตีset -o viแต่สำหรับเสียงเรียกเข้าเอง (heh!)

ดู:help q:บิตที่น่าสนใจมากขึ้นสำหรับการกลับไปกลับมา


22

ฉันเพิ่งค้นพบ omnicompletion ของ Vim ในวันอื่น ๆ และในขณะที่ฉันยอมรับว่าฉันค่อนข้างขุ่นมัวในสิ่งที่ทำฉันได้รับผลลัพธ์ที่ดีอย่างน่าประหลาดใจเพียงแค่ทำการบดCtrl+ x Ctrl+ uหรือ Ctrl+ n/ Ctrl+ pในโหมดแทรก มันไม่ได้เป็นIntelliSenseแต่ฉันยังคงเรียนรู้อยู่

ลอง! :help ins-completion


20

สิ่งเหล่านี้ไม่ใช่ทางลัด แต่เกี่ยวข้อง:

  1. ทำให้ capslock เป็น ESC เพิ่มเติม (หรือ Ctrl)
  2. ผู้นำแผนที่ไปที่ "," (จุลภาค) ด้วยคำสั่งนี้: let mapleader = ","

พวกเขาเพิ่มผลผลิตของฉัน


สวัสดีคำใบ้ดีเกี่ยวกับ "\"! ดีกว่าที่จะพิมพ์ "," กว่า "\"
Olivier Pons

2
ในการทำให้ Caps Lock เป็น Esc เพิ่มเติมใน Windows (คีย์ตัวพิมพ์ใหญ่สำหรับล็อคคืออะไร "คีย์ใด ๆ ") ให้ลองทำสิ่งนี้: web.archive.org/web/20100418005858/http://webpages.charter.net/
R. Martinho Fernandes

สำหรับ Mac คุณต้องมี PCKeyboardHack - รายละเอียดที่superuser.com/questions/34223/ …
Tom Morris

1
ใน Windows ฉันใช้ AutoHotKey withCapslock::Escape
Jeromy Anglim

19

"ทางลัด" ที่มีประโยชน์อื่น ๆ ที่ฉันใช้บ่อยคือ 'xp' สิ่งนี้จะสลับอักขระใต้เคอร์เซอร์ด้วยอักขระถัดไป


3
Xpเพื่อไปทางอื่น
ทดสอบ

5
ในช่วงเวลาที่ Windows xp ออกมาฉันมักจะพูดเล่น ๆ ว่านี่เป็นสิ่งที่ดีสำหรับมันเท่านั้น
kguest

18

<Ctrl> + W, V เพื่อแยกหน้าจอในแนวตั้ง
<Ctrl> + W, W เพื่อเลื่อนระหว่างหน้าต่าง

! python% [args] เพื่อเรียกใช้สคริปต์ที่ฉันกำลังแก้ไขในหน้าต่างนี้

ZF ในโหมดแสดงภาพเพื่อพับเส้นโดยพลการ


2
<Ctrl> + W และ j / k จะช่วยให้คุณนำทางได้อย่างสมบูรณ์ (j up, k down เช่นเดียวกับกลุ่มปกติ) นี่เป็นสิ่งที่ยอดเยี่ยมเมื่อคุณมีการแยก 3+
Andrew Scagnelli

1
+1 สำหรับ zf ในโหมดภาพฉันชอบการพับโค้ด แต่ไม่รู้เกี่ยวกับสิ่งนั้น
coder_tim

2
หลังจากทุบแป้นพิมพ์ของฉันฉันได้อนุมานว่า<C-w>nหรือ<C-w>sเป็นหน้าต่างแนวนอนใหม่เป็นหน้าต่าง<C-w>bด้านล่างขวา<C-w>cหรือ<C-w>qเป็นหน้าต่างปิด<C-w>xคือการเพิ่มและจากนั้นลดความกว้างของหน้าต่าง (??) <C-w>pเป็นหน้าต่างสุดท้ายคือหน้าต่าง<C-w>backspaceย้ายไปทางซ้าย (ish)
puk

:help ctrl-wFTW ... ทำตัวเป็นคนโปรดและบังคับตัวเองให้ลองสิ่งเหล่านี้เป็นเวลาอย่างน้อย 15 นาที!
sjas

18

โหมดภาพ

ตามที่คนอื่นหลายคนบอกว่าโหมดภาพคือคำตอบสำหรับปัญหาการคัดลอก / ตัดและวางของคุณ Vim ให้ 'v', 'V' และ Cv ตัวพิมพ์เล็ก 'v' ในกลุ่มเป็นหลักเหมือนกับปุ่ม Shift ในแผ่นจดบันทึก สิ่งที่ดีคือคุณไม่ต้องกดมันลงไป คุณสามารถใช้เทคนิคการเคลื่อนไหวเพื่อนำทางอย่างมีประสิทธิภาพไปยังจุดเริ่มต้น (หรือจุดสิ้นสุด) ของการเลือกของคุณ จากนั้นกด 'v' และใช้เทคนิคการเคลื่อนไหวที่มีประสิทธิภาพอีกครั้งเพื่อนำทางไปยังส่วนอื่น ๆ ที่คุณเลือก จากนั้น 'd' หรือ 'y' อนุญาตให้คุณตัดหรือคัดลอกส่วนที่เลือก

ประโยชน์จากโหมดภาพของข้อดีมีมากกว่าคำอธิบายของ Jim Dennis เรื่องการตัด / คัดลอก / วางใน vi คือคุณไม่ต้องทำให้ตำแหน่งถูกต้อง บางครั้งการใช้การเคลื่อนไหวอย่างรวดเร็วเพื่อไปยังบริเวณใกล้เคียงที่คุณต้องการไปแล้วปรับแต่งสิ่งนั้นด้วยการเคลื่อนไหวอื่น ๆ มากกว่าที่จะคิดคำสั่งการเคลื่อนไหวเดี่ยวที่ซับซ้อนมากขึ้นซึ่งจะทำให้คุณไปถึงที่ที่คุณต้องการ

ข้อเสียของการใช้โหมดภาพอย่างกว้างขวางในลักษณะนี้คือมันสามารถกลายเป็นไม้ยันรักแร้ที่คุณใช้ตลอดเวลาซึ่งทำให้คุณไม่สามารถเรียนรู้คำสั่ง vi (m) ใหม่ที่อาจทำให้คุณทำสิ่งต่าง ๆ ได้อย่างมีประสิทธิภาพมากขึ้น อย่างไรก็ตามหากคุณมีความกระตือรือร้นในการเรียนรู้แง่มุมใหม่ ๆ ของ vi (m) สิ่งนี้อาจไม่ส่งผลกระทบต่อคุณมากนัก

ฉันจะเน้นย้ำอีกครั้งว่าโหมดการแสดงผลแบบบรรทัดและบล็อกแบบวิชวลให้ความหลากหลายของธีมเดียวกันซึ่งมีประสิทธิภาพมาก ... โดยเฉพาะโหมดบล็อกแบบวิชวล

การใช้งานคีย์บอร์ดอย่างมีประสิทธิภาพ

ฉันไม่เห็นด้วยกับการยืนยันของคุณว่าการสลับมือเป็นวิธีที่เร็วที่สุดในการใช้แป้นพิมพ์ มันมีองค์ประกอบของความจริงอยู่ในนั้น การพูดโดยทั่วไปการใช้ซ้ำของสิ่งเดียวกันช้ามาก ตัวอย่างที่สำคัญที่สุดของหลักการนี้คือการกดแป้นต่อเนื่องที่พิมพ์ด้วยนิ้วเดียวกันนั้นช้ามาก การยืนยันของคุณอาจเกิดจากแนวโน้มตามธรรมชาติที่จะใช้ s / finger / hand / transformation ในรูปแบบนี้ ในระดับหนึ่งมันถูกต้อง แต่ในตอนท้ายของสเปกตรัมที่มีประสิทธิภาพสูงมันไม่ถูกต้อง

เพียงแค่ถามนักเปียโน ถามพวกเขาว่ามันจะเร็วกว่าในการเล่นต่อเนื่องของโน้ตสองสามสลับมือหรือใช้นิ้วมือติดต่อกันของมือเดียวตามลำดับ วิธีที่เร็วที่สุดในการพิมพ์การกดแป้น 4 ครั้งไม่ใช่การสลับมือ แต่เป็นการพิมพ์ด้วยการใช้นิ้วมือ 4 นิ้วในการเรียงลำดับจากน้อยไปมากหรือมากไปหาน้อย (เรียกว่า "วิ่ง") สิ่งนี้ควรปรากฏชัดในตัวเองเมื่อคุณพิจารณาถึงความเป็นไปได้นี้

ปัญหาที่ยากขึ้นคือการปรับให้เหมาะสมสำหรับสิ่งนี้ มันค่อนข้างง่ายที่จะปรับให้เหมาะสำหรับระยะทางที่แน่นอนบนคีย์บอร์ด เป็นกลุ่มนั้น เป็นการยากที่จะปรับให้เหมาะสมในระดับ "รัน" แต่ vi (m) ด้วยการแก้ไขแบบโมดัลจะช่วยให้คุณมีโอกาสที่จะทำมันได้ดีกว่าวิธีการที่ไม่เป็นโมดัลใด ๆ (ahem, emacs) เท่าที่ทำได้

บน Emacs

เพื่อไม่ให้ผู้ที่คลั่งไคล้ emacs เพิกเฉยต่อการโพสต์ทั้งหมดของฉันเนื่องจากความคิดเห็นเกี่ยวกับผู้ปกครองครั้งสุดท้ายฉันรู้สึกว่าฉันต้องอธิบายรากของความแตกต่างระหว่าง emacs และศาสนาที่เป็นกลุ่ม ฉันไม่เคยพูดออกมาในสงครามเอดิเตอร์และฉันอาจจะไม่ทำมันอีก แต่ฉันไม่เคยได้ยินใครพูดถึงความแตกต่างแบบนี้ ข้อแตกต่างคือ tradeoff ต่อไปนี้:

Vim ให้ประสิทธิภาพการแก้ไขข้อความดิบที่ไม่มีใครเทียบ Emacs ให้ความสามารถที่ไม่มีใครเทียบได้ในการปรับแต่งและโปรแกรมแก้ไข

zealots กลุ่มคนตาบอดจะอ้างว่ากลุ่มนั้นมีภาษาสคริปต์ แต่มันเป็นภาษาที่ไม่ชัดเจนและเป็นโฆษณาที่ออกแบบมาเพื่อให้บริการแก้ไข Emacs มีเสียงกระเพื่อม! พูดพอแล้ว. หากคุณไม่เข้าใจความสำคัญของประโยคสองประโยคสุดท้ายหรือมีความปรารถนาที่จะเรียนรู้มากพอเกี่ยวกับฟังก์ชั่นการเขียนโปรแกรมและเสียงกระเพื่อมเพื่อพัฒนาความชื่นชมนั้นคุณควรใช้เสียงเรียกเข้า

zealots emacs จะอ้างว่า emacs มีโหมด viper และดังนั้นจึงเป็น superset ของกลุ่ม แต่โหมดไวเปอร์นั้นไม่ได้มาตรฐาน ความเข้าใจของฉันคือโหมด viper ไม่ได้ใช้โดยผู้ใช้ emacs ส่วนใหญ่ เนื่องจากไม่ใช่ค่าเริ่มต้นผู้ใช้ emacs ส่วนใหญ่อาจไม่พัฒนาความซาบซึ้งอย่างแท้จริงต่อผลประโยชน์ของกระบวนทัศน์ที่เป็นกิริยาช่วย

ในความคิดของฉันความแตกต่างเหล่านี้เป็นมุมฉาก ฉันเชื่อว่าประโยชน์ของเสียงเรียกเข้าและ emacs ดังที่ฉันได้กล่าวมาแล้วว่าใช้ได้ทั้งคู่ นี่หมายความว่ายังไม่มีเครื่องมือแก้ไขขั้นสูงสุด มันอาจเป็นความจริงที่ emacs จะเป็นแพลตฟอร์มที่ง่ายที่สุดที่จะใช้เป็นฐานในการแก้ไขที่ดีที่สุด แต่การแก้ไขกิริยาไม่ได้ยึดติดกับความคิดของ emacs ชุมชน emacs สามารถย้ายไปทางนั้นในอนาคต แต่ดูเหมือนจะไม่น่าเป็นไปได้มาก

ดังนั้นหากคุณต้องการประสิทธิภาพในการแก้ไขแบบ raw ให้ใช้ vim หากคุณต้องการสภาพแวดล้อมที่ดีที่สุดสำหรับการเขียนสคริปต์และการเขียนโปรแกรมแก้ไขของคุณใช้ emacs หากคุณต้องการทั้งสองอย่างโดยเน้นที่ความสามารถในการโปรแกรมให้ใช้ emacs กับโหมด viper (หรือตั้งโปรแกรมโหมดของคุณเอง) หากคุณต้องการสิ่งที่ดีที่สุดของทั้งสองโลกคุณจะโชคไม่ดีในตอนนี้


17

ใช้เวลา 30 นาทีในการทำ vim tutorial (ใช้ vimtutor แทน vim ใน terminal) คุณจะได้เรียนรู้การเคลื่อนไหวขั้นพื้นฐานและการกดแป้นบางครั้งสิ่งนี้จะทำให้คุณมีประสิทธิผลอย่างน้อยด้วย vim เช่นเดียวกับโปรแกรมแก้ไขข้อความที่คุณใช้มาก่อน หลังจากนั้นอ่านคำตอบของ Jim Dennis อีกครั้ง :)


1
นี่เป็นสิ่งแรกที่ฉันคิดเมื่ออ่าน OP เห็นได้ชัดว่าโปสเตอร์ไม่เคยใช้สิ่งนี้ ฉันวิ่งผ่านมันเมื่อเรียนรู้เสียงเรียกเข้าเป็นครั้งแรกเมื่อสองปีที่แล้วและมันทำให้ฉันรู้สึกถึงความเหนือกว่าของ Vim ต่อบรรณาธิการอื่น ๆ ที่ฉันเคยใช้ .
dash-tom-bang

16

อะไรคือวิธีที่คุณใช้ Vim ที่ทำให้คุณมีประสิทธิผลมากกว่าบรรณาธิการร่วมสมัย?

ความสามารถในการดำเนินการแก้ไขที่ซับซ้อนและซ้ำ ๆ ด้วยการกดแป้นเพียงไม่กี่ครั้ง (มักใช้แมโคร ) ดูVimGolfเพื่อเป็นสักขีพยานพลังของ Vim!

หลังจากใช้งานไปเกือบสิบปีทุกวันมันยากที่จะจินตนาการถึงการใช้เครื่องมือแก้ไขอื่น ๆ


16

ใช้\cที่ใดก็ได้ในการค้นหาเพื่อเพิกเฉยกรณีและปัญหา (การแทนที่การตั้งค่าเพิกเฉยหรือการตั้งค่าสมาร์ทcaseของคุณ) เช่น/\cfooหรือ/foo\cจะตรงfoo, Foo, fOO, FOOฯลฯ

ใช้\Cที่ใดก็ได้ในการค้นหาเพื่อบังคับการจับคู่เคส เช่น/\Cfooหรือ/foo\Cจะจับคู่กับ foo เท่านั้น


16

ฉันรู้สึกประหลาดใจที่ไม่มีใครพูดถึงการtเคลื่อนไหว ฉันมักจะใช้กับรายการพารามิเตอร์ในรูปแบบของdt,หรือyt,


2
หรือ dfx, dFx, dtx, ytx ฯลฯ โดยที่ x คือ char, +1
hhh

ใช่ และอย่าลืม ct (เปลี่ยนเป็น)
markle976

16

ctags ที่ไม่มีใครพูดถึงแปลก ดาวน์โหลด "exuberant ctags" และนำหน้าเวอร์ชั่นที่ติดตั้งไว้ล่วงหน้าที่คุณมีอยู่แล้วในเส้นทางการค้นหาของคุณ ซีดีถึงรากของสิ่งที่คุณกำลังทำอยู่ ตัวอย่างเช่นการกระจายเคอร์เนล Android พิมพ์ "ctags -R." เพื่อสร้างดัชนีของไฟล์ต้นฉบับที่ใดก็ได้ใต้ dir นั้นในไฟล์ชื่อ "แท็ก" สิ่งนี้มีแท็กทั้งหมด, ตั้งชื่อภาษาหรือที่ใดใน dir, ในไฟล์เดียว, การทำงานข้ามภาษาจึงง่าย

จากนั้นเปิดเสียงเรียกเข้าในโฟลเดอร์นั้นและอ่าน: ช่วย ctags สำหรับคำสั่งบางอย่าง ไม่กี่ฉันใช้บ่อย:

  • วางเคอร์เซอร์บนการเรียกใช้เมธอดและพิมพ์ CTRL-] เพื่อไปที่การกำหนดเมธอด

  • ประเภท: ชื่อ ta เพื่อไปที่คำจำกัดความของชื่อ


14

เยื้องอัตโนมัติ:

gg(ไปที่จุดเริ่มต้นของเอกสาร)
=(เวลาเยื้อง!)
shift-g(ไปที่จุดสิ้นสุดของเอกสาร)

คุณจะต้องมี 'ปลั๊กอินประเภทไฟล์เยื้อง' ใน.vimrcไฟล์ของคุณและอาจเหมาะสมกับการตั้งค่า 'shiftwidth' และ 'expandtab'


4
หรือเพียงแค่ใช้สิ่งอำนวยความสะดวก ": set ai" (เยื้องอัตโนมัติ) ซึ่งอยู่ใน vi มาตั้งแต่ต้น
xcramps

14

คุณถามเกี่ยวกับทางลัดการผลิต แต่ฉันคิดว่าคำถามจริงของคุณคือ: เป็นกลุ่มที่คุ้มค่าหรือไม่ คำตอบสำหรับคำถาม stackoverflow นี้คือ -> "ใช่"

คุณต้องสังเกตสองสิ่ง เป็นกลุ่มที่มีประสิทธิภาพและเป็นกลุ่มยากที่จะเรียนรู้ พลังส่วนใหญ่อยู่ในความสามารถในการขยายและการรวมคำสั่งที่ไม่รู้จบ อย่ารู้สึกหนักใจ ไปช้าๆ. หนึ่งคำสั่งหนึ่งปลั๊กอินในเวลาเดียวกัน อย่าหักโหมจนเกินไป

การลงทุนทั้งหมดที่คุณใส่เข้าไปในกลุ่มจะจ่ายคืนเป็นพันเท่า คุณจะต้องอยู่ในเครื่องมือแก้ไขข้อความเป็นเวลาหลายชั่วโมงก่อนที่คุณจะตาย เสียงเรียกเข้าจะเป็นเพื่อนของคุณ


13

บัฟเฟอร์หลายรายการและโดยเฉพาะอย่างยิ่งการกระโดดอย่างรวดเร็วระหว่างพวกเขาเพื่อเปรียบเทียบสองไฟล์ด้วย:bpและ:bn(แมปใหม่อย่างถูกต้องกับเดี่ยวShift+ pหรือShift+ n)

vimdiff โหมด (แบ่งเป็นสองบัฟเฟอร์แนวตั้งพร้อมสีเพื่อแสดงความแตกต่าง)

คัดลอกพื้นที่ด้วยCtrl+v

และสุดท้ายตัวระบุแท็บเสร็จสมบูรณ์ (ค้นหา "mosh_tab_or_complete") นั่นคือการเปลี่ยนชีวิต


12

เห็นด้วยกับโปสเตอร์ชั้นนำ - the : r! คำสั่งมีประโยชน์มาก

ส่วนใหญ่ฉันมักจะใช้เพื่อ "วาง" สิ่งต่าง ๆ :

:r!cat
**Ctrl-V to paste from the OS clipboard**
^D

:set pasteวิธีนี้ผมไม่ได้มีซอกับ


3
น่าจะดีกว่าเพื่อตั้งค่าclipboardตัวเลือกเป็นunnamed( set clipboard=unnamedใน. vimrc ของคุณ) เพื่อใช้คลิปบอร์ดระบบโดยค่าเริ่มต้น "*pหรือถ้าคุณยังต้องการระบบคลิปบอร์ดแยกออกจากการลงทะเบียนชื่อใช้ลงทะเบียนคลิปบอร์ดชื่อที่เหมาะสม:
R. Martinho Fernandes

2
รักมัน! หลังจากถูกทำให้โกรธโดยการวางตัวอย่างโค้ดจากเว็บและฉันเพิ่งเริ่มรู้สึกชำนาญในกลุ่ม นั่นคือคำสั่งที่ฉันฝันไว้ในที่เกิดเหตุ นี่คือเมื่อเสียงเรียกเข้าทั้งหมดฉัน
kevpie

หากคุณกำลังพัฒนาบน Mac, Command + C และ Command + V คัดลอกและวางโดยใช้คลิปบอร์ดระบบไม่ต้องทำการแมปใหม่
Ben Mordecai

เฉพาะ GVIm ... จากคอนโซลการวางโดย:set pasteไม่ทำงานได้ดีหากเปิดใช้งานการป้อนอัตโนมัติ
David Wolever
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.