Zsh este un shell puternic care funcționează atât ca un shell interactiv, cât și ca un interpretor de limbaj de scripting. În timp ce este compatibil cu POSIX sh (nu în mod implicit, doar dacă se emite emulate sh
), oferă avantaje cum ar fi o completare îmbunătățită a tabulatoarelor și globbing.
Pregătirea frecventă Zsh oferă mai multe motive pentru a utiliza Zsh.
Instalare
Înainte de a începe, utilizatorii ar putea dori să vadă ce shell este utilizat în prezent:
$ echo $SHELL
Instalați pachetul zsh. Pentru definiții de completare suplimentare, instalați și pachetul zsh-completions.
Configurare inițială
Asigurați-vă că Zsh a fost instalat corect rulând următoarele într-un terminal:
$ zsh
Ar trebui să vedeți acum zsh-newuser-install, care vă va ghida prin câteva configurări de bază. Dacă doriți să săriți peste acest lucru, apăsați q
. Dacă nu l-ați văzut, îl puteți invoca manual cu:
$ autoload -Uz zsh-newuser-install$ zsh-newuser-install -f
Să faceți din Zsh shell-ul dvs. implicit
Schimbați shell-ul în /usr/bin/zsh
. Consultați Command-line shell#Changing your default shell.
~/.bashrc
la ~/.zshrc
(de exemplu, promptul și aliasurile) și de la ~/.bash_profile
la ~/.zprofile
(de exemplu, codul care pornește sistemul X Window).Fișiere de pornire/oprire
- Vezi A User’s Guide to the Z-Shell pentru explicații cu privire la shell-urile interactive și de conectare, și ce să puneți în fișierele de pornire.
- Ați putea lua în considerare implementarea unei căi standard pentru fișierele de configurare Zsh.
- Dacă
$ZDOTDIR
nu este setat, se folosește în schimb$HOME
. - Dacă opțiunea
RCS
nu este setată în niciunul dintre fișiere, niciun fișier de configurare nu va fi citit după acel fișier. - Dacă opțiunea
GLOBAL_RCS
nu este setată în niciunul dintre fișiere, niciun fișier de configurare globală (/etc/zsh/*
) nu va fi citit după acel fișier.
La pornire, Zsh va citi în mod implicit comenzile din următoarele fișiere în această ordine, cu condiția ca acestea să existe.
-
/etc/zsh/zshenv
Utilizat pentru setarea variabilelor de mediu pentru toți utilizatorii; nu trebuie să conțină comenzi care produc ieșire sau care presupun că shell-ul este atașat la un TTY. Atunci când acest fișier există, el va fi întotdeauna citit; acest lucru nu poate fi anulat. -
$ZDOTDIR/.zshenv
Utilizat pentru setarea variabilelor de mediu ale utilizatorilor; nu trebuie să conțină comenzi care produc ieșire sau care presupun că shell-ul este atașat la un TTY. Atunci când acest fișier există, va fi întotdeauna citit. -
/etc/zsh/zprofile
Utilizat pentru executarea comenzilor la pornire pentru toți utilizatorii; va fi citit la pornirea ca shell de conectare. Vă rugăm să rețineți că pe Arch Linux, în mod implicit conține o singură linie care are ca sursă/etc/profile
. Consultați avertismentul de mai jos înainte de a dori să o eliminați!-
/etc/profile
Acest fișier ar trebui să provină de la toate shell-urile compatibile POSIX sh la autentificare: stabilește$PATH
și alte variabile de mediu și setări specifice aplicației (/etc/profile.d/*.sh
) la autentificare.
-
-
$ZDOTDIR/.zprofile
Utilizat pentru executarea comenzilor utilizatorului la pornire, va fi citit la pornirea ca shell de autentificare. Utilizat de obicei pentru a porni automat sesiunile grafice și pentru a seta variabilele de mediu la nivelul sesiunii. -
/etc/zsh/zshrc
Utilizat pentru setarea configurației shell-ului interactiv și executarea comenzilor pentru toți utilizatorii, va fi citit la pornire ca un shell interactiv. -
$ZDOTDIR/.zshrc
Utilizat pentru setarea configurației shell-ului interactiv al utilizatorului și executarea comenzilor, va fi citit la pornire ca un shell interactiv. -
/etc/zsh/zlogin
Utilizat pentru executarea comenzilor pentru toți utilizatorii la sfârșitul progresului inițial, va fi citit la pornirea ca un shell de conectare. -
$ZDOTDIR/.zlogin
Utilizat pentru executarea comenzilor utilizatorului la sfârșitul progresului inițial, va fi citit la pornirea ca un shell de conectare. Utilizat de obicei pentru a porni automat utilitățile de linie de comandă. Nu ar trebui să fie utilizat pentru a porni automat sesiuni grafice, deoarece în acest moment sesiunea ar putea conține configurația destinată doar unui shell interactiv. -
$ZDOTDIR/.zlogout
Utilizat pentru a executa comenzi la ieșirea unui shell de logare. -
/etc/zsh/zlogout
Utilizat pentru a executa comenzi pentru toți utilizatorii la ieșirea unui shell de logare.
Vezi reprezentarea grafică.
-
$HOME/.profile
nu face parte din fișierele de pornire Zsh și nu este accesat de Zsh decât dacă Zsh este invocat cash
sauksh
și pornit ca un shell de conectare. Pentru mai multe detalii despre modurile de compatibilitate sh și ksh, consultați zsh(1) § COMPATIBILITY. - Cărările folosite în pachetul zsh din Arch sunt diferite de cele implicite folosite în paginile de manual (FS#48992).
/etc/zsh/zprofile
, altfel se va rupe integritatea altor pachete care furnizează unele scripturi din /etc/profile.d/
.Configurați Zsh
Deși Zsh este utilizabil din fabrică, este aproape sigur că nu este configurat așa cum ar dori să îl folosească majoritatea utilizatorilor. Dar, datorită cantității mari de personalizare disponibilă în Zsh, configurarea lui Zsh poate fi o experiență descurajantă și consumatoare de timp.
Simplu .zshrc
Includeți mai jos un exemplu de fișier de configurare. Acesta oferă un set decent de opțiuni implicite, precum și exemple de multe moduri în care Zsh poate fi personalizat. Pentru a utiliza această configurație, salvați-o ca un fișier numit .zshrc
.
source ~/.zshrc
.Iată un simplu .zshrc
:
~/.zshrc
autoload -Uz compinit promptinitcompinitpromptinit# Acest lucru va seta promptul implicit pe tema waltersprompt walters
Vezi #Teme de prompt pentru mai multe detalii despre sistemul de teme de prompt.
Configurarea $PATH
Zsh leagă variabila PATH
de o matrice path
. Acestea sunt sincronizate automat. Acest lucru ne permite să manipulăm cu ușurință PATH
prin simpla modificare a matricei. Consultați A User’s Guide to the Z-Shell pentru detalii.
Linia typeset -U PATH path
, unde -U
înseamnă unic, instruiește shell-ul să elimine duplicatele atât din $PATH
cât și din $path
:
~/.zshenv
typeset -U PATH pathpath=("$HOME/.local/bin" /altele/lucruri/în/path "$path")export PATH
Comandă de completare
Poate cea mai interesantă caracteristică a lui Zsh sunt abilitățile sale avansate de autocompletare. Cel puțin, activați autocompletarea în .zshrc
. Pentru a activa autocompletarea, adăugați următoarele la ~/.zshrc
:
~/.zshrc
autoload -Uz compinitcompinit
Configurația de mai sus include completarea numelor de gazdă ssh/scp/sftp, dar pentru ca această caracteristică să funcționeze, utilizatorii nu trebuie să activeze hashing-ul de nume de gazdă al lui ssh (i.e. opțiunea HashKnownHosts
în configurația clientului ssh).
Pentru autocompletare cu o interfață condusă cu ajutorul tastelor săgeată, adăugați următoarele la:
~/.zshrc
zstyle ':completion:*' menu select
Pentru a activa meniul, apăsați Tab
de două ori.
Pentru autocompletarea comutatoarelor din linia de comandă pentru aliasuri, adăugați următoarele la:
~/.zshrc
setopt COMPLETE_ALIASES
Pentru activarea autocompletării mediilor privilegiate în comenzile privilegiate (de ex.g. dacă completați o comandă care începe cu sudo, scripturile de completare vor încerca, de asemenea, să determine completările dvs. cu sudo), includeți:
~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
Legături de taste
Zsh nu folosește readline, în schimb folosește propriul și mai puternicul său editor de linii Zsh (ZLE). Acesta nu citește /etc/inputrc
sau ~/.inputrc
. Citiți O privire mai atentă la editorul de linii zsh și crearea de widget-uri personalizate pentru o introducere în configurarea ZLE.
ZLE are un mod Emacs și un mod vi. Dacă una dintre variabilele de mediu VISUAL
sau EDITOR
conține șirul vi
, atunci va fi utilizat modul vi; în caz contrar, va fi utilizat în mod implicit modul Emacs. Setați modul în mod explicit cu bindkey -e
sau bindkey -v
pentru modul Emacs, respectiv pentru modul vi.
Legăturile de taste sunt atribuite prin maparea unei secvențe de evadare care corespunde unei apăsări de taste la un widget ZLE. Widget-urile disponibile, cu descrieri ale acțiunilor lor și legăturile de taste implicite, sunt listate în zshzle(1) § STANDARD WIDGETS și zshcontrib(1) § ZLE FUNCTIONS.
Modalitatea recomandată pentru a seta legăturile de taste în Zsh este folosirea capacităților de șir de caractere din terminfo(5). De exemplu:
~/.zshrc
# creați un hash compatibil cu zkbd;# pentru a adăuga alte chei la acest hash, consultați: man 5 terminfotypeset -g -A keykey="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"key="${terminfo}"${terminfo}"${terminfo}"${terminfo}"${terminfo}"${terminfo}"${terminfo}"${terminfo}"# configurați cheia în consecință}" ]] && bindkey -- "${key}" "beginning-of-line}" ]] && bindkey -- "${key}" end-of-line}" ]] && bindkey -- "${key}" overwrite-mode}" ]] && bindkey -- "${key}" backward-delete-char}" ]] && bindkey -- "${key}" delete-char}" ]] && bindkey -- "${key}" up-line-or-history}" ]] && bindkey -- "${key}" down-line-or-history}" ]] && bindkey -- "${key}" backward-char}" ]] && bindkey -- "${key}" forward-char}" ]] && bindkey -- "${key}" begin-of-buffer-or-history}" ]] && bindkey -- "${key}" end-of-buffer-or-history}" ]] && bindkey -- "${key}" reverse-menu-complete# În cele din urmă, asigurați-vă că terminalul se află în modul aplicație, când zle este# activ. Numai atunci sunt valabile valorile din $terminfo.if (( ${+terminfo} && ${+terminfo} )); thenautoload -Uz add-zle-hook-widgetfunction zle_application_mode_start { echoti smkx }function zle_application_mode_stop { echoti rmkx }add-zle-hook-widget -Uz zle-line-init zle_application_mode_starstartadd-zle-hook-widget -Uz zle-line-finish zle_application_mode_stopfiCercetare istoric
Trebuie să configurați matricea
key
și să vă asigurați că ZLE intră în modul aplicație pentru a utiliza următoarele instrucțiuni; a se vedea #Key bindings.Pentru a activa căutarea în istoric adăugați aceste linii în fișierul
.zshrc
:~/.zshrcautoload -Uz up-line-or-beginning-search down-line-or-beginning-searchzle -N up-line-or-beginning-searchzle -N down-line-or-beginning-search}" ]] && bindkey -- "${key}" up-line-or-beginning-search}" ]] && bindkey -- "${key}" down-line-or-beginning-searchFăcând acest lucru, la apăsarea tastelor
Up
sauDown
vor fi afișate numai comenzile trecute care corespund liniei curente până la poziția curentă a cursorului.Modificatorii Shift, Alt, Ctrl și Meta
Terminalele compatibile cu xterm pot folosi definițiile extinse ale tastelor din user_caps(5). Acestea sunt combinații de
Shift
,Alt
,Ctrl
șiMeta
împreună cuUp
,Down
,Left
,Right
,PageUp
,PageDown
,Home
,End
sauDel
. Consultați sursa zkbd pentru o listă de nume recomandate pentru tastele modificatoare și combinațiile de taste.De exemplu, pentru ca
Ctrl+Left
să treacă la începutul cuvântului anterior șiCtrl+Right
să treacă la începutul cuvântului următor:~/.zshrckey="${terminfo}"key="${terminfo}"}" ]] && bindkey -- "${key}" backward-word}" ]] && bindkey -- "${key}" forward-wordPrompturi
Zsh oferă opțiunile de a folosi o temă de prompt sau, pentru utilizatorii care sunt nemulțumiți de teme (sau doresc să le extindă utilitatea), posibilitatea de a construi un prompt personalizat.
Teme de prompt
Temele de prompt sunt o modalitate rapidă și ușoară de a configura un prompt colorat în Zsh. Consultați zshcontrib(1) § PROMPT THEMES pentru informații despre temele de prompt și despre cum să vă scrieți propria temă.
Pentru a utiliza o temă, asigurați-vă că sistemul de teme de prompt este setat la autoload în
.zshrc
. Acest lucru se poate face prin adăugarea acestor linii la:~/.zshrcautoload -Uz promptinitpromptinitTelemele de prompt disponibile sunt listate prin rularea comenzii:
$ prompt -lDe exemplu, pentru a utiliza tema
walters
, introduceți:$ prompt waltersPentru a previzualiza toate temele disponibile, utilizați această comandă:
$ prompt -pInstalarea manuală a temelor prompt
Este posibilă instalarea manuală a temelor, fără instrumente externe de gestionare a configurației. Pentru o instalare locală, mai întâi creați un dosar și adăugați-l la matricea
fpath
, de exemplu:$ mkdir ~/.zprompts$ fpath=("$HOME/.zprompts" "$fpath")Crearea unei legături simbolice a fișierului dvs. de temă în acest dosar:
$ ln -s mytheme.zsh ~/.zprompts/prompt_mytheme_setupDacă în schimb doriți să instalați o temă la nivel global, faceți:
# ln -s mytheme.zsh /usr/share/zsh/functions/Prompts/prompt_mytheme_setupAcum ar trebui să o puteți activa folosind:
$ prompt mythemeDacă totul funcționează, puteți să vă editați
.zshrc
în consecință.Adaugarea de teme de prompt fără un fișier separat pentru fiecare
În plus față de adăugarea unei teme de prompt prin intermediul propriului fișier, este posibil să adăugați teme din interiorul unui alt fișier (cum ar fi
.zshrc
al dumneavoastră), de exemplu:~/.zshrc# Încărcați promptinitautoload -Uz promptinit && promptinit# Definiți temaprompt_mytheme_setup() { PS1="%~%#"}# Adăugați tema la promptsprompt_themes+=( mytheme )# Încărcați temaprompt mythemeCustomized prompt
Acest articol sau secțiune necesită extindere.
Motivul: Adăugați un exemplu simplu și incolorPROMPT
. (Discutați în Talk:Zsh#)În plus față de un prompt principal de stânga
PS1
(PROMPT
,prompt
) care este comun tuturor shell-urilor, Zsh suportă și un prompt de dreaptaRPS1
(RPROMPT
). Aceste două variabile sunt cele pe care veți dori să le setați la o valoare personalizată.Alte prompturi cu scop special, cum ar fi
PS2
(PROMPT2
),PS3
(PROMPT3
),PS4
(PROMPT4
),RPS1
(RPROMPT
),RPS2
(RPROMPT2
) șiSPROMPT
, sunt explicate în zshparam(1) § PARAMETRI UTILIZAȚI DE SHELL.Toate prompturile pot fi personalizate cu evadări de prompt. Evadările de prompt disponibile sunt enumerate în zshmisc(1) § EXPANZAREA SECVENȚELOR DE EVADARE DE PROMPT.
Colors
Zsh stabilește culorile în mod diferit față de Bash, nu trebuie să folosiți secvențe de evacuare ANSI alambicate sau capacitățile terminalului din terminfo(5). Zsh oferă scăpări de prompt convenabile pentru a seta culoarea de prim-plan, culoarea de fundal și alte efecte vizuale; a se vedea zshmisc(1) § Efecte vizuale pentru o listă a acestora și descrierile lor.
Corile pot fi specificate folosind un număr întreg zecimal, numele uneia dintre cele opt culori cele mai larg acceptate sau ca un # urmat de un triplet RGB în format hexazecimal. Pentru mai multe detalii, consultați descrierea lui fg=colour în zshzle(1) § CHARACTER HIGHLIGHTING pentru mai multe detalii.
Majoritatea terminalelor acceptă următoarele culori după nume:
Nume | Număr |
---|---|
black |
0 |
red |
1 |
green |
2 |
yellow |
3 |
blue |
4 |
magenta |
5 |
cyan |
6 |
white |
7 |
Numerele de culori 0-255 pentru emulatoarele de terminal compatibile cu xterm 256 culori pot fi găsite în fișierul xterm-.256color chart.
Cu o variabilă de mediu TERM corect setată, numărul maxim de culori suportate de terminal poate fi găsit din baza de date terminfo(5) folosind echoti colors
. În cazul culorilor pe 24 de biți, verificați, de asemenea, variabila de mediu COLORTERM cu print $COLORTERM
. Dacă aceasta returnează 24bit
sau truecolor
, atunci terminalul dvs. suportă 16777216 (224) culori, chiar dacă terminfo afișează un număr mai mic.
- Cuvintele 0-15 pot diferi între emulatoarele de terminale și schemele de culori utilizate de acestea.
- Multe emulatoare de terminale afișează boldul cu o culoare mai aprinsă.
- Eșapajele de la prompt pot fi testate cu comanda
print -P "prompt escapes"
, de exemplu:$ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
- Dacă folosiți culori pe 24 de biți, este posibil să doriți să încărcați modulul
zsh/nearcolor
în terminalele care nu le suportă. De ex:}" -eq '16777216' ]] || zmodload zsh/nearcolor
Consultați zshmodules(1) § THE ZSH/NEARCOLOR MODULE pentru detalii despre modulul
zsh/nearcolor
.
Exemplu
Acesta este un exemplu de prompt cu două fețe:
PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# 'RPROMPT=''
Și iată cum va fi afișat:
Pentru a utiliza culori din intervalul 16-255 și culoarea adevărată pe 24 de biți, puteți folosi numărul de la 0 la 255 atribuit culorii dorite și, respectiv, codul hexazecimal al acesteia:
PROMPT='%F{2}%n%f@%F{5}%m%f %F{4}%B%~%b%f %# 'RPROMPT=''
PROMPT='%F{#c0c0c0}%n%f@%F{#008000}%m%f %F{#800080}%B%~%b%f %# 'RPROMPT=''
Eșantion .zshrc files
- Pentru a obține aceeași configurație ca în cazul versiunilor ISO lunare (care utilizează Zsh în mod implicit), instalați grml-zsh-config. Acesta include numeroasele ajustări și optimizări avansate din grml.
- https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc – configurare de bază, cu prompt dinamic și titlu de fereastră/hardinfo.
- https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc – zshrc cu multiple caracteristici, asigurați-vă că verificați comentariile în el. Caracteristici notabile: funcție de confirmare pentru a se asigura că utilizatorul dorește să execute poweroff, reboot sau hibernare, suport pentru GIT în prompt (realizat fără vcsinfo), completare tab cu meniu, tipărirea comenzii curente executate în bara de titlu a ferestrei și multe altele.
Vezi dotfiles#User repositories pentru mai multe.
Tips and tricks
Autostart X at login
Vezi xinit#Autostart X at login.
Restabilirea setărilor terminalului după ce un program iese anormal
Multe programe schimbă starea terminalului și, adesea, nu restaurează setările terminalului la ieșirea anormală (de exemplu, când se blochează sau întâlnesc SIGINT).
Acest lucru poate fi rezolvat de obicei prin executarea reset(1):
$ reset
Secțiunile următoare descriu modalități de a evita necesitatea de a reseta manual terminalul.
Comanda ttyctl
Comanda ttyctl poate fi utilizată pentru a „îngheța/dezgheța” terminalul. Pentru a îngheța shell-ul interactiv la lansare, utilizați următoarele:
~/.zshrc
ttyctl -f
Reinițializarea terminalului cu ajutorul secvențelor de evadare
Seturile alternative de caractere de desenare liniară pot da peste cap terminalul într-un mod pe care ttyctl nu îl poate preveni.
O soluție simplă este ieșirea secvențelor de evadare care resetează terminalul din funcția de cârlig precmd
, astfel încât acestea să fie executate de fiecare dată înainte ca promptul să fie desenat. De exemplu, utilizarea secvenței de evacuare \e] && (( ${#dirstack} == 0 )); thendirstack=("${(@f)"$(< "$DIRSTACKFILE")"}")}" ]] && cd -- "${dirstack}"fichpwd_dirstack() {print -l -- "$PWD" "${(u)dirstack}" > "$DIRSTACKFILE"}add-zsh-hook -Uz chpwd chpwd_dirstackDIRSTACKSIZE='20'setopt AUTO_PUSHD PUSHD_SILENT PUSHD_TO_HOME## Remove duplicate entriessetopt PUSHD_IGNORE_DUPS## This reverts the +/- operators.setopt PUSHD_MINUS
Now use
$ dirs -v
to print the dirstack. Use cd -<NUM>
pentru a reveni la un dosar vizitat. Utilizați autocompletarea după liniuță. Acest lucru se dovedește foarte util dacă se utilizează meniul de autocompletare.
cd
, din cauza unui conflict în cazul în care ambele sesiuni scriu în același fișier. cdr
cdr vă permite să schimbați directorul de lucru într-un director de lucru anterior dintr-o listă menținută automat. Acesta stochează toate intrările în fișiere care sunt menținute între sesiuni și (în mod implicit) între emulatoarele de terminal din sesiunea curentă.
Vezi zshcontrib(1) § REMEMBERING RECENT DIRECTORIES pentru instrucțiuni de configurare.
Comandă de ajutor
Dincolo de Bash, Zsh nu permite o comandă încorporată help
, în schimb oferă run-help
. În mod implicit, run-help
este un alias pentru man
, poate fi executată fie manual prin preaprecierea ei la o comandă, fie poate fi invocată pentru comanda tastată în acel moment cu comenzile rapide de la tastatură Alt+h
sau Esc
h
.
Din moment ce în mod implicit este doar un alias pentru man, va funcționa doar pentru comenzi externe. Pentru a-i îmbunătăți funcționalitatea, astfel încât să funcționeze în cazul construcțiilor de shell și al altor caracteristici de shell, trebuie să utilizați funcția run-help
. Consultați zshcontrib(1) pentru mai multe informații despre run-help
și funcțiile sale asistente.
În primul rând încărcați funcția run-help
și apoi eliminați aliasul run-help
existent. Pentru comoditate, help
poate fi alipit la run-help
. De exemplu, adăugați următoarele la zshrc
:
autoload -Uz run-help(( ${+aliases} )) && unalias run-helpalias help=run-help
Funcțiile asistente trebuie activate separat:
autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn
De exemplu, comanda run-help git commit
va deschide acum pagina de manual git-commit(1) în loc de git(1).
Refacere persistentă
În mod normal, compinit nu va găsi automat noi executabile în $PATH
. De exemplu, după ce instalați un nou pachet, fișierele din /usr/bin/
nu vor fi incluse imediat sau automat în completare. Astfel, pentru ca aceste noi executabile să fie incluse, se va rula:
$ rehash
Acest "rehash" poate fi setat să se întâmple automat. Pur și simplu includeți următoarele în zshrc
:
~/.zshrc
zstyle ':completion:*' rehash true
Rehash la cerere
Ca și mai sus, însă pacman poate fi configurat cu cârlige pentru a solicita automat un rehash
, ceea ce nu implică penalizarea de performanță a rehashing-ului constant ca mai sus. Pentru a activa acest lucru, creați directorul /etc/pacman.d/hooks
, și un director /var/cache/zsh
, apoi creați un fișier hook:
/etc/pacman.d/hooks/zsh.hook
Operation = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshWhen = PostTransactionExecec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman
Acest lucru menține data de modificare a fișierului /var/cache/zsh/pacman
în concordanță cu ultima dată când un pachet a fost instalat, actualizat sau eliminat. Apoi, zsh
trebuie convins să își refacă propriul cache de comenzi atunci când nu mai este actualizat, adăugând la ~/.zshrc
:
~/.zshrczshcache_time="$(date +%s%N) "autoload -Uz add-zsh-hookrehash_precmd() { if ]; then local paccache_time="$(date -r /var/cache/zsh/pacman +%s%N)" if (( zshcache_time < paccache_time )); then rehash zshcache_time="$paccache_time" fi fi}add-zsh-hook -Uz precmd rehash_precmdDacă cârligul
precmd
este declanșat înainte ca/var/cache/zsh/pacman
să fie actualizat, este posibil ca finalizarea să nu funcționeze până când nu este inițiat un nou prompt. Rularea unei comenzi goale, de exemplu apăsareaenter
, ar trebui să fie suficientă.Alternativă de rehash la cerere folosind SIGUSR1
Ca și mai sus, însă fișierul de cârlig arată astfel:
/etc/pacman.d/hooks/zsh-rehash.hookOperation = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshDepends = procps-ngWhen = PostTransactionExec = /usr/bin/pkill zsh --signal=USR1Avertizare: Acest lucru trimite SIGUSR1 la toate instanțelezsh
care rulează. Rețineți că comportamentul implicit pentru SIGUSR1 este terminate, astfel încât atunci când configurați pentru prima dată acest lucru, toate instanțelezsh
care ruleazăzsh
ale tuturor utilizatorilor (inclusiv shell-urile de autentificare) se vor încheia dacă nu au furnizat capcana de mai jos.~/.zshrcTRAPUSR1() { rehash }Capcana funcțională de mai sus poate fi înlocuită cu o capcană de listă
trap 'rehash' USR1
. Vezi zshmisc(1) § Funcții Trap pentru diferențele dintre tipurile de capcane.Această metodă va
rehash
instantaneu toate instanțelezsh
, eliminând necesitatea de a apăsa enter pentru a declanșaprecmd
.Bind key to ncurses application
Bind a ncurses application to a keystroke, but it will not accept interaction. Utilizați variabila
BUFFER
pentru a o face să funcționeze. Următorul exemplu permite utilizatorilor să deschidă ncmpcpp folosindAlt+\
:~/.zshrcncmpcppShow() { BUFFER="ncmpcpp" zle accept-line}zle -N ncmpcppShowbindkey '^2;
\a
. De exemplu:$ print -n '\e]2;My xterm title\a'$ print -n '\e]2;My xterm title\a'va seta titlul la
My xterm titleO modalitate simplă de a avea un titlu dinamic este de a seta titlul în funcțiile cârlig
precmd
șipreexec
. Consultați zshmisc(1) § Funcții cârlig pentru o listă a funcțiilor cârlig disponibile și descrierile lor.Prin utilizarea
print -P
puteți profita în plus de scăpările promptului Zsh.Sfat:
- Imprimarea titlului poate fi împărțită în mai multe comenzi atâta timp cât acestea sunt secvențiale.
- GNU Screen trimite titlul xterm la hardstatus (
%h
). Dacă doriți să folosiți scăpările de șiruri de caractere ale lui Screen (de exemplu, pentru culori) trebuie să setați hardstatus cu secvența de scăpare\e_
\e\
. În caz contrar, dacă se folosesc scăpări de șiruri de caractere în\e]2;
\a
, emulatorul de terminal va obține un titlu confuz datorită faptului că este incapabil să interpreteze scăpările de șiruri de caractere ale Screen.Notă:
- Nu folosiți opțiunea
-P
din- Utilizați stegulețul de expansiune a parametrilor
q
la imprimarea variabilelor pentru a preveni ca acestea să fie analizate ca secvențe de evadare.~/.zshrcautoload -Uz add-zsh-hookfunction xterm_title_precmd () {print -Pn -- '\e]2;%n@%m %~\a'] && print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-}%m\005{-} \005{B}%~\005{-{-}\e\\\'}function xterm_title_preexec () {print -Pn -- '\e]2;%n@%m %~ %# ' && print -n -- "${(q)1}\a"] && { print -Pn -- '\e_\005{g}%n\005{-}@\005{m}%m\005{-} \005{B}%~\005{-} %# ' && print -n -- "${(q)1}\e\\\\\\"; }}if ]; thenadd-zsh-hook -Uz precmd xterm_title_precmdadd-zsh-hook -Uz preexec xterm_title_preexecfiTitlul filei din emulatorul de terminal
Câteva emulatoare de terminal și multiplexoare acceptă setarea titlului filei. Secvențele de evadare depind de terminal:
Terminal | Secvențe de evadare | Descriere |
---|---|---|
GNU Screen | \ek \e\ |
Titlul ferestrei ecranului (%t ). |
Konsole | \e]30; \a |
Titlul filei lui Konsole. |
Detecția mediului shell
Vezi un depozit despre detecția mediului shell pentru teste de detecție a mediului shell. Acesta include login/interactive shell, sesiune Xorg, TTY și sesiune SSH.
/dev/tcp echivalent: ztcp
Utilizați modulul zsh/net/tcp
:
$ zmodload zsh/net/tcp
Acum puteți stabili conexiuni TCP:
$ ztcp example.com 80
Shortcut pentru a ieși din shell pe o linie de comandă parțială
În mod implicit, Ctrl+d
nu va închide shell-ul dacă linia de comandă este umplută, acest lucru îl rezolvă:
.zshrcexit_zsh() { exit }zle -N exit_zshbindkey '^D' exit_zshExtensii terțe
Cadre de configurare
Notă: Cadrele introduc un nivel de abstractizare și complexitate. Ele pot introduce, și adesea introduc, un comportament nedefinit. În caz de întrerupere a shell-ului, primul pas de depanare ar trebui să fie revenirea la shell-ul simplu.
- oh-my-zsh – Un cadru popular, condus de comunitate, pentru gestionarea configurației Zsh. Vine la pachet cu o tonă de funcții utile, ajutoare, plugin-uri, teme.
https://github.com/ohmyzsh/ohmyzsh || oh-my-zsh-gitAUR
- Prezto – Un cadru de configurare pentru Zsh. Vine cu module, îmbogățind mediul interfeței liniei de comandă cu valori implicite sănătoase, alias-uri, funcții, autocompletare și teme de prompt.
https://github.com/sorin-ionescu/prezto || prezto-gitAUR
- ZIM – Un cadru de configurare cu viteză fulminantă și extensii modulare. Zim este foarte ușor de personalizat și vine cu un set bogat de module și caracteristici, fără a face compromisuri în ceea ce privește viteza sau funcționalitatea.
https://github.com/zimfw/zimfw || zsh-zim-gitAUR
Manageri de plugin-uri
- Antibody – Un manager de plugin-uri axat pe performanță, similar cu Antigen.
https://github.com/getantibody/antibody || antibodyAUR
- zinit (anterior „zplugin”) – Manager flexibil de plugin-uri Zsh cu fpath curat, rapoarte, management al finalizării, mod turbo
https://github.com/zdharma/zinit || zsh-zplugin-gitAUR
- Antigen – Un manager de plugin-uri pentru Zsh, inspirat de oh-my-zsh și vundle. ABANDONAT
https://github.com/zsh-users/antigen || antigen-gitAUR
- zgen – Un manager de plugin-uri ușor și simplu pentru Zsh. ABANDONED
https://github.com/tarjoilija/zgen || zgen-gitAUR
- zplug – Un manager de plugin-uri de ultimă generație pentru Zsh. ABANDONED
https://github.com/zplug/zplug || zplugAUR
Fish-like syntax highlighting and autosuggestions
Fish oferă o evidențiere foarte puternică a sintaxei din shell și autosugestii. Pentru a le folosi pe amândouă în Zsh, puteți instala zsh-syntax-highlighting, zsh-autosuggestions și, în cele din urmă, să obțineți ca sursă unul sau ambele scripturi furnizate din zshrc:
source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zshsource /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh
Gestionatorul „command not found”
Acest articol sau secțiune este un candidat pentru a fi mutat în #Tips and tricks.
pacman -F
nu este o „extensie terță parte”. Doar chestiunile din pkgfile își au locul în această secțiune. (Discutați în Talk:Zsh#)pacman -F „command not found” handler
pacman include o funcționalitate de căutare a pachetelor care conțin un fișier. Următorul handler command-not-found va folosi pacman direct pentru a căuta pachetele corespunzătoare atunci când este executată o comandă necunoscută.
~/.zshrc
command_not_found_handler() {local pkgs cmd="$1" files=()printf 'zsh: comanda nu a fost găsită: %s' "$cmd" # tipărește comanda nu a fost găsită cât mai repede, apoi caută pachetefiles=(${(f)"$(pacman -F --machinereadable -- "/usr/bin/${cmd}")"})if ((( ${#files} )); thenprintf '\r%s poate fi găsit în următoarele pachete:\n' "$cmd "local res=() repo package version filefor file in "$files"; dores=("${(0)file}")repo="$res "package="$res "version="$res "file="$res "printf ' %s/%s %s %s: /%s\n' "$repo" "$pachet" "$versiune" "$fișier "doneelseprintf '\n'fireturn 127}
pacman -Fy
. Consultați pacman#Search for a package that contains a specific file pentru detalii. pkgfile „command not found” handler
pkgfile include un fișier script Zsh care oferă o funcție command_not_found_handler
care va căuta automat în baza de date pkgfile la introducerea unei comenzi nerecunoscute.
Trebuie să creați sursa scriptului pentru a-l activa. De exemplu:
~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Dezinstalare
Schimbați shell-ul implicit înainte de a elimina pachetul zsh.
Executați următoarea comandă:
$ chsh -s /bin/bash user
Utilizați-o pentru fiecare utilizator cu zsh setat ca shell de conectare (inclusiv root, dacă este necesar). Când se termină, pachetul zsh poate fi eliminat.
Alternativ, schimbați shell-ul implicit înapoi la Bash prin editarea /etc/passwd
ca root.
/etc/passwd
, deoarece ajută la prevenirea intrărilor invalide și/sau a erorilor de sintaxă.De exemplu, modificați următoarele:
username:x:1000:1000:Full Name,,,:/home/username:/usr/bin/zsh
Acesta:
username:x:1000:1000:Full Name,,,:/home/username:/bin/bash
Vezi și
.