Όμορφα command prompts με το starship

Στις μέρες μας κάθε σοβαρός χρήστης του τερματικού :terminal: θα φτιάξει ένα prompt είτε λειτουργικό είτε εφετζίδικο, και σε κάποιες σπάνιες περιπτώσεις και τα δύο. Για πολύ καιρό με είχε βολέψει το zsh με τα έτοιμα themes του. Αλλά υπάρχει ένα μικρό πρόβλημα: Είναι διαβολεμένα αργό.

Οι υπάρχουσες λύσεις είτε θα χρησιμοποιούν την ίδια την γλώσσα του shell είτε όπως στην περίπτωση του powerline γραμμένα σε Python :python:. Καθόλου ελκυστικές λύσεις ειδικά εφόσον υπάρχει το starship που είναι ταχύτατο και γραμμένο στην γλώσσα Rust :rust: .

Εγκατάσταση γραμματοσειρών

Για να το αξιοποιήσουμε πλήρως θα πρέπει πρώτα να εγκαταστήσουμε ένα κατάλληλο font που να περιέχει αυτά τα όμορφα χρωματιστά εικονίδια (η εικόνα τα αδικεί) .

Θα πάμε στο NerdFonts και θα κατεβάσουμε την αγαπημένη μας γραμματοσειρά. Δοκιμάστε την “Fira Code Nerd” που έχει και ωραίες λιγκλατούρες. Θα φτιάξουμε ένα φάκελλο

mkdir -p ~/.local/share/fonts/FiraCodeNerd

και θα εγκαταστήσουμε εκεί τα αρχεία των γραμματοσειρών. Στο συμπιεσμένο φάκελο υπάρχουν πολλές εκδόσεις της γραμματοσειράς και καλό είναι να βάλουμε μόνο τα βάρη που χρειαζόμαστε. Εναλλακτικά τα αποσυμπιέζουμε εκεί όλα, σβήνουμε τις γραμματοσειρές *.ttf καθώς και όσες έχουν μέσα την λέξη Windows.

Στα αποθετήρια των διανομών θα βρούμε το απλό Fira Code που δεν περιέχει τα επιπλέον σύμβολα.

Μετά θα ρυθμίσουμε το τερματικό να χρησιμοποιεί αυτήν την γραμματοσειρά.

Εγκατάσταση του starship

Αν έχουμε εγκατεστημένη την γλώσσα Rust :rust: θα δώσουμε την εντολή

cargo install starship

διαφορετικά

 curl -fsSL https://starship.rs/install.sh | bash

Στην συνέχεια ανάλογα με το shell θα προσθέσουμε στο τέλος του κατάλληλου αρχείου αρχείου μια γραμμή

# Bash, αρχείο ~/.bashrc
eval "$(starship init bash)"

# Fish, αρχείο ~/.config/fish/config.fish
starship init fish | source

# Zsh, αρχείο ~/.zshrc
eval "$(starship init zsh)"

Ανοίγουμε ένα τερματικό και έχουμε ένα όμορφο και γρήγορο prompt.

Ρύθμιση

Θέλω να αλλάξω λίγα πράγματα. Το πρώτο είναι πως έχοντας όλα τα κελύφη την ίδια όψη, δεν ξέρεις πλέον σε ποιο είσαι. Επίσης το θέλω λίγο ποιο μαζεμένο σε μια γραμμή.
Για το πρώτο θέμα θα χρειαστώ ένα μικρό αρχείο, που θα το βάλω στο ~/.local/bin/starship_check_shell.sh με τα παρακάτω

#!/usr/bin/env bash

shell=${1:-bash}

if [ "$STARSHIP_SHELL" == "${shell}" ]
then
    echo true
else
    exit 1
fi

και θα το κάνω εκτελέσιμο

chmod +x ~/.local/bin/starship_check_shell.sh

Στην συνέχεια θα φτιάξω ένα αρχείο ~/.config/starship.toml με τα παρακάτω

# ~/.config/starship.toml

# Don't print a new line at the start of the prompt
add_newline = false

# One one Line
[line_break]
disabled = true

# Show Shell
[custom.zsh]
command = "echo 🚀"
when = "~/.local/bin/starship_check_shell.sh zsh"
prefix = ""

[custom.fish]
command = "echo 🐟"
when = "~/.local/bin/starship_check_shell.sh fish"
prefix = ""

[custom.bash]
command = "echo "
when = "~/.local/bin/starship_check_shell.sh bash"
prefix = ""

[git_branch]
symbol = "🌱 "

Κάποια σύμβολα ίσως δεν τα δεις σωστά, γιατί δεν έχεις την κατάλληλη γραμματοσειρά στον υπολογιστή σου. Κάνε μια αντιγραφή και θα είσαι εντάξει, ή διάλεξε από την γραμματοσειρά όποιο σύμβολο σου αρέσει.

Ένας διαφορετικός τρόπος

Μια άλλη λύση, αν θέλεις διαφορετικά prompts είναι να φτιάξεις πολλά αρχεία ρυθμίσεων. Αντί για τις custom εντολές φτιάξε για κάθε κέλυφος ένα αρχείο που θα περιέχει τα εξής

# ~/.config/starship_zsh.toml
[character]
symbol="🚀 ❯"

και στο .zshrc θα βάλουμε

export STARSHIP_CONFIG=~/.config/starship_zsh.toml
eval "$(starship init zsh)"

Αλλάζοντας την σειρά εμφάνισης

Αυτό θα γίνει με μια γραμμή σαν την παρακάτω:

prompt_order=["rust","line_break","package","line_break","character"]

Αυτό θα απενεργοποιήσει οτιδήποτε δεν δηλώνετε ρητά. Μέτρησα ~40 διαφορετικά modules. Κανονικά θα έβαζα μόνο αυτά που μου είναι χρήσιμα, αλλά είναι τόσο γρήγορο που δεν αξίζει τον κόπο. Είναι καλύτερα να απενεργοποιήσει απλά τα ενοχλητικά, όπως έκανα με το line_break

Περισσότερες αλλαγές

Μπορούμε να αλλάξουμε πολλ´ες παραμέτρους σε κάθε module καθώς και τα χρώματα. Στον παρακάτω σύνδεσμο θα βρούμε όλλα τα modules με παραδείγματα για το καθένα:

Μοιραστείτε το prompt σας

Το starship είναι ενα νέο εργο και δεν θα βρείς ακόμα έτοιμα setup ή αντίστοιχα άρθρα. Ας μοιραστούμε λοιπόν εδώ ότι φτιάξαμε. Το δικό μου prompt με zsh μοιάζει με

image

5 «Μου αρέσει»

Στην τελευταία έκδοση έχουν αλλάξει τα αρχείο ρυθμίσεων. Επίσης υπάρχει αυτόματη ανίχνευση του Shell και δεν θέλει τις παραπάνω ταρζανίες, αλλά θέλει να ενεργοποιηθεί. Χωρίς πολλά λόγια το αρχείο ρυθμίσεων που χρησιμοποιώ, έχω αφαιρέσει ότι module δεν χρησιμοποιώ τώρα. Τροποποιήστε ανάλογα.

# Inserts a blank line between shell prompts
add_newline = false
continuation_prompt = "▶▶"

format = """\
  $cmd_duration\
  $shell\
  $status\
  $sudo\
  $directory\
  $git_branch\
  $git_commit\
  $git_state\
  $git_status\
  $rust\
  $character\
"""

# Replace the "❯" symbol in the prompt with "➜"
[character] 
success_symbol = "[❯](bold green)"
error_symbol = "[✗](bold red) "

[cmd_duration]
min_time = 5_000

[directory]
truncation_length = 4
truncation_symbol = "…/"
home_symbol=" "
repo_root_style="blue underline"
style="blue"

# One one Line
[line_break]
disabled = true

[dotnet]
disabled = true

[status]
disabled = false

[sudo]
disabled = false

[shell]
disabled = false
bash_indicator = " "
zsh_indicator = "🚀 "
format="[$indicator](bold green)"

Δείγμα

2 «Μου αρέσει»

3 χρόνια με starship και δεν το αλλάζω με τίποτα.

Θα το δω το conf σου

1 «Μου αρέσει»

Μια χαρά είναι το config σου !

Όπως σου είπα και αλλού, εγώ το συνδυάζω με Kitty :slight_smile:

2 «Μου αρέσει»

Νέες δυνατότητες: Presets

image

Με την εντολή:

starship preset -l

θα δούμε κάποια έτοιμα configs

pastel-powerline
no-runtime-versions
bracketed-segments
plain-text-symbols
pure-preset
nerd-font-symbols

Μπορούμε να εφαρμόσουμε ένα με την εντολή:

starship preset <όνομα> > ~/.config/starship.toml

Εντολή: starship explain

Χρήσιμο να δεις ακριβώς τι σημαίνει κάθε σύμβολο

1 «Μου αρέσει»

Το δοκιμασα για λίγο καιρό. Μεγάλο παράπονο και λόγος που το έβγαλα ήταν ότι έσπαγε σε κάθε resize. Δεν ξέρω αν το φτιαξαν πάντως πλέον χρησιμοποιώ ohmyzsh με ένα από τα default themes που εχει

1 «Μου αρέσει»

Το χρησιμοποιώ πάνω από 2 χρόνια και ποτέ δεν έβγαλε πρόβλημα.

Έχεις prompt και αριστερά και δεξιά;
To κάνει σε όλους τους terminal emulators;

Ναι αλλά δεν είχε σχέση, ούτε το τερμιναλ έπαιζε ρολο, (που σιγά μην αλλάξω τέρμιναλ για το prompt) ήταν καταγεγραμμένο bug στο repo τους. Νομίζω είχε να κάνει με την ανάλυση οθόνης κάτι χάλαγε στον υπολογισμό στο resize, μπορεί να ειμαι και εντελώς λάθος. Δεν λέω ωραίο ήταν στο μάτι, αλλα πλέον επείδη σχεδόν όλα τα popular distros κάνουν customies που μπορεί να χαλάσουν plugins και διάφορα άλλα, κρατάω τα πάντα όσο πιο vanilla & default γίνεται. Για να μην έχω ο ίδιος dependencies. Απο περιβάλλον σε περιβάλλον και λειτουργικό σε λειτουργικό.

4 «Μου αρέσει»

ναι αλλά ποιο σοβαρό είναι το terminator. Lemme show a prooof:

1 παράθυρο 4 τερματικά.

You’re welcome.

1 «Μου αρέσει»

Νομίζω οτι μπέρδεψες το prompt με το terminal :stuck_out_tongue: