Nội dung

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ím x để xóa 1 ký tự, phím d 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õ diwxóa một từ hoặc daw 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.

/combo-chat-cho-thanh-vim-voi-alacritty-zsh-tmux-neovim-nvim/vim8.png
vim version 8
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ó plugin scrooloose/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. Hay vim-snippet kiểu như bạn gõ cl và bấm tab thì sẽ ra console.log(), hay bạn muốn format lại code cho chuẩn theo eslint hay prettier, 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 hay git 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ệc undo 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ần undo 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ới diffget //2 hay diffget //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.

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

./tmux-layout.png
Tmux layout

Giải thích:

  1. Đây là 1 window trong 1 session 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
  2. Mình không thích chia layout theo window hay tab mà thích chia layout theo pane 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 chia 3 pane trong đó thì pane bên trái mình dùng chạy nvim với lệnh nvim phần bên phải mình chia 2 pane trên dưới với pane trên dùng check gitpane dưới dùng chạy dự án. Trong thực tế hình này thì dự án chạy bằng lệnh hugo server
  3. 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…
  4. 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ủa vim lý do là pane thuộc về Tmux do đó bạn phải dùng hệ thống phím tắt của tmux để chuyển qua lại giữa các pane 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é

/combo-chat-cho-thanh-vim-voi-alacritty-zsh-tmux-neovim-nvim/alacritty-zsh-tmux-neovim.png
alacritty-zsh-tmux-vim

Giải thích:

  1. 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
  2. Gõ lệnh vào tmux để vào tmux
  3. Gõ lệnh prefix + Ctr + r để phục hồi lại các session đã lưu trong quá khứ
  4. 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
Lời kết
Hi vọng là qua bài này mọi người đã có một hình dung về mối liên hệ giữa các công cụ xung quanh hệ sinh thái vim và cũng giúp bạn hiểu rõ hơn về vim để thấy yêu vim hơn