Vim Basics
I've been using Vim for about 2 years now, mostly because I can't figure out how to exit it.
— I Am Devloper (@iamdevloper) February 17, 2014
Vim มาจากคำว่า Vi IMproved เป็น open-source cross-platform text editor ตัวหนึ่ง พัฒนาโดย Bram Moolenaar และถุกปล่อยออกมาใช้งานตั้งแต่ปี 1991
Learning Vim with FizzBuzz
เราจะมาหัดใช้ Vim โดยการใช้ภาษา Ruby ทำโจทย์ FizzBuzz กัน ก่อนอื่นให้สร้างโฟลเดอร์เปล่า ๆ ขึ้นมา
แล้วเดี๋ยวเราจะค่อย ๆ เพิ่มไฟล์ด้านล่างนี้กัน
File: test/fizzbuzz_test.rb
require "minitest/autorun"
require_relative "../fizzbuzz"
class FizzBuzzTest < Minitest::Test
def test_it_should_get_fizz_when_input_is_3
result = fizzbuzz(3)
assert_equal "Fizz", result
end
end
File: fizzbuzz.rb
รันคำสั่ง
ถ้ารันเทสได้ ไม่ติดปัญหาอะไร เราก็สามารถทำเวิร์คชอปกันต่อได้ล่ะ ซึ่งเดี๋ยวเราจะมาค่อย ๆ เรียนรู้ Vim และทำโปรแกรม FizzBuzz ต่อให้จบกัน 😎
Understanding Vim Modes
Vim มีโหมดที่ใช้หลัก ๆ ตามนี้
-
Normal: เป็นโหมด default ที่เราสามารถที่จะเลื่อนหรือสำรวจข้อความ สั่งคำสั่ง และย้ายไปโหมดอื่น เข้าโหมด normal โดยการกด
Esc
จากโหมดไหนก็ได้ -
Insert: เป็นโหมดที่ใช้สำรับเพิ่มหรือแก้ไขข้อความ เข้าโหมด insert โดยการกด
i
(insert before cursor) ส่วนI
ใช้ insert ที่ต้นบรรทัดa
(append after cursor) ส่วนA
ใช้ append ที่ท้ายบรรทัดo
(open a new line below current line and enter insert mode)O
(open a new line above current line and enter insert mode)
-
Visual: สำหรับ selecting ข้อความ เข้าโหมด visual โดยการกด
v
(character-wise selection)V
(line-wise selection)Ctrl+v
(block-wise selection)
-
Command-line: สำหรับการสั่งคำสั่ง หรือใช้ค้นหาคำ เข้าโหมด command-line โดยการกด
:
(colon)
ดูโหมดอื่น ๆ เพิ่มเติมได้ที่ Vim documentation: intro
Opening a File
เปิดไฟล์เราใช้คำสั่ง
ตอนที่เราอยู่ใน Vim แล้ว ที่โหมด normal
:w
สำหรับการเซฟไฟล์ หรือ:w <new_file_name>
เพื่อเซฟไฟล์ใหม่ตามชื่อที่กำหนด
Saving and Quitting
:q
เพื่อออกจาก Vim หรือใช้:q!
เพื่ออกจาก Vim แบบ force (ไม่เซฟไฟล์):wq
หรือZZ
เพื่อเซฟ และออกจาก Vim
Navigation
h
,j
,k
,l
สำหรับไปทาง ซ้าย, ลง, ขึ้น, ขวา ตามลำดับ (ทำไมhjkl
?)w
ใช้เลื่อนไปข้างหน้า 1 คำ ส่วนb
ใช้เลื่อนถอยหลัง 1 คำ$
ไปที่ท้ายสุดของบรรทัด ส่วน0
ไปที่ต้นบรรทัดgg
ไปที่ด้านบนสุดของไฟล์ ส่วนG
ไปที่ล่างสุด
เพิ่มเติม ถ้าเราพิมพ์ตัวเลขก่อน แล้วค่อย navigate ก็จะเป็นการกระโดดไปเป็นจำนวนตามตัวเลข เช่น
10k
จะเป็นการ nagivate ไปทางขวา 10 ตัวอักษร เป็นต้น
Ctrl+e
เป็นการเลื่อนหน้าจอลง 1 แถว ส่วนCtrl+y
เป็นการเลื่อนหน้าจอขึ้น 1 แถวCtrl+d
เป็น 1/2 page down ส่วนCtrl+u
จะเป็น 1/2 page upCtrl+f
เป็น 1 page down ส่วนCtrl+b
จะเป็น 1 page up- เวลาที่อยากจะกระโดดจากสิ่งที่อยู่คู่กัน เช่น เปิด
{
กับ ปิด}
ให้เลื่อน cursor ไปบนนั้นแล้วกด%
ซึ่งสามารถกระโดดย้อนไปย้อนมาได้ (ใช้กับ tag HTML ได้ด้วย)
Editing Text
x
ใช้ลบ 1 อักษรdw
ใช้ลบ 1 คำ ส่วนdd
ใช้ลบทั้งแถวu
ใช้ undo การเปลี่ยนแปลงล่าสุด ส่วนCtrl+r
ใช้ redo- คลุมแถบดำโดยใช้
V
เสร็จแล้วกดU
จะเป็นการเปลี่ยนเป็น upper case ทั้งหมด - คลุมแถบดำโดยใช้
V
เสร็จแล้วกดu
จะเป็นการเปลี่ยนเป็น lower case ทั้งหมด - ครอบ +
>
จะเป็นการ indent ไปทางขวา ถ้า<
ก็จะ indent ไปทางซ้าย
Search and Replace
/pattern
ใช้ search หาคำว่า "pattern" แบบ forward?pattern
ใช้ search แบบ backward:s/old/new/g
ใช้ replace คำว่า "old" ด้วยคำว่า "new" ที่บรรทัดที่อยู่ ถ้าเราติม%
หลังs
จะเป็นการ replace ทั้งไฟล์
Basic Commands
:e file_name
ใช้ edit ไฟล์ "file_name":sp file_name
หรือ:new file_name
ใช้ split แบบ horizontally เพื่อมา edit:vsp file_name
ใช้ split แบบ vertically
Useful Shortcuts
yy
ใช้สำหรับ yank หรือ copy ทั้งแถp
orP
ใช้ใน paste หลัง หรือ ก่อนหน้า cursor ตามลำดับd$
ใช้ลบตั้งแต่ cursor ไปจนสิ้นสุดบรรทัด ส่วนd^
ใช้ลบตั้งแต่ cursor ไปจนจุดเริ่มของบรรทัด
Plugins
สามารถไปส่องได้ที่ Vim Awesome ส่วน plugin manager แนะนำ vim-plug เพราะว่ารู้สึกว่าใช้ง่ายที่สุด แล้วเค้าก็เคลมว่าเค้าเป็น minimalist design 😂
Customization
ไฟล์ ~/.vimrc
syntax on " syntax highlighting
set nocompatible " use vim defaults
set ls=2 " always show status line
set tabstop=4 " numbers of spaces of tab character
set shiftwidth=4 " numbers of spaces to (auto)indent
set expandtab " insert space characters whenever the tab key is pressed
set autoindent " always set autoindenting on
set hlsearch " highlight searches
set incsearch " do incremental searching
" set number " show current line number
set relativenumber " show line numbers
set ignorecase " ignore case when searching
set title " set title in console title bar
set ruler " show the line and column number of the cursor position.
set colorcolumn=100 " show the vertical line at column number 100
set autoread " Reload unchanged files automatically.
" disable arrow keys
map <Up> <Nop>
map <Down> <Nop>
map <Left> <Nop>
map <Right> <Nop>