zsh-autosuggestions: zsh autosuggest kiểu Fish
zsh-autosuggestions chỉ làm đúng một việc: in ra một dự đoán màu xám cho phần còn lại của lệnh bạn đang gõ, lấy từ lịch sử hoặc từ completion engine, trước khi bạn gõ xong. Chính vì chỉ tập trung vào một việc nên plugin này hoạt động bền bỉ hàng ngày thay vì biến thành một framework shell cồng kềnh phải bảo trì. Đổi lại chỉ là thêm một script được source vào .zshrc, và điều đó đáng bỏ công với bất kỳ ai gõ lại lệnh đủ thường xuyên để thấy phiền.
Gõ lại các lệnh đã từng chạy trong lịch sử shell
Bất kỳ ai dùng Zsh cũng sẽ có lúc gõ lại cùng một chuỗi flag dài của docker run, cùng một lệnh git, hay cùng một hostname ssh hàng chục lần mỗi tuần, và Zsh mặc định chỉ giúp được nếu bạn nhớ bấm Ctrl+R để tìm kiếm. zsh-autosuggestions bỏ qua bước đó. Chỉ cần gõ đủ để khớp với một lệnh đã chạy trước đây, phần còn lại của dòng lệnh sẽ hiện ngay tại chỗ, không cần một giao diện tìm kiếm riêng.
zsh-autosuggestions làm gì
zsh-autosuggestions là một plugin cho Zsh, hiển thị một gợi ý lệnh bằng chữ xám mờ ngay sau con trỏ khi bạn gõ, dựa trên các lệnh khớp trong lịch sử shell hoặc từ completion engine. Plugin yêu cầu Zsh từ bản v4.3.11 trở lên và hoạt động bằng cách gắn vào các widget của Zsh Line Editor (zle) thay vì thay thế prompt hay shell của bạn. Nhấn phím mũi tên phải hoặc End để chấp nhận toàn bộ gợi ý, hoặc dùng forward-word để chấp nhận từng phần.
Tùy chỉnh chiến lược gợi ý và giao diện hiển thị
- ✓Ba chiến lược gợi ý có thể hoán đổi cho nhau — history (lệnh khớp gần nhất trong lịch sử), completion (những gì tab-completion sẽ gợi ý, cần module zpty), và match_prev_cmd (giống history nhưng gắn với lệnh bạn vừa chạy ngay trước đó).
- ✓ZSH_AUTOSUGGEST_STRATEGY nhận vào một mảng, nên bạn có thể nối nhiều chiến lược và rơi xuống chiến lược tiếp theo khi cái đầu không tìm thấy gợi ý nào — ví dụ thử history trước rồi mới đến completion.
- ✓Màu sắc và kiểu hiển thị gợi ý cấu hình được qua ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE (màu chữ, màu nền, bold, underline, standout), không chỉ là bật/tắt đơn thuần.
- ✓Năm mảng widget (CLEAR, ACCEPT, EXECUTE, PARTIAL_ACCEPT, IGNORE_WIDGETS) cho phép bạn cấu hình lại chính xác keybinding zle nào kích hoạt hành vi gợi ý nào.
- ✓ZSH_AUTOSUGGEST_HISTORY_IGNORE và ZSH_AUTOSUGGEST_COMPLETION_IGNORE nhận glob pattern để tắt gợi ý cho một số lệnh cụ thể, ví dụ không bao giờ gợi ý cd * hay completion của git *.
- ✓ZSH_AUTOSUGGEST_BUFFER_MAX_SIZE tắt gợi ý khi buffer vượt quá độ dài quy định, nên dán một đoạn văn bản lớn vào terminal sẽ không kích hoạt tra cứu gợi ý.
Cài đặt plugin
Các bước cài đặt cụ thể không được ghi rõ trực tiếp trong dữ kiện ở đây — README trỏ sang một file INSTALL.md riêng thay vì liệt kê trực tiếp. Điều được ghi rõ: zsh-autosuggestions cần Zsh từ bản v4.3.11 trở lên, và phần Uninstallation của README cho thấy hình dạng của việc cài đặt theo chiều ngược lại — plugin tồn tại dưới dạng một git repository đã clone (ví dụ gỡ cài đặt trong README dùng đường dẫn ~/.zsh/zsh-autosuggestions) và được source từ một dòng trong ~/.zshrc, dòng này sẽ bị xóa cùng với repo khi gỡ cài đặt. Nếu bạn dùng Oh My Zsh, README khuyên nên đặt các override cấu hình ZSH_AUTOSUGGEST_* vào một file trong thư mục $ZSH_CUSTOM thay vì sửa trực tiếp .zshrc, để tránh bị ghi đè khi framework cập nhật.
Chấp nhận và tinh chỉnh gợi ý
Sau khi được source, zsh-autosuggestions hoạt động một cách thụ động: bắt đầu gõ một lệnh và phần còn lại của dòng lệnh sẽ hiện sau con trỏ bằng chữ xám mờ (màu này lấy từ ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE, mặc định là fg=8). Khi con trỏ ở cuối buffer, nhấn mũi tên phải (widget forward-char) hoặc End (end-of-line) sẽ chấp nhận toàn bộ gợi ý và thay nội dung buffer bằng gợi ý đó. Gọi widget forward-word chỉ chấp nhận đến vị trí con trỏ dừng lại — đây là cách lấy gợi ý từng từ một. Ngoài các phím mặc định, plugin còn cung cấp các widget riêng — autosuggest-accept, autosuggest-execute, autosuggest-clear, autosuggest-fetch, autosuggest-disable, autosuggest-enable, và autosuggest-toggle — mà bạn có thể tự bind, ví dụ bindkey '^ ' autosuggest-accept để chấp nhận bằng Ctrl+Space. Nguồn gốc của gợi ý do ZSH_AUTOSUGGEST_STRATEGY quyết định, một mảng được thử lần lượt: history cho lệnh khớp gần nhất, completion cho những gì completion engine gợi ý, hoặc match_prev_cmd cho một match trong lịch sử gắn với lệnh bạn vừa chạy trước đó.
Điểm mạnh
- ✓Plugin chỉ làm một việc duy nhất — quản lý gợi ý inline — nên không xung đột với theme prompt hay completion framework bạn đang dùng.
- ✓Cấu hình chi tiết đến từng hành vi widget, không chỉ là vài công tắc bật/tắt.
- ✓Việc lấy gợi ý bất đồng bộ (async) được bật mặc định trên zsh hiện đại, nên không làm chậm việc gõ phím.
- ✓Giấy phép MIT, nên không có rào cản pháp lý khi sử dụng ở bất kỳ đâu.
Hạn chế và các vấn đề thường gặp
- △Bản thân README đẩy các bước cài đặt sang một file INSTALL.md riêng thay vì liệt kê trực tiếp, nên tài liệu chính không nêu rõ các lệnh cài đặt cụ thể.
- △Chiến lược completion phụ thuộc vào module zpty, còn chiến lược match_prev_cmd sẽ âm thầm bị lỗi nếu bạn bật HIST_IGNORE_ALL_DUPS hoặc HIST_EXPIRE_DUPS_FIRST — một cái bẫy dễ gặp nếu bạn đã tinh chỉnh cấu hình history từ trước.
- △Trên các bản zsh cũ hơn 5.0.8, có một lỗi đã được ghi nhận: ctrl+c không reset prompt ngay lập tức sau khi gợi ý được lấy bất đồng bộ.
- △Một số người dùng iTerm2 không nhìn thấy gợi ý cho đến khi sửa xung đột màu giữa Background và Bright Black trong ANSI Colors ở profile — một bước khắc phục mà README phải nêu riêng.
Các lựa chọn autocomplete khác cho zsh
Câu hỏi thường gặp
zsh-autosuggestions hoạt động tốt cùng Oh My Zsh, không xung đột. README nêu rõ cách đặt các override cấu hình ZSH_AUTOSUGGEST_* vào một file trong thư mục $ZSH_CUSTOM của Oh My Zsh, giúp cấu hình không bị ghi đè khi framework cập nhật.
zsh-autosuggestions yêu cầu Zsh từ bản v4.3.11 trở lên, theo đúng yêu cầu được nêu trong README. Nếu muốn lấy gợi ý bất đồng bộ, vốn được bật mặc định, bạn cần Zsh 5.0.8 trở lên — các bản cũ hơn có một lỗi đã biết khiến ctrl+c không reset prompt ngay sau khi fetch async.
zsh-autosuggestions hỗ trợ tắt gợi ý theo từng lệnh bằng glob pattern: đặt ZSH_AUTOSUGGEST_COMPLETION_IGNORE thành "git *" để tắt gợi ý dựa trên completion cho git, hoặc đặt ZSH_AUTOSUGGEST_HISTORY_IGNORE cho gợi ý dựa trên lịch sử, ví dụ để bỏ qua "cd *" hoặc các dòng lịch sử quá dài.
Đặt biến ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE để thay đổi cách zsh-autosuggestions hiển thị chữ gợi ý — màu chữ, màu nền, bold, underline, hoặc standout. Giá trị mặc định là fg=8 trong bảng màu 256-color; terminal chỉ hỗ trợ 8 màu thì cần dùng giá trị từ 0 đến 7.
zsh-autosuggestions không có code riêng cho từng hệ điều hành — plugin chạy được ở bất kỳ đâu có Zsh từ bản v4.3.11 trở lên, bao gồm cả macOS. Phần troubleshooting trong README có nêu một vướng mắc liên quan đến iTerm2: một số người dùng không thấy gợi ý cho đến khi sửa xung đột màu giữa Background và Bright Black trong ANSI Colors ở phần cài đặt profile.
Chiến lược history chọn lệnh khớp gần nhất trong lịch sử shell của bạn, còn chiến lược completion hỏi thẳng engine tab-completion của zsh xem nó sẽ gợi ý gì, và cần module zpty để hoạt động. Một chiến lược thứ ba, match_prev_cmd, giống history nhưng chỉ khớp với các mục có lệnh liền trước trùng với lệnh bạn vừa chạy.
Trường hợp sử dụng phù hợp nhất
- •Gõ các lệnh dài, hay lặp lại — flag của docker run, lệnh curl kèm header, alias ssh — nơi việc gõ lại cùng một chuỗi là thuần túy phiền toái.
- •Làm việc trong một cấu hình Oh My Zsh có sẵn, vì README hướng dẫn đặt các override ZSH_AUTOSUGGEST_* vào một file trong $ZSH_CUSTOM.
- •Các workflow dùng terminal nhiều, nơi liếc qua một gợi ý màu xám tốt hơn việc ngắt mạch để bấm Ctrl+R.
- •Các thiết lập keybinding tùy biến, vì mỗi hành động accept/clear/execute đều được cung cấp như một widget zle riêng để bạn tự bind.
Ai nên dùng — và ai nên bỏ qua
Bất kỳ ai sống trong terminal và đã quen với việc chỉnh .zshrc đều nên thử zsh-autosuggestions — đây là một plugin nhỏ, chỉ làm một việc, không có dependency nào ngoài Zsh. Bỏ qua nó nếu bạn hiếm khi gõ lại lệnh cũ, hoặc không muốn học thêm một tập biến ZSH_AUTOSUGGEST_* mới mỗi khi cần tinh chỉnh — đặc biệt là chiến lược completion, vốn đòi hỏi bạn hiểu zpty và cấu hình completion hiện có của mình.
Repo liên quan
Vẫn đang phân vân về zsh-autosuggestions?
Một cú bấm sẽ gửi câu hỏi kèm trang này cho AI — xem AI nói gì về zsh-autosuggestions.
