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 โดยเทพพิทักษ์ การุญบุญญานันท์
ความคิดเห็น
แสดงความคิดเห็น