Thêm hỗ trợ hoàn tất lệnh cho fish shell

Thêm hỗ trợ hoàn tất lệnh cho fish shell

Bet 68 Game Bài 3C

Tự động hoàn tất lệnh trong fish shell khi sử dụng go Cobra

Ngày cập nhật: 25-04-2025 | Lượt xem: 728 | Số từ: 658 | Phân loại: golang

Tiếp nối các bài viết trước, sau khi tôi đã hoàn thành việc phân tích cú pháp struct bằng AST trong Golang và tự động tạo mã CRUD, tôi tiếp tục thêm một số tính năng mới. Như vậy, công cụ hỗ trợ lập trình tự động của tôi gần như đã hoàn thiện. 😊

Tuy nhiên, khi sử dụng trong dự án thực tế, vẫn còn một vài điểm chưa hài lòng — cụ thể là không thể hoàn tất lệnh tự động trong môi trường fish shell. Các lệnh mà chính tôi cũng khó nhớ rõ, mỗi lần đều phải dùng lệnh help hoặc tham khảo tài liệu để tìm kiếm thông tin. Điều này đôi khi gây bất tiện. Tôi liền nghĩ đến việc có thể triển khai chức năng tự động gợi ý lệnh tương tự như công cụ smug hay không. Sau khi tra cứu, hóa ra điều đó hoàn toàn khả thi nhờ vào tính năng sẵn có của Cobra.

Thư viện Cobra cung cấp sẵn chức năng tạo script hoàn tất lệnh (autocompletion) cho nhiều loại shell phổ biến như: fish, bash, zsh, và powershell.

Ví dụ, nếu tên công cụ của bạn là go_snip, bạn có thể kiểm tra cách tạo file cấu hình autocompletion cho fish bằng lệnh sau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
> go_snip completion fish --help
Tạo script hoàn tất lệnh cho shell fish.
Để tải về trong phiên shell hiện tại:
    go_snip completion fish | source
Để thiết lập vĩnh viễn cho mọi phiên mới, chỉ cần chạy một lần:
    go_snip completion fish > ~/.config/fish/completions/go_snip.fish
Bạn sẽ cần khởi động lại shell để thiết lập có hiệu lực.
Sử dụng:
 go_snip completion fish [các tùy chọn]
Tùy chọn:
 -h, --help       Hiển thị trợ giúp
   --no-descriptions  Vô hiệu hóa mô tả khi gợi ý lệnh

Nếu bạn chưa từng cấu hình autocompletion trên fish shell trước đây, hãy tạo thư mục chứa các tệp hoàn tất lệnh:

1
mkdir ~/.config/fish/completions/

Sau đó, tiến hành xuất file cấu hình với lệnh:

1
> go_snip completion fish > ~/.config/fish/completions/go_snip.fish

Lúc này, bạn đã có thể tận hưởng trải nghiệm tự động hoàn tất lệnh rồi!

Hiệu quả thực tế

Chỉ cần nhấn phím Tab một lần để xem gợi ý lệnh, hoặc nhấn hai lần Tab để liệt kê tất cả các lệnh khả dĩ.

![](Hình ảnh minh họa: Tự động hoàn tất lệnh trong fish shell với Cobra)

Nội dung file cấu hình fish là gì?

Tò mò quá nên tôi mở file ~/.config/fish/completions/go_snip.fish ra xem thử. Bỏ qua phần định nghĩa hàm đầu tiên, nội dung bên trong trông rất phức tạp, gần như là “chữ nghĩa kỳ quái” đối với người không rành về fish shell.

1
2
3
4
5
6
7
8
9
# Xóa bỏ các cấu hình hoàn tất lệnh cũ nếu tồn tại
complete -c go_snip -e
# Hàm này sẽ được gọi sau hai lệnh dưới và xóa dữ liệu global $__go_snip_perform_completion_once_result
complete -c go_snip -n '__go_snip_clear_perform_completion_once_result'
# Gọi __go_snip_prepare_completions để chuẩn bị danh sách lựa chọn hoàn tất lệnh
# Nếu không yêu cầu giữ nguyên thứ tự, thì không sử dụng flag -k
complete -c go_snip -n 'not __go_snip_requires_order_preservation && __go_snip_prepare_completions' -f -a '$__go_snip_comp_results'
# Ngược lại, nếu cần giữ nguyên thứ tự, sử dụng flag -k
complete -k -c go_snip -n '__go_snip_requires_order_preservation && __go_snip_prepare_completions' -f -a '$__go_snip_comp_results'

Khi thêm lệnh mới, có cần cập nhật lại không?

Giả sử tôi thêm một lệnh con mới bằng cách:

1
2
> cobra-cli add test1
> go install

Không cần thiết phải cập nhật lại file autocompletion fish. Cấu hình trước đó đã đủ thông minh để nhận diện và liệt kê tất cả các lệnh mới.

Cấu trúc thư mục cấu hình fish

Dưới đây là sơ đồ cây thư mục cấu hình fish:

1
2
3
4
5
6
7
> tree ~/.config/fish/
/home/zhongwei/.config/fish/
├── completions
   └── go_snip.fish
├── config.fish
└── fish_variables
1 thư mục, 3 tệp

Ghi vào Makefile

Việc thủ công thực hiện các bước trên không dễ nhớ, đặc biệt khi bạn làm việc trên nhiều máy khác nhau. Vì vậy, tốt nhất là bạn nên lưu lại quy trình này trong một file Makefile để thuận tiện hơn khi cần thiết.


Hy vọng bài viết này sẽ giúp bạn dễ dàng hơn trong việc tích hợp chức năng tự động hoàn tất lệnh khi phát triển CLI ứng dụng bằng Go và Cobra trong môi trường fish shell. Nếu bạn thấy hữu ích, đừng quên chia sẻ nhé!

comments powered by Disqus
Built with Hugo
Theme Stack thiết kế bởi Jimmy