jvinhit//lab

Search posts

Type to search across journal entries.

navigate open esc close

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:

  1. đọc message đầy đủ;
  2. xác định lớp lỗi: terminal, provider, LSP, plugin, external tool;
  3. 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:

  1. restart Nvim;
  2. mở project thật;
  3. chạy :checkhealth;
  4. test LSP/completion/format;
  5. nếu ổn, commit lockfile;
  6. 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ỏiNế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:

  1. comment plugin mới thêm;
  2. chạy :messages;
  3. chạy :Lazy health;
  4. kiểm tra :verbose map key;
  5. kiểm tra :verbose set option?;
  6. 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ệcLệnh
Health check:checkhealth
LSP health:checkhealth vim.lsp
Lazy UI:Lazy
Lazy profile:Lazy profile
Startup lognvim --startuptime startup.log
Clean modenvim --clean
Xem message:messages
Keymap từ đâu:verbose map <key>
Option từ đâu:verbose set option?

Bài tập

  1. Đưa config vào Git repo.
  2. Commit lazy-lock.json.
  3. Chạy :Lazy profile, ghi lại 3 plugin tốn thời gian nhất.
  4. Chạy nvim --clean để thấy Neovim không config.
  5. 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.