Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Smalltalk
Antworten
Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von mn77de » 31.12.2023 17:29:28

Als Ergänzung zum Adventskalender möchte ich noch meine ZSH-Konfiguration vorstellen.

Bitte seht diese als Work-In-Progress und korrigiert mich auch gerne. Ergänzungen und Verbesserungen sind auch willkommen.

Warum ZSH?
Ich habe lange Bash verwendet, da es eben als Standard eingerichtet ist. Da ich mir gerne Alternativen ansehe, bin ich u.a. über Debianfish gestolpert. Fish bietet viele Features wie z.B: Vorschläge, Syntax-Highlighting, usw. ...
... das ist halt schon irgendwie cool und will man dann halt auch. :lol:
Allerdings ist Fish nicht POSIX-Kompatibel. :roll: Und da ich nicht auf Liquidprompt verzichten will, bleibt somit nur die ZSH.

Die ZSH ist Posix-Kompatibel und bietet enorm viele Anpassungs- und Erweiterungsmöglichkeiten. So viele, .... dass man schon fast ein Studium dafür benötigt. 8O
Die Konfiguration ist in der Summe nicht gerade Trivial und erfordert etwas Einarbeitungszeit und Recherche.
Vielleicht kann dieser Post manchem etwas an Arbeit ersparen.

Install
Auf Liquidprompt wird hier nicht näher eingegangen, dies wurde bereits hier beschrieben:
viewtopic.php?t=188637

Erstmal die ZSH installieren:

Code: Alles auswählen

apt install zsh
Dann noch die benötigten Erweiterungen:

Code: Alles auswählen

apt install zsh-autosuggestions zsh-syntax-highlighting fizsh
Ja, wir bedienen uns kurzerhand bei der fizsh, das ist am einfachsten.

Und ein paar nützliche Tools:

Code: Alles auswählen

apt install liquidprompt autojump command-not-found lsd
Autopair
Auto-Pair fügt z.B. zu einer öffnenden Klammer automatisch eine schließende Klammer ein.
Eigentlich eine sehr praktische Sache.

Wir müssen uns die Datei allerdings von hier holen:
https://github.com/hlissner/zsh-autopai ... topair.zsh
Ich hab' die Datei unter /usr/local/share/zsh/autopair.zsh abgelegt.

Wichtig! Damit es mit MC und McEdit keine Probleme gibt, muss die Zeile 9 wie folgt geändert werden:

Code: Alles auswählen

AUTOPAIR_PAIRS=('`' '`' "'" "'" '"' '"' '{' '}' '[' ']' '(' ')')
ZSH-Abbr
Abbr ist eine Funktion, mit der sich ein langer Befehl als einfaches Kürzel schreiben lässt.
Z.B.: "ulb" statt "cd /usr/local/bin".
Dies lässt sich zwar auch mit "alias" erreichen, dies hier ist aber etwas praktischer.

Die Datei bekommen wir von hier:
https://github.com/olets/zsh-abbr/blob/ ... h-abbr.zsh
Bei mir liegt sie auch unter "/usr/local/share/zsh/"

Die Dokumentation befindet sich hier:
https://zsh-abbr.olets.dev/

Konfiguration
Generell wird ZSH über die ~/.zshrc konfiguriert.

Um hier nicht den Rahmen zu sprengen, liegt die Datei hier:
NoPaste-Eintrag42063
Ich habe möglichst viele Kommentare eingefügt.

Für globale Einstellungen gibt es übrigens noch die: /etc/zsh/zshrc

Aliase
Damit es keinen Fehler gibt, muss noch eine ~/.bash_aliases erzeugt werden.

Code: Alles auswählen

touch ~/.bash_aliases
Bei mir liegen dort sehr viele Aliase. Alternativ kann man den Eintrag aber auch löschen.

Testen
Wer mit Bash unterwegs ist, kann ZSH nun einfach testen: Komplett umstellen lässt sich mit:

Code: Alles auswählen

chsh -s /bin/zsh
Features
Sollte alles laufen, hat man z.B. die Möglichkeit eine Abkürzung zu definieren:

Code: Alles auswählen

abbr hw="echo 'hello world'"
Nun kann "hw" jederzeit verwendet werden.

Und nach einem ...

Code: Alles auswählen

cd /home/user/Desktop
... reicht dank Autojump zukünftig ein einfaches:

Code: Alles auswählen

j desk
Ach ja ... mein absoluter Favorit ist das direkte Ausführen der Vorschläge mit:

Code: Alles auswählen

Strg + Leertaste
:lol: :wink:

Ausblick
Bei mir ist das alles noch ein klein wenig komplexer. Nach vielen anderen Experimenten nutze ich mittlerweile /usr/local als git-Repo und lege die Konfigurationen zentral unter /usr/local/etc ab. Entsprechend wird dann darauf verlinkt. So kann ich die Einstellungen auf allen Rechnern gut synchron halten.
Zuletzt geändert von mn77de am 01.01.2024 14:42:01, insgesamt 1-mal geändert.
OpenSource! :THX:

dasebastian
Beiträge: 1907
Registriert: 12.07.2020 11:21:17

Re: Adventskalender-Nachtrag - ZSH

Beitrag von dasebastian » 01.01.2024 12:20:25

Sehr sehr cool!

Ich habe auch mal ein bisschen rumgetan damit, war dann aber zu faul/pragmatisch - kann man sehen, wie man will... :lol:

Könnte mir vorstellen, dass deine zshrc für Neueinsteiger ein guter Startpunkt ist, da steckt ja schon einiges an Arbeit drin. 8O

Linkst du selber rüber? :wink:

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender-Nachtrag - ZSH

Beitrag von mn77de » 01.01.2024 15:20:39

dasebastian hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 12:20:25
... da steckt ja schon einiges an Arbeit drin. 8O
Oh ja ... aber so etwas entwickelt sich über Wochen/Monate.
dasebastian hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 12:20:25
Linkst du selber rüber? :wink:
Schon geschehen 8)
OpenSource! :THX:

rodney
Beiträge: 338
Registriert: 09.12.2016 04:15:59

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von rodney » 01.01.2024 17:05:59

Gut verstaendliche Konfigurationsdatei. Danke.

Da ich aktuell meine Konfigurationsdateien (nicht nur zsh) ausmiste/update, haette ich da 2 Fragen zum bessren Verstaendnis deiner Konfiguration:

Die erste Frage betrifft Zeile 148:

Code: Alles auswählen

precmd() $funcstack[1]() echo -e "\e[38;5;236m$(x=$(stty size|cut -d' ' -f2); while [ $x -gt 1 ]; do echo -n '?'; let x=$x-1; done; echo)\e[0m"
Welchen Zweck erfuellt $funcstack[1]()?

Die zweite Frage betrifft Zeile 183:

Code: Alles auswählen

source ~/.bash_aliases
Welchen Bezug hat die alias-Datei ihrem Namen nach (~/.bash.aliases) zur bash-Shell?

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von mn77de » 01.01.2024 17:47:06

rodney hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:05:59
Gut verstaendliche Konfigurationsdatei. Danke.
Hallo @rodney, vielen Dank für das Feedback und freut mich wenn Dir mein Post weiterhilft.
rodney hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:05:59

Code: Alles auswählen

precmd() $funcstack[1]() echo -e "\e[38;5;236m$(x=$(stty size|cut -d' ' -f2); while [ $x -gt 1 ]; do echo -n '?'; let x=$x-1; done; echo)\e[0m"
Welchen Zweck erfuellt $funcstack[1]()?
Effektiv sorgt $funcstack[1] dafür, dass erst vor dem zweiten Prompt eine Trennlinie eingefügt wird und nicht gleich über dem ersten Prompt.
Ich finde die Trennlinie sinnvoll, es kann aber natürlich die Farbe angepasst oder die Trennlinie komplett gelöscht werden.
rodney hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:05:59

Code: Alles auswählen

source ~/.bash_aliases
Welchen Bezug hat die alias-Datei ihrem Namen nach (~/.bash.aliases) zur bash-Shell?
Soweit ich weiß (kann mich irren), ist dies die Standard-Datei für Aliase der Bash. Du kannst hier aber jede beliebige Datei einlesen.

:!: :!: :!:
Einen Fehler hab' ich mittlerweile gefunden!
Abbr löscht alle bindkeys zur Leertaste. Entsprechend müssen die Zeilen 40-42 (bindkey für autosuggest) unter Zeile 154 (source zsh-abbr) verschoben werden. Außer man verwendet eine andere Tastenkombination.
OpenSource! :THX:

uname
Beiträge: 12111
Registriert: 03.06.2008 09:33:02

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von uname » 01.01.2024 22:07:03

Bzgl. ZSH kann man sich auch mal die GRML-Konfiguration anschauen: https://grml.org/zsh

Mit GRML kamn man ZSH mal ausprobieren. Und bei X11 verwendet GRML den Window Manager Fluxbox.

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von mn77de » 01.01.2024 22:38:10

uname hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 22:07:03
Bzgl. ZSH kann man sich auch mal die GRML-Konfiguration anschauen: https://grml.org/zsh
GRML ist wirklich toll :THX:
Die ZSH-Konfiguration hab' ich mir schon angeschaut ... allerdings 3957 Zeilen 8O :roll: :lol:
https://github.com/grml/grml-etc-core/b ... /zsh/zshrc
OpenSource! :THX:

uname
Beiträge: 12111
Registriert: 03.06.2008 09:33:02

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von uname » 02.01.2024 09:10:49

Man kann ja GRML und auch deren ZSH-Konfiguration als Inspiration nutzen. Ein Großteil der Konfiguration sind wohl Funktionen. Ob man die alle braucht, weiß ich nicht.

Benutzeravatar
smutbert
Moderator
Beiträge: 8331
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von smutbert » 02.01.2024 10:03:11

unter Linux bestimmt nicht.
Ich habe gerade einen kurzen Blick riskiert und auf Anhieb Akkustatus/-warnfunktionen für openbsd, freebsd und darwin (MacOS?) gefunden, außerdem jede Menge Kommentare und Hilfetexte für einige der vielen Funktionen.

rodney
Beiträge: 338
Registriert: 09.12.2016 04:15:59

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von rodney » 02.01.2024 15:23:26

@mn77de
mn77de hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:47:06
rodney hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:05:59
Gut verstaendliche Konfigurationsdatei. Danke.
Hallo @rodney, vielen Dank für das Feedback und freut mich wenn Dir mein Post weiterhilft.
rodney hat geschrieben: ↑ zum Beitrag ↑
01.01.2024 17:05:59

Code: Alles auswählen

precmd() $funcstack[1]() echo -e "\e[38;5;236m$(x=$(stty size|cut -d' ' -f2); while [ $x -gt 1 ]; do echo -n '?'; let x=$x-1; done; echo)\e[0m"
Welchen Zweck erfuellt $funcstack[1]()?
Effektiv sorgt $funcstack[1] dafür, dass erst vor dem zweiten Prompt eine Trennlinie eingefügt wird und nicht gleich über dem ersten Prompt.
Ich finde die Trennlinie sinnvoll, es kann aber natürlich die Farbe angepasst oder die Trennlinie komplett gelöscht werden.
Haettest du mal je einen Screenshot (einmal mit und einmal ohne $funcstack[1]()). Bei mir sehe ich da keinen Unterschied. Mit zweitem Prompt meinst du $PROMT2? Das mit der Trennline ist soweit klar, ich sehe bei mir halt nur keinen Unterschied, koennte aber auch an meinem Prompt liegen:

@all

Bezueglich der zshrc von grml:

Leider zu gross und will es allen recht machen. Ist fuer eine Live-Distribution sehr angenehm konfiguriert. Tastenkombinationen stecken teilweise in Arrays und werden unter Zuhilfenahme von 2 Funktionen zu der Tastenkombination und einer weiteren Funktion zur Ausgabe der spezifischen Hilfe. Zudem ist sehr viel rund um sudo drin. Auch werden grml-libs gesourced, die nur auf grml-Systemen zu finden sind. Dann wird neben dem OS auch noch je nach grml-Version (normal, small, wasweissich) verschieden konfiguriert. Das alles macht die zshrc gefuehlt riesig und schlecht durchschaubar.

Mir ist jedoch keine Live-CD mit einer besseren Shell-Default-Konfiguration als grml bekannt

dasebastian
Beiträge: 1907
Registriert: 12.07.2020 11:21:17

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von dasebastian » 02.01.2024 15:30:11

rodney hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 15:23:26
Bezueglich der zshrc von grml: Leider zu gross und will es allen recht machen.
uname hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 09:10:49
Man kann ja GRML und auch deren ZSH-Konfiguration als Inspiration nutzen. Ein Großteil der Konfiguration sind wohl Funktionen. Ob man die alle braucht, weiß ich nicht.

rodney
Beiträge: 338
Registriert: 09.12.2016 04:15:59

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von rodney » 02.01.2024 18:23:32

dasebastian hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 15:30:11
rodney hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 15:23:26
Bezueglich der zshrc von grml: Leider zu gross und will es allen recht machen.
uname hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 09:10:49
Man kann ja GRML und auch deren ZSH-Konfiguration als Inspiration nutzen. Ein Großteil der Konfiguration sind wohl Funktionen. Ob man die alle braucht, weiß ich nicht.
Wie ist diese Zitatausschnittsfolge zu interpretieren?. Da du bei unames Zitat "als Inspiration" nutzen unterstrichen hast, finde ich in meiner Auesserung keinerlei Hinweis auf Inspirationsquellentauglichkeit der grml-zshrc.

Jede Konfigurationsdatei kann als Inspirationsquelle genutzt werden, aber nicht jede Konfigurationsdatei liest sich gleich bzw. erschliesst sich einem gleich schnell (je nach persoenlicher Energie die in das Lesen gesteckt wird). Man kann sich sogar von Einreichungen zum Obfuscated Perl Contest inspirieren lassen :wink:

Um die grml-zshrc zu lesen und halbwegs zu verstehen benoetige ich viel mehr Energie wie z.b. bei oh-my-zsh (ich selbst nutze kein zsh-Framework). Andere moegen sich da beim Lesen und Inspirierenlassen leichter tun als ich.

dasebastian
Beiträge: 1907
Registriert: 12.07.2020 11:21:17

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von dasebastian » 02.01.2024 18:54:09

rodney hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 18:23:32
Wie ist diese Zitatausschnittsfolge zu interpretieren?
Bei mir kam dein Post so ein bisschen "Vergiss die grml zshrc, die ist Schrott" an, die kann man nicht verwenden. Und sämtliche Vorredner haben das aber selbst schon angedeutet, dass man sie natürlich nicht 1:1 übernehmen soll, sondern sich Sachen raussuchen kann.

War nicht böse gemeint.

Benutzeravatar
mn77de
Beiträge: 155
Registriert: 23.11.2003 16:53:53
Wohnort: Übersee
Kontaktdaten:

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von mn77de » 02.01.2024 23:28:30

rodney hat geschrieben: ↑ zum Beitrag ↑
02.01.2024 15:23:26
@mn77de
Haettest du mal je einen Screenshot (einmal mit und einmal ohne $funcstack[1]()). Bei mir sehe ich da keinen Unterschied. Mit zweitem Prompt meinst du $PROMT2? Das mit der Trennline ist soweit klar, ich sehe bei mir halt nur keinen Unterschied, koennte aber auch an meinem Prompt liegen:
Mit "$funcstack[1]()" wird vor dem ersten Prompt keine Linie gezeichnet.

Code: Alles auswählen

user:~ > 
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
user:~ > 
Ohne die Zeile sieht es etwa so aus:

Code: Alles auswählen

–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
user:~ > 
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– 
user:~ > 
... was doof ist :roll: :lol:

Ich hab' mich hier inspirieren lassen:
https://stackoverflow.com/questions/205 ... ch-command
OpenSource! :THX:

rodney
Beiträge: 338
Registriert: 09.12.2016 04:15:59

Re: Adventskalender-Nachtrag: Die Z-Shell mit Fish-Features

Beitrag von rodney » 03.01.2024 00:24:06

Danke. Und ich hatte die ganze Zeit als zweiten Prompt $PROMPT2 im Hinterkopf. Jetzt ist alles klar.

Antworten