Neovim · Part 11 — Performance, Maintenance và Dotfiles
Giữ Neovim nhanh và bền: profiling, checkhealth, lockfile, update plugin, backup, sync dotfiles, debug config và chống plugin bloat.
Một config Neovim dùng được một tuần thì dễ. Dùng được một năm mới khó.
Phần này nói về bảo trì: nhanh, ổn định, rollback được, sync được giữa máy.
Đo trước khi tối ưu
Startup log:
nvim --startuptime startup.log
Mở file log:
nvim startup.log
Với lazy.nvim:
:Lazy profile
Đừng tối ưu theo cảm giác. Plugin nào chậm, event nào load sớm, file nào tốn thời gian, hãy đo.
Checkhealth là bác sĩ gia đình
Chạy định kỳ:
:checkhealth
:checkhealth vim.lsp
:checkhealth lazy
:checkhealth mason
Khi có lỗi:
- đọc message đầy đủ;
- xác định lớp lỗi: terminal, provider, LSP, plugin, external tool;
- sửa từ dependency thấp nhất.
Ví dụ LSP không chạy có thể không liên quan plugin, chỉ là executable không có trong PATH.
Lockfile và rollback
Với lazy.nvim, commit:
lazy-lock.json
Update workflow:
:Lazy update
Sau update:
- restart Nvim;
- mở project thật;
- chạy
:checkhealth; - test LSP/completion/format;
- nếu ổn, commit lockfile;
- nếu hỏng, revert lockfile.
Git là nút undo cho config.
Cấu trúc dotfiles
Một repo dotfiles đơn giản:
dotfiles/
├─ nvim/
│ ├─ init.lua
│ ├─ lazy-lock.json
│ └─ lua/
│ ├─ config/
│ └─ plugins/
├─ shell/
│ └─ zshrc
└─ README.md
Symlink:
ln -s ~/dotfiles/nvim ~/.config/nvim
Hoặc dùng tool như GNU Stow:
stow nvim
Đừng để config chỉ sống trên một máy. Một ngày nào đó bạn sẽ đổi laptop, SSH vào server, hoặc rebuild môi trường.
Secrets không thuộc về dotfiles
Không commit:
- API keys;
- token GitHub;
- private SSH key;
- company-specific config nhạy cảm;
- đường dẫn local chứa tên khách hàng/project riêng tư.
Nếu cần local override:
local local_config = vim.fn.stdpath("config") .. "/lua/config/local.lua"
if vim.uv.fs_stat(local_config) then
dofile(local_config)
end
Thêm lua/config/local.lua vào .gitignore.
Chống plugin bloat
Mỗi tháng tự hỏi:
| Câu hỏi | Nếu câu trả lời là không |
|---|---|
| Mình dùng plugin này tuần qua không? | xóa |
| Nó thay được bằng built-in không? | thử built-in |
| Nó có làm startup chậm không? | lazy-load hoặc xóa |
| Nó có chồng chức năng plugin khác không? | chọn một |
| Nó có được maintain không? | cân nhắc thay |
Config tốt thường nhỏ hơn bạn nghĩ.
Debug config có phương pháp
Khi Nvim vỡ:
nvim --clean
Nếu --clean chạy ổn, lỗi nằm trong config/plugin.
Disable từng lớp:
- comment plugin mới thêm;
- chạy
:messages; - chạy
:Lazy health; - kiểm tra
:verbose map key; - kiểm tra
:verbose set option?; - bisect Git commit dotfiles nếu cần.
Đừng xóa sạch ~/.local/share/nvim ngay. Đó là biện pháp cuối, không phải reflex.
Version pinning
Một số plugin nên pin version/branch:
{
"saghen/blink.cmp",
version = "1.*",
}
Pin khi:
- plugin có major version mới breaking;
- config production cần ổn định;
- bạn không có thời gian migrate ngay.
Không pin quá chặt mọi thứ nếu bạn không có lý do. Lockfile đã giữ revision hiện tại.
Cheatsheet bảo trì
| Việc | Lệnh |
|---|---|
| Health check | :checkhealth |
| LSP health | :checkhealth vim.lsp |
| Lazy UI | :Lazy |
| Lazy profile | :Lazy profile |
| Startup log | nvim --startuptime startup.log |
| Clean mode | nvim --clean |
| Xem message | :messages |
| Keymap từ đâu | :verbose map <key> |
| Option từ đâu | :verbose set option? |
Bài tập
- Đưa config vào Git repo.
- Commit
lazy-lock.json. - Chạy
:Lazy profile, ghi lại 3 plugin tốn thời gian nhất. - Chạy
nvim --cleanđể thấy Neovim không config. - Xóa hoặc disable một plugin không dùng.
Checklist dotfiles tối thiểu
[ ] Có README cài đặt
[ ] Có lazy-lock.json
[ ] Không có secrets
[ ] Có danh sách external tools cần cài
[ ] Có cách rollback
[ ] Có local override được gitignoreĐiều cốt lõi
Config Neovim là phần mềm cá nhân. Hãy đối xử với nó như code: đo, version, review diff, pin khi cần, rollback được. Một setup pro không phải nhiều plugin; nó là setup sống lâu mà không làm bạn sợ update.