Danh sách bài viết

Bài 15: VS Code + rust-analyzer — Setup IDE Khuyến Nghị

Bài 15 của series Rust Cơ Bản — hướng dẫn setup VS Code làm IDE chính cho Rust. Cài extension rust-analyzer chính thức (LSP server), kèm các extension bổ trợ thường dùng (even-better-toml, CodeLLDB, crates, Error Lens), cấu hình settings.json với clippy + format-on-save, dựng launch.json để debug binary, và tips giảm RAM cho project lớn.

09/06/2026
12 phút đọc
0 lượt xem
1

Mục Tiêu Bài Học

Sau bài học, bạn sẽ:

  • Hiểu rust-analyzer là gì, vai trò Language Server Protocol (LSP), khác gì so với extension Rust legacy đã deprecated.
  • Cài VS Code đúng cách trên Windows / macOS / Linux và mở được marketplace extension.
  • Cài extension chính rust-lang.rust-analyzer + 4 extension bổ trợ thường dùng nhất.
  • Cấu hình settings.json để bật format-on-save, clippy thay cargo check, inlay hint, và import style theo convention.
  • Setup launch.json với CodeLLDB để đặt breakpoint, F5 debug binary và test, inspect Variables panel.
  • Biết các phím tắt sử dụng hằng ngày (F12 goto def, Shift+F12 references, F2 rename, Ctrl+. quick fix) và Codelens Run | Debug | Run Test.
  • Biết tips giảm RAM cho rust-analyzer khi mở project có nhiều crate.

Bài này giả định bạn đã cài rustup + toolchain stable ở các bài 10-14. Nếu chưa có cargorustc trên PATH, quay lại Bài 10 hoặc các bài Linux/Windows tương ứng.

2

rust-analyzer Là Gì

rust-analyzer là một Language Server implement giao thức LSP (Language Server Protocol) cho Rust. Nó là dự án official, do rust-analyzer working group trong Rust project bảo trì, và từ tháng 7 năm 2022 đã chính thức thay thế RLS (Rust Language Server cũ) — RLS bị deprecated và không còn được phát hành.

Vai trò: rust-analyzer chạy nền như một process riêng, IDE giao tiếp với nó qua LSP để lấy:

  • Autocomplete theo context (sau dấu ., sau ::, trong macro).
  • Hover hiển thị type, signature, doc comment.
  • Goto definition, find references, rename trên toàn workspace.
  • Refactor (extract function, inline variable, change signature).
  • Inlay hint — gợi ý type hoặc parameter name hiện ngay inline trong editor (không sửa code thật).
  • Diagnostic realtime, hiển thị lỗi của cargo check / clippy ngay khi bạn gõ.

Vì là LSP server độc lập, rust-analyzer chạy được trên VS Code, Neovim, Emacs, Helix, Zed, Sublime Text... mỗi editor chỉ cần một thin client. Bài này tập trung VS Code vì đây là combo phổ biến nhất và setup nhẹ nhất cho người mới.

hai cách cài binary rust-analyzer:

  • rustup component add rust-analyzer — cài qua rustup, binary nằm trong ~/.cargo/bin và update cùng toolchain (xem Bài 14).
  • Mặc định extension VS Code tự download binary phù hợp với toolchain — không cần làm gì thủ công. Đây là cách khuyến nghị cho người mới.
rustup component add rust-analyzer

Chạy lệnh trên nếu bạn dùng editor khác VS Code (Neovim, Helix), hoặc muốn đảm bảo binary luôn khớp version với rustc đang dùng.

3

Cài VS Code

VS Code do Microsoft phát hành, free, multi-platform. Download tại https://code.visualstudio.com/.

  • macOS: tải file .zip, giải nén, kéo Visual Studio Code.app vào /Applications. Có cả bản Universal (Intel + Apple Silicon).
  • Windows: tải .exe installer (System hoặc User), chạy wizard. Khuyến nghị tick option Add to PATH để có lệnh code . trong terminal.
  • Linux: có sẵn .deb cho Debian/Ubuntu, .rpm cho Fedora/RHEL, snap cho distro support snapd, và tarball generic. Trên Arch dùng yay -S visual-studio-code-bin (AUR).

Sau khi cài, mở VS Code và quen với hai panel hay dùng:

  • Extension marketplace: Cmd+Shift+X (macOS) hoặc Ctrl+Shift+X (Windows/Linux). Đây là chỗ search và cài extension.
  • Command Palette: Cmd/Ctrl+Shift+P. Mọi action đều gọi được từ đây — tốt cho người mới chưa nhớ phím tắt.

Nếu chưa quen VS Code, không cần đi sâu — bài này chỉ động đến extension panel và settings.json.

4

Cài Extension Chính rust-analyzer

Mở Extension marketplace (Cmd/Ctrl+Shift+X), gõ tìm rust-analyzer. Có một số kết quả — chọn đúng extension:

  • Tên: rust-analyzer
  • Publisher: The Rust Programming Language
  • Extension ID: rust-lang.rust-analyzer

Bấm Install. Lần đầu mở một file .rs trong project có Cargo.toml, extension sẽ tự download binary rust-analyzer tương ứng platform — bạn thấy thanh trạng thái dưới cùng hiện "rust-analyzer: indexing" trong vài chục giây đến vài phút (tuỳ project to nhỏ).

Cảnh báo quan trọng — đừng cài nhầm: trên marketplace từng có một extension tên là "Rust" của Marc Lopes (publisher rust-lang cũ, ID rust-lang.rust). Extension đó dùng RLS bên dưới và đã chính thức deprecated từ năm 2022. Không cài extension này. Và không cài chồng nhiều extension Rust cùng lúc — chúng sẽ tranh nhau LSP, gây lỗi diagnostic chập chờn.

Cách check đã cài đúng: vào tab Extensions, ô search gõ @installed rust, chỉ nên thấy rust-analyzer publisher "The Rust Programming Language".

5

Extension Bổ Trợ Hữu Ích

Bốn extension dưới đây không bắt buộc nhưng được dùng rộng rãi cùng rust-analyzer. Cài cả bộ là setup chuẩn cho người mới và cả production developer.

even-better-toml

  • ID: tamasfe.even-better-toml
  • Syntax highlighting + schema validation cho Cargo.toml, rust-toolchain.toml, và TOML nói chung. Hỗ trợ autocomplete field theo schema của Cargo.

CodeLLDB

  • ID: vadimcn.vscode-lldb
  • Debugger dựa trên LLDB, hoạt động trên macOS, Linux, Windows. Đây là debugger được rust-analyzer ưu tiên đề xuất khi bạn bấm Codelens "Debug". Cài đặt và quên — extension tự bundle LLDB binary, không cần cấu hình bên ngoài.

crates

  • ID: serayuzgur.crates
  • Hiện inline trong Cargo.toml version mới nhất của mỗi dependency, cho biết khi nào cần update. Click vào notification để bump version tự động.

Error Lens

  • ID: usernamehw.errorlens
  • Hiện message lỗi và warning ngay cuối dòng code, không phải hover hay mở panel Problems. Đỡ nhiều thao tác chuột khi đang sửa lỗi compile.

Nguyên tắc chung: không cài chồng nhiều extension Rust trùng nhau. Một số tên cũ như "Rust (rls)", "Rust Test Lens", "Rust Syntax" — bỏ qua. rust-analyzer đã làm đủ.

6

Cấu Hình settings.json Khuyến Nghị

Mở Settings (JSON) qua Command Palette: Cmd/Ctrl+Shift+P → gõ "Preferences: Open User Settings (JSON)". Hoặc shortcut Cmd/Ctrl+, rồi bấm icon JSON ở góc trên phải. Dán đoạn dưới vào (merge với cấu hình hiện có):

{
  "editor.formatOnSave": true,
  "editor.semanticHighlighting.enabled": true,
  "[rust]": {
    "editor.defaultFormatter": "rust-lang.rust-analyzer"
  },
  "rust-analyzer.check.command": "clippy",
  "rust-analyzer.check.allTargets": true,
  "rust-analyzer.cargo.features": "all",
  "rust-analyzer.inlayHints.typeHints.enable": true,
  "rust-analyzer.inlayHints.parameterHints.enable": true,
  "rust-analyzer.imports.granularity.group": "module",
  "rust-analyzer.imports.prefix": "crate",
  "files.watcherExclude": {
    "**/target/**": true
  }
}

Giải thích từng dòng:

  • editor.formatOnSave: tự chạy formatter mỗi lần lưu file. Kết hợp với formatter của rust-analyzer (gọi rustfmt bên dưới) cho code style nhất quán.
  • [rust] block: set rust-analyzer làm default formatter chỉ cho file Rust, không ảnh hưởng JS/Python.
  • rust-analyzer.check.command: "clippy": thay cargo check mặc định bằng cargo clippy — bạn vừa có typecheck vừa có lint warning trong cùng pass. Hơi tốn CPU hơn nhưng rất đáng.
  • check.allTargets: true: check cả test, example, bench — không bỏ sót lỗi ở target khác main.
  • cargo.features: "all": rust-analyzer load mọi feature flag, autocomplete hiểu được mọi #[cfg(feature = "x")] branch.
  • inlayHints.typeHints / parameterHints: bật gợi ý type và tên parameter inline. Từ rust-analyzer 2024+ inlay hint đã bật mặc định, nhưng khai báo rõ ràng tránh phụ thuộc default.
  • imports.granularity.group: "module" + imports.prefix: "crate": khi auto-import (qua quick fix), gom import theo module và dùng path crate::... thay vì super::. Đây là convention phổ biến trong Rust 2024 edition.
  • editor.semanticHighlighting.enabled: bật token semantic do rust-analyzer cung cấp — màu theme phân biệt mutable vs immutable, generic param vs concrete type.
  • files.watcherExclude **/target/**: VS Code không watch folder target/ — folder này có thể có hàng trăm nghìn file build artifact, watch sẽ ngốn CPU + RAM của VS Code.

Lưu file là setting có hiệu lực ngay. Nếu rust-analyzer đang chạy, restart server qua Command Palette → "rust-analyzer: Restart server".

7

Tính Năng Sử Dụng Hằng Ngày

Bộ thao tác bạn sẽ dùng mỗi ngày — quen được bộ này là đi nhanh gấp đôi:

  • Autocomplete: gõ dấu . sau biến — rust-analyzer suggest mọi method khả dụng, kèm signature và doc.
  • Hover: trỏ chuột vào identifier (hoặc Cmd/Ctrl+K Cmd/Ctrl+I) — hiện type, signature, doc comment. Rất hữu ích khi dùng crate lạ.
  • Goto Definition — F12: nhảy đến chỗ định nghĩa function/type/trait. Áp dụng cho cả crate trong workspace lẫn dependency từ crates.io.
  • Goto Type Definition — Cmd/Ctrl+F12: nhảy đến definition của type (khác goto definition của variable).
  • Find References — Shift+F12: liệt kê mọi nơi đang dùng identifier này. Cần khi refactor.
  • Rename — F2: đổi tên symbol trên toàn workspace, có preview. An toàn hơn nhiều so với find-replace text.
  • Quick Fix — Cmd/Ctrl+.: hiện danh sách fix tự động khi có lỗi/warning. Phổ biến: Add missing import, Extract into function, Convert match to if let, Wrap in Ok/Some/Err.
  • Codelens trên main và test: phía trên mỗi fn main() hoặc #[test] hiện 3 link nhỏ Run | Debug | Run Test. Click là chạy cargo tương ứng — không cần ra terminal gõ cargo run / cargo test --test foo::bar dài dòng.
  • Symbol search: Cmd/Ctrl+T mở danh sách mọi struct/enum/fn trong workspace, gõ tên để nhảy nhanh.

Inlay hint mặc định hiện type cho let x = ... không annotate, và tên parameter ở call site. Nếu cảm thấy rối, tạm tắt bằng Command Palette → "rust-analyzer: Toggle inlay hints".

8

Workflow Debug Với CodeLLDB

Sau khi đã cài CodeLLDB, debug Rust trong VS Code khá straightforward.

Tạo launch.json

Cách nhanh nhất: mở file main.rs, bấm Codelens Debug phía trên fn main() — rust-analyzer + CodeLLDB tự generate config trong .vscode/launch.json. Hoặc tự tạo: vào Run and Debug panel (Cmd/Ctrl+Shift+D) → create a launch.json file → chọn LLDB. Mẫu:

{
  "version": "0.2.0",
  "configurations": [
    {
      "type": "lldb",
      "request": "launch",
      "name": "Debug binary",
      "cargo": {
        "args": ["build", "--bin=my-app"],
        "filter": { "name": "my-app", "kind": "bin" }
      },
      "args": [],
      "cwd": "${workspaceFolder}"
    }
  ]
}

Sửa my-app thành tên binary thật trong Cargo.toml. Phần cargo.args chạy cargo build --bin=my-app trước khi launch — CodeLLDB tự tìm executable trong target/debug/. filter giúp CodeLLDB chọn đúng artifact khi package có nhiều bin/lib.

Đặt breakpoint và chạy

  • Click vào lề trái (margin) cạnh số dòng — hiện chấm đỏ là breakpoint.
  • F5: bắt đầu debug session. CodeLLDB build (profile dev mặc định, có symbol) rồi launch binary.
  • Khi hit breakpoint, execution dừng — panel Variables bên trái hiện giá trị mọi biến trong scope.
  • F10 Step Over, F11 Step Into, Shift+F11 Step Out, F5 Continue.
  • Stop debug: Shift+F5.

Lưu ý: profile dev (mặc định khi cargo build) đi kèm debug info đầy đủ — chính là điều kiện để CodeLLDB inspect được giá trị biến. Đừng debug binary build từ cargo build --release — optimization xoá nhiều biến intermediate, breakpoint có thể không hit đúng vị trí.

Trên Windows, ngoài CodeLLDB còn lựa chọn C/C++ extension của Microsoft (debugger MSVC) với "type": "cppvsdbg" — phù hợp khi project có C/C++ tích hợp. Mặc định CodeLLDB là đủ cho phần lớn use case.

9

Tips Performance Cho Project Lớn

rust-analyzer build cả crate graph trong memory để cho autocomplete + diagnostic realtime. Trên project nhỏ (< 50 file) gần như không cảm nhận. Trên workspace lớn (hàng trăm crate, ví dụ monorepo backend hoặc fork Linux kernel), rust-analyzer có thể ngốn 1-4 GB RAM. Một số mẹo:

  • Tăng RAM cho LSP server: thêm vào settings.json:
    "rust-analyzer.server.extraEnv": {
      "RA_LSP_MEMORY_LIMIT": "4096"
    }
    Giá trị là MB. Tránh đặt quá cao (>8 GB) trừ khi máy có sẵn nhiều RAM.
  • Tắt inlay hint nếu thấy editor lag: "rust-analyzer.inlayHints.typeHints.enable": false. Hint render khá tốn CPU khi mở file dài.
  • Hạn chế feature: thay "rust-analyzer.cargo.features": "all" bằng list cụ thể ["foo", "bar"] khi project có nhiều conditional code không cần thiết để dev hằng ngày.
  • Giữ riêng target/: đã exclude khỏi file watcher ở bước 6. Thêm vào .gitignore nếu chưa có. Folder này có thể vài GB sau vài lần build.
  • Tắt check.allTargets nếu chỉ làm việc với binary chính, không quan tâm test/example: "rust-analyzer.check.allTargets": false.
  • Restart server sau khi update Cargo.toml lớn: Command Palette → "rust-analyzer: Restart server". rust-analyzer đôi khi giữ cache cũ.
  • Trace performance: Command Palette → "rust-analyzer: Show RA Version" + "Analyzer Status" để xem memory + indexing stats.

Nếu rust-analyzer vẫn quá nặng cho máy yếu (8 GB RAM, project nhiều crate), cân nhắc RustRover của JetBrains — engine khác, đôi khi xử lý project lớn mượt hơn, xem bài tiếp theo.

10

Tổng Kết

  • rust-analyzer là LSP server chính thức của Rust project, thay thế RLS từ 2022. Cung cấp autocomplete, hover, goto-def, refactor, inlay hint, diagnostic cho mọi editor support LSP.
  • Cài VS Code từ code.visualstudio.com, mở Extension marketplace bằng Cmd/Ctrl+Shift+X.
  • Extension chính: rust-lang.rust-analyzer publisher The Rust Programming Language. Không cài "Rust" của Marc Lopes (deprecated).
  • Extension bổ trợ: tamasfe.even-better-toml, vadimcn.vscode-lldb (debugger), serayuzgur.crates, usernamehw.errorlens. Không cài chồng nhiều extension Rust trùng nhau.
  • settings.json khuyến nghị: bật formatOnSave, set rust-analyzer làm default formatter cho Rust, dùng clippy thay cargo check, bật inlay hint, exclude target/ khỏi file watcher.
  • Phím tắt hằng ngày: F12 goto def, Shift+F12 references, F2 rename, Ctrl+. quick fix, Cmd/Ctrl+T symbol search. Codelens Run | Debug | Run Test trên main và test function.
  • Debug với CodeLLDB: tạo launch.json với "type": "lldb" + cargo.args, click margin đặt breakpoint, F5 chạy, F10/F11 step. Chỉ debug profile dev để có debug info.
  • Performance: tăng RA_LSP_MEMORY_LIMIT, tắt inlay hint nếu lag, exclude target/, restart server sau khi sửa Cargo.toml.
  • Cài binary qua rustup component add rust-analyzer chỉ cần khi dùng editor khác VS Code, hoặc muốn binary cùng version với toolchain.
11

Bài Tập Củng Cố

Tự trả lời, đáp án ở cuối:

  1. Bạn search "rust" trong VS Code marketplace, thấy hai extension: rust-analyzer của "The Rust Programming Language" và Rust của "rust-lang". Nên cài cái nào? Vì sao không cài cả hai?
  2. Đồng nghiệp set "rust-analyzer.check.command": "clippy" trong settings.json. So với mặc định, lợi và hại gì?
  3. Bạn bấm Codelens Debug trên fn main() nhưng VS Code báo không có debugger nào hỗ trợ. Nguyên nhân và cách fix?
  4. Sau khi đặt breakpoint trong file main.rs, F5 thì binary chạy thẳng qua breakpoint không dừng. Hai nguyên nhân phổ biến nhất là gì?
  5. Project monorepo có 200 crate, rust-analyzer ngốn 6 GB RAM làm máy chậm. Liệt kê 3 cách giảm tải mà không cần đổi IDE.
Đáp án
  1. Cài rust-analyzer publisher "The Rust Programming Language" (ID rust-lang.rust-analyzer). Extension Rust còn lại là legacy của Marc Lopes dùng RLS bên dưới, đã chính thức deprecated từ 2022. Cài cả hai khiến hai LSP client tranh nhau xử lý file .rs, gây diagnostic chập chờn và autocomplete bị duplicate.
  2. Lợi: vừa typecheck vừa lint trong cùng pass, phát hiện sớm lỗi style + bug như needless_clone, unwrap_used, collapsible_if ngay khi gõ thay vì chờ CI. Hại: clippy chậm hơn cargo check khoảng 20-50%, tốn CPU + RAM hơn. Trên project lớn có thể cảm thấy lag — đánh đổi đáng giá ở project vừa và nhỏ.
  3. Chưa cài extension debugger nào. rust-analyzer chỉ generate config, không tự bundle debugger. Cài vadimcn.vscode-lldb (CodeLLDB) — hoạt động trên cả ba OS. Trên Windows có thể thay bằng C/C++ extension của Microsoft với "type": "cppvsdbg".
  4. (a) Build profile sai — nếu launch.json đang chạy cargo build --release, optimization xoá symbol và inline nhiều code, breakpoint không hit. Đổi sang profile dev (bỏ --release). (b) File nguồn đang bị remap/symlink, hoặc binary cũ trong target/ chưa rebuild — clean rồi build lại: cargo clean && cargo build.
  5. (a) Tắt inlay hint: "rust-analyzer.inlayHints.typeHints.enable": false. (b) Giới hạn feature load: thay "cargo.features": "all" bằng list cụ thể chỉ cần cho dev hằng ngày. (c) Tắt check.allTargets nếu không cần check test/example, hoặc giảm RA_LSP_MEMORY_LIMIT để rust-analyzer chủ động evict cache. Bonus: chia workspace thành nhiều VS Code window, mỗi window mở subset crate.
12

Bài Tiếp Theo

Bài 16: RustRover & JetBrains IDE Cho Rust — so sánh RustRover (free for non-commercial) với VS Code + rust-analyzer, cài qua JetBrains Toolbox, cấu hình toolchain, ưu/nhược refactoring vs nhẹ ký, license commercial cost, và migrate từ CLion + Rust plugin (deprecated 2024).