Vim Tips

รวมเกร็ดเล็ก ๆ น้อย ๆ ของ vim ที่เป็นประโยชน์

การเลื่อนเคอร์เซอร์ในบรรทัดยาว

สำหรับบรรทัดที่ยาวเกินขอบขวา vim จะแสดงโดย wrap เป็นหลายบรรทัดบนเทอร์มินัล แต่การเลื่อนเคอร์เซอร์ด้วย j, k จะข้ามบรรทัดยาว ๆ นั้นทั้งบรรทัด แต่บางครั้งเราอยากเลื่อนข้ามแค่บรรทัดที่ wrap ไว้เท่านั้น

คำสั่งที่ใช้ข้ามบรรทัด wrap คือ gj และ gk

คำสั่งอื่นที่มีประโยชน์สำหรับบรรทัดยาว:

  • เลขคอลัมน์| ไปที่คอลัมน์ที่กำหนดในบรรทัดยาวปัจจุบัน
  • 0 ไปที่คอลัมน์แรก (แม้จะเป็นช่องว่างก็ตาม)
  • ^ ไปที่ต้นบรรทัด (ข้ามช่องว่างที่ต้นบรรทัด)
  • $ ไปที่ท้ายบรรทัด
  • w, b เลื่อนไปข้างหน้า/ถอยหลังทีละคำ (เครื่องหมายวรรคตอนมีผลต่อขอบเขตของคำ)
  • W, B เลื่อนไปข้างหน้า/ถอยหลังทีละกลุ่มอักขระ (ไม่สนใจชนิดอักขระนอกจากช่องว่าง (เลื่อนไปข้างหน้าได้เร็วมาก)
  • e, E เลื่อนไปที่ท้ายคำ/ท้ายกลุ่มอักขระ

การตัดบรรทัดยาว

การตัดบรรทัดยาวให้เป็นหลายบรรทัดใน 80 คอลัมน์ ใช้คำสั่ง gqq

ในกรณีที่ต้องการกำหนดขอบขวาให้น้อยกว่า 80 คอลัมน์ ก็กำหนดตัวแปร wrapmargin ให้เป็นค่าที่จะร่นจากขอบขวาเข้ามา ดังนี้:

:set wrapmargin=จำนวนคอลัมน์ที่ร่น

เช่น อยากให้ตัดบรรทัดที่คอลัมน์ 70 ก็สั่ง:

:set wrapmargin=10

หมายเหตุ:

  • จำนวนคอลัมน์ 80 คอลัมน์นี้ อิงตามขนาดเทอร์มินัลปกติ ถ้าขยายหรือย่อเทอร์มินัลไปจากค่า 80 ก็แทนที่ค่า 80 ด้วยจำนวนคอลัมน์ดังกล่าว ทั้งการแสดงผลและการตัดบรรทัดยาว
  • การเปลี่ยนค่าจำนวนคอลัมน์ที่แสดงผลของ vim สามารถทำผ่านตัวแปร columns ได้ เช่น
    :set columns=132
    
    จะปรับขนาดของ vim ให้แสดง 132 คอลัมน์

การลบบรรทัดด้วย regular expression

vi มีประสิทธิภาพในการแก้ไขเอกสารใหญ่ ๆ บางครั้งเราต้องการลบบรรทัดที่มีรูปแบบบางอย่างออกทั้งหมด เช่น ลบบรรทัดที่ไม่เกี่ยวข้องใน log file ทิ้ง, ลบบรรทัดที่ทำเครื่องหมายพิเศษสำหรับเตือนความจำออกจากฉบับสุดท้ายที่จะเป็นฉบับจริง ฯลฯ vi สามารถใช้คำสั่งของ ed หรือ ex ทำงานให้ได้ รูปแบบคือ

:g/regex/d

เป็นคำสั่งใน ex mode โดย g หมายถึงคำสั่ง global เป็นคำสั่งสำหรับทำทั้งเอกสาร โดยจะหาบรรทัดทุกบรรทัดที่แมตช์กับนิพจน์เรกิวลาร์ regex แล้วทำคำสั่งที่กำหนดกับบรรทัดต่าง ๆ ดังกล่าว โดยในที่นี้คือคำสั่ง d คือ delete (ลบทิ้ง)

แถม: คำสั่ง d ดังกล่าว เมื่อแทนด้วยคำสั่ง p จะเป็นการสั่ง print บรรทัดที่แมตช์ (ทดลองใน vi ได้) และอันที่จริง คำสั่ง grep ของยูนิกซ์ก็มีที่มาจากคำสั่ง g/re/p ของ ed นี่เอง (โดย re หมายถึง regular expression)

การแทรกผลลัพธ์ของโปรแกรม

ขณะเขียนเอกสารอาจต้องการแทรกผลลัพธ์ของการรันโปรแกรมภายนอก สามารถทำได้ด้วยรูปแบบพิเศษของคำสั่ง :r แฟ้ม ซึ่งปกติจะใช้อ่านเนื้อหาของแฟ้มเข้ามาแทรกหลังบรรทัดที่เคอร์เซอร์วางอยู่ โดยเราสามารถแทน แฟ้ม ด้วย shell escape เป็น !คำสั่งเชลล์ ได้ โดย vi จะ fork เชลล์ขึ้นมาทำคำสั่งที่กำหนด แล้วไปป์ผลลัพธ์มาแทรกลงในเอกสาร

ตัวอย่างเช่น

:r !ls -l

จะ fork เชลล์มารันคำสั่ง ls -l แล้วแทรกผลลัพธ์ลงในเอกสารหลังบรรทัดที่เคอร์เซอร์วางอยู่

การค้นคำแบบไม่สนใจตัวพิมพ์ใหญ่-พิมพ์เล็ก (Case-Insensitive Search)

คำสั่ง /regex และ ?regex สามารถแมตช์นิพจน์เรกิวลาร์โดยไม่สนใจตัวพิมพ์ใหญ่-พิมพ์เล็กได้ โดยเพิ่มตัวเลือก \c ต่อท้าย เช่น

/debian\c

จะค้นเจอทั้ง Debian, debian และ DEBIAN

การสลับตัวพิมพ์ใหญ่-พิมพ์เล็ก

พิมพ์ภาษาอังกฤษแล้วใช้ตัวพิมพ์ใหญ่-พิมพ์เล็กสับสนต้องแก้บ่อยหรือ? คำสั่ง ~ จะเปลี่ยนอักขระที่ตำแหน่งเคอร์เซอร์จากตัวพิมพ์เล็กเป็นตัวพิมพ์ใหญ่ จากตัวพิมพ์ใหญ่เป็นตัวพิมพ์เล็ก แล้วเลื่อนเคอร์เซอร์ไปอักขระถัดไป

หากต้องการเปลี่ยนตัวพิมพ์หลายตัวติด ๆ กัน ก็สามารถกด ~ ต่อ ๆ กันไปได้เลย เพราะเคอร์เซอร์จะเลื่อนให้อยู่แล้ว หรืออีกวิธีหนึ่งสำหรับ vim คือเลือกเป็นบล็อคไว้แล้วกด ~ เพื่อทำกับทั้งบล็อคในคราวเดียว

การค้นคำที่เคอร์เซอร์วางอยู่

ในการค้นหาคำที่เคอร์เซอร์วางอยู่ แทนที่จะใช้คำสั่ง / หรือ ? ตามด้วยคำนั้น ก็สามารถใช้คำสั่ง * (ค้นไปข้างหน้า) หรือ # (ค้นย้อนกลับ) ได้

โปรแกรมเมอร์ที่พบ function call ในที่หนึ่งแล้วต้องการหา body ของฟังก์ชันนั้นจะพบว่าสองคำสั่งนี้ช่วยให้งานเร็วขึ้นมาก

การกระโดดไปยังวงเล็บเปิด-ปิดที่เข้าคู่กัน

คำสั่ง % ใช้สั่งเคอร์เซอร์กระโดดไปยังวงเล็บเปิด-ปิดที่เข้าคู่กัน

ผู้ใช้ทั่วไปอาจไม่คิดว่าสำคัญ แต่โปรแกรมเมอร์จะเห็นประโยชน์ของคำสั่งนี้มาก

นำเสนอในโสเหล่ KKLUG 58.07 โดยเทพพิทักษ์ การุญบุญญานันท์

ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Open source ในสาขาวิทยาศาสตร์สุขภาพและเรื่องอื่น ๆ

About Us