Vim Cool Cool
วันนี้จะมานำเสนอ default feature บางส่วนของ Vim เด็ดๆ ที่ไม่ต้องลง plugin ที่จะช่วยอำนวยความสะดวกและทำให้ผู้ใช้ดูคูลขึ้นอย่างมาก
ใช้ Clipboard ของ OS
ปกติเวลาที่เราทำการ copy คำด้วย y
ใน vim คำที่ copy จะเข้าไปอยู่ใน register ของ vim เท่านั้น ทำให้ไม่สามารถ paste ลงในโปรแกรมอื่นได้ ทำให้ไม่ค่อยสะดวกเวลาที่เราอยากจะก๊อบคำใน vim เพื่อไป search ใน web browser แต่สามารแก้ได้ง่ายๆโดย ไปเซ็ตค่า ใน .vimrc
set clipboard=unnamed
เท่านี้คำที่ก๊อบมาจะเข้าไปอยู่ใน clipboard ของ OS ทำให้ไปวางในโปรแกรมอื่นได้
จัด indent ทั้งไฟล์
ใน normal mode พิมพ์ gg=G
indent ของ code จะอยู่ในรูปแบบที่สวยงามทันที
แปลง tab เป็น space
มีหลายๆครั้งที่เราเปิดไฟล์มาแล้ว indent บางจุดก็ใช้ space บางจุดก็ใช้ tab เราสามารถแก้ให้เหมือนกันทั้งไฟล์ได้ด้วย command :retab
Remove trailing whitespace on save
เราสามารถตั้งค่าให้ vim ลบ space ท้ายบรรทัดตอน save ไฟล์ได้ โดยไปเซ็ตค่าใน .vimrc
autocmd BufWritePre * :%s/\s+$//e
วิธี reload .vimrc โดยไม่ต้องออกจาก vim
ปกติหลังจากแก้ไฟล์ .vimrc แล้ว เปิด vim ใหม่เพื่อให้ ค่าที่เราเซ็ตไปทำงาน แต่เราสามารถทำให้ ค่าที่เพิ่งเซ็ต ใน.vimrc ทำงานได้โดยไม่ต้องออก vim แล้วเปิดใหม่ ด้วย command :so %
วิธี execute commandใน vim
เราสามารถ execute shell command ข้างนอก จากใน vim ได้ โดยใช้ :!
ตามด้วย command ตัวอย่างเช่น
:!ls
ก็ใช้ดู file ใน directory ปัจจุบันได้ หรือ
ใช้ :!go test
เพื่อ run test go ก็ได้
ก็คือ คำสั่งอะไรที่ปกติเราพิมพ์ใน shell ก็เรียกใช้ตรงนี้ได้เลย
หรือจะให้ output จาก insert ใส่ในไฟล์ที่เปิดอยู่ก็ทำได้ด้วยเติม ตัว “r” ไปข้างหน้าคำสั่งเมื่อกี้ แบบนี้ :r!ls
Substitute
เราสามารถ search and replace คำที่ต้องการในไฟล์รวดเดียวได้ ด้วย command :%s/{คำที่จะค้นหา}/{คำใหม่ที่จะเอามาแทน}
เช่น
Insert multiple line
เราสามารถแทรกคำที่เหมือนกันหลายๆบรรทัดในคราวเดียวได้ แต่ต้องอยู่ column ด้วยกัน เช่น
กด Ctrl-v เพื่อเข้าสู่โหมด visual block แล้วกด j ลงไปเรื่อยๆตามบรรทัดที่ต้องการจะแทรก แล้วก็ “I” พิมพ์คำที่ต้องการ แล้วกด Esc คำที่เพิ่มไปในบรรทัดแรกจะเพิ่มขึ้นในบรรทัดที่เราครอบ visual block
Macro
คือสุดยอดเทคนิคของการใช้ vim ขั้นสูง macro คือการบันทึก key pressing แล้วนำไป replay กับส่วนอื่นในไฟล์ ทำให้ลดการพิมพ์ซ้ำๆ ช่วยเพิ่ม productivity อย่างมาก ตัวอย่างเช่น
ในไฟล์ go มี struct ตัวนึง ต้องการใส่ tag json ที่ท้ายบรรทัดของแต่ละ field โดย ชื่อ field json จะตรงกับ ชื่อ field ใน struct เพียงแต่ว่าจะต้องขึ้นต้นด้วยตัวเล็ก ซึ่งมันจะซ้ำๆกันทุกๆบรรทัด แต่เราจะทำแค่บรรทัดเดียว แล้วใช้ macro เพื่อ replay ใช้ในบรรทัดอื่น วิธีการในเคสนี้ก็จะมีดังต่อไปนี้ (ตัวพิมพ์เล็กพิมพ์ใหญ่มีผล)
1. เลื่อน cursor ไปที่ ตัวแรก สุด ของบรรทัด field แรก ใน struct ก็คือตัว “B”
2. กด qd เพื่อเริ่มบันทึก (d เป็นแค่ reference key ว่า เพื่อเก็บ macro นี้ไว้)
3. กด yiw เพื่อก๊อบคำว่า Brand
4. กด A เพื่อเลื่อน cursor ไปที่ท้ายสุดของบรรทัดพร้อมกับเข้าสู่ mode insert
5. พิมพ์ `json:” แล้วกด Esc เพื่อออกจาก mode insert
7. กด p เพื่อวางคำที่ก๊อบมา
8. กด a เพื่อเปิด mode insert ที่หลังคำ แล้วพิมพ์ “` เพื่อปิด tag ให้เรียบร้อย
10. กด bb เพื่อเลื่อน cursor มาที่ต้นคำที่เพิ่งวาง
11. กด vu เพื่อเปลี่ยน “B” เป็น lowercase
12. กด ^ เพื่อเลื่อน cursor ไปที่ต้นบรรทัด
13. กด j เพื่อเลื่อนลงมา 1 บรรทัด (สำหรับความต่อเนื่องในการเรียกใช้ macro)
14. กด q เพื่อจบการบันทึก macro
แล้วกด @d ในบรรทัดที่ 2 เพื่อเรียกใช้ macro ที่เพิ่งบันทึกไป ก็จะพบว่า tag json ของ field ถัดไปก็เกิดขึ้นโดยอัตโนมัติ
หลังจากนั้น กด @@ ไปเรื่อยๆ ก็จะ apply macro ไปทีละบรรทัด
จบแล้ว จริงๆมีเทคนิคอีกมากมาย แต่บางอย่างก็อธิบายด้วยการเขียน blog ยาก เอาไว้จะมาแนะนำอีกในโอกาสต่อไป