Combo chất như nước cất dành cho các thánh vim với AZTN (Ây-Zét-Ti-En) Alacritty, Zsh, Tmux, Neovim(nvim)
Vấn đề code trong Vim
Sau một thời gian tầm sư học đạo về vim và cách dùng thì mình muốn chia sẻ với anh em coder về công cụ và cách kết hợp để giúp cho quá trình code trên terminal bằng vim của mình ngày càng cải thiện hơn.
Có một câu hỏi mà nhiều bạn sẽ tự hỏi là. Vì sao phải dùng vim và code bằng terminal trong khi mình đã có nhiều IDE tuyệt vời ví dụ như là vscode, sublime text…
Nếu bạn đang băn khoăn với câu hỏi này thì mình sẽ trả lời giúp bạn đơn giản vài ý như sau:
- Hầu hết thời gian bạn code thì bạn sẽ
đọc
code nhiều hơn làviết
code và với vim thì mặc định bạn sẽ có chế độ normal mà đó là chế độ xem, đọc code và di chuyển trong source code vô cùng nhanh và thuận tiện với bàn phím mà không cần phải dùng chuột - Với vim thì bạn có hệ thống phím tắt cho phép di chuyển tiện lợi tiết kiệm thời gian với
- Vim dùng phím h, j, k, l để di chuyển qua trái, xuống, lên, phải thay vì phím mũi tên. Điều này sẽ giúp bạn không phải di chuyển tay ra phím mũi tên khi muốn di chuyển trong source code, file.
- Vim có hệ thống phím tắt vô cùng
logic
bởi vì nó dựa vào từ ngữ và phím tắt cũng ngắn. Ví dụ phímx
để xóa 1 ký tự, phímd
là phím hành động liên quan tới xóa và khi bạn muốn xóa một từ thì bạn gõdiw
làxóa một từ
hoặcdaw
là xóa một từ và khoảng trắng - Với việc không phải dùng chuột sẽ giúp bạn khỏi bị
ngắt quãng tư duy
vì khi bạn đang đọc code, gõ code mà muốn sửa gì đó mà phải dùng chuột trỏ vào thì sẽ làm cho dòng suy nghĩ của bạn sẽ bị ảnh hưởng. Đây cũng là một lý do vì sao ngôn ngữmarkdown
ra đời đó bạn.
Lý do cho hệ sinh thái xung quanh vim
Vim
Vim ban đầu là một text editor
nghĩa là dùng để chỉnh sửa văn bản nó cũng giống như notepad hay word thôi. Như hình bên dưới.
Có điều là anh em hay cài neovim (hay rút gọn là nvim) là một bản dễ sử dụng hơn của vim và từ đây trở đi khi nhắc tới vim là mình đang nói tới nvim
.
Khi cài vim rồi thì mình có thể thoải mái chỉnh sửa file trong hệ thống, tạo những script để chạy tự động hay tạo, chỉnh sửa những file cần làm việc. Nhưng nếu giờ mình muốn code nguyên cả dự án bằng vim thì có cách nào quản lý các file, folder cho việc thêm sửa xoá files trở nên dễ dàng hơn không? Khi bạn bắt đầu hỏi những câu này có nghĩa là bạn đang từ từ đi vào hệ sinh thái vim.
Các lập trình viên đã nghĩ như bạn và họ đã và đang tìm mọi cách cải thiện trải nghiệm quá trình phát triển, quản lý dự án trên vim. Và sau đó thì họ đã phát triển nhiều plugin để cài cắm
vào trong vim để thêm nhiều tính năng cho trình vim editor để biến nó thành một IDE (Integrated Development Environment). Ngày tháng trôi qua và cứ thế số lượng plugin ngày càng nhiều để đáp ứng cho nhu cầu đa dạng của các lập trình viên trên thế giới. Ví dụ cụ thể cho các bạn hiểu thêm như:
- Để cho Vim có thể cài plugin thì các
thánh
đã phát triển ra trình quản lý plugin mà phổ biến làvim-plug
. - Màn hình đen sì cùng với dòng code màu trắng vô cùng nhàm chán ư? Không sao, đã có bộ sưu tập
theme
và plugin nhiều mắc sắc ví dụ như:- Theme
dracular
hay nổi tiếng nhất làgruvbox
. - Rồi để làm nổi bật
syntax
cho ngôn ngữ thì đã có plugin ví dụ nhưsheerun/vim-polyglot
và nó sẽ giúp cho màu sắc của file code nhưhtml, css, javascript...
sẽ rõ ràng hơn. - Tiếp theo thì khi mà bạn muốn có một cái
folder tree
để xem cấu trúc file và folder trong dự án code thì sẽ có pluginscrooloose/nerdtree
và với nó bạn có thể xem cấu trúc folder, đứng từ 1 file và tìm và định vị nó trong source code. Thêm sửa xóa file, folder… - Khi bạn muốn, tìm và mở nhanh một file trong source code, cũng như tìm một hàm, biến, giá trị nào đó trong toàn bộ source code của mình thì bạn có thể cài plugin quốc dân là
fzf
. - Tiếp theo khi làm việc bạn muốn có nhiều hỗ trợ hơn ví dụ như
auto suggestion
code tên hàm, biến. Hayvim-snippet
kiểu như bạn gõcl
và bấmtab
thì sẽ raconsole.log()
, hay bạn muốn format lại code cho chuẩn theoeslint
hayprettier
, cũng như check code xem có đúng hay không thì có plugin đầy sức mạnh làcoc
. - Khi làm việc với source code thì việc làm việc với
version control system
haygit
là một điều bắt buộc và với plugin hỗ trợ nhưgitgutter
sẽ giúp bạn xem dễ dàng hơn những chỗ nào trong file đã được thêm+
, sửa~
hay xóa-
bạn cũng có thể xem preview xem chỗ đó đã được thêm, sửa xóa những gì và sẽ có phím tắt quyết định xem sẽ giữ thay đổi đó hay làundo
lại theo như ban đầu. Và việcundo
này không phải làm theo thứ tự ngược lại mà bạn có thể đứng tại bất cứ vị trí nào cầnundo
và thực hiện nó mà không cần phải quan tâm thứ tự của việc undo. - Về git thì còn plugin nữa là
git fugitive
với plugin này sẽ giúp bạn check status, commit, push ngay trong vim luôn với mặc định nó sẽ chia đôi màn hình ở bên dưới màn hình vim hiện tại. Ngoài ra thì nó còn giúp bạn check và giải quyết conflict vô cùng thông minh vớidiffget //2
haydiffget //3
- Thêm một plugin về git nữa là
diffview.nvim
, đây là plugin sẽ làm cho bạn vô cùng sung sướng vì ngoài việc xem toàn bộ file thay đang được thay đổi trong source code dạng tree thì nó còn cho bạn xem history git của một file nào đó bạn chọn từ lúc file đó bắt đầu ra đời cho tới hiện tại, vô cùng bá đạo.
- Theme
Nói chung là với tình yêu
vim
vô bờ bến thì các lập trình viên đang ngày càng cải tiến và thêm vào những plugin để đáp ứng nhu cầu của bản thân trong lập trình cho từng loại ngôn ngữ một. Thật là toẹt vời.
Tmux
OK. Bạn đã có vim, đã có plugin để biến vim thành IDE nhưng có một vấn đề là bạn không chỉ có một dự án mà một lúc bạn sẽ có rất nhiều dự án cùng làm song song và việc nhảy qua lại giữa các dự án đang làm là việc vô cùng thường xuyên. Có điều là mỗi lần mở dự án mới thì bạn lại phải thoát dự án hiện tại và cd
vào folder dự án khác mà bạn muốn làm việc, điều đó dẫn tới bạn phải tốn thời gian, thao tác cho việc này. Thêm nữa là mỗi lần tắt máy tính rồi mở lên lại thì bạn lại phải làm lại những thao tác này lặp đi, lặp lại theo flow là: Mở terminal > cd vào folder dự án > chia layout / hoặc là bạn phải mở nhiều tab để làm việc ví dụ: 1 tab hoặc cửa sổ mở vim
, 1 tab hoặc cửa sổ chạy dự án, 1 tab hoặc 1 cửa sổ để check git hoặc làm này kia.. rồi khi đó bạn sẽ được thoải mái làm việc. Và việc này sẽ lặp lại khi bạn đang làm việc với project này nhưng lại có việc cần chỉnh sửa projet kia thì quy trình sẽ được lặp lại. Tắt máy đi, mở máy lên làm việc thì cũng bị lặp lại.
==> Vậy có cách nào giải quyết vấn đề này không? Có cách nào lưu lại những phiên làm việc từ layout cho đến các tab đã mở trong từng dự án một không? Để khi mà ta mở dự án lên thì các layout sẵn có, các tab sẵn có đã bật sẵn và ta chỉ việc làm việc ngay lập tức.
Rất may là các lập trình viên đi trước đã suy nghĩ ra cái này và đã khắc phục bằng nhiều cách trong đó có một cách là dùng tmux
. Về định nghĩa thì tmux là multiplexer
dịch nôm na là bộ ghép kênh
và cái hay của nó là cho phép bạn chạy nhiều dự án độc lập trong cùng một terminal và tách các chương trình ra một terminal riêng mà vẫn giữ
được trạng thái hoạt động của nó. Nói đơn giản là khi bạn mở dự án lên rồi tắt terminal đi thì dự án nó vẫn chạy, khi bạn mở lại terminal thì vào lại tmux và mở lại dự án thì nó sẽ mở cho bạn vào đúng chỗ bạn đã tắt nó đi và bạn chỉ việc tiếp tục làm việc. Đó là lý do vì sao mà mình lại dùng vim với Tmux.
Nói đơn giản thì Tmux sẽ tạo ra một môi trường bao gồm cái chính là session
và mỗi session này tương ứng với từng dự án mà bạn làm việc. Trong mỗi section thì có một hoặc nhiều window
và window tương ứng là tab
và trong mỗi window
hay tab
thì bạn có thể chia layout chia đôi màn hình theo chiều ngang, hoặc dọc gọi là pane
và bạn có thể resize
kích thước của từng pane riêng biệt để tạo ra 1 layout phù hợp với phong cách và sở thích làm việc của bạn nhất. Rồi trong từng window
, hay pane
thì bạn có thể chạy riêng biệt từng chương trình độc lập ví dụ như hình bên dưới
Giải thích:
- Đây là 1
window
trong 1session
của tmux đang chạy và mình có tới vài session như thế này và mỗi session là 1 dự án riêng biệt - Mình không thích chia layout theo
window
haytab
mà thích chia layout theopane
vì lúc làm việc mình có thể nhìn thấy nhiều màn hình. Ví dụ trong 1 window này thì mình chia3 pane
trong đó thìpane
bên trái mình dùng chạynvim
với lệnhnvim
phần bên phải mình chia2 pane
trên dưới vớipane
trên dùng checkgit
vàpane
dưới dùng chạy dự án. Trong thực tế hình này thì dự án chạy bằng lệnhhugo server
- Khi đang làm việc với
vim
bên pane bên trái của hình thì bạn có thể dùng mọi thứ từ hệ thống phím tắt, plugin… - Khi bạn muốn chuyển qua lại giữa các
pane
thì bạn không dùng được phím tắt củavim
lý do làpane
thuộc vềTmux
do đó bạn phải dùng hệ thống phím tắt củatmux
để chuyển qua lại giữa cácpane
và đồng thời chuyển qua lại giữa các dự án
zsh
Vậy là tới giờ thì bạn đã tìm hiểu vì sao dùng vim
rồi sau đó làm sao biến vim từ trình chỉnh sửa văn bản thành một công cụ lập trình. Rồi sau đó giải thích vì sao lại dùng tmux
để quản lý dự án và làm việc vì nó giúp ta mở và làm việc trên các dự án nhanh chóng và đỡ phải thao tác nhiều. Rồi tiếp theo là zsh
.
Tại sao lại dùng zsh
? Zsh là gì? Thực ra thì zsh cũng chỉ là một trình cung cấp các dòng lệnh để máy tính thực thi và nó cũng chỉ là một terminal
một shell
hay một bash
khác ngoài cái terminal
mặc định của máy tính cung cấp cho ta. NHƯNG, nó sẽ có nhiều sức mạnh, sự tiện dụng và quyến rũ dân dev
hơn so với trình terminal
khô khan, mặc định trong máy tính cung cấp. Ta có thể cài theme ohmyzsh
vào trong terminal zsh
và nó sẽ làm cho terminal
zsh trở nên sexy hơn với màu sắc, ký tự và nó còn có các plugin khác cung cấp thông tin về git
về autosuggestion
giúp gợi ý những lệnh mà ta đã gõ trong quá khứ và bạn có thể hoàn thành lệnh bằng cách gõ mũi tên qua phải. Hay còn nhiều plugin khác giúp cho terminal zsh
của bạn sẽ có nhiều tính năng mà terminal
mặc định của máy không có.
Alacritty
Vim chạy trên môi trường dòng lệnh là terminal, bash
và đúng là mọi hệ điều hành hiện tại như MacOs, Window, Linux… thì đều có mặc định một hoặc nhiều terminal cài đặt sẵn trong máy ví dụ như window thì có promt
hay powershell
MacOs thì có iTerms
còn Linux thì tùy mỗi distro
mà sẽ có terminal khác nhau ví dụ trong ubuntu thì có gnome-terminal
trong xubuntu thì có xfce4-terminal
… Và không có gì khác nhau nhiều về chức năng nhiệm vụ của terminal trong các hệ điều hành và tất cả các terminal đều có mục đích chung là nhận dòng lệnh từ người dùng và thực thi nó.
Bạn có thể dùng terminal mặc định trong hệ điều hành để làm việc với vim nó mặc định, nó ổn định… Vậy tại sao phải xem xét chọn Alacritty
terminal? Lý do đơn giản là Alacritty có nhiều điểm mạnh so với terminal mặc định của hệ điều hành và điểm mạnh nhất là.
- Alacritty rất nhanh vì được chạy trên GPU (card đồ họa). Thời điểm hiện tại thì hầu hết các máy tính đều có card đồ họa từ 1GB - 2GB… và do đó nên Alacritty tận dụng sức mạnh của GPU để chạy thay vì phải chạy trên CPU đang phải chia sẻ tài nguyên cho nhiều nhiệm vụ khác.
- Alacritty chạy trên nhiều hệ điều hành được có trên cả Window, Mac, Linux và dễ cấu hình với 1 file cấu hình và dễ dàng lưu trữ, chia sẻ để tạo được môi trường đồng nhất trong mọi hệ điều hành
Tổng hợp Alacritty - Zsh - Tmux - Nvim
Để tổng hợp lại thì các bạn có thể xem hình tổng hợp mối quan hệ của các công cụ này trong hình dưới nhé
Giải thích:
- Mở Alacritty terminal và ngay lập tức sẽ vào
terminal zsh
, từ zsh cd vào folder dự án với lệnh gợi ý từ zsh - Gõ lệnh vào
tmux
để vào tmux - Gõ lệnh
prefix + Ctr + r
để phục hồi lại các session đã lưu trong quá khứ - Dùng tmux để chuyển qua lại giữa các dự án đã lưu với layout yêu thích có sẵn
vim
và cũng giúp bạn hiểu rõ hơn về vim để thấy yêu vim hơn