Hướng dẫn sử dụng Vim để code Go

Vim là gì?

Cài đặt và config

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 df :GoDef


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 pp pp.Println(“”) Tức là khi mình gõ trong insert modeppnó sẽ tự chuyển thànhpp.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:

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.

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket