zsh-syntax-highlighting: Zsh Syntax Highlighting
zsh-syntax-highlighting làm tốt đúng một việc: tô màu dòng lệnh theo thời gian thực, để lỗi gõ sai hay dấu ngoặc chưa đóng chuyển sang màu đỏ trước khi bạn nhấn Enter, thay vì sau đó. Đây là lớp mỏng gắn vào line editor của Zsh, không phải shell thay thế, và khi source đúng cách bạn sẽ quên mất là nó đang chạy — đó chính là mục đích. Chỉ nên bỏ qua nếu bạn đã dùng Fish shell hoặc một framework đã tích hợp sẵn hành vi tương tự.
zsh-syntax-highlighting là gì?
zsh-syntax-highlighting là plugin Zsh mang kiểu tô màu lệnh trực tiếp của Fish shell sang Zsh: khi bạn gõ, nó tô màu cú pháp ngay trên dòng lệnh để lỗi hiện ra trước khi nhấn Enter, không phải sau đó. Nó hook vào Zsh Line Editor (ZLE) và tính lại phần tô màu trên command-line buffer qua các highlighter script có thể bật/tắt riêng, thay vì một bộ quy tắc cố định. Yêu cầu Zsh 4.3.11 trở lên, phân phối dưới dạng một script được source từ .zshrc.
Những gì được tô màu
- ✓Tô màu lệnh, tham số và lỗi cú pháp ngay trong prompt, trước khi bạn nhấn Enter.
- ✓Mang hành vi tô màu trực tiếp của Fish shell sang Zsh thay vì tạo ra một kiểu tô màu mới.
- ✓Hook vào Zsh Line Editor (ZLE) — ở Zsh 5.2 trở về trước bằng cách wrap các ZLE widget, còn ở Zsh mới hơn 5.8 thì qua hook zle-line-pre-redraw của add-zle-hook-widget.
- ✓Vẫn tô màu được trong lúc tìm kiếm lịch sử incremental (Ctrl+R), nhưng chỉ từ Zsh 5.4 trở lên.
- ✓Được xây từ các highlighter script có thể cắm/gỡ (tài liệu ở docs/highlighters.md) thay vì một bộ quy tắc cố định duy nhất.
- ✓Chạy như một shell script được source — không cần daemon, không cần binary cài đặt.
Cài đặt zsh-syntax-highlighting
README chỉ trỏ tới INSTALL.md cho các bước cài đặt thay vì liệt kê trực tiếp, và nguồn dữ liệu ở đây không bao gồm nội dung file đó, nên các lệnh cài đặt cụ thể không được tài liệu hóa rõ ràng trong nguồn này. Điều được ghi rõ là yêu cầu về thứ tự source: theo FAQ, zsh-syntax-highlighting.zsh phải được nạp ở cuối cùng trong .zshrc, sau tất cả zle -N widget tùy chỉnh và sau khi compinit chạy xong, nếu không các widget được tạo sau đó sẽ không được tô màu. Sai thứ tự source là lỗi phổ biến nhất khiến plugin không hoạt động hoặc chỉ hoạt động một phần.
Cấu hình highlighter và theme
Phần cấu hình cũng không được trình bày chi tiết ngay trong README — nó trỏ sang docs/highlighters.md cho các tùy chọn của từng highlighter, nên tên biến và tùy chọn cụ thể không được tài liệu hóa rõ trong nguồn này. Điều README xác nhận là mô hình hoạt động: việc tô màu do các highlighter script riêng biệt tạo ra, bạn có thể bật từng cái một thay vì dùng một bộ quy tắc gộp chung, và việc tinh chỉnh những script này là cách được hỗ trợ để thay đổi thứ được tô màu.
Điểm mạnh
- ✓Giải quyết đúng một vấn đề hẹp — bắt lỗi cú pháp trước khi chạy — mà không cố trở thành một framework đầy đủ.
- ✓Hook vào ZLE thay vì thay thế nó, nên nó chồng lên bất kỳ thiết lập prompt/widget nào bạn đã có.
- ✓Có thể cấu hình qua các highlighter script cắm được thay vì một kiểu tô màu cố định.
- ✓Giấy phép BSD-3-Clause — không có ràng buộc copyleft phải lo.
Giới hạn cần biết
- △Thứ tự source rất quan trọng và không dễ dãi: phải nạp sau tất cả zle -N widget tùy chỉnh và sau compinit, nếu không các widget tạo sau đó sẽ ngừng được tô màu.
- △Phiên bản Zsh tối thiểu được hỗ trợ là 4.3.11 — bản cũ hơn không được hỗ trợ.
- △Tô màu khi tìm kiếm lịch sử Ctrl+R chỉ có từ Zsh 5.4 trở lên; bản cũ hơn chỉ có gạch chân mặc định của Zsh.
- △Không có kênh thông báo release theo kiểu đẩy — theo FAQ, bạn phải tự theo dõi Atom feed trên GitHub hoặc mục anitya.
- △Cài đặt và cấu hình bị chia ra hai tài liệu riêng (INSTALL.md và docs/highlighters.md) thay vì gộp một trang.
Các lựa chọn tô màu Zsh khác
Câu hỏi thường gặp
zsh-syntax-highlighting hook vào Zsh Line Editor (ZLE) — bằng cách wrap các ZLE widget ở Zsh 5.2 trở về trước, hoặc qua hook zle-line-pre-redraw của add-zle-hook-widget ở Zsh mới hơn 5.8. Dù theo cách nào, nó cũng cần được nạp sau tất cả zle -N widget tùy chỉnh và sau compinit, nếu không các widget tạo sau đó vẫn hoạt động nhưng sẽ không được tô màu.
zsh-syntax-highlighting chỉ thêm phần tô màu của nó trong lúc tìm kiếm Ctrl+R trên Zsh 5.4 trở lên. Trên bản Zsh cũ hơn, tìm kiếm incremental chỉ có gạch chân mặc định của Zsh cho phần khớp, không có phần tô màu bổ sung, vì các bản đó không cung cấp đủ thông tin để tính toán.
zsh-syntax-highlighting yêu cầu Zsh 4.3.11 trở lên để chạy được. Một số tính năng cần bản mới hơn — ví dụ tô màu trong lúc tìm kiếm Ctrl+R cần Zsh 5.4 trở lên, và cơ chế hook cũng khác nhau giữa Zsh 5.2 trở về trước với Zsh mới hơn 5.8.
zsh-syntax-highlighting không có kênh thông báo release theo kiểu đẩy. Bạn tự theo dõi qua Atom feed release trên GitHub hoặc qua mục dự án trên release-monitoring.org (anitya) — đây là hai kênh mà dự án liệt kê.
zsh-syntax-highlighting được xây từ các highlighter script cắm được thay vì một bộ quy tắc cố định, nên việc chọn loại nào được tô màu vốn được thiết kế để tùy chỉnh được. Các tùy chọn cụ thể nằm trong file docs/highlighters.md của repo chứ không phải trong README chính.
zsh-syntax-highlighting là một plugin bạn thêm vào Zsh để tái tạo kiểu tô màu lệnh trực tiếp mà Fish shell đã có sẵn. Dự án tự mô tả là Fish shell like syntax highlighting cho Zsh, nên hành vi cốt lõi mô phỏng theo Fish, nhưng đây là add-on cho một shell khác chứ không phải tính năng của Fish.
Vấn đề mà nó giải quyết
Không như Fish shell, Zsh mặc định không tô màu dòng lệnh khi bạn gõ — bạn chỉ biết về lỗi gõ sai, dấu ngoặc kép chưa đóng, hay lệnh không tồn tại khi nhấn Enter và nhận lỗi, hoặc tệ hơn là khi shell chạy nhầm thứ bạn không định chạy. zsh-syntax-highlighting lấp đúng khoảng trống đó bằng cách hook vào line editor của Zsh và tính lại phần tô màu trên command-line buffer theo thời gian thực, cùng kiểu phản hồi trực tiếp mà Fish shell có sẵn, mà không bắt bạn rời khỏi Zsh.
Trường hợp sử dụng tốt nhất
- •Bắt lỗi dấu ngoặc kép chưa đóng hoặc dấu ngoặc chưa khớp trong một lệnh pipe dài, trước khi nhấn Enter.
- •Phát hiện tên lệnh gõ sai — thứ Zsh không báo cho đến khi chạy fail — ngay khi bạn còn đang gõ.
- •Xem lại trực quan một lệnh có tính phá hủy (rm, dd, git reset) trước khi thực thi, vì việc tô màu giúp cấu trúc lệnh dễ đọc hơn.
- •Người dùng Zsh thích kiểu tô màu trực tiếp của Fish nhưng không muốn đổi hẳn sang shell khác.
Nên dùng — và nên bỏ qua
Bất kỳ ai chạy Zsh tương tác và muốn có phản hồi trực quan khi gõ lệnh nên thêm zsh-syntax-highlighting — chỉ tốn một dòng source trong .zshrc và đáng giá ngay lần đầu nó bắt được một dấu ngoặc kép chưa đóng. Bỏ qua nếu bạn đang dùng Zsh cũ hơn 4.3.11 và không có cách nâng cấp, hoặc đã chuyển hẳn sang Fish shell và có sẵn phản hồi tương tự. Đây cũng không phải giải pháp nếu vấn đề thực sự của bạn là gợi ý lệnh chứ không phải tô màu — đó là việc của zsh-autosuggestions, không phải của plugin này.
Repo liên quan
Chưa chắc zsh-syntax-highlighting có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về zsh-syntax-highlighting.
