- Starship adalah proyek prompt open source yang ringan, berperforma tinggi, dan fleksibel untuk digunakan di berbagai lingkungan shell
- Menyediakan kompatibilitas luas dengan mendukung sebagian besar shell utama seperti Bash, Zsh, Fish, Powershell, dan Tcsh
- Dapat dikonfigurasi dan diterapkan dengan mudah hanya dengan menambahkan skrip inisialisasi untuk masing-masing shell
- Ditulis dengan Rust untuk menjamin kecepatan dan keamanan, serta didistribusikan sebagai satu binary tunggal
- Dapat dikustomisasi hingga ke detail terkecil
- Mendukung konfigurasi lingkungan yang konsisten di berbagai platform seperti Android, BSD, Linux, macOS, dan Windows, sehingga meningkatkan produktivitas dan kemudahan penggunaan
Proyek open source Starship
- Starship adalah alat prompt yang mendukung performa dan kustomisasi sekaligus, sehingga bisa digunakan di berbagai sistem operasi dan shell
- Dibandingkan prompt tradisional yang berat, Starship menonjol dengan respons yang cepat dan penggunaan resource yang rendah, serta membantu meningkatkan produktivitas pengembang berkat tingkat kustomisasi yang tinggi
Cara konfigurasi di setiap lingkungan shell
- Bash:
- Tambahkan kode
eval "$(starship init bash)" di akhir file ~/.bashrc
- Fish:
- Tambahkan
starship init fish | source di akhir file ~/.config/fish/config.fish
- Zsh:
- Tambahkan kode
eval "$(starship init zsh)" di akhir file ~/.zshrc
- Powershell:
- Tambahkan
Invoke-Expression (&starship init powershell) ke file Microsoft.PowerShell_profile.ps1
- Lokasi file profil PowerShell dapat diperiksa melalui variabel
$PROFILE
- Ion:
- Masukkan kode
eval $(starship init ion) ke file ~/.config/ion/initrc
- Elvish:
- Hanya mendukung versi v0.18 ke atas
- Tambahkan kode
eval (starship init elvish) ke file ~/.elvish/rc.elv
- Tcsh:
- Masukkan kode
eval \starship init tcsh`` ke file ~/.tcshrc
- Nushell:
- Hanya mendukung v0.96 ke atas, dan metode konfigurasi dapat berubah di masa mendatang
- Jalur file konfigurasi dapat diperiksa dengan perintah
$nu.config-path
- Terapkan pada jalur tersebut dengan kode
starship init nu | save -f ...
- Xonsh:
- Masukkan kode
execx($(starship init xonsh)) di akhir file ~/.xonshrc
- Cmd (memerlukan Clink):
- Memerlukan Clink v1.2.30 atau lebih baru
- Buat file
starship.lua lalu simpan di direktori skrip Clink
- Di dalamnya, tambahkan kode
load(io.popen('starship init cmd'):read("*a"))()
2 komentar
Rasanya segar juga melihat sesuatu yang sudah saya pakai dengan baik selama bertahun-tahun ini muncul di sini :)
Saya sudah memakainya sejak masih tersedia sebagai tema Zsh... hahaha
Komentar Hacker News
Saya pengguna yang suka prompt maksimalis, dan sering memakai Shell Bling Ubuntu berbasis Starship saat menyiapkan mesin development
Namun, gaya seperti ini memang tidak cocok untuk semua orang
Jika hanya ingin menambahkan informasi yang paling padat, saya menyarankan prompt hanya menampilkan waktu saat prompt muncul dan durasi eksekusi perintah terakhir
Dengan dua informasi ini saja, kita bisa dengan mudah memahami apa yang terjadi dan kapan, dan ini sangat membantu untuk debugging atau pencatatan di kemudian hari
Cara ini adalah tip yang saya dapat dari buku Michael W. Lucas, 『Networking for System Administrators』, dan saya juga sering merekomendasikan buku itu kepada developer yang ingin mempelajari dasar-dasar jaringan
Kalau ingin dapat poin nerd tambahan, tampilkan waktu dalam detik berdasarkan UNIX epoch
Keuntungannya, perhitungan delta waktu jadi sangat mudah
Lihat repo Shell Bling Ubuntu
Di nushell, informasi seperti ini tersedia secara bawaan
Di riwayat eksekusi (history), kita bisa melihat detail seperti timestamp mulai perintah, waktu eksekusi, direktori saat ini, status keluar, dan lain-lain
Sangat praktis karena bukan hanya menunjukkan selisih waktu antar-eksekusi, tetapi juga langsung menampilkan durasi eksekusi perintah itu sendiri
Saya hampir tidak pernah melakukan kustomisasi prompt
Kalau memakai emacs, semua informasi yang saya inginkan sudah bisa dilihat di editor
Saya hanya menyiapkan Starship saat harus memperlihatkan sesuatu ke orang lain, misalnya saat pair programming, dan saya membuka aplikasi terminal terpisah supaya tidak perlu memperlihatkan setup pribadi saya
Exit code dari perintah sebelumnya juga sangat berguna, dengan alasan yang mirip seperti di atas
Menampilkan waktu saat ini dalam format yang mudah dibaca manusia juga cukup membantu
Dan jika status keluar perintah sebelumnya bukan 0 (gagal), akan membantu debugging kalau itu juga ditampilkan
Bagi saya, informasi direktori saat ini saja sudah cukup
Cukup ubah warna prompt berdasarkan status sukses/gagal dari perintah terakhir
Informasi tambahan bisa dicek terpisah saat memang diperlukan
Saya jadi penasaran seperti apa distribusi usia pengguna Starship
Saya sendiri makin lama makin tidak terlalu tertarik dengan kustomisasi prompt
Saya sampai pada kesimpulan bahwa, seberapa pun rumit prompt dihias, 90% informasi yang ditampilkan tidak diperlukan selama 90% waktu
Terlalu banyak informasi justru terasa seperti noise visual, sehingga otak akhirnya mengabaikannya dan kita bahkan lupa bahwa informasi itu ada
Informasi yang benar-benar penting juga punya keterbatasan jika hanya ditaruh di prompt; misalnya, hanya melihat ada perubahan pada branch Git tidak memberi tahu file mana yang berubah, jadi tetap perlu menjalankan perintah tambahan
Saya punya pengalaman lebih dari 20 tahun sebagai developer
Saya merasa sangat terbantu dengan adanya informasi Git di prompt
Memang tidak sampai memberi detail lengkap, tetapi setidaknya mengingatkan kalau ada perubahan yang belum di-commit atau stash yang terlupa
Starship terlihat menarik sehingga saya langsung mencobanya, tetapi bagian seperti penampilan versi tool terasa terlalu berisik, dan akhirnya saya uninstall
Opsi seperti timing perintah atau status sukses/gagal memang bagus, tetapi hasilnya tidak sebanding dengan repotnya mengelola konfigurasi kustom yang kompleks
Dari sudut pandang senior dengan pengalaman lebih dari 25 tahun di industri, saya cenderung tidak banyak memakai tool modern yang mencolok
Dulu saya memakai PS1 yang sangat sederhana, seperti <pre><code>export PS1="[\033[1;32m][\t \u@\h \w]\$[\033[0m]"</code></pre>, yang hanya menampilkan waktu, akun saya, host yang sedang diakses, dan path saat ini
Saya sudah beberapa kali mencoba prompt lain yang lebih canggih, tetapi hampir tidak membantu
Sekarang justru saya sudah beberapa tahun nyaman memakai Starship
Saya kustomisasi agar hanya menampilkan informasi minimum yang saya butuhkan, dan hasilnya sangat cepat serta nyaman dipakai
Salah satu bagian paling berguna dari kustomisasi prompt saya adalah tampilan exit status dari perintah sebelumnya
Kadang ada perintah yang gagal tanpa pesan error apa pun, jadi indikator gagal seperti ini sangat kuat sebagai sinyal
Namun, supaya tidak jadi noise, saya hanya menampilkannya saat gagal
Contoh: <pre><code>» true » false (last command returned 1.)</code></pre>
Jika proses berakhir karena signal, itu juga saya tampilkan dalam bentuk terjemahan seperti "last command exited on SIGSEGV"
Sebaliknya, ini juga berguna saat ada program yang mengeluarkan pesan error tetapi tetap selesai dengan kode sukses
Sebagai pengguna "very senior" dengan pengalaman UNIX puluhan tahun, saya suka mode minimal Starship karena rapi
Dulu saya sempat bersusah payah bertahun-tahun dengan berbagai setup zsh, tetapi sekarang hampir tidak ada repotnya
Kalau ada yang menduga semua pengguna Starship adalah generasi baru yang menjejalkan emoji dari JavaScript, saya ingin bilang bahwa pengguna seperti saya juga ada
Kalau dilihat lebih luas, ini fenomena yang berlaku untuk seluruh lingkungan komputasi
Waktu muda, saya sibuk membuat OS sendiri dengan Gentoo, mengutak-atik flag optimasi CPU, window manager, alias dan fungsi di bashrc, sampai prompt
Pekerjaan optimasi seperti ini sendiri sebenarnya pengalaman yang cukup membantu dalam proses berkembang
Kalau dianalogikan dengan pertukangan kayu, saat masih pemula kita menghabiskan sebagian besar waktu membuat dan menyempurnakan tool atau trik-trik kecil, tetapi pada suatu titik fokus bergeser ke pekerjaan nyata
Saya masih suka Linux sampai sekarang, tetapi di tengah kesibukan hidup, saya memprioritaskan “pekerjaan” daripada mengejar efisiensi atau kesempurnaan, jadi saya cukup memakai lingkungan default Debian dan KDE
Saya tidak suka dekorasi yang tidak perlu atau informasi berlebihan, jadi saya lebih suka lingkungan terminal yang minimalis
Namun, Starship cukup bagus dalam menampilkan konteks yang relevan saat diperlukan, dan bisa dikustomisasi dengan sangat rinci
Prompt default saya hanya menampilkan direktori saat ini, waktu, dan satu tanda %
Jika variabel lingkungan tertentu ditetapkan (KUBECONFIG, OS_CLOUD, dll.), maka informasi terkait juga ikut ditampilkan
Versi bahasa seperti Go dan Python juga otomatis muncul sesuai konteks pemakaian
Starship membuat setup seperti ini jadi sangat mudah, dan semua itu berjalan dengan overhead minimum tanpa perlu konfigurasi plugin zsh yang rumit
Terutama jika dipakai bersama evalcache, kecepatan inisialisasinya juga sangat tinggi
Sebagai penggemar Starship, ada beberapa komentar
Fakta bahwa ia dikembangkan dengan Rust yang aman dan cepat, serta berupa binary terkompilasi, membuat performanya jauh lebih baik daripada powerline berbasis Python, ohmybash berbasis shell script, ohmyzsh berbasis zshell, atau spaceship
Sudah tentu mendukung zsh, bash, sh, fish, dan juga MS Windows CMD serta Powershell
Memiliki satu file config tunggal untuk mengelola prompt di semua sistem adalah sesuatu yang hampir unik
Kalau informasinya terasa terlalu banyak, itu bisa dengan mudah disederhanakan, dan ikon juga bisa dinonaktifkan
Dengan sekitar 100 modul, batas kustomisasinya nyaris tidak ada
Saya tidak mengerti kenapa Starship dipasarkan sebagai sesuatu yang “minimal”
<pre><code>: ▶</code></pre>Kenyataannya, fiturnya sangat banyak, dan dari cara orang memakainya juga sering terlihat sebagai prompt raksasa penuh dekorasi
Saya sendiri memakainya sesederhana ini
Kalau benar-benar ingin minimal, sebenarnya tidak perlu framework kustomisasi seperti ini
Dibandingkan shell dan prompt lain, file konfigurasi Starship punya kelebihan karena tetap cukup intuitif meski kompleksitasnya meningkat
Semua fitur bisa dinonaktifkan
<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>Saat ini saya memakai konfigurasi minimal yang kurang lebih seperti ini
Starship pada akhirnya memang bisa dipakai secara minimal, tetapi pada dasarnya ia adalah prompt maksimalis yang dirancang untuk memuat sebanyak mungkin informasi dan konten
Rasanya akan baik kalau hal ini diakui saja
Saya memakai panah yang bahkan lebih tipis dari itu
<pre><code>PROMPT='%{%F{red}%}%~ %{%F{yellow}%}% › %{%F{reset_color}%}%'</code></pre>Bersih, simpel, dan minimal
Saya heran melihat respons yang mencampuradukkan sifat bisa dikustomisasi dengan maksimalisme
Default-nya memang agak berlebihan, tetapi itu bisa dipangkas sebanyak yang diinginkan
Saya bekerja di berbagai lingkungan AWS dan beragam runtime, jadi informasi konteks di prompt benar-benar sangat membantu
Secara pribadi, saya sudah lama terus memakai kombinasi Starship + Nushell
Saya suka karena cukup instal sekali lalu tidak perlu disentuh lagi
Saya ingin langsung bisa melihat apakah shell sedang memakai node 20 atau 22, dan apakah rust yang aktif adalah stable atau nightly
Karena semua itu langsung ditampilkan tanpa pekerjaan tambahan, saya puas
Terlepas dari Starship, ada hal yang mengganggu pada prompt zsh: saat menekan Enter, kursor sesaat bergerak ke awal baris dan terjadi “flash”
Pada prompt yang ultra-fast hal ini tidak terlalu terlihat, tetapi jika prompt melakukan sesuatu sekecil apa pun, gejala ini sangat jelas
Saya mengamati hal yang sama di berbagai terminal (gnome-terminal, wezterm, kitty, alacritty, xterm)
Satu-satunya terminal yang tidak mengalami masalah ini adalah urxvt
Lihat rekaman reproduksi
Saya penasaran apa penyebab fenomena flash ini dan bagaimana cara menghindarinya
Jika prompt memeriksa informasi tak berguna seperti git status setiap kali dirender, misalnya tiap 100ms, itu akan menimbulkan penurunan produktivitas yang tidak terlihat
Terminal seharusnya menjadi alat memori responsif, dan sebaiknya tidak berubah menjadi dekorasi yang tidak perlu
Masalahnya, kita memperhatikan optimasi kecepatan eksekusi kode, tetapi terlalu permisif terhadap latency saat mengetik sendiri
Starship benar-benar cepat
Mengumpulkan data yang diperlukan hanya butuh beberapa ms saja, dan kita bisa dengan mudah mengontrol informasi apa yang akan diambil
Di tool lain yang pernah saya coba, delay yang terasa panjang selalu mengganggu, tetapi saat memakai Starship, perbedaannya sangat terasa secara subjektif
100ms yang dirasakan manusia dan 100ms dalam optimasi CPU adalah dua hal yang sama sekali berbeda
Menurut saya, kalau prompt butuh 100ms untuk menampilkan branch atau status git, itu memunculkan pertanyaan: mana yang lebih penting untuk dioptimalkan, gangguan terhadap flow kerja atau waktu yang memang saya habiskan untuk mengetik perintah?
Beberapa ms yang dipakai untuk fitur kenyamanan yang wajar masih sangat layak ditoleransi
Pada akhirnya, kita hanya mencari titik seimbang antara kenyamanan dan minimalisme
Minimalisme ekstrem maupun dekorasi berlebihan sama-sama bisa berujung pada inefisiensi
Karena terganggu oleh delay seperti ini, saya mem-patch terminal kitty agar prompt Starship dipindahkan ke status bar bawah seperti modeline di vim atau emacs
Modeline diperbarui secara asinkron, sehingga respons prompt menjadi sangat cepat
Kelemahannya, saya harus mem-patch kitty sendiri, dan saya belum sempat mengujinya di luar lingkungan Linux pribadi saya
Lihat proyek patch terkait
Saya penasaran apakah tool prompt bisa bekerja seperti TUI, yaitu memodifikasi area prompt secara asinkron setelah output prompt selesai dikembalikan sepenuhnya (misalnya kubectl, git, aws cli menambahkan informasi lagi setelah 200ms)
Dengan begitu, pengguna bisa langsung mengetik perintah berikutnya tanpa menunggu, sementara informasi tambahan muncul belakangan secara alami
Saya jadi berpikir, dibanding optimasi eksekusi kode, mungkin justru makin banyaknya layer yang digunakan membuat optimasi latency input pada prompt jadi lebih sulit dalam praktik
Saat membuka situs resminya, saya merasa kurang ada penjelasan yang jelas tentang kenapa orang perlu memakai Starship
<pre><code>- hasil perintah terakhir (warna: hijau, merah, ungu)Kustomisasi prompt saya belakangan ini menampilkan informasi berikut dalam sekali lihat
Jika perintah terakhir berhasil, tampil hijau; jika gagal, merah; jika dihentikan, ungu
Saya mungkin termasuk target user mereka, tetapi dari homepage-nya saya tidak mendapatkan penjelasan yang jelas tentang "mengapa" harus memakainya dan peningkatan apa yang ditawarkan