- Starship là một dự án prompt mã nguồn mở nhẹ, hiệu năng cao và linh hoạt có thể dùng trong nhiều môi trường shell khác nhau
- Cung cấp khả năng tương thích rộng, hỗ trợ hầu hết các shell phổ biến như Bash, Zsh, Fish, Powershell, Tcsh
- Có thể cấu hình và áp dụng bằng cách thêm đơn giản script khởi tạo cho từng shell
- Được viết bằng Rust nên đảm bảo tốc độ cao và tính an toàn, đồng thời được cung cấp dưới dạng một binary duy nhất
- Có thể tùy biến đến từng chi tiết nhỏ
- Hỗ trợ thiết lập môi trường thống nhất trên nhiều nền tảng như Android, BSD, Linux, macOS, Windows, giúp tăng năng suất và sự thuận tiện khi sử dụng
Dự án mã nguồn mở Starship
- Starship là một công cụ prompt hỗ trợ cả hiệu năng lẫn khả năng tùy biến, có thể sử dụng trên nhiều hệ điều hành và shell khác nhau
- So với các prompt nặng truyền thống, nó nổi bật với tốc độ phản hồi nhanh và mức sử dụng tài nguyên thấp, đồng thời khả năng tùy biến cao giúp cải thiện năng suất của lập trình viên
Cách thiết lập trong từng môi trường shell
- Bash:
- Thêm mã
eval "$(starship init bash)" vào cuối tệp ~/.bashrc
- Fish:
- Thêm
starship init fish | source vào cuối tệp ~/.config/fish/config.fish
- Zsh:
- Thêm mã
eval "$(starship init zsh)" vào cuối tệp ~/.zshrc
- Powershell:
- Thêm
Invoke-Expression (&starship init powershell) vào tệp Microsoft.PowerShell_profile.ps1
- Có thể kiểm tra vị trí tệp hồ sơ PowerShell bằng biến
$PROFILE
- Ion:
- Nhập mã
eval $(starship init ion) vào tệp ~/.config/ion/initrc
- Elvish:
- Chỉ hỗ trợ từ phiên bản v0.18 trở lên
- Thêm mã
eval (starship init elvish) vào tệp ~/.elvish/rc.elv
- Tcsh:
- Nhập mã
eval \starship init tcsh`` vào tệp ~/.tcshrc
- Nushell:
- Chỉ hỗ trợ từ v0.96 trở lên, cách cấu hình có thể thay đổi trong tương lai
- Có thể kiểm tra đường dẫn tệp cấu hình bằng lệnh
$nu.config-path
- Áp dụng vào đường dẫn đó bằng mã
starship init nu | save -f ...
- Xonsh:
- Nhập mã
execx($(starship init xonsh)) vào cuối tệp ~/.xonshrc
- Cmd (cần Clink):
- Cần Clink v1.2.30 trở lên
- Tạo tệp
starship.lua rồi lưu vào thư mục script của Clink
- Bên trong thêm mã
load(io.popen('starship init cmd'):read("*a"))()
2 bình luận
Thấy thứ mình đã dùng rất tốt suốt mấy năm nay được đăng lên đây nên thấy mới mẻ ghê :)
Mình dùng từ hồi nó còn được cung cấp dưới dạng theme cho Zsh cơ... hahaha
Ý kiến Hacker News
Tôi là kiểu người dùng thích prompt theo hướng maximalist, và thường dùng Shell Bling Ubuntu thông qua Starship khi dựng máy phát triển
Nhưng kiểu này không hợp với tất cả mọi người
Nếu chỉ muốn thêm đúng những thông tin có mật độ giá trị cao nhất, tôi khuyên chỉ hiển thị thời điểm prompt xuất hiện và thời lượng chạy của lệnh gần nhất
Chỉ với hai thông tin đó là đã dễ dàng nắm được chuyện gì xảy ra khi nào, và rất có ích về sau cho việc debug hay quản lý nhật ký
Cách này là mẹo tôi học được từ cuốn 『Networking for System Administrators』 của Michael W. Lucas, và tôi cũng hay giới thiệu sách này cho các lập trình viên muốn học nền tảng mạng
Nếu muốn tăng thêm điểm nerd, hãy hiển thị thời gian theo số giây kể từ UNIX epoch
Ưu điểm là việc tính delta thời gian trở nên cực kỳ dễ
Xem repo Shell Bling Ubuntu
Trong nushell thì những thông tin này có sẵn mặc định
Trong history có thể xem chi tiết như timestamp bắt đầu của lệnh, thời gian chạy, thư mục hiện tại, trạng thái thoát, v.v.
Nó không chỉ cho thấy khoảng cách thời gian giữa các lệnh mà còn hiển thị trực tiếp thời gian thực thi của chính lệnh đó, nên rất tiện
Tôi hầu như chưa từng tùy biến prompt
Vì nếu dùng emacs thì tôi đã xem được toàn bộ thông tin mình muốn ngay trong editor
Chỉ khi nào phải cho người khác xem như lúc pair programming thì tôi mới thiết lập Starship, rồi mở riêng một ứng dụng terminal khác để khỏi phải lộ cấu hình cá nhân của mình
Exit code của lệnh trước đó cũng là thông tin cực kỳ hữu ích vì những lý do tương tự như trên
Hiển thị thời gian hiện tại ở định dạng dễ đọc với con người cũng khá hữu ích
Và nếu trạng thái thoát của lệnh trước khác 0 (tức là thất bại) thì hiện thêm ra sẽ giúp debug
Với tôi thì chỉ cần thông tin thư mục hiện tại là đủ
Chỉ cần đổi màu prompt theo trạng thái thành công/thất bại của lệnh gần nhất
Thông tin thêm thì khi cần có thể kiểm tra riêng
Tôi tò mò không biết dữ liệu phân bố độ tuổi của người dùng Starship ra sao
Bản thân tôi theo thời gian càng ít quan tâm đến việc tùy biến prompt
Dù có chăm chút prompt đến đâu thì cuối cùng 90% thông tin hiển thị là thứ không cần thiết trong 90% thời gian
Thậm chí quá nhiều thông tin còn thành nhiễu thị giác, khiến não bộ mặc định bỏ qua và rồi quên luôn rằng những thông tin đó đang tồn tại
Thông tin thực sự quan trọng thì prompt vốn có giới hạn, ví dụ chỉ báo rằng có thay đổi trên Git branch cũng không cho biết file nào đã đổi, nên cuối cùng vẫn phải chạy thêm lệnh khác
Tôi có hơn 20 năm kinh nghiệm phát triển
Tôi thấy việc có thông tin Git trong prompt là rất hữu ích
Nó không cho biết chi tiết đến mức vi mô, nhưng đủ để nhắc tôi rằng đang có thay đổi chưa commit hay có stash bị quên, như vậy là tốt rồi
Tôi thấy Starship thú vị nên cài thử ngay, nhưng những phần như hiển thị version công cụ thì quá ồn ào nên cuối cùng gỡ ra
Các tùy chọn như thời gian lệnh hay trạng thái thành công/thất bại thì hay, nhưng không đáng với công sức quản lý một cấu hình tùy biến phức tạp
Với tư cách một senior đã hơn 25 năm trong ngành, tôi cũng không hay dùng các công cụ mới bóng bẩy
Trước đây tôi dùng một PS1 rất đơn giản như <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre>, chỉ hiển thị thời gian, tài khoản của tôi, host đang kết nối và đường dẫn hiện tại
Tôi cũng thử nhiều prompt nâng cao khác vài lần nhưng hầu như không giúp ích mấy
Hiện giờ tôi đã dùng Starship ổn định suốt vài năm
Tôi tùy biến để chỉ hiện lượng thông tin tối thiểu cần thiết, nên nó rất nhanh và dễ chịu
Một trong những phần hữu ích nhất trong prompt tùy biến của tôi là hiển thị exit status của lệnh vừa chạy
Có những trường hợp lệnh thất bại mà không hề in ra thông báo lỗi nào, nên có chỉ báo thất bại là một tín hiệu rất lớn
Tuy vậy, để tránh thành nhiễu thì tôi chỉ hiện khi lệnh thất bại
Ví dụ: <pre><code>» true » false (last command returned 1.)</code></pre>
Nếu lệnh kết thúc do signal thì tôi cũng dịch ra để hiển thị, kiểu như "last command exited on SIGSEGV"
Ngược lại, nó cũng hữu ích trong những trường hợp chương trình in ra thông báo lỗi nhưng lại thoát với mã thành công
Với tư cách một người dùng "very senior" có hàng chục năm kinh nghiệm UNIX, tôi thích chế độ minimal của Starship vì nó gọn gàng
Trước đây tôi từng vật lộn nhiều năm với đủ kiểu cấu hình zsh, nhưng giờ thì gần như không còn hassle
Nếu bạn đoán người dùng Starship đều là lớp trẻ mới lớn lạm dụng emoji trong JavaScript, thì xin nói là cũng có những người như tôi
Nhìn rộng hơn thì đây là hiện tượng áp dụng cho cả môi trường máy tính nói chung
Hồi trẻ tôi từng tự dựng OS bằng Gentoo, ám ảnh với cờ tối ưu CPU, window manager, alias và hàm trong bashrc, rồi cả prompt
Bản thân việc tối ưu như thế thực ra cũng là một trải nghiệm khá hữu ích trong quá trình trưởng thành
Nếu ví với nghề mộc thì lúc mới học, ta dành phần lớn thời gian để làm và mài giũa công cụ hay tiểu xảo; đến một lúc nào đó trọng tâm sẽ chuyển sang làm việc thực tế
Giờ tôi vẫn thích Linux, nhưng trong thực tế bận rộn thì thay vì cân đo hiệu quả và độ hoàn thiện, tôi ưu tiên “công việc”, nên cứ dùng Debian và KDE mặc định
Tôi ghét trang trí thừa thãi hay quá tải thông tin nên thích môi trường terminal tối giản
Nhưng Starship lại cho thấy ngữ cảnh khá tốt khi cần, và có thể tùy biến rất chi tiết
Prompt mặc định của tôi chỉ hiện thư mục hiện tại, thời gian và một dấu %
Khi các biến môi trường nhất định (KUBECONFIG, OS_CLOUD, v.v.) được thiết lập thì nó mới thêm thông tin tương ứng
Version ngôn ngữ như Go, Python cũng tự động hiện theo ngữ cảnh sử dụng
Starship giúp việc thiết lập kiểu này trở nên cực kỳ dễ dàng, và hoạt động nguyên bản với overhead tối thiểu mà không cần cấu hình plugin zsh phức tạp
Đặc biệt khi dùng cùng evalcache thì tốc độ khởi tạo cũng rất nhanh
Là fan của Starship, tôi có vài nhận xét
Nó được viết bằng Rust nên an toàn và nhanh, và vì là binary đã biên dịch nên hiệu năng tốt hơn rất nhiều so với powerline viết bằng Python, ohmybash viết bằng shell script, ohmyzsh viết cho zshell, hay spaceship
Hỗ trợ zsh, bash, sh, fish là điều hiển nhiên, ngoài ra còn hỗ trợ cả MS Windows CMD và Powershell
Việc quản lý prompt trên mọi hệ thống bằng một file config duy nhất gần như là độc nhất
Nếu thấy thông tin quá nhiều thì có thể đổi rất dễ, và cũng có thể tắt icon
Với khoảng 100 module thì gần như không có giới hạn về khả năng tùy biến
Tôi không hiểu vì sao Starship lại được marketing là “minimal”
<pre><code>: ▶</code></pre>Thực tế nó có rất nhiều tính năng, và những gì người ta thực sự dùng cũng thường là prompt khổng lồ gắn đầy trang trí
Tôi thì dùng rất đơn giản như sau
Nếu muốn tối giản thực sự thì không nhất thiết cần đến một framework tùy biến kiểu này
So với các shell và prompt khác, ưu điểm của file cấu hình Starship là dù độ phức tạp tăng lên thì nó vẫn khá trực quan
Có thể tắt mọi tính năng
<pre><code>format = """ $username\ $hostname\ $shlvl\ $directory\ $git_branch\ $git_commit\ $git_state\ $git_metrics\ $git_status\ $package\ $python\ $rust\ $env_var\ $custom\ $cmd_duration\ $jobs\ $time\ $status\ $shell\ $character"""</code></pre>Hiện tôi đang dùng một cấu hình tối giản kiểu như sau
Suy cho cùng Starship có thể dùng theo kiểu tối giản, nhưng về bản chất nó là một prompt maximalist có thể chứa nhiều thông tin và nội dung nhất có thể
Tôi nghĩ nên thừa nhận điểm đó
Tôi còn dùng mũi tên mảnh hơn thế này
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>Sạch sẽ, đơn giản và tối giản
Tôi ngạc nhiên khi có nhiều phản hồi nhầm lẫn giữa khả năng tùy biến với chủ nghĩa maximalism
Mặc định thì có hơi quá tay, nhưng hoàn toàn có thể lược bớt đến mức mình muốn
Tôi làm việc với nhiều môi trường AWS và nhiều runtime khác nhau, nên thông tin ngữ cảnh trên prompt thực sự rất hữu ích
Cá nhân tôi đã dùng cặp Starship + Nushell trong thời gian dài
Tôi thích ở chỗ chỉ cần cài một lần rồi gần như không phải đụng vào nữa
Tôi muốn nhìn phát là biết shell đang là node 20 hay 22, rust đang là stable hay nightly
Vì nó hiển thị ngay những thứ đó mà không cần thao tác thêm nên tôi rất hài lòng
Không liên quan trực tiếp đến Starship, nhưng trong prompt zsh tôi thấy khó chịu với hiện tượng khi nhấn Enter thì con trỏ thoáng chốc nhảy về đầu dòng và tạo hiệu ứng “flash”
Với prompt ultra-fast thì đỡ hơn, nhưng chỉ cần prompt có làm thêm chút gì đó là hiện tượng này thấy rất rõ
Tôi quan sát thấy giống nhau trên nhiều terminal khác nhau (gnome-terminal, wezterm, kitty, alacritty, xterm)
Chỉ riêng terminal urxvt là không bị vấn đề này
Xem video tái hiện
Tôi muốn biết nguyên nhân và cách tránh hiện tượng flash này
Nếu cứ mỗi lần render prompt lại phải kiểm tra những thông tin vô ích như git status trong 100ms, thì sẽ dẫn tới suy giảm năng suất vô hình
Terminal nên là một công cụ bộ nhớ phản hồi nhanh, và cần tránh biến nó thành đồ trang trí không cần thiết
Vấn đề là ta chăm chăm tối ưu tốc độ chạy code nhưng lại quá dễ dãi với độ trễ gõ phím của chính mình
Starship thực sự rất nhanh
Nó chỉ mất vài ms để thu thập dữ liệu cần thiết, và cũng rất dễ kiểm soát việc trích xuất thông tin nào
Với những công cụ khác tôi từng dùng, độ trễ dài luôn gây khó chịu, nhưng khi dùng Starship thì khác biệt cảm nhận được rất rõ
100ms con người cảm nhận và 100ms trong tối ưu CPU là hai thứ hoàn toàn khác nhau
Theo tôi, nếu prompt mất 100ms để hiện Git branch hay trạng thái, thì nên nghĩ xem điều gì đáng tối ưu hơn: sự đứt mạch “flow” đó hay việc tôi tự gõ lệnh vốn còn lâu hơn
Vài ms cho những tiện ích hợp lý là cái giá hoàn toàn chấp nhận được
Cuối cùng vẫn là tìm điểm cân bằng giữa tiện ích và tối giản
Cả chủ nghĩa tối giản cực đoan lẫn trang trí quá mức đều có thể dẫn đến kém hiệu quả
Vì khó chịu với độ trễ này, tôi đã vá kitty terminal để chuyển prompt Starship xuống status bar phía dưới kiểu như modeline của vim hay emacs
Modeline được cập nhật bất đồng bộ nên phản hồi của prompt rất nhanh
Điểm trừ là phải tự vá kitty, và tôi cũng chưa thử ngoài môi trường Linux cá nhân của mình
Xem dự án patch liên quan
Tôi tự hỏi liệu công cụ prompt có thể hoạt động như TUI, tức là sau khi đã trả xong toàn bộ output của prompt thì vẫn tiếp tục sửa vùng prompt một cách bất đồng bộ hay không (ví dụ kubectl, git, aws cli bổ sung thông tin sau 200ms)
Làm vậy người dùng có thể gõ lệnh tiếp theo ngay không phải chờ, còn thông tin phụ sẽ hiện ra sau một cách tự nhiên
Tôi nghĩ có khi không phải tối ưu chạy code, mà chính việc ngày càng có nhiều tầng (layer) tham gia khiến việc tối ưu độ trễ nhập liệu của prompt trong thực tế còn khó hơn
Khi vào trang web chính thức, tôi cảm thấy thiếu một lời giải thích rõ ràng về vì sao phải dùng Starship
<pre><code>- kết quả lệnh gần nhất (màu: xanh lá, đỏ, tím)Gần đây cấu hình prompt của tôi cho hiển thị nhanh những thông tin sau
Nếu lệnh trước thành công thì hiện màu xanh lá, thất bại thì màu đỏ, còn bị ngắt thì màu tím
Có thể tôi chính là người dùng mục tiêu của họ, nhưng từ trang chủ tôi không nhận được thông điệp rõ ràng về “vì sao” nên dùng, hay nó cải thiện điều gì