Šta je novo?

zsh (Z shell) - konfiguracija

sammy

Slavan
Učlanjen(a)
02.11.2007
Poruke
2,512
Poena
485
Ukoliko neko želi da zameni bash shell sa ovim dosta moćnijim i konfigurabilnijim shellom probaću da opišem postupak, što se tiče tema i izgleda samog shella toga ima na pretek, ja ću ovde dati moju konfiguraciju uz objašnjenje gde se ostale teme mogu naći i način na koji se mogu instalirati.

Prva stvar koju treba uraditi je pronaći paket zsh u package manageru i instalirati ga.
Nakon toga jednostavno se otkuca :
Kod:
$ zsh
i novi sheel će se ukazati, ukoliko želimo za stalno da ga koristimo tj. da zamenimo bash otkucamo sledeće :
Kod:
$ chsh -s /bin/zsh
promena će uslediti nakon novog logina.

Konfiguracioni fajl se nalazi u ~/.zshrc

To bi u principu bilo to, sada dolazimo do dela gde se podešava zsh sa raznim dodacima, u početku sam koristio oh-my-zsh jer je to bio najjednostavniji način da bez pomuke dodjem do izgleda koji sam vidjao po raznim screenshotovima drugih usera, naravno nisu samo teme u pitanju tj. izgled nego i razni pluginovi i konfiguracija koju ovaj sjajan paket odradjuje umesto vas.
Sajt se nalazi ovde : http://ohmyz.sh/

Nakon izvesnog vremena interesovalo me da probam kako bi donekle mogao da odradim sličnu stvar bez oh-my-zsh, u principu sam to uspeo da izvedem tako da ga više ne koristim, ako nekoga zanima taj "teži" put objasniću i njega ukratko.
Tu sada dolazimo do problema sa distroima jer zaista ne znam kako i da li ima par paketa koje sam instalirao u gentoo, radi se o completions dodacima sa kojima praktično putem TAB u terminalu kompletirate ono što vas mrzi da kucate do kraja, odnosno da vidite sve kombinacije koje počinju nakon par slova koje ste napisali nakon čega je usledio pritisak na TAB taster.
U pitanju su zapravo 3 paketa od kojih je jedan gentoo specific tako da se možda može naći neki sličan za vaš distro, paketi su :
gentoo-zsh-completions, zsh-completions, zsh-syntax-highlighting
Linkovi za zadnja dva u slučaju da ga vaš distro nema :
https://github.com/zsh-users/zsh-completions
https://github.com/zsh-users/zsh-syntax-highlighting

Tamo imate i upustva šta i kako, da ne ulazim sada u te detalje, ako bude problema slobodno pitajte.

Završio bih ovo za sada sa temom koja se meni svidja i koju koristim a to je powerlevel9k, link : https://github.com/bhilburn/powerlevel9k
Iscrpne detalje takodje imate na tom sajtu, kasnije bih mogao da do detalja opišem i postupak instalacije te teme, medjutim za sada toliko.

Moj konfig fajl .zshrc :

Kod:
 #!/bin/zsh
 
 # POWERLEVEL9K
 POWERLEVEL9K_MODE='awesome-patched'
 POWERLEVEL9K_PROMPT_ON_NEWLINE=true
 POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
 POWERLEVEL9K_OS_ICON_BACKGROUND="red"
 POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context
 POWERLEVEL9K_TIME_BACKGROUND="011"
 POWERLEVEL9K_TIME_FOREGROUND="black"
 #POWERLEVEL9K_DIR_HOME_BACKGROUND="172"
 POWERLEVEL9K_DIR_HOME_FOREGROUND="015"
 #POWERLEVEL9K_DIR_HOME_SUBFOLDER_BACKGROUND="172"
 POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND="015"
 #POWERLEVEL9K_DIR_DEFAULT_BACKGROUND="172"
 POWERLEVEL9K_DIR_DEFAULT_FOREGROUND="015"
 
 export TERM="xterm-256color"
 DEFAULT_USER=`whoami`
 
 source ~/powerlevel9k/powerlevel9k.zsh-theme
 export HISTSIZE=2000
 export HISTFILE="$HOME/.history"
 export SAVEHIST=$HISTSIZE
 setopt hist_ignore_all_dups
 
 # Completion
 autoload -U compinit
 compinit
 
 # Correction
 setopt correctall
 
 zstyle ':completion::complete:*' use-cache 1
 
 zstyle ':completion:*:descriptions' format '%U%B%d
 zstyle ':completion:*:warnings' format '%BSorry, n
 
 # Colored ls
 eval "$(dircolors /etc/DIR_COLORS)"
 
 # ctrl-left/right
 bindkey "\e[1;5C" forward-word
 bindkey "\e[1;5D" backward-word
 
 # ctrl-backspace/delete
 bindkey "\C-_" backward-kill-word
 bindkey "\e[3;5~" kill-word
 
 # alt-backspace
 bindkey "\e\d" undo
 
 bindkey "\e[3~" delete-char
 bindkey '\e[H' beginning-of-line
 bindkey '\e[F' end-of-line
 
 # Keypad
 # 0 . Enter
 bindkey -s "^[Op" "0"
 bindkey -s "^[Ol" "."
 bindkey -s "^[OM" "^M"
 # 1 2 3
 bindkey -s "^[Oq" "1"
 bindkey -s "^[Or" "2"
 bindkey -s "^[Os" "3"
 # 4 5 6
 bindkey -s "^[Ot" "4"
 bindkey -s "^[Ou" "5"
 bindkey -s "^[Ov" "6"
 # 7 8 9
 bindkey -s "^[Ow" "7"
 bindkey -s "^[Ox" "8"
 bindkey -s "^[Oy" "9"
 # + -  * /
 bindkey -s "^[Ok" "+"
 bindkey -s "^[Om" "-"
 bindkey -s "^[Oj" "*"
 bindkey -s "^[Oo" "/"

# Example aliases
 alias zshconfig="vi ~/.zshrc"
 alias ls='ls --color=auto'
 alias update-system="sudo emerge -uDNav @world --with-bdeps=y"
 alias update-grub="sudo grub-mkconfig -o /boot/grub/grub.cfg"
 alias edit-i3config="vi ~/.config/i3/config"
 alias edit-zshconfig="vi ~/.zshrc"
 alias edit-i3blocksconfig="vi ~/.config/i3/i3blocks.conf"
 alias edit-packageuse="sudo vi /etc/portage/package.use/package.use"
 alias edit-packageaccept="sudo vi /etc/portage/package.accept_keywords"

# Syntax highlighting
. /usr/share/zsh/site-contrib/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
Ovo je odlicno, pregledacu bolje ovaj .zshrc cim se snadjem u i3. :d
 
Kaže na wikipediji da je z shell nastao proširivanjem bash-a, je l postoji neka nekompatibilnost?
 
Mislio sam da ću moći naknadno da editujem tu poruku ali ne mogu, htedoh da postavim par slika i dodatnih informacija ali šta je tu je.
Taj konfig fajl je pogrešno "nalepljen" iz nekog razloga, fali u prvoj polovini desna polovina ekrana :d
žurio sam dok sam radio copy-paste iz terminala, verovatno sam napravio neki previd, staviću ovde pravilan i to pod spoiler da ne uzima mnogo mesta.
Dakle, ~/.zshrc :

Kod:
#!/bin/zsh

# POWERLEVEL9K
POWERLEVEL9K_MODE='awesome-patched'
POWERLEVEL9K_PROMPT_ON_NEWLINE=true
POWERLEVEL9K_RPROMPT_ON_NEWLINE=true
POWERLEVEL9K_OS_ICON_BACKGROUND="red"
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context dir rbenv vcs root_indicator)
POWERLEVEL9K_TIME_BACKGROUND="011"
POWERLEVEL9K_TIME_FOREGROUND="black"
#POWERLEVEL9K_DIR_HOME_BACKGROUND="172"
POWERLEVEL9K_DIR_HOME_FOREGROUND="015"
#POWERLEVEL9K_DIR_HOME_SUBFOLDER_BACKGROUND="172"
POWERLEVEL9K_DIR_HOME_SUBFOLDER_FOREGROUND="015"
#POWERLEVEL9K_DIR_DEFAULT_BACKGROUND="172"
POWERLEVEL9K_DIR_DEFAULT_FOREGROUND="015"

export TERM="xterm-256color"
DEFAULT_USER=`whoami`

source ~/powerlevel9k/powerlevel9k.zsh-theme
export HISTSIZE=2000
export HISTFILE="$HOME/.history"
export SAVEHIST=$HISTSIZE
setopt hist_ignore_all_dups

# Completion
autoload -U compinit
compinit

# Correction
setopt correctall

zstyle ':completion::complete:*' use-cache 1

zstyle ':completion:*:descriptions' format '%U%B%d%b%u'
zstyle ':completion:*:warnings' format '%BSorry, no matches for: %d%b'

# Colored ls
eval "$(dircolors /etc/DIR_COLORS)"

# ctrl-left/right
bindkey "\e[1;5C" forward-word
bindkey "\e[1;5D" backward-word

# ctrl-backspace/delete
bindkey "\C-_" backward-kill-word
bindkey "\e[3;5~" kill-word

# alt-backspace
bindkey "\e\d" undo

bindkey "\e[3~" delete-char
bindkey '\e[H' beginning-of-line
bindkey '\e[F' end-of-line

# Keypad
# 0 . Enter
bindkey -s "^[Op" "0"
bindkey -s "^[Ol" "."
bindkey -s "^[OM" "^M"
# 1 2 3
bindkey -s "^[Oq" "1"
bindkey -s "^[Or" "2"
bindkey -s "^[Os" "3"
# 4 5 6
bindkey -s "^[Ot" "4"
bindkey -s "^[Ou" "5"
bindkey -s "^[Ov" "6"
# 7 8 9
bindkey -s "^[Ow" "7"
bindkey -s "^[Ox" "8"
bindkey -s "^[Oy" "9"
# + -  * /
bindkey -s "^[Ok" "+"
bindkey -s "^[Om" "-"
bindkey -s "^[Oj" "*"
bindkey -s "^[Oo" "/"

# Example aliases
 alias zshconfig="vi ~/.zshrc"
 alias ls='ls --color=auto'
 alias update-system="sudo emerge -uDNav @world --with-bdeps=y"
 alias update-grub="sudo grub-mkconfig -o /boot/grub/grub.cfg"
 alias edit-i3config="vi ~/.config/i3/config"
 alias edit-zshconfig="vi ~/.zshrc"
 alias edit-i3blocksconfig="vi ~/.config/i3/i3blocks.conf"
 alias edit-packageuse="sudo vi /etc/portage/package.use/package.use"
 alias edit-packageaccept="sudo vi /etc/portage/package.accept_keywords"

# Syntax highlighting
. /usr/share/zsh/site-contrib/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
 
Kaže na wikipediji da je z shell nastao proširivanjem bash-a, je l postoji neka nekompatibilnost?

Ja je nisam primetio, što ne znači da je nema, ne znači ni da je ima, jednostavno nisam naišao na neki problem, mada nisam istraživao da li takvo nešto postoji, nisam ni onako usput nailazio da neko priča o tome, možda neko ima više informacija ili probaj sam da nadješ (postavi ovde info ako naidješ).
 
Doslo je izgleda do greske prilikom kopiranja, neke linije nisu zavrsene
Kod:
POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(os_icon context

zstyle ':completion:*:descriptions' format '%U%B%d
zstyle ':completion:*:warnings' format '%BSorry, n
 
Objasnio sam u prethodnom mom postu i ostavio pravilan konfig u njemu (pogledaj spoiler)

Mislim da se razumemo, taj konfig sam ostavio čisto reda radi, to je ono što trenutno koristim, niti je savršen niti ne znam šta, meni odgovara, preporučujem ipak novim korisnicima da instaliraju oh-my-zsh.
Više je čisto u duhu da još neko podeli možda svoj konfig i tako, razmenjivanje iskustava :)

Evo i trenutan screenshot kako izgleda sa tim konfigom :
 

Prilozi

  • Screenshot at 2017-04-27 21:18:04.jpg
    Screenshot at 2017-04-27 21:18:04.jpg
    454.7 KB · Pregleda: 86
Auh da, promakao mi ispravljeni .zshrc.
Namestio sam, fino izgleda ali cini mi se da je nesto sporiji zsh sa temama u odnosu na cisti bash koji sam do sada koristio. Ali ocekujem da bude brzi kada izbacim sve sto ne koristim.
 
Слабо користим терминал, која је то предност једног у односу на други? Вероватно је битно некоме ко ту често проводи време.
 
Shell nije terminal, ni Gnome terminal nije terminal, već emulator terminala kao i Xterm i svi ostali. Jedini pravi terminal je tty. Shell je interpreter komandi.

Prednost zsh u odnosu na bash je u podešavanju i proširenju funkcionalnosti. Već gore opisao sammy šta sve može zsh. Prednost fish u odnosu na zsh je što je command completion bolje urađen i pored tab za listanje komandi možeš strelicama završiti komandu koju ti ponudi, mada često promaši ono što hoćeš ali posle nekog vremena biste srasli. fish koliko mi se čini nije proširiv i podesiv kao zsh, ne izgleda toliko fensi kao zsh sa powerlevel9k, agnoster ili bullet-trail temama. Ali ako nećeš da čačkaš a hoćeš ugodniji rad u odnosu na bash, fish je dobro rešenje.

Ima još jedan kul dodatak, zove se tmux. On deli terminal po visini i širini kako ti želiš i može se prebacivati iz jednog u drugi po potrebi. Tu funkcionalnost ima emacs editor. Mada ne znam kako da napustim prozor gde se nalazi htop...

Od emulatora terminal nijedan nije sjajan, ali su svi većinom ok. Neki vole Terminator ali bilo koji uz tmux može isto. Ja koristim termit, probao sam i rxvt ali izgleda kao da je napravljen 768 godine p.n.e. i ne znam jel se to može menjati. Mada kažu da je stabilan kao čitavo naselje.
 
Poslednja izmena:
Rxvt uz malo konfigurisanja od izgleda iz 1978. dolazi do izgleda iz 2055. I to uz svega dvije linije u konfiguracionoj skripti.

Takođe ni z shell ne treba mnogo da se konfiguriše, to je jedino u slučaju ako sam podešavaš cijeli konfiguracioni fajl kao što je to sammy uradio, dok recimo uz oh-my-zsh to je dva minuta posla da instaliraš sve što ti treba, a između ostalog i plagine kao što je ovaj fish-like-completion, highlighting i slično. Naravno što više plagina to je shell sporiji.

Recimo tmux ne koristim jer mi stvarno ne treba toliko terminala, uglavnom imam u jednom otvoren vim, a u drugom je shell.

Sad vidio sam da dosta ljudi potencira koji je to light-weight, a koji ne, naravno meni to ne igra neku veliku ulogu jer nemam računar na kom moram da brinem o takvim stvarima, ali u slučaju da imate tu brigu onda već može da se ulazi u dublje rasprave termite, rxvt i slični, pa koji troši više, a koji manje. Za sada mi ni ovaj default gnome terminal ne pravi probleme, mada možda se uputim u neko isprobavanje pojedinih.
 
Слабо користим терминал, која је то предност једног у односу на други? Вероватно је битно некоме ко ту често проводи време.

Da pojasnim šta je ABET hteo da kaže na temu razlike između terminalskog emulatora i komandnog shell-a.

Programi bez sopstvenog GUI-ja realizuju interfejs ka korisniku koristeći nešto što se zove "standardni ulaz" i "standardni izlaz". U pitanju su memorijski baferi (ponašaju se kao stream-ovi bajtova) koje operativni sistem automatski dodeljuje svakom procesu, ali sa stanovišta procesa, ta dva stream-a se tretiraju kao fajl iz koga se može čitati (u slučaju standardnog ulaza), odnosno po kome se može pisati (standardni izlaz). Proces nema pojma odakle su došli bajtovi koje je očitao sa "standardnog ulaza" niti zna gde završavaju bajtovi koje upiše na "standardni izlaz". Ovo stvara prostor za razne akrobacije, na primer moguće je pokrenuti dva procesa, gde se standardni izlaz jednog preusmeri na standardni izlaz drugog, i tako formira lanac operacija. Ili za jednostavnije poslove, poput usmeravanja postojećeg fajla sa diska na standardni ulaz programa (ako te mrzi da svaki put ručno ukucavaš komande u neki program), ili usmeravanja standardnog izlaza u fajl na disku.

Komandni shell (kao što je bash, ash, ksh, zsh i slični) nema apsolutno nikakav GUI. On samo čita podatke koje dobije na svoj standardni ulaz, obrađuje ih, i izbacuje rezultat na standardni izlaz.

Terminalski emulatori (kao što je Gnome-Terminal, Konsole, Xterm i slični) služe da prikažu svoj GUI, zatim pokrenu neki program (npr. komandni shell) kao svoj podproces, "zakače" se na njegov standardni ulaz i izlaz, i nakon toga sve što ukucavaš na tastaturi, terminalski emulator prosleđuje na standardni ulaz komandnog shell-a, i obrnuto -> sve što komandni shell izbaci na standardni izlaz, terminalski emulator će "uhvatiti" i ispisati u svom GUI-ju. Naziv "emulator" je zbog toga što ovi programi suštinski imitiraju terminalne uređaje korišćene pre 40 i više godina na mainframe računarima koji nisu imali sopstveni monitor i tastaturu, nego je korisnički "ulaz/izlaz" predstavljao RS-232 kabl na koga je mainframe preusmeravao standardni ulaz i izlaz komandnog shell-a. Na drugom kraju kabla (i najčešće u različitoj prostoriji) je bio terminalni uređaj koji je sadržao monitor i tastaturu, i na kome su korisnici mogli da rade.

Terminalski emulatori ne služe obavezno za pokretanje komandnog shell-a, već mogu pokretati bilo koji program bez GUI-ja na istom principu. Ako si programirao u C-u, onda znaš za funkcije printf i scanf koje rade sa standardnim izlazom i ulazom, i isto tako možeš da ga pokreneš pod terminal emulatorom koji će hvatati standardni ulaz/izlaz tvog programa.
 
"&&" ne radi u fish, izgleda da ću ipak morati na zsh. Ovakve stvari su dealbreaker. Ne znam zašto je onaj ko je pravio fish menjao komande, šta dobija time što "&&" zameni sa ";"?
 
Da pojasnim šta je ABET hteo da kaže na temu razlike između terminalskog emulatora i komandnog shell-a.
Ух, боље да сам написао да слабо користим емулатор, не би било оволиког писања. ;)

Мислим да је поменуто, мени (навика из 4dos-a) фали понуда команди после неког/неколико откуцаних слова. Ако рецимо откуцам sudo pac и онда стрелицу, таб или било шта треће, да онда понуди све команде које су у историји а почињу онако. Слабо користим ... конзолу па ми је ово једино што недостаје, остало ми није нешто битно.
 
Zbog toga čitava ova priča. Instaliraš zsh shell pa onda oh-my-zsh i imaš to namešteno. Ili instaliraš fish shell pa onda imaš to još bolje rešeno.
 
Сасвим солидно, инсталирао fish и ради оно што сам питао, можда не баш као код 4dos али је то ипак ситница, завршава посао.

Хм, да не мењам комплет навике, направим профил са bash и са fish и онда код отварања новог таба пита који од њих. Па по потреби имам табове и са једним и са другим. Лепо. :)
 
Kako ocenjuješ kada ti treba jedan a kada drugi i zašto ne odmah fish ?
Zašto uopšte fish a ne zsh ?
zsh radi isto to što radi i fish, samo bolje.
Komplikuješ bez potrebe, mislim to pravljenje profila i da te pita koji ćeš, ali ok, što bi rekli na engleskom "whatever floats your boat" :)
 
Па bash остаје јер сам га користио, fish пошто је препоручен у оној поруци а zsh ... па да направим и за њега профил? Какво компликовање, убацио сам fish уместо постојећег, дао профилу име и готово. Не оцењујем, користићу bash а ако ми затреба враћање неке постојеће команде, онда fish. А и то ми је ретко потребно да ћу да заборавим на све ово кад дође на ред.
 
Verovatno ja nisam nešto dobro razumeo, to kada otvaraš novi tab kažeš da te pita koji od njih, na to sam mislio pod komplikovanje.
 
Kako u zsh da napravim da mi ponudi da kompletiram unos na strelice a ne samo na tab?
 
Само ако идем преко менија па отварам нови таб, иначе на двоклик поред постојећег или на ctrl-shift-T отвара default таб. Мени небитно, за ово колико користим може било који.
 
Kako u zsh da napravim da mi ponudi da kompletiram unos na strelice a ne samo na tab?

Sa oh-my-zsh to bi trebalo da ti radi odmah, sa ručnim konfigom nisam siguran da li treba neki plugin ili neka linija da se doda u konfig samo, nisam ni gledao da budem iskren, na TAB mi radi posao, probaću da nadjem.
 
Gracias :) To mi treba. Ne mogu više reputacije da podelim a valjalo bi jer je ovo jedan od korisnijih podforuma ovde što se pomoganja tiče.
 
Kako u zsh da napravim da mi ponudi da kompletiram unos na strelice a ne samo na tab?

Imaš i kompletiranje sa strelicama kada primera radi otkucaš nešto pa onda dva puta TAB, pa da sa strelicama biraš šta hoćeš, to je isto dobro a nisam recimo imao u configu, tako da sam ga dodao sada :

Kod:
zstyle ':completion:*' menu select
 
Jel kada otkucaš dvaput TAB, strelicama ideš na kraj ponuđenog ili svaku reč možeš da obeležiš? Pošto TAB lista man dok strelice idu na kraj ponuđenog izbora. Ne znam da li me razumeš šta hoću da kažem. Probaću primerom:

kucam sudo apt stisnem TAB i on mi izlista sve moguće komande iz man. Ali izlista i jednu skorašnju ili često korisćenu ili čime je god bira (fuzzy logika možda). Uglavnom TAB šalta između svih komandi kojih možeš biti jako puno dok strelica desno popunjava ponuđeni izbor od strane algoritma. E sad, kod fish strelica desno obeleži sve, recimo sudo apt-get install kde dok bi ja da recimo stisnem dva puta desnu strelicu i dobijem sudo apt-get install bez kde.

fish sam već odbacio, ne odgovara mi simplikovanje sintakse radi lakšeg kucanje sinstakse. Ko je da je velika razlika otkucati && ili ; ne znam što to menjaju pogotovo što većina programskih jezika koristi && a nijedan ; Uostalom semicolon nosi jedan potpuno drugačiji kontekst za većinu programera.

Off-topic: Jel može nekako da se kombinuje tiling window manager i openbox? Hteo bi da imam po potrebi i jedno i drugo tj. da imam tiling windows ako želim ali da mogu da uradim show desktop, minimize neku sličnu funkciju koja bi sklonila tiled windows i prikazala custom openbox desktop.
 
Poslednja izmena:
Da, pa malo je teže za objasniti, da probam slikom.
Evo ti primer, recimo otkucaš ls i onda dva puta TAB, dobićeš ovo ispod kao na slici, znači on ti ispod da sve kombinacije komandi koje počinju sa ls, jedan pritisak na TAB ti izlistava te kombinacije a drugi te "baca dole" gde ti sa strelicama biraš koju hoćeš komandu i sa enter je izabereš.
Znači ovo sa belom pozadinom "šetaš" levo desno gore dole.
 

Prilozi

  • Screenshot at 2017-04-30 17:39:52.png
    Screenshot at 2017-04-30 17:39:52.png
    44.7 KB · Pregleda: 36
Nazad
Vrh Dno