Cách mạng 0.5 của Neovim: Lua và Built-in LSP Client

<- Quay về trang chủ

Vãi thật, mình nhớ là mới viết một bài về Neovim 0.4 đây thôi, thế mà đã 2 năm rồi cơ à.

Phiên bản 0.5 của Neovim vừa release cách đây không lâu và chính thức trình làng rất nhiều thay đổi lớn, lớn nhất trong số đó là khả năng config bằng Luamột loạt chức năng built-in liên quan đến LSP.

Lua Config

Với phiên bản 0.5, chúng ta đã có thể thay thế init.vim bằng init.lua, cơ chế load config của bản này cũng khá dễ hiểu:

  • Đầu tiên là check coi có file $HOME/.config/nvim/init.lua không
  • Nếu có thì load file này
  • Không có thì fallback về $HOME/.config/nvim/init.vim

Lưu ý là Neovim sẽ chỉ load một trong 2 file trên, chứ không load cả 2.

Và không chỉ có config file, Lua còn được tích hợp sâu rộng vào toàn bộ runtime của Vim, và bạn có thể dùng nó để thay thế cho Vimscript trong mọi tình huống, từ module/plugin cho đến execute command.

Ví dụ bạn có thể chạy Ex command sau để kiểm chứng:

:lua print("Hello, Lua!!!")

Cơ chế load module của Lua cũng không phức tạp lắm, mọi file *.lua nằm trong thư mục $HOME/.config/nvim/lua đều sẽ được load bằng lệnh require(), ví dụ với cấu trúc thư mục như sau:

~/.config/nvim
├── lua
│  ├── module_a.lua
│  └── big_ass_modules
│     ├── something.lua
│     └── init.lua

Ta có thể load module bằng nhiều cách khác nhau như sau:

require('module_a')
let mod_a = require('module_a')

require('big_ass_modules/something')
require('big_ass_modules.something')

-- load file big_ass_modules/init.lua
require('big_ass_modules')

Ngoài ra, chúng ta còn có thể chèn Lua script vào Vimscript thông qua khối lệnh:

lua << EOF

-- lua code here

EOF

Trong trường hợp bạn chưa có thời gian để migrate toàn bộ Vim config từ Vimscript sang Lua thì có thể dùng cách trên để vừa sử dụng Lua plugin vừa sử dụng Vimscript plugin.

Đọc thêm về Lua support trong Vim tại đây https://github.com/nanotee/nvim-lua-guide

Built-in LSP Client

Trước Neovim 0.5, có rất nhiều LSP Client plugin, mà phổ biến nhất có lẽ là coc.nvim.

Phiên bản 0.5 tích hợp sẵn LSP Client nên chúng ta không cần dùng các plugin như coc.nvim nữa, các bạn có thể xem qua hình bên dưới để thấy sự khác biệt giữa việc sử dụng built-in LSP Client trong Neovim 0.5 so với các plugin LSP Client khác.

Trong trường hợp của coc.nvim thì bá đạo hơn tí, vì nó sẽ run luôn cả extension host của VSCode ở bên dưới, nhưng nhờ thế mà cho trải nghiệm gần với VSCode hơn.

Còn Built-in LSP Client của Neovim thì khá đơn giản:

Chúng ta tiết kiệm được một layer khi giao tiếp với language server, nhanh hơn hay không thì chưa biết, mình đoán là nhanh hơn, cứ so sánh với mô hình của coc.nvim là sẽ thấy.

Ngoài ra, phiên bản 0.5 còn tích hợp Treesitter, đây là chức năng cho phép Neovim thực hiện syntax highlighting thông qua kết quả phân tích code của LSP, nên chất lượng nhận diện code để highlight sẽ tốt hơn thông thường.

Bản thân việc sử dụng built-in LSP Client cũng có rất nhiều cách cấu hình khác nhau, với các plugin hỗ trợ khác nhau. Hiện tại có các plugin hữu dụng như:

Ở bài sau mình sẽ hướng dẫn chi tiết hơn về cách cấu hình. Són dần ra mới câu được nhiều view.