Hướng dẫn sử dụng Vim để code Go
- Vim là một text-editor khá mạnh, được sử dụng trong môi trường máy chủ không có giao diện đồ họa. Trong bài này mình sẽ giới thiệu Vim căn bản và hướng dẫn các bạn sử dụng Vim như một IDE dành cho Go
Vim là gì?
- Vim là text editor cao cấp, phiên bản sau của Vi(Vim = Vi Improved), được viết bởi Bram Moolenaar, lần đầu tiên được đưa ra vào năm 1991.
- Vim thường được gọi à “editor dành cho dân lập trình”, tuy nhiên nó có thể hầu hết các công việc liên quan tới văn bản như sửa chữa văn bản, soạn thảo email hay sửa file configs.
- Vim có thể sử dụng làm IDE nhờ các plugins
- Vim hỗ trợ đa nền tảng.
Cài đặt và config
Vim có thể được download tại trang vim homepage hoặc cài đặt bằng brew
brew install vim
Vì một số plugins phía sau có thể cần tới lua nên các bạn nên cài với câu lệnh:
brew install vim --with-lua
Sau khi cài đặt xong, các bạn tạo một file .vimrc ở ~/ (file này không tự động tạo). File .vimrc này sẽ là nơi chứa toàn bộ config, plugins hay bundle cũng như các function liên quan tới vim.
Tiếp theo là cài vim plugins manager. Hiện tại mình đang sử dụng Vundle, các bạn có thể sử dụng panthogen nếu thích. Vundle sẽ giúp các bạn trong việc config các plugins trong .vimrc, install hay update và một số việc khác. Để cài đặt, các bạn clone vundle vào thư mục ~/.vim/bundle/ (thư mục .vim sẽ có sau khi cài đặt vim xong)
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
Copy vào .vimrc một số configs và các plugin cơ bản (chú ý dấu “ trong vim là comment)
set nocompatible " be iMproved, required filetype off " required " set the runtime path to include Vundle and initialize set rtp+=~/.vim/bundle/Vundle.vim call vundle#begin() " alternatively, pass a path where Vundle should install plugins "call vundle#begin('~/some/path/here') " let Vundle manage Vundle, required Plugin 'VundleVim/Vundle.vim' " The following are examples of different formats supported. " Keep Plugin commands between vundle#begin/end. " plugin on GitHub repo Plugin 'tpope/vim-fugitive' " plugin from http://vim-scripts.org/vim/scripts.html Plugin 'L9' " Git plugin not hosted on GitHub Plugin 'git://git.wincent.com/command-t.git' " git repos on your local machine (i.e. when working on your own plugin) Plugin 'file:///home/gmarik/path/to/plugin' " The sparkup vim script is in a subdirectory of this repo called vim. " Pass the path to set the runtimepath properly. Plugin 'rstacruz/sparkup', {'rtp': 'vim/'} " Avoid a name conflict with L9 Plugin 'user/L9', {'name': 'newL9'} " All of your Plugins must be added before the following line call vundle#end() " required filetype plugin indent on " required " To ignore plugin indent changes, instead use: "filetype plugin on " " Brief help " :PluginList - lists configured plugins " :PluginInstall - installs plugins; append `!` to update or just :PluginUpdate " :PluginSearch foo - searches for foo; append `!` to refresh local cache " :PluginClean - confirms removal of unused plugins; append `!` to auto-approve removal " " see :h vundle for more details or wiki for FAQ " Put your non-Plugin stuff after this line ```
Tiếp theo để install plugins, các bạn mở vim lên và chạy command sau(bằng cách nhấn Esc):
:PluginInstall
Để update plugins, các bạn sử dụng
:PluginUpdate
Như vậy là đủ đồ chơi để các bạn có thể sử dụng Vim rồi.
Hướng dẫn sử dụng căn bản.
Vim là một chương trình soạn thảo được build lần đầu tiên trên UNIX, dùng để làm việc trên môi trường ko có UI. Lúc này bàn phím chưa cũng khá thô sơ, nên các bước di chuyển trên vim hơi khác với bình thường:
Các bạn có thể tự tập luyện việc sử dụng các phím này bằng vim game
Để mở một file với vim, các bạn dùng câu lệnh:
vim file_name
Trong vim có 3 mode:
– Normal mode - xuất hiện khi bạn ấn Ecs, thường đi kèm đầu tiên bởi dấu “:“. Ở đây vim sẽ hiểu những gì bạn gõ vào là câu lệnh cho vim. Ví dụ::w
là save văn bản, :q
là thoát một văn bản.
Vim có ngôn ngữ riêng dành cho mình, đó là Vim script. Vim script có thể được execute ở normal mode, ví dụ, để in ra Hello world chúng ta dùng:
:echo "Hello world"
– Insert mode - xuất hiện khi bạn nhấn một trong các nút sau :
a: Insert vào phía sau con trỏ hiện tại
A: Insert vào cuối hàng
i: Insert vào phía trước con trỏ hiện tại
I: Insert vào đầu hàng
o: Insert và mở một hàng trống phía dưới
O: Insert và mở một hàng trống phía trên
– Visual mode – xuất hiện khi bạn ấn nút v, được dùng cho việc chọn một mảng block text lớn, có thể sử dụng vào việc copy paste hoặc comment…
Các bạn có thể đọc vim command để biết thêm về các command trong vim.
Sử dụng Vim như Go IDE
Để sử dụng Vim như một IDE cho Go, chúng ta cần cài đặt một số plugins cho go.
Quan trọng nhất là vim go. Vim go bao gồm tập hợp các thư viện hỗ trợ Go cho vim, ví dụ godef
Để cài đặt vim go, các bạn copy plugin vào file .vimrc
Plugin ‘fatih/vim-go’
Sau đó vào normal mode bằng cách nhấn ```Esc``` và gõ command:
:PluginInstall
Xong, lại tiếp tục gõ command để install Go binaries
:GoInstallBinaries
Chỉ với Vim-go các bạn đã có thể code Go được rồi, nhưng để mọi thứ dễ nhìn hơn cũng như tăng độ hiệu quả, các bạn nên tìm và cài thêm các plugin sau
ack.vim
bclose.vim
bufexplorer
nerdtree
nerdcommenter
csapprox
vim-fugitive
gitv
vim-gitgutter
syntastic
neocomplete.vim
neosnippet.vim
auto-pairs
Trong số này:
-- nerdtree: Giúp bạn tổ chức folder trong vim dưới dạng cây thư mục, dễ dàng hơn trong việc mở file và folder. Sau khi cài đặt:
<img src="/post/img/nerdtree.png" class="img-center">
Nhờ plugin của git, các bạn có thể biết file nào đang sửa, thêm mới và chưa được commit.
-- neocomplete: Hỗ trợ auto complete trong vim.
<img src="/post/img/neocomplete.png" class="img-center">
-- autopair: Plugin giúp bạn gõ nhanh khi sử dụng các dấu " ( ' [ < bằng cách thêm vào thành một pair "" () '' [] <>
## Cơ chế mapping trong Vim
Vim có một khái niệm là mapping, cho phép người dùng mode lại các tổ hợp phím để phục vụ các mục đích cá nhân.
Khi tôi nhấn key này, tôi muốn bạn làm hành động này thay vì những gì bạn hay thường làm
Ví dụ:
Gõ vài dòng trên văn bản bằng vim, sau đó chạy command:
:map - x
Đặt con trỏ của bạn lên văn bản và nhấn ```-```. Vim lập tức delete kí tự tại vị trí con trỏ, như là bạn đã nhấn ```x```
Lúc này mapping của bạn chỉ có hiệu quả trên file text mà bạn đang edit, để mapping hoạt động trên toàn bộ các file khác, bạn cần đặt mapping vào trong file .vimrc
Một số loại mapping thường dùng:
nmap : sử dụng khi ở chế độ normal imap : sử dụng trong chế độ insert vmap : sử dụng trong chế độ visual noremap : không thể bị override bởi mapping khác
Ví dụ, khi code Go chúng ta hay dùng godef để tìm định nghĩa của hàm(biến) đó. Để sử dụng với vim-go chúng ta cần vào normal mode và gõ ```:GoDef```
Thay vì vậy, mình mapping lại như sau
nnoremap
Có nghĩa là, khi mình ở chế độ normal, ấn tổ hợp df sẽ thực hiện command ```:GoDef```. Map này không bị override bởi bất kì normal map nào khác.
Như vậy, khi bạn muốn tìm kiếm định nghĩa một hàm hay một biến nào đó, bạn sử dụng tổ hợp phím ```df```. Việc này giảm thiểu quá trình typing đi khá nhiều.
Một ví dụ về mapping khác, ví dụ mình hay sử dụng thư viện [print](https://github.com/k0kubun/pp) để in ra result ở terminal đẹp hơn. Việc log để debug trong Go diễn ra khá thường xuyên, vì vậy mình đặt một map như sau:
inoremap
Tức là khi mình gõ trong insert mode
ppnó sẽ tự chuyển thành
pp.Println(“”)```, điều này giúp mình code nhanh hơn.
Các bạn có thể đọc thêm về mapping in vim
Lời kết
Tất cả mọi thứ dường như đã sẵn sàng! Việc còn lại của bạn là tập luyện:
- Sử dụng nhuần nhuyễn cách di chuyển trong vim bằng các nút hjkl, cũng như các command cơ bản trong vim.
- Tìm thêm các plugins để hỗ trợ thêm cho vim. Một trang mình thấy khá hay và bổ ích về plugins cho vim
- Điểm mạnh của vim chính là customization, các bạn nên tìm cách tạo những mapping hay function giúp tăng tốc độ code.
Trên đây là những gì mình tìm hiểu được về Vim và cách sử dụng Vim để code Go. Thế giới của Vim có rất nhiều điều để có thể tìm hiểu, mong nhận được sự đóng góp của mọi người. Nếu có điều gì muốn trao đổi, liên hệ qua mail thach@dwarvesf.com với mình nha.
Runi blog
Runi is a gopher