Thursday, November 13, 2008

VIM for dummies

Trong bài so sánh các Text Editor, tôi đã đề cập đến vi và các dẫn xuất của nó, mà nổi tiếng nhất là vim (Vi IMprove) .
Hầu như trong bản phân phối Linux nào hiện nay cũng có vim và lệnh vi sẽ được ánh xạ (symbolic link) đến vim , một số ít khác thì ánh xạ đến vài biến thể khác của vi như elvis, nvi . Cho nên nếu bạn có thấy các tips hoặc trick hiện nay cho vi , đó nghĩa là dành cho VIM . Thỉnh thoảng cũng có vài *nix cũ (như Solaris) là còn xài vi chính hiệu, nhưng cứ yên tâm là nếu đã rành vim thì gặp vi nguyên thủy cũng chẳng phải lo :D

Ngoài ra còn 1 trình soạn thảo code khác cũng rất nổi tiếng và phổ biến trong giới *nix là Emacs . Đã từng có những tranh cãi dữ dội giữa các fan của vi và Emacs , nhưng rồi cũng chẳng đi đến đâu. Thôi quay lại với các tips nhỏ cho VIM nào :

(for those who don't know: VI/vim is a very good powerful and lightweight editor. It can run on console, i.e. command-line, of ALL the modern Operating Systems. VI/vim is incredibly hard to learn; it has a virtual cliff-face learning curve. But, once you’ve mastered it, you are the most effective manipulator of text possible. Watching experienced VIM coders typing prolly make you impressed, people say that the cursor just follows their eyes ! )



=== Cài đặt VIM ===

Tuy nói là trên Linux nào cũng có vim/vi , nhưng cũng có trường hợp các bản vim cài đặt sẵn trong hệ điều hành là bản thiếu chức năng. Thật không may, trong bản phân phối phổ biến nhất hiện nay là Ubuntu thì vim cài sẵn rất thiếu hấp dẫn: không hỗ trợ Unicode, tab, vimshell, ... Và thậm chí với phiên bản Ubuntu 8 trở lên thì vim đi kèm còn thiếu cả chức năng highlight màu ! OK, thực ra cũng chẳng có vấn đề gì nếu bạn có thể cài bản vim mới cho Ubuntu :
$ sudo apt-get install vim vim-runtime

Nếu muốn đầy đủ, có cả GUI (gvim, evim, ...) thì cài thêm:
$ sudo apt-get install vim-full



=== Khởi động VIM ===

Thường ta dùng vim mở tập tin có tên "myfile.txt" bằng cách gõ lệnh:
$ vim myfile.txt

hoặc để đơn giản, ta gõ ngắn gọn vi , Linux (Ubuntu/Fedora/SUSE/...) cũng sẽ hiểu là vim:
$ vi myfile.txt

(nếu ở thư mục đó chưa có tập tin myfile.txt thì vim sẽ tạo ra 1 file rỗng và đặt tên là myfile.txt luôn)


=== Thoát khỏi VIM ===

Bấm phím Escapse (phím Esc ở góc trên, bên trái màn phím), sau đó gõ
:q
rồi bấm Enter để thoát khỏi 1 cửa sổ vim .

Nếu có warning là chưa save, nên chưa quit được, thì bạn thêm dấu chấm than sau chữ q để thực hiện luôn lệnh thoát khỏi cần xác nhận:
:q!

Trong trường hợp muốn lưu lại các chỉnh sửa trên file đang làm (myfile.txt) và thoát khỏi thì dùng lệnh write quit:
:wq
(ngoài ra còn lệnh cùng chức năng lưu và thoát :x cũng là :wq! , nhưng lệnh này không được khuyến khích với người mới làm quen vim vì nó chỉ exit mà không thể hiện là write quit)


=== Các chế độ của VIM ===

Khác với nhiều trình soạn thảo (text editor) quen thuộc trên Windows chỉ có 1 chế độ là edit , vim có ít nhất là 2 chế độ : command-mode và edit-mode (còn gọi là normal-modeinsert mode) , trong đó chế độ command (normal) là mặc định khi mới khởi động vim lên.
Để bắt đầu chuyển sang chế độ edit (insert) thì đơn giản nhất là bạn nhấn phím "i" , sau đó bạn đã có thể gõ, chỉnh sửa văn bản được rồi !
Sau đó để lưu (save) lại các thay đổi vào tập tin đang soạn, bạn đừng bấm Ctrl+S nhé :D , mà phải bấm phím Escape để chuyển lại chế độ normal (command), rồi gõ lệnh write
:w
Còn nếu muốn lưu thành (save as) tập tin có tên khác, chẳng hạn file2.txt, thì gõ :
:w file2.txt

Sau đó để soạn thảo tiếp thì bạn lại phải trước tiên chuyển sang chế độ insert (bấm phím "i") . Rồi khi nào muốn thoát thì lại bấm Esc để chuyển sang chế độ normal và dùng các lệnh ở phần thoát khỏi vim ở trên :-)
(thực ra để chuyển chế độ normal sang insert, ngoài phím i còn có thể dùng phím a hoặc o )


=== Di chuyển trong VIM ===

Một điểm nữa trong vim cũng khá lạ với các bạn mới làm quen, đó là vim có thể di chuyển cursor mà không dùng các phím mũi tên , thay vào đó dùng 4 phím liền nhau: "h", "j" , "k" , "l" tương ứng:
* trái và phải : là "h" và tương ứng "l"
* còn xuống , lên : là "j" , "k"

Tại sao lại có kiểu chế độ di chuyển bằng phím này? Và kể cả phím Esc để đổi chế độ trên kia? Câu trả lời rất đơn giản: vi ban đầu được viết theo chương trình ed , chương trình này chỉ xử lý tuần tự kiểu soạn thảo 1 loạt, rồi các thao tác xử lý (như replace) thì lại 1 loạt, nên 2 chế độ kia tách rời cho phù hợp. Tác giả của vi, Bill Joy, cũng là đồng sáng lập hãng Sun Microsystem , lại luôn lập trình trên loại bàn phím ADM3A , có hình bên dưới:


Các bạn cũng thấy đó, trên bàn phím đó thì vị trí Esc cũng như Tab bây giờ, khá dễ bấm, và KHÔNG CÓ CÁC PHÍM MŨI TÊN RIÊNG để di chuyển. Chính vì lý do đó mà khi viết ra vi , Bill Joy đã làm ra các chức năng tương ứng các phím nói trên :D . Đến bây giờ thì các hậu duệ của vi vẫn giữ các tính năng này, mặc dù đã bổ sung nhiều tính năng mới phù hợp với kiểu bàn phím mới , xu hướng mới.

(cũng tương tự như vậy, bạn có thể xoá ký tự trong vim mà chỉ dùng các phím chữ, chứ không cần dùng phím Delete hay Backspace. Bài sau sẽ giới thiệu kỹ hơn tính năng này)


=== Thiết lập các tuỳ chọn VIM ===

Khi đang ở trong chế độ gõ lệnh (normal mode) của vim, bạn có thể dùng các lệnh sau để bật một số tuỳ chọn hữu ích cho vim (vốn bị ẩn đi trong Ubuntu mặc định) :

* Chuyển theme màu khác cho vim, chẳng hạn theme "murphy" :
:colorscheme murphy

* Bật syntax highlight màu cho các ngôn ngữ lập trình, script :
:syntax on

* Bật số dòng (line number) lên cho dễ theo dõi:
:set number

* Bật chức năng hiện các lệnh (show command) đã gõ :
:set showcmd

* Bật "cây thước" để hiện số dòng, số cột, số ký tự đã gõ:
:set ruler

* Bật chức năng highlight các từ được search :
:set hlsearch

* Bật chức năng ignore case của từ được search để tìm được nhiều hơn :
:set ignorecase


=== Tìm kiếm từ trong VIM ===

Trước tiên bạn nên chuyển về chế độ normal (nhấn phím Esc) , sau đó nhấn phím slash ( / ) rồi gõ từ cần tìm và nhấn Enter/Return để bắt đầu tìm .

Ngoài phím / , còn có thể dùng phím ? để tìm kiếm , giống như dùng / . Khác biệt giữa 2 kiểu này là / sẽ tìm các từ theo thứ tự từ đầu file đến cuối file (trên xuống), còn ? sẽ tìm cũng từ đó nhưng theo thứ tự ngược lại (tìm từ dưới lên).

Nếu trong cụm từ muốn tìm kiếm, có chứa dấu / , ví dụ "directory1/file1" , thì khi tìm bằng / bạn có thể thêm 1 dấu Backslash (\) ở trước dấu slash (/) để phân biệt: /directory\/file1

Tuy nhiên trong thực tế, khi tìm từ có dấu slash / , ví dụ tìm cụm từ "http://google.com/" người ta thường dùng ? để tìm, còn lại thì tìm bằng / bình thường.


=== Bỏ làm và làm lại với VIM ===

Hehe, chính là các thao tác "undo" và "redo" cũng khá phổ biến trong các chương trình soạn thảo. Các editor thông thường chỉ hỗ trợ vài chục đến khoảng trăm lần undo/redo liên tục, nhưng vim thì hỗ trợ vô hạn , tới mức tối đa mà máy tính của bạn chịu nổi, nên cứ yên tâm.

Để undo, thì trước tiên chuyển về normal mode (nhấn ESC) , rồi bấm phím u , thế là undo 1 lần. Muốn undo nữa thì nhấn u nữa, cứ thế. Còn để redo thì ở Normal mode ta bấm Ctrl+r (trong VIM thường ký hiệu là C-R) . Nếu muốn redo nữa thì lại bấm Ctrl+r tiếp, bạn có thể redo đến hết lần undo liên tục gần nhất.


=== Xem phần trợ giúp về VIM ===

Thông thường các lệnh, tập tin trong Linux bạn có thể coi nhanh cách dùng bằng tuỳ chọn --help , hoặc dùng man để xem đầy đủ manual . Tuy nhiên trong bản thân vim cũng đã built-in các lệnh nên bạn có thể coi bằng cách dùng lệnh :h như sau trong chế độ normal (command ) :
:h word
(với "word" là từ mà mình muốn coi help)

Còn các tuỳ chọn (options) của lệnh :set mà bạn muốn tìm hiểu thêm thì gõ:
:options

Để thoát khỏi cửa sổ help của vim, cũng dùng cách thoát như đã nói ở phần trên ( :q )

vim cũng có built-in sẵn 1 cái tutor về cách dùng VIM , bạn có thể dùng lệnh sau để xem và thực hành tutor đó của vim:

$ vimtutor


Cuối cùng, xin nhắc các bạn là các lệnh của vim cũng như các lệnh trong Linux shell, đều là dạng viết tắt (hoặc đúng) chức năng tương ứng bằng tiếng Anh, khi gõ nếu không nhớ hết có thể gõ thêm phím Tab để tự bung ra các lệnh có cùng prefix.



OK, thế là xong các thao tác cơ bản nhất của VIM. Hy vọng vậy là đủ cho các bạn lần đầu làm quen với vi/vim . Khả năng của vim là rất lớn nhưng nếu ghi ra nhiều ở đây có thể làm các bạn nản chí nên chỉ tạm thế đã, hehe.
Nếu các bạn có hứng thú tớ sẽ viết thêm dần 1 số tips & tricks về vi/vim , trong các bài <sau.

2 comments:

Anonymous said...

nice Tut ! I was struggling with vi in Ubuntu , and this tut helps !

Anonymous said...

Part 2 is better:

http://mediocre-ninja.blogspot.com/2008/11/vim-for-dummies-2.html

:D