Στον σημερινό οδηγό, θα σετάρουμε το τερματικό Kitty με ZSH και Starship Prompt μαζί με κάποια εξτραδάκια που θα απογειώσουν την παραγωγικότητα στο τερματικό μας.

Εάν χρησιμοποιείτε τερματικό καθημερινά, για λόγους επαγγελματικούς, προσωπικούς ή λόγο αυτών που έχουμε αναφέρει στο άρθρο Τερματικό του Linux: Γιατί υπάρχει ακόμα και σήμερα, το μόνο σίγουρο είναι ότι έχετε πειράξει, έστω και λίγο, τις ρυθμίσεις του τερματικού σας για να το φέρετε στα μέτρα σας.

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

  • Kitty terminal (προαιρετικό)
  • FiraCode Nerd Fonts
  • Starship Prompt
  • ZSH με Plugins όπως
    – Syntax Highlighting
    – Completion plugin
    – Autosuggestions plugin
    – Commands history config

Χρήση του Kitty τερματικού (προαιρετικό)

Προαιρετικά μπορείτε να δοκιμάσετε το kitty το οποίο εδώ και μερικούς μήνες έχει γίνει το μοναδικό τερματικό που χρησιμοποιώ. Αν δεν θέλετε μπορείτε να πάτε στο επόμενο βήμα.

Το Kitty είναι ένα τερματικό περιβάλλον που τρέχει απευθείας στην κάρτα γραφικών, είναι λυτό, καθαρό, επεκτάσιμο και ιδιαίτερα πληκτρολογιο-κεντρικό. Έχει τι ίδιες ιδιότητες με ένα «ανταγωνιστικό» τερματικό που είχαμε δει παλιότερα ονόματι Alacritty.

Παρότι το Alacritty είναι εξαιρετικό τερματικό, το μεγάλο μειονέκτημα του είναι ότι μέχρι στιγμής δεν υποστηρίζει ligatures («συμπλέγματα») που είναι ιδιαίτερα βολικά όταν διαβάζουμε κώδικα στο τερματικό.

Το kitty είναι διαθέσιμο για Linux και macOS και μπορείτε να το κατεβάσετε από τα αποθετήρια ή από την επίσημη σελίδα του:

Αφού το κάνετε εγκατάσταση, καλό είναι να μάθετε τα πλήκτρα συντόμευσης που διαθέτει. Ενδεικτικά αυτά που χρησιμοποιώ συχνά είναι:

Νέο Tabctrl+shift+t ( ⌘+t στο macOS)
Νέο εσωτερικό παράθυροctrl+shift+enter ( ⌘+↩ στο macOS)
Νέο εξωτερικό παράθυροctrl+shift+n ( ⌘+n στο macOS)
Αλλαγή διάταξης εσ. παραθύρωνctrl+shift+l
Κλείσιμο εσ. παραθύρουctrl+shift+w ( ⇧+⌘+d στο macOS)

Περισσότερα μπορείτε να δείτε στην επίσημη τεκμηρίωση του.

Ρύθμιση του Kitty

Όλες οι ρυθμίσεις του Kitty γίνονται από το kitty.conf αρχείο το οποίο βρίσκεται στο ~/.config/kitty/kitty.conf. Εναλλακτικά μπορείτε να το επεξεργαστείτε απευθείας από το kitty με την συντόμευση ctrl+shift+f2

Kitty και SSH

Σε περίπτωση που συνδεθείτε σε SSH server με το kitty και λάβετε ένα σφάλμα : open terminal failed: missing or unsuitable terminal: xterm-kitty

Τότε αποσυνδεθείτε από το SSH και για μια και μόνο φορά συνδεθείτε στον ssh σας με τον παρακάτω τρόπο:

$ kitty +kitten ssh user@o-ssh-server-mou

Dracula Theme for Kitty (προαιρετικό)

Επειδή κοιτάω αρκετές ώρες ένα παράθυρο τερματικού, θέλω να έχει και όμορφα χρώματα και ξεκούραστη απόχρωση. Για αυτό τον λόγο χρησιμοποιώ το dracula theme για kitty:

Πρώτα το κατεβάζετε από το το αποθετήριο του:

Στην συνέχεια το αποσυμπιέζετε και μεταφέρετε το dracula.conf και το diff.conf στον φάκελο ρυθμίσεων του kitty

$ cp dracula.conf diff.conf ~/.config/kitty/
$ echo "include dracula.conf" >> ~/.config/kitty/kitty.conf

Έπειτα κλείστε και ανοίξτε πάλι το kitty. Διαβάστε περισσότερα για το Dracula Theme.

FiraCode Nerd fonts

Για να μπορέσουμε να έχουμε πέρα από απλά μια όμορφη γραμματοσειρά (σχεδιασμένη για τερματικό και κώδικα), αλλά και υποστήριξη για ligatures – glyphs που είναι απαραίτητα για το starship που θα βάλουμε σε λίγο, θα χρειαστεί να βάλουμε μια συμβατή γραμματοσειρά.

Μια από της καλύτερες είναι η FiraCode με Nerd Patches. Να σημειώσουμε ότι οι διανομές στα αποθετήρια τους έχουν το απλό Fira Code που δεν περιέχει τα σύμβολα και τα συμπλέγματα που χρειαζόμαστε.

Άρα θα πρέπει να κατεβάσουμε τα Fira Code που έχουν «patch’αριστεί» με τα Nerd Fonts με τις παρακάτω εντολές

$ cd /tmp
$ wget https://github.com/ryanoasis/nerd-fonts/releases/download/v2.1.0/FiraCode.zip
$ unzip FiraCode.zip -d ~/.local/share/fonts/FiraCodeNerd
$ fc-cache -fv

Με τις παραπάνω εντολές, κατεβάζουμε το FiraCode, το αποσυμπιέζουμε στον φάκελο fonts του λογαριασμού μας και τέλος ενημερώνουμε το σύστημα μας για την ύπαρξη των νέων fonts.

Ρύθμιση του τερματικού με FiraCode

Για να μπορέσετε να χρησιμοποιήσετε το FiraCode θα πρέπει να ενημερώσετε το τερματικό σας για να τα χρησιμοποιεί. Αν δεν χρησιμοποιείτε το Kitty, τότε θα πρέπει να δείτε στις ρυθμίσεις του δικού σας τερματικού. Αυτό φυσικά αλλάζει από τερματικό σε τερματικό μιας και έχουν το καθένα διαφορετικό μενού.

Στην δική μας περίπτωση επειδή το Kitty δεν έχει ένα μενού ρυθμίσεων, όλα γίνονται στο αρχείο ρυθμίσεων ~/.config/kitty/kitty.conf. Πολλές φορές όμως, ένα μικρό λάθος μπορεί να μας οδηγήσει σε π.χ. αγνόησή της γραμματοσειράς που ζητάμε να χρησιμοποιείται.

Για να δούμε ποια γραμματοσειρά φορτώνει το kitty όταν ανοίγει το ξεκινάμε με την παράμετρο --debug-font-fallback:

$ kitty --debug-font-fallback  
Preloaded font faces:
normal face: /usr/share/fonts/TTF/DejaVuSansMono.ttf:0
bold face: /usr/share/fonts/TTF/DejaVuSansMono-Bold.ttf:0
italic face: /usr/share/fonts/TTF/DejaVuSansMono-Oblique.ttf:0
bi face: /usr/share/fonts/TTF/DejaVuSansMono-BoldOblique.ttf:0

Βλέπουμε λοιπόν ότι στο σύστημά μου φορτώνει τα DejavuSansMono Fonts. Εμείς όμως θέλουμε τα Fira Code Nerd Fonts. Πως θα το αλλάξουμε αυτό;

Μπορούμε να μάθουμε τον τρόπο γραφής της παραμέτρου με την παρακάτω εντολή:

$ kitty + list-fonts --psnames | grep Fira
FiraCode Nerd Font
     Fira Code Bold Nerd Font Complete (FiraCodeNerdFontComplete-Bold)
     Fira Code Light Nerd Font Complete (FiraCodeNerdFontComplete-Light)
     Fira Code Medium Nerd Font Complete (FiraCodeNerdFontComplete-Medium)
     Fira Code Regular Nerd Font Complete (FiraCodeNerdFontComplete-Regular)
     Fira Code Retina Nerd Font Complete (FiraCodeNerdFontComplete-Retina)

Αυτό που μας εμφανίζει στην παρένθεση είναι η PostScript γραφή. Στην περίπτωση του Kitty απλά ανοίγετε το kitty.conf και το προσθέτετε στο αντίστοιχο πεδίο:

: Fonts {{{

font_family      FiraCodeNerdFontComplete-Regular
bold_font        FiraCodeNerdFontComplete-Bold
italic_font      auto
bold_italic_font auto

Αφού κλείσουμε και ανοίξουμε πάλι το kitty με την παρακάτω εντολή θα δούμε ότι έχει φορτώσει την γραμματοσειρά που ζητήσαμε:

$ kitty --debug-font-fallback  
Preloaded font faces:
normal face: ~/.local/share/fonts/FiraCodeNerd/Fira Code Regular Nerd Font Complete.ttf:0
bold face: ~/.local/share/fonts/FiraCodeNerd/Fira Code Bold Nerd Font Complete.ttf:0
italic face: ~/.local/share/fonts/FiraCodeNerd/Fira Code Regular Nerd Font Complete.ttf:0
bi face: ~/.local/share/fonts/FiraCodeNerd/Fira Code Regular Nerd Font Complete.ttf:0

Περισσότερα για τα fonts δείτε στην τεκμηρίωση του Kitty

Αν θέλετε κάτι έτοιμο μπορείτε να χρησιμοποιήσετε τα δικά μου με τις παρακάτω εντολές:

$ cd ~/.config/kitty/
$ wget https://raw.githubusercontent.com/cerebrux/.dotfiles/master/.config/kitty/diff.conf
$ wget https://raw.githubusercontent.com/cerebrux/.dotfiles/master/.config/kitty/dracula.conf
$ wget https://raw.githubusercontent.com/cerebrux/.dotfiles/master/.config/kitty/kitty.conf

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

Σειρά έχει η εγκατάσταση του Starship.

Το Starship «κάθεται» πάνω στο ZSH (που θα εγκαταστήσουμε στην συνέχεια) και παρέχει στην γραμμή εντολών κάποιες χρήσιμες πληροφορίες τις οποίες μπορούμε να παραμετροποιήσουμε σύμφωνα με τις ανάγκες μας.

Για να το εγκαταστήσουμε τρέχουμε την παρακάτω εντολή:

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

Στην συνέχεια, για να ξεκινάει αυτόματα με κάθε άνοιγμα ενός τερματικού το βάζουμε στις ρυθμίσεις του κελύφους μας:

echo 'eval "$(starship init bash)"' >> ~/.bashrc

Η παραπάνω εντολή θα προσθέσει την γραμμή eval "$(starship init bash)" στο τέλος του αρχείου ρυθμίσεων του bash. Το ίδιο θα κάνουμε αργότερα και στο ZSH.

Ρυθμίσεις του straship prompt

Οι default ρυθμίσεις που έχει το startship prompt είναι μια χαρά και δεν χρειάζεται να κάνετε τίποτα. Αν όμως θέλετε να του αλλάξετε τα φώτα τότε μπορείτε να δείτε την επίσημη τεκμηρίωση απο την οποία μπορείτε να «κλέψετε» ρυθμίσεις. Επίσης μπορείτε να ψάξετε και στο internet για έτοιμες ρυθμίσεις και να της χρησιμοποιείσετε.

Γενικά, θα βρείτε αρκετό κόσμο να έχει δημιουργήσει έτοιμα starship.toml τα οποία μπορείτε να βάλετε στο αρχείο ρυθμίσεων του starship στην διαδρομή ~/.config/starship.toml

Μπορείτε φυσικά να «κλέψετε» το δικό μου:

$ cd ~/.config
$ wget https://raw.githubusercontent.com/cerebrux/.dotfiles/master/.config/starship.toml

Οι λίστα με τις διαθέσιμες ρυθμίσεις είναι στην επίσημη τεκμηρίωση.

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

Παράδειγμα, ως χρήστης του git μου είναι χρήσιμο να βλέπω σε ποιο branch είμαι και πόσες αλλαγές έχουν γίνει.

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

Το Zsh μπορεί να θεωρηθεί ένα επεκτεταμένο κέλυφος Bash με αρκετές βελτιώσεις, περιλαμβάνοντας μεταξύ άλλων χαρακτηριστικά του bash, του ksh, και του tcsh.

Tο zshell είναι πλήρως συμβατό με το bash και είναι ένα κέλυφος που θα κάνει την καθημερινότητα σας απλούστερη ενώ ταυτόχρονα εμπλουτίζεται η αποδοτικότητα σας με την προσθήκη plugins για διάφορες εργασίες όπως π.χ. το syntax highlighting (ποτέ δεν θα ξαναγράψετε λάθος εντολή).

Το ZSH είναι διαθέσιμο σε όλες τις διανομές Linux μέσω των αποθετηρίων της διανομής σας. Π.χ. σε Debian/Ubuntu:

sudo apt install zsh

Όπως και να το κάνετε εγκατάσταση, θα πρέπει τώρα να ενημερώσετε το σύστημα ότι ο λογαριασμός σας θα χρησιμοποιεί ZSH αντί του bash:

chsh -s /bin/zsh

Κάνουμε logout από το λογαριασμό μας και ξανά login. Την πρώτη φορά που θα ανοίξετε τον τερματικό σας, θα σας ρωτήσει να διαλέξετε τις ρυθμίσεις για το ZSH. Επιλέξτε τα default που σας δίνει.

Αφού έχετε εγκαταστήσει και το starship, θα πρέπει να ενημερώσουμε το .zshrc

echo 'eval "$(starship init zsh)"' >> ~/.zshrc

Είναι πολύ σημαντικό να διατηρήσετε το eval "$(starship init zsh)" στο τέλος του .zshrc γιατί σε διαφορετική περίπτωση μπορεί το starship να μην φορτώσει.

Ρύθμιση του ZSH

Φυσικά, στο διαδίκτυο θα βρείτε διάφορα «κολπάκια» που μπορείτε να προσθέσετε στο ~/.zshrc αρχείο σας όπου αποθηκεύονται οι διάφορες ρυθμίσει του ZSH.

Ένα από τα ποιο δημοφιλή είναι το oh-my-zsh που είχαμε αναλύσει στο άρθρο : Pimp my shell : αντικαταστήστε το bash με το zsh και αναβαθμίστε την εμφάνιση του.

Εμείς όμως θα πάρουμε τα πιo χρήσιμα στοιχεία του, χωρίς όλο το «βάρος» που κουβαλάει το oh-my-zsh

Zsh Syntax Highlighting

Πάμε να εγκαταστήσουμε ένα από τα πιο χρήσιμα plugins του ZSH. Θα δημιουργήσουμε έναν κρυφό φάκελο στον οποίο θα κατεβάσουμε το plugin

$ mkdir ~/.zsh
$ cd ~/.zsh
$ git clone https://github.com/zdharma/fast-syntax-highlighting.git
$ echo "source $HOME/.zsh/fast-syntax-highlighting/fast-syntax-highlighting.plugin.zsh" >> ~/.zshrc
$ source ~/.zshrc

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

Zsh Completion plugin

Στην συνέχεια θα προσθέσουμε ένα completion plugin το οποίο όταν πατάμε tab θα μας εμφανίζει τις διαθέσιμες επιλογές

$ cd ~/.zsh 
$ wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/lib/completion.zsh
$ echo "source $HOME/.zsh/completion.zsh" >> ~/.zshrc

Επιπλέον, αυτή τη φορά πρέπει να προσθέσουμε μερικές ακόμη γραμμές στο αρχείο ~/.zshrc:

source $HOME/.zsh/completion.zsh
autoload -Uz compinit
# Cache completion if nothing changed - faster startup time

typeset -i updated_at=$(date +'%j' -r ~/.zcompdump 2>/dev/null || stat -f '%Sm' -t '%j' ~/.zcompdump 2>/dev/null)
if [ $(date +'%j') != $updated_at ]; then
 compinit -i
else
 compinit -C -i
fi

zmodload -i zsh/complist

Φυσικά αγνοείστε τις όποιες γραμμές από τον πάνω κώδικα, που υπάρχουν ήδη στο δικό σας ~/.zshrc

Αφού κλείστε και ξεκινήσετε ξανά το τερματικό σας, θα μπορείτε να γραφετε μια εντολή ή διαδρομή και να πατάτε tab για να δείτε τί έχετε απο διαθέσιμες επιλογές.

Zsh Autosuggestions plugin

Αυτό το plugin είναι ένα από τα πιο χρήσιμα που έχω συναντήσει. Αυτό που παρέχει είναι μια υπενθύμιση της προηγούμενης εντολής που είχατε πληκτρολογήσει όταν ξεκινάτε να το πληκτρολογείτε ξανά.

Με άλλα λόγια, όταν πάτε να μετακινηθείτε σε έναν φάκελο, το zsh θα σας εμφανίσει δυναμικά την ίδια ή παρόμοια εντολή που είχατε εκτελέσει την τελευταία φορά. Έτσι αν είναι να γράψετε την ίδια εντολή, μπορείτε απλά να πατήσετε το δεξί βελάκι στο πληκτρολόγιο για να σας το συμπληρώσει αυτόματα.

Ας το εγκαταστήσουμε:

$ cd ~/.zsh
$ git clone https://github.com/zsh-users/zsh-autosuggestions.git
$ echo "source $HOME/.zsh/zsh-autosuggestions/zsh-autosuggestions.zsh" >> ~/.zshrc
$ source ~/.zshrc

Λειτουργεί πολύ απλά προτείνοντας με «αχνή» γραμματοσειρά το υπόλοιπο της σύνταξης της εντολής και μπορείτε να χρησιμοποιήσετε τα βελάκια για να αποδεχτείτε την προτεινόμενη εντολή.

Commands history plugin

Πάλι, πρόκειται να χρησιμοποιήσουμε μια έτοιμη διαμόρφωση από το oh-my-zsh :

$ cd ~/.zsh
$ wget https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/lib/history.zsh
$ echo "source $HOME/.zsh/history.zsh" >> ~/.zshrc
$ source ~/.zshrc

Τώρα, χρησιμοποιώντας το βελάκι προς τα πάνω μπορούμε να επιστρέψουμε στις προηγούμενες εντολές μας. Μπορούμε επίσης να χρησιμοποιήσουμε την αναζήτηση προς τα πίσω χρησιμοποιώντας τον συνδυασμό πλήκτρων CTRL + R:

Επίλογος

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

Φυσικά αν δουλεύετε συχνά με απομακρυσμένο server μπορέιτε να το συνδυάσετε και με το Tmux όπως αναλύσαμε στον οδηγό Tmux | Μην χρησιμοποιείς τερματικό σε server χωρίς tmux.

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

Εάν έχετε να προτείνετε ορισμένα από τα εργαλεία για το τερματικό που χρησιμοποιείτε, ενημερώστε με στα σχόλια.