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 ทั้งแถporPใช้ใน 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>