8 điểm bởi GN⁺ 2025-06-25 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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 nhanhmứ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

 
tujuc 2025-06-25

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

 
GN⁺ 2025-06-25
Ý 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”
    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

    <pre><code>: ▶</code></pre>

    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
      Hiện tôi đang dùng một cấu hình tối giản kiểu như sau

      <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>
    • 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
    Gần đây cấu hình prompt của tôi cho hiển thị nhanh những thông tin sau

    <pre><code>- kết quả lệnh gần nhất (màu: xanh lá, đỏ, tím)
  • user@host:currentDirectory
  • (nếu ở trong repo) branch hiện tại và tóm tắt git status, các background job</code></pre>
    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ì