สรุปคำสั่ง vi ของ Linux | 3 โหมดของ Vim และโหมด Visual

เปิด vi แล้วพิมพ์อะไรก็ไม่ขึ้น หรือไม่รู้วิธีออกจนต้องปิดหน้าต่างทิ้ง เป็นเรื่องที่คนเพิ่งเริ่มใช้เซิร์ฟเวอร์ต้องเจอสักครั้ง คำสั่ง vi ของ Linux แยกโหมด Normal กับโหมด Insert ออกจากกัน ขอแค่รู้ว่าตอนนี้อยู่โหมดไหน ที่เหลือก็จบได้ด้วยไม่กี่ปุ่ม บทความนี้สรุป 3 โหมดและคำสั่งของแต่ละโหมดไว้ในตาราง และให้ลองพิมพ์ vi เองบนเซิร์ฟเวอร์เสมือนในเบราว์เซอร์
บน AlmaLinux 9.8 ทั้ง vi และ vim มาจากแพ็กเกจ vim 8.2 และหน้าจอกับข้อความในบทความนี้เปิดด้วย vim ถ้ายังไม่ได้ติดตั้ง ให้ติดตั้งด้วย [dnf -y install vim-enhanced]
✅ 3 โหมดของ vi
ใน vi ปุ่มเดียวกันทำงานต่างกันไปตามโหมด เมื่อเปิดไฟล์จะเริ่มที่โหมด Normal กด i เพื่อเข้าโหมด Insert แล้วพิมพ์ กด Esc เพื่อกลับ และกดโคลอน [:] เพื่อเข้าโหมด Last-line แล้วบันทึกและออก
| โหมด | ปุ่มที่ใช้เข้า | หน้าที่ |
|---|---|---|
| โหมด Normal (โหมดคำสั่ง) | เปิด vi แล้วจะอยู่ในโหมดนี้ · กด Esc จากโหมดอื่น | ย้ายเคอร์เซอร์ ลบ คัดลอก วาง เลิกทำ |
| โหมด Insert (โหมดพิมพ์ข้อความ) | i a I A o O | พิมพ์ข้อความ ด้านล่างหน้าจอจะแสดง [-- INSERT --] |
| โหมด Last-line (โหมดบรรทัดสุดท้าย) | : | บันทึก·ออก·แทนที่·ตั้งค่าหมายเลขบรรทัด ด้านล่างหน้าจอจะขึ้น : |
| โหมด Visual | v V Ctrl-v | เลือกช่วงแล้วลบ·คัดลอก·พิมพ์พร้อมกันหลายบรรทัด |
วิธีเปิดไฟล์จากคอนโซลมี 3 แบบ
| คำสั่ง | คำอธิบาย |
|---|---|
| vi ชื่อไฟล์ | เปิดไฟล์แล้วเริ่มที่โหมด Normal ถ้าไม่มีไฟล์นั้นจะสร้างใหม่และแสดง [New] |
| vi +20 ชื่อไฟล์ | เปิดไฟล์โดยวางเคอร์เซอร์ไว้ที่บรรทัด 20 |
| view ชื่อไฟล์= vi -R | เปิดแบบอ่านอย่างเดียว ถ้าแก้ไขจะมีคำเตือน [W10] และถ้าบันทึกจะขึ้น [E45] |
ถ้าพิมพ์ [vi httpd.conf] บนเซิร์ฟเวอร์เสมือนด้านล่าง vi จะเปิดขึ้น และเมนูด้านซ้ายจะเปลี่ยนเป็นคำสั่งภายใน vi กดชิปเพื่อส่งปุ่มนั้นเข้าไปในหน้าจอ หรือจะพิมพ์ด้วยคีย์บอร์ดเองก็ได้
✅ สรุปคำสั่ง vi ของ Linux
🔲 ย้ายเคอร์เซอร์
| ปุ่ม | คำอธิบาย |
|---|---|
| h j k l← ↓ ↑ → | ย้ายทีละตัวอักษร ใช้ปุ่มลูกศรก็ได้ |
| 0 · ^ | ต้นบรรทัด (0) · ตัวอักษรแรกในบรรทัดที่ไม่ใช่ช่องว่าง (^) |
| $ | ท้ายบรรทัด |
| w · b · e | ต้นคำถัดไป · ต้นคำก่อนหน้า · ท้ายคำถัดไป |
| gg · G | บรรทัดแรก · บรรทัดสุดท้ายของไฟล์ |
| 20Gเหมือนกับ :20 | ไปที่บรรทัด 20 เปลี่ยนตัวเลขเพื่อไปยังบรรทัดที่ต้องการ |
| H · M · L | บรรทัดบนสุด · กลาง · ล่างสุดของหน้าจอ |
| Ctrl-f · Ctrl-b | เลื่อนลง · ขึ้นหนึ่งหน้าจอ |
| Ctrl-d · Ctrl-u | เลื่อนลง · ขึ้นครึ่งหน้าจอ |
🔲 เข้าสู่โหมด Insert
ไม่ว่าจะเข้าด้วยปุ่มไหน เมื่อพิมพ์เสร็จให้กด Esc ส่วน cw·cc·C·s จะลบแล้วเข้าโหมด Insert ทันที เวลาแก้คำหรือบรรทัดจึงเร็วกว่าการกด x กับ i แยกกัน
| ปุ่ม | คำอธิบาย |
|---|---|
| i · a | เริ่มพิมพ์หน้าเคอร์เซอร์ (i) · หลังเคอร์เซอร์ (a) |
| I · A | เริ่มพิมพ์ที่ต้นบรรทัด (I) · ท้ายบรรทัด (A) |
| o · O | สร้างบรรทัดว่างด้านล่าง (o) · ด้านบน (O) แล้วเริ่มพิมพ์ |
| cw | ลบจากเคอร์เซอร์ถึงท้ายคำแล้วเริ่มพิมพ์ |
| cc | ลบทั้งบรรทัดแล้วเริ่มพิมพ์ |
| C | ลบจากเคอร์เซอร์ถึงท้ายบรรทัดแล้วเริ่มพิมพ์ |
| s | ลบตัวอักษรหนึ่งตัวแล้วเริ่มพิมพ์ |
| Esc | จบการพิมพ์แล้วกลับไปโหมด Normal |
🔲 ลบ·แก้ไข
ถ้าใส่ปุ่มเคลื่อนที่ต่อท้าย d ช่วงนั้นจะถูกลบ dw คือคำ dd คือบรรทัด dG คือจนถึงท้ายไฟล์ และถ้าใส่ตัวเลขไว้ข้างหน้าจะทำซ้ำตามจำนวนนั้น
| ปุ่ม | คำอธิบาย |
|---|---|
| x · X | ลบตัวอักษรที่เคอร์เซอร์ (x) · ตัวอักษรหน้าเคอร์เซอร์ (X) 3x คือ 3 ตัวอักษร |
| dw | ลบจากเคอร์เซอร์ถึงท้ายคำ |
| dd | ลบบรรทัด 3dd คือ 3 บรรทัด |
| D= d$ | ลบจากเคอร์เซอร์ถึงท้ายบรรทัด |
| d0 | ลบจากต้นบรรทัดถึงหน้าเคอร์เซอร์ |
| dG | ลบจากบรรทัดปัจจุบันถึงท้ายไฟล์ |
| :6d · :6,10d | ลบบรรทัด 6 · ลบบรรทัด 6–10 |
| J | นำบรรทัดล่างมาต่อท้ายบรรทัดปัจจุบัน |
| r | เปลี่ยนตัวอักษรที่เคอร์เซอร์เป็นตัวที่พิมพ์ถัดไป |
| ~ | สลับตัวพิมพ์ใหญ่·เล็ก |
| >> · << | ย่อหน้าบรรทัด · ลดการย่อหน้า |
🔲 คัดลอก·วาง·เลิกทำ
สิ่งที่ลบไปก็วางด้วย p ได้เหมือนสิ่งที่คัดลอก ถ้ากด dd แล้วตามด้วย p บรรทัดจะย้ายลงไปด้านล่าง u ย้อนกลับได้หลายขั้น และ Ctrl-r จะทำซ้ำสิ่งที่เลิกทำไป
| ปุ่ม | คำอธิบาย |
|---|---|
| yy | คัดลอกบรรทัด 3yy คือ 3 บรรทัด |
| yw | คัดลอกจากเคอร์เซอร์ถึงท้ายคำ |
| p · P | วางสิ่งที่คัดลอกไว้ด้านล่าง (p) · ด้านบน (P) ถ้าคัดลอกเป็นหน่วยตัวอักษรจะวางหลัง · หน้าเคอร์เซอร์ |
| :1 co 7เหมือนกับ :1 t 7 | คัดลอกบรรทัด 1 ไปไว้ใต้บรรทัด 7 |
| :1,7 co 8 | คัดลอกบรรทัด 1–7 ไปไว้ใต้บรรทัด 8 |
| :1 m 8 | ย้ายบรรทัด 1 ไปไว้ใต้บรรทัด 8 |
| u | เลิกทำ กดหลายครั้งจะย้อนกลับไปเรื่อยๆ |
| Ctrl-r | ทำซ้ำสิ่งที่เลิกทำไป |
| . | ทำการเปลี่ยนแปลงล่าสุดซ้ำ |
🔲 ค้นหา·แทนที่
การแทนที่ทำในโหมด Last-line ถ้าไม่ระบุช่วงจะมีผลเฉพาะบรรทัดปัจจุบัน ถ้าใส่ [%] จะมีผลทั้งไฟล์ และถ้าไม่มี g ต่อท้าย จะเปลี่ยนเฉพาะตัวแรกของแต่ละบรรทัด
| ปุ่ม | คำอธิบาย |
|---|---|
| /ข้อความ | ค้นหาลงไปจากเคอร์เซอร์ เมื่อถึงท้ายไฟล์จะวนไปค้นต่อจากต้นไฟล์ [search hit BOTTOM, continuing at TOP] |
| ?ข้อความ | ค้นหาขึ้นไปจากเคอร์เซอร์ |
| n · N | ผลถัดไปในทิศทางเดียวกัน (n) · ทิศทางตรงข้าม (N) |
| * | ค้นหาคำที่เคอร์เซอร์อยู่ลงไปด้านล่าง |
| :s/old/new/ | เปลี่ยน old ตัวแรกในบรรทัดปัจจุบันเป็น new |
| :s/old/new/g | เปลี่ยน old ทุกตัวในบรรทัดปัจจุบันเป็น new |
| :%s/old/new/g | เปลี่ยน old ทุกตัวในทั้งไฟล์เป็น new |
| :10,20s/old/new/g | เปลี่ยน old ทุกตัวในบรรทัด 10–20 เป็น new |
| :%s/old/new/gc | ถามทีละรายการก่อนเปลี่ยน (y เปลี่ยน · n ข้าม · a ทั้งหมด · q เลิก) |
🔲 บันทึก·ออก·หมายเลขบรรทัด
| ปุ่ม | คำอธิบาย |
|---|---|
| :w | บันทึก เมื่อเสร็จจะขึ้น [36L, 1094B written] |
| :w ชื่อไฟล์ | บันทึกเป็นชื่ออื่น ไฟล์เดิมยังอยู่ตามเดิม |
| :wq= :x = ZZ | บันทึกแล้วออก |
| :q | ออก ถ้ามีการแก้ไขที่ยังไม่บันทึกจะขึ้น [E37: No write since last change] |
| :q! | ออกโดยไม่บันทึก |
| :set nu · :set nonu | แสดง · ซ่อนหมายเลขบรรทัด |
✅ คอมเมนต์ทั้งคอลัมน์ในครั้งเดียวด้วยโหมด Visual Block ของ Vim
เวลาจะใส่ตัวอักษรเดียวกันไว้หน้าหลายบรรทัด ให้ใช้โหมด Visual Block แทนการกด i ทีละบรรทัด ในโหมด Normal ปุ่ม v ใช้เลือกช่วงทีละตัวอักษร Shift-v เลือกทีละบรรทัด และ Ctrl-v เลือกทีละคอลัมน์
ต่อไปนี้คือลำดับการคอมเมนต์ทั้งก้อนในไฟล์ตั้งค่า วางเคอร์เซอร์ที่ตัวอักษรแรกของบรรทัดแรก กด Ctrl-v แล้วกด j ลงไปเพื่อเลือกบรรทัด จากนั้นกด I พิมพ์ # แล้วกด Esc



การเอาคอมเมนต์ออกก็ทำแบบเดียวกัน วางเคอร์เซอร์บน # ของบรรทัดแรก กด Ctrl-v เลือกลงไปถึงด้านล่าง แล้วกด x คอลัมน์ที่เลือกจะถูกลบในครั้งเดียว ลองทำแบบเดียวกันได้ที่ vhost.conf ในตัวจำลองด้านบน
ℹ️ ประกาศเรื่องลิงก์แอฟฟิลิเอต
เนื้อหาของเว็บไซต์นี้มีลิงก์แอฟฟิลิเอต หากผู้เข้าชมซื้อสินค้าหรือบริการผ่านลิงก์เหล่านี้ เว็บไซต์นี้จะได้รับค่าคอมมิชชันจากผู้ขาย ในกระบวนการนี้ ราคาที่ผู้ซื้อจ่าย(ราคาจะลดลงเมื่อมีโปรโมชัน↓)จะไม่สูงขึ้นแต่อย่างใด ราคา ส่วนลด และข้อมูลสต็อกที่แสดงเป็นข้อมูล ณ เวลาที่เขียนและอาจต่างจากความเป็นจริง โปรดตรวจสอบกับผู้ขายอีกครั้งก่อนซื้อ การเลือกและการประเมินสินค้าเขียนตามเกณฑ์ของเราเอง และการได้รับค่าคอมมิชชันหรือไม่ไม่มีผลต่อลำดับการแนะนำหรือเนื้อหาการประเมิน