Zsh

Zsh è una potente shell che opera sia come shell interattiva che come interprete di un linguaggio di scripting. Pur essendo compatibile con POSIX sh (non in modo predefinito, solo se si emette emulate sh), offre vantaggi come un migliore completamento di tabulazione e globbing.

La FAQ di Zsh offre altre ragioni per usare Zsh.

Installazione

Prima di iniziare, gli utenti potrebbero voler vedere quale shell è attualmente in uso:

$ echo $SHELL

Installa il pacchetto zsh. Per ulteriori definizioni di completamento, installa anche il pacchetto zsh-completions.

Configurazione iniziale

Assicurati che Zsh sia stato installato correttamente eseguendo quanto segue in un terminale:

$ zsh

Ora dovresti vedere zsh-newuser-install, che ti guiderà attraverso una configurazione di base. Se volete saltare questo, premete q. Se non lo vedi, puoi invocarlo manualmente con:

$ autoload -Uz zsh-newuser-install$ zsh-newuser-install -f
Nota: Assicurati che la dimensione del tuo terminale sia almeno 72×15 altrimenti zsh-newuser-install non funzionerà.

Rendere Zsh la tua shell predefinita

Cambia la tua shell con /usr/bin/zsh. Vedere Command-line shell#Changing your default shell.

Suggerimento: se si sostituisce bash, gli utenti potrebbero voler spostare alcuni codici da ~/.bashrc a ~/.zshrc (ad esempio il prompt e gli alias) e da ~/.bash_profile a ~/.zprofile (ad esempio il codice che avvia il sistema X Window).

File di avvio/spegnimento

Suggerimento:

  • Vedi A User’s Guide to the Z-Shell per spiegazioni sulle shell interattive e di login, e su cosa mettere nei tuoi file di avvio.
  • Potresti considerare di implementare un percorso standard per i tuoi file di configurazione di Zsh.
Nota:

  • Se $ZDOTDIR non è impostato, viene invece usato $HOME.
  • Se l’opzione RCS non è impostata in nessuno dei file, nessun file di configurazione sarà letto dopo quel file.
  • Se l’opzione GLOBAL_RCS non è impostata in nessuno dei file, nessun file di configurazione globale (/etc/zsh/*) sarà letto dopo quel file.

Quando si avvia, Zsh leggerà i comandi dai seguenti file in questo ordine per default, sempre che esistano.

  • /etc/zsh/zshenv Usato per impostare le variabili d’ambiente per tutti gli utenti; non dovrebbe contenere comandi che producono output o assumono che la shell sia collegata a una TTY. Quando questo file esiste sarà sempre letto, questo non può essere sovrascritto.
  • $ZDOTDIR/.zshenv Usato per impostare le variabili d’ambiente dell’utente; non dovrebbe contenere comandi che producano output o assumere che la shell sia collegata a una TTY. Quando questo file esiste sarà sempre letto.
  • /etc/zsh/zprofile Usato per eseguire comandi all’avvio per tutti gli utenti, sarà letto quando si avvia come shell di login. Si prega di notare che su Arch Linux, per impostazione predefinita, contiene una linea di fonti /etc/profile. Vedere l’avvertimento qui sotto prima di volerlo rimuovere!
    • /etc/profile Questo file dovrebbe essere prelevato da tutte le shell POSIX sh-compatibili al momento del login: imposta $PATH e altre variabili d’ambiente e impostazioni specifiche dell’applicazione (/etc/profile.d/*.sh) al momento del login.
  • $ZDOTDIR/.zprofile Usato per eseguire i comandi dell’utente all’avvio, verrà letto all’avvio come shell di login. Tipicamente usato per autoavviare sessioni grafiche e per impostare variabili d’ambiente a livello di sessione.
  • /etc/zsh/zshrc Usato per impostare la configurazione della shell interattiva ed eseguire comandi per tutti gli utenti, verrà letto all’avvio come shell interattiva.
  • $ZDOTDIR/.zshrc Usato per impostare la configurazione della shell interattiva dell’utente ed eseguire comandi, verrà letto all’avvio come shell interattiva.
  • /etc/zsh/zlogin Usato per l’esecuzione di comandi per tutti gli utenti alla fine dell’avanzamento iniziale, verrà letto all’avvio come shell di login.
  • $ZDOTDIR/.zlogin Usato per eseguire i comandi dell’utente alla fine dell’avanzamento iniziale, verrà letto all’avvio come shell di login. Tipicamente usato per avviare automaticamente le utilità della linea di comando. Non dovrebbe essere usato per l’avvio automatico di sessioni grafiche, poiché a questo punto la sessione potrebbe contenere la configurazione pensata solo per una shell interattiva.
  • $ZDOTDIR/.zlogout Usato per eseguire i comandi quando una shell di login esce.
  • /etc/zsh/zlogout Usato per eseguire i comandi per tutti gli utenti quando una shell di login esce.

Vedi la rappresentazione grafica.

Nota:

  • $HOME/.profile non è una parte dei file di avvio di Zsh e non viene generato da Zsh a meno che Zsh sia invocato come sh o ksh e avviato come shell di login. Per maggiori dettagli sulle modalità di compatibilità di sh e ksh fare riferimento a zsh(1) § COMPATIBILITÀ.
  • I percorsi usati nel pacchetto zsh di Arch sono diversi da quelli predefiniti usati nelle pagine man (FS#48992).
Attenzione: Non rimuovere la linea predefinita in /etc/zsh/zprofile, altrimenti si romperà l’integrità di altri pacchetti che forniscono alcuni script in /etc/profile.d/.

Configurare Zsh

Anche se Zsh è utilizzabile out of the box, quasi certamente non è impostato nel modo in cui la maggior parte degli utenti vorrebbe usarlo. Ma a causa dell’enorme quantità di personalizzazione disponibile in Zsh, configurare Zsh può essere un’esperienza scoraggiante e dispendiosa in termini di tempo.

Semplice .zshrc

Di seguito è incluso un file di configurazione di esempio. Fornisce un set decente di opzioni predefinite, oltre a fornire esempi di molti modi in cui Zsh può essere personalizzato. Per usare questa configurazione, salvatela in un file chiamato .zshrc.

Suggerimento: Applicare le modifiche senza bisogno di uscire e rientrare eseguendo source ~/.zshrc.

Ecco un semplice .zshrc:

~/.zshrc
autoload -Uz compinit promptinitcompinitpromptinit# Questo imposterà il prompt di default sul tema waltersprompt walters

Vedi #Temi del prompt per maggiori dettagli sul sistema dei temi del prompt.

Configurare $PATH

Zsh lega la variabile PATH ad un array path. Sono automaticamente sincronizzati. Questo ci permette di manipolare facilmente PATH semplicemente modificando l’array. Vedi A User’s Guide to the Z-Shell per i dettagli.

La linea typeset -U PATH path, dove il -U sta per unico, istruisce la shell a scartare i duplicati da entrambi $PATH e $path:

~/.zshenv
typeset -U PATH pathpath=("$HOME/.local/bin" /other/things/in/path "$path")export PATH

Completamento comandi

Forse la caratteristica più interessante di Zsh è la sua capacità avanzata di completamento automatico. Come minimo, abilita il completamento automatico in .zshrc. Per abilitare l’autocompletamento, aggiungi quanto segue al tuo ~/.zshrc:

~/.zshrc
autoload -Uz compinitcompinit

La configurazione di cui sopra include il completamento degli hostname ssh/scp/sftp, ma affinché questa caratteristica funzioni, gli utenti non devono abilitare l’hashing degli hostname di ssh (es.e. opzione HashKnownHosts nella configurazione del client ssh).

Per il completamento automatico con un’interfaccia guidata da tasti freccia, aggiungi il seguente a:

~/.zshrc
zstyle ':completion:*' menu select

Per attivare il menu, premi Tab due volte.

Per l’autocompletamento degli switch della linea di comando per gli alias, aggiungi il seguente a:

~/.zshrc
setopt COMPLETE_ALIASES

Per abilitare l’autocompletamento degli ambienti privilegiati nei comandi privilegiati (es.g. se completate un comando che inizia con sudo, gli script di completamento cercheranno anche di determinare il vostro completamento con sudo), include:

~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
Attenzione: Questo permetterà agli script di completamento di Zsh di eseguire comandi con i privilegi di sudo. Non dovresti abilitarlo se usi script di autocompletamento non fidati.
Nota: Questo speciale tipo di completamento consapevole del contesto è disponibile solo per un piccolo numero di comandi.

Key bindings

Zsh non usa readline, invece usa il proprio e più potente Zsh Line Editor (ZLE). Non legge /etc/inputrc o ~/.inputrc. Leggi Uno sguardo più da vicino all’editor di linee zsh e la creazione di widget personalizzati per un’introduzione alla configurazione di ZLE.

ZLE ha una modalità Emacs e una modalità vi. Se una delle variabili d’ambiente VISUAL o EDITOR contiene la stringa vi allora verrà usata la modalità vi; altrimenti, verrà usata la modalità Emacs. Impostare la modalità esplicitamente con bindkey -e o bindkey -v rispettivamente per la modalità Emacs o la modalità vi.

I collegamenti ai tasti sono assegnati mappando una sequenza di escape corrispondente alla pressione di un tasto a un widget ZLE. I widget disponibili, con le descrizioni delle loro azioni e le loro associazioni di tasti predefinite, sono elencati in zshzle(1) § WIDGETS STANDARD e zshcontrib(1) § ZLE FUNCTIONS.

Il modo raccomandato per impostare le associazioni di tasti in Zsh è usare le capacità delle stringhe da terminfo(5). Per esempio:

~/.zshrc
# crea un hash compatibile con zkbd; # per aggiungere altre chiavi a questo hash, vedi: 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}"# imposta la chiave di conseguenza}" ]] && bindkey -- "${key}" inizio linea}" ]] && 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}" beginning-of-buffer-or-history}" ]] && bindkey -- "${key}" end-of-buffer-or-history}" ]] && bindkey -- "${key}" reverse-menu-complete# Infine, assicurati che il terminale sia in modalità applicazione, quando zle è# attivo. Solo allora i valori di $terminfo sono validi.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_startadd-zle-hook-widget -Uz zle-line-finish zle_application_mode_stopfi

Ricerca della storia

È necessario impostare l’array key e assicurarsi che ZLE entri in modalità applicazione per utilizzare le seguenti istruzioni; vedi #Key bindings.

Per abilitare la ricerca nella storia aggiungi queste linee al file .zshrc:

~/.zshrc
autoload -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-search

Facendo così, solo i comandi passati che corrispondono alla linea corrente fino alla posizione corrente del cursore saranno mostrati quando vengono premuti i tasti Up o Down.

I modificatori Shift, Alt, Ctrl e Meta

i terminali compatibili conxterm possono usare definizioni di tasti estese da user_caps(5). Queste sono combinazioni di Shift, Alt, Ctrl e Meta insieme a Up, Down, Left, Right, PageUp, PageDown, Home, End o Del. Fai riferimento al sorgente zkbd per una lista di nomi raccomandati per i tasti modificatori e le combinazioni di tasti.

Per esempio, per Ctrl+Left per passare all’inizio della parola precedente e Ctrl+Right per passare all’inizio della parola successiva:

~/.zshrc
key="${terminfo}"key="${terminfo}"}" ]] && bindkey -- "${key}" backward-word}" ]] && bindkey -- "${chiave}" forward-word

Prompts

Zsh offre la possibilità di usare un tema di prompt o, per gli utenti che non sono soddisfatti dei temi (o vogliono espandere la loro utilità), la possibilità di costruire un prompt personalizzato.

Temi di prompt

I temi di prompt sono un modo semplice e veloce per impostare un prompt colorato in Zsh. Vedi zshcontrib(1) § PROMPT THEMES per informazioni sui temi del prompt e su come scrivere il proprio tema.

Per usare un tema, assicurati che il sistema dei temi del prompt sia impostato su autoload in .zshrc. Questo può essere fatto aggiungendo queste linee a:

~/.zshrc
autoload -Uz promptinitpromptinit

I temi prompt disponibili sono elencati eseguendo il comando:

$ prompt -l

Per esempio, per usare il tema walters, inserire:

$ prompt walters

Per vedere un’anteprima di tutti i temi disponibili, usa questo comando:

$ prompt -p
Installazione manuale dei temi del prompt

È possibile installare i temi manualmente, senza strumenti esterni di gestione della configurazione. Per un’installazione locale, prima crea una cartella e aggiungila all’array fpath, ad esempio:

$ mkdir ~/.zprompts$ fpath=("$HOME/.zprompts" "$fpath")

Ora crea un link simbolico del tuo file del tema in questa cartella:

$ ln -s mytheme.zsh ~/.zprompts/prompt_mytheme_setup

Se invece vuoi installare un tema globalmente, fai:

# ln -s mytheme.zsh /usr/share/zsh/functions/Prompts/prompt_mytheme_setup

Ora dovresti essere in grado di attivarlo usando:

$ prompt mytheme

Se tutto funziona, puoi modificare il tuo .zshrc di conseguenza.

Aggiungere temi di prompt senza un file separato per ciascuno

Oltre ad aggiungere un tema di prompt attraverso un proprio file, è possibile aggiungere temi dall’interno di un altro file (come il tuo .zshrc), es:

~/.zshrc
# Carica promptinitautoload -Uz promptinit && promptinit# Definisci il temaprompt_mytheme_setup() { PS1="%~%#"}# Aggiungi il tema al promptysprompt_themes+=( mytheme )# Carica il temaprompt mytheme

Prompt personalizzato

Tango-view-fullscreen.pngQuesto articolo o sezione necessita di espansione.Tango-view-fullscreen.png

Motivo: Aggiungere un semplice esempio incolore PROMPT. (Discutere in Talk:Zsh#)

Oltre ad un prompt primario di sinistra PS1 (PROMPT, prompt) che è comune a tutte le shell, Zsh supporta anche un prompt di destra RPS1 (RPROMPT). Queste due variabili sono quelle che vorrete impostare ad un valore personalizzato.

Altri prompt per scopi speciali, come PS2 (PROMPT2), PS3 (PROMPT3), PS4 (PROMPT4), RPS1 (RPROMPT), RPS2 (RPROMPT2) e SPROMPT, sono spiegati in zshparam(1) § PARAMETRI USATI DALLA SHELL.

Tutti i prompt possono essere personalizzati con escape. Gli escape di prompt disponibili sono elencati in zshmisc(1) § ESPANSIONE DELLE SEQUENZE DI PROMESSO.

Colors

Zsh imposta i colori in modo diverso da Bash, non è necessario usare le contorte sequenze di escape ANSI o le capacità del terminale da terminfo(5). Zsh fornisce comode escape di prompt per impostare il colore di primo piano, il colore di sfondo e altri effetti visivi; vedi zshmisc(1) § Effetti visivi per una lista di essi e le loro descrizioni.

I colori possono essere specificati usando un intero decimale, il nome di uno degli otto colori più ampiamente supportati o come un # seguito da una terzina RGB in formato esadecimale. Vedi la descrizione di fg=colore in zshzle(1) § CHARACTER HIGHLIGHTING per maggiori dettagli.

La maggior parte dei terminali supporta i seguenti colori per nome:

Nome Numero
black 0
red 1
green 2
yellow 3
blue 4
magenta 5
cyan 6
white 7

I numeri di colore 0-255 per emulatori di terminale compatibili con xterm 256 colori possono essere trovati nella tabella xterm-256 colori.

Con una variabile d’ambiente TERM correttamente impostata, il numero massimo di colori supportati dal terminale può essere trovato dal database terminfo(5) usando echoti colors. Nel caso di colori a 24 bit, controllate anche la variabile d’ambiente COLORTERM con print $COLORTERM. Se restituisce 24bit o truecolor allora il tuo terminale supporta 16777216 (224) colori anche se terminfo mostra un numero più piccolo.

Nota:

  • I colori 0-15 possono differire tra gli emulatori di terminale e i loro schemi di colore usati.
  • Molti emulatori di terminale visualizzano il grassetto con un colore più chiaro.
Suggerimento:

  • Gli escape dei prompt possono essere testati con il comando print -P "prompt escapes", per esempio:
    $ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
  • Se usate colori a 24 bit, potreste voler caricare il modulo zsh/nearcolor in terminali che non li supportano. Per esempio:
    }" -eq '16777216' ]] || zmodload zsh/nearcolor

    Vedi zshmodules(1) § IL MODULO ZSH/NEARCOLOR per dettagli sul modulo zsh/nearcolor.

Esempio

Questo è un esempio di prompt a due lati:

PROMPT='%F{green}%n%f@%F{magenta}%m%f %F{blue}%B%~%b%f %# 'RPROMPT=''

Ed ecco come verrà visualizzato:

username@host ~ %

Per usare colori dalla gamma 16-255 e 24-bit true color, puoi usare il numero da 0 a 255 assegnato al colore desiderato e il suo codice colore esadecimale, rispettivamente:

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=''

Campione .zshrc files

  • Per ottenere la stessa configurazione delle versioni ISO mensili (che usano Zsh per default), installare grml-zsh-config. Include le molte modifiche e ottimizzazioni avanzate di grml.
  • https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc – configurazione di base, con prompt dinamico e titolo della finestra/hardinfo.
  • https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc – zshrc con molteplici caratteristiche, assicurati di controllare i commenti su di esso. Caratteristiche degne di nota: funzione di conferma per assicurarsi che l’utente voglia eseguire poweroff, reboot o ibernazione, supporto per GIT nel prompt (fatto senza vcsinfo), completamento delle schede con menu, stampa del comando correntemente eseguito nella barra del titolo della finestra e altro.

Vedi dotfiles#User repository per altro.

Suggerimenti e trucchi

Avvia automaticamente X al login

Vedi xinit#Avvia automaticamente X al login.

Ripristina le impostazioni del terminale dopo che un programma esce in modo anomalo

Molti programmi cambiano lo stato del terminale, e spesso non ripristinano le impostazioni del terminale quando escono in modo anomalo (ad esempio quando si bloccano o incontrano SIGINT).

Questo può essere tipicamente risolto eseguendo reset(1):

$ reset

Le seguenti sezioni descrivono modi per evitare la necessità di resettare manualmente il terminale.

Il comando ttyctl

Il comando ttyctl può essere usato per “congelare/sbloccare” il terminale. Per congelare la shell interattiva all’avvio, usa quanto segue:

~/.zshrc
ttyctl -f

Resettare il terminale con sequenze di escape

Il set di caratteri alternativi per il disegno in linea può rovinare il terminale in un modo che ttyctl non può prevenire.

Una soluzione semplice è quella di emettere le sequenze di escape che resettano il terminale dalla funzione di hook precmd, in modo che vengano eseguite ogni volta prima che il prompt venga disegnato. Per esempio, usando la sequenza di escape \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> per tornare a una cartella visitata. Usare il completamento automatico dopo il trattino. Questo si rivela molto utile se si usa il menu di autocompletamento.

Nota: Questo non funzionerà se avete più di una sessione zsh aperta, e tentate di cd, a causa di un conflitto in entrambe le sessioni che scrivono sullo stesso file.

cdr

cdr vi permette di cambiare la directory di lavoro in una directory di lavoro precedente da una lista mantenuta automaticamente. Memorizza tutte le voci in file che sono mantenuti attraverso le sessioni e (per impostazione predefinita) tra emulatori di terminale nella sessione corrente.

Vedi zshcontrib(1) § RICORDARE LE DIRECTORIE RECENTI per istruzioni di configurazione.

Comando Help

A differenza di Bash, Zsh non abilita un comando help integrato, invece fornisce run-help. Per impostazione predefinita run-help è un alias di man, può essere eseguito manualmente aggiungendolo a un comando o può essere invocato per il comando attualmente digitato con le scorciatoie da tastiera Alt+h o Esc h.

Siccome di default è solo un alias di man, funzionerà solo su comandi esterni. Per migliorare la sua funzionalità, in modo che funzioni sui builtin della shell e altre caratteristiche della shell, è necessario utilizzare la funzione run-help. Vedi zshcontrib(1) per maggiori informazioni su run-help e le sue funzioni di assistente.

Prima carica la funzione run-help e poi rimuovi l'alias run-help esistente. Per convenienza, help può essere alias di run-help. Per esempio, aggiungi il seguente al tuo zshrc:

autoload -Uz run-help(( ${+aliases} )) && unalias run-helpalias help=run-help

Le funzioni di assistenza devono essere abilitate separatamente:

autoload -Uz run-help-git run-help-ip run-help-openssl run-help-p4 run-help-sudo run-help-svk run-help-svn

Per esempio, il comando run-help git commit ora aprirà la pagina man git-commit(1) invece di git(1).

Persistent rehash

Di solito, compinit non trova automaticamente nuovi eseguibili nella $PATH. Per esempio, dopo aver installato un nuovo pacchetto, i file in /usr/bin/ non sarebbero immediatamente o automaticamente inclusi nel completamento. Quindi, per avere questi nuovi eseguibili inclusi, si dovrebbe eseguire:

$ rehash

Questo 'rehash' può essere impostato per avvenire automaticamente. Semplicemente includi quanto segue nel tuo zshrc:

~/.zshrc
zstyle ':completion:*' rehash true

On-demand rehash

Come sopra, tuttavia pacman può essere configurato con degli hook per richiedere automaticamente un rehash, che non incorre nella penalità di performance del rehash costante come sopra. Per abilitarlo, creare la directory /etc/pacman.d/hooks e una directory /var/cache/zsh, quindi creare un file hook:

/etc/pacman.d/hooks/zsh.hook
Operazione = InstallOperazione = UpgradeOperazione = RemoveType = PathTarget = usr/bin/*Depends = zshWhen = PostTransactionExec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman

Questo mantiene la data di modifica del file /var/cache/zsh/pacman coerente con l'ultima volta che un pacchetto è stato installato, aggiornato o rimosso. Poi, zsh deve essere persuaso a rimettere in ordine la propria cache dei comandi quando va fuori data, aggiungendo al tuo ~/.zshrc:

~/.zshrc
zshcache_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_precmd

Se l'hook precmd viene attivato prima che /var/cache/zsh/pacman venga aggiornato, il completamento potrebbe non funzionare fino a quando non viene avviato un nuovo prompt. L'esecuzione di un comando vuoto, ad esempio premendo enter, dovrebbe essere sufficiente.

Alternativa on-demand rehash usando SIGUSR1

Come sopra, tuttavia il file hook appare così:

/etc/pacman.d/hooks/zsh-rehash.hook
Operazione = InstallOperazione = UpgradeOperazione = RemoveType = PathTarget = usr/bin/*Depends = zshDepends = procps-ngWhen = PostTransactionExec = /usr/bin/pkill zsh --signal=USR1
Warning: Questo invia SIGUSR1 a tutte le istanze zsh in esecuzione. Nota che il comportamento di default per SIGUSR1 è terminate, quindi quando configuri questo per la prima volta tutte le istanze zsh in esecuzione di tutti gli utenti (incluse le shell di login) termineranno se non hanno ricevuto la trappola sottostante.
~/.zshrc
TRAPUSR1() { rehash }

La funzione trap di cui sopra può essere sostituita con una lista trap trap 'rehash' USR1. Vedi zshmisc(1) § Trap Functions per le differenze tra i tipi di trappole.

Questo metodo farà istantaneamente rehash tutte le istanze zsh, rimuovendo la necessità di premere invio per innescare precmd.

Bind key to ncurses application

Legare un'applicazione ncurses alla pressione di un tasto, ma non accetta interazione. Usa la variabile BUFFER per farla funzionare. Il seguente esempio permette agli utenti di aprire ncmpcpp usando Alt+\:

~/.zshrc
ncmpcppShow() { BUFFER="ncmpcpp" zle accept-line}zle -N ncmpcppShowbindkey '^2;

\a. Per esempio:

$ print -n '\e]2;My xterm title\a'

imposterà il titolo a

My xterm title

Un modo semplice per avere un titolo dinamico è impostare il titolo nelle funzioni hook precmd e preexec. Vedi zshmisc(1) § Hook Functions per una lista di funzioni hook disponibili e le loro descrizioni.

Utilizzando print -P puoi inoltre trarre vantaggio dalle escape del prompt di Zsh.

Consiglio:

  • La stampa del titolo può essere suddivisa in più comandi, purché siano sequenziali.
  • GNU Screen invia il titolo di xterm all’hardstatus (%h). Se vuoi usare gli escape di stringa di Screen (ad esempio per i colori) dovresti impostare l’hardstatus con la sequenza di escape \e_\e\. Altrimenti, se gli escape di stringa sono usati in \e]2;\a, l’emulatore di terminale otterrà un titolo confuso a causa della sua incapacità di interpretare gli escape di stringa di Screen.
Nota:

  • Non usare l’opzione -P di print quando stampi le variabili per evitare che siano analizzate come escape di prompt.
  • Utilizzare il flag di espansione dei parametri q quando si stampano le variabili per evitare che vengano analizzate come sequenze di escape.
~/.zshrc
autoload -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{-}  && { 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_preexecfi

Titolo scheda emulatore terminale

Alcuni emulatori di terminale e multiplexer supportano l’impostazione del titolo della scheda. Le sequenze di escape dipendono dal terminale:

Terminale Seguenze di escape Descrizione
GNU schermo \ek\e\ Titolo della finestra dello schermo (%t).
Konsole \e]30;\a Titolo della scheda della console.

Rilevamento ambiente shell

Vedi un repository sul rilevamento ambiente shell per i test per rilevare l’ambiente shell. Questo include login/guscio interattivo, sessione Xorg, TTY e sessione SSH.

/dev/tcp equivalente: ztcp

Utilizza il modulo zsh/net/tcp:

$ zmodload zsh/net/tcp

Ora puoi stabilire connessioni TCP:

$ ztcp example.com 80

Scorciatoia per uscire dalla shell su linea di comando parziale

Di default, Ctrl+d non chiude la shell se la linea di comando è piena, questo lo risolve:

.zshrc
exit_zsh() { exit }zle -N exit_zshbindkey '^D' exit_zsh

Estensioni di terze parti

Quadri di configurazione

Nota: i quadri introducono un livello di astrazione e complessità. Possono, e spesso lo fanno, introdurre comportamenti non definiti. In caso di rottura della shell, il primo passo per il debug dovrebbe essere quello di ritornare alla shell normale.

  • oh-my-zsh – Un popolare framework guidato dalla comunità per gestire la configurazione di Zsh. Viene fornito con una tonnellata di funzioni utili, helper, plugin, temi.

https://github.com/ohmyzsh/ohmyzsh || oh-my-zsh-gitAUR

  • Prezto – Un framework di configurazione per Zsh. Viene fornito con moduli, arricchendo l’ambiente dell’interfaccia a riga di comando con valori predefiniti sani, alias, funzioni, completamento automatico e temi di prompt.

https://github.com/sorin-ionescu/prezto || prezto-gitAUR

  • ZIM – Un framework di configurazione con una velocità incredibile ed estensioni modulari. Zim è molto facile da personalizzare e viene fornito con un ricco set di moduli e caratteristiche senza compromettere la velocità o la funzionalità.

https://github.com/zimfw/zimfw || zsh-zim-gitAUR

Gestori di plugin

  • Antibody – Un gestore di plugin focalizzato sulle prestazioni simile ad Antigen.

https://github.com/getantibody/antibody || antibodyAUR

  • zinit (precedentemente “zplugin”) – Flessibile gestore di plugin per Zsh con fpath pulito, rapporti, gestione del completamento, modalità turbo

https://github.com/zdharma/zinit || zsh-zplugin-gitAUR

  • Antigen – Un gestore di plugin per Zsh, ispirato da oh-my-zsh e vundle. ABANDONED

https://github.com/zsh-users/antigen || antigen-gitAUR

  • zgen – Un leggero e semplice gestore di plugin per Zsh. ABANDONED

https://github.com/tarjoilija/zgen || zgen-gitAUR

  • zplug – Un gestore di plugin di nuova generazione per Zsh. ABANDONED

https://github.com/zplug/zplug || zplugAUR

Evidenziazione della sintassi e autosuggestioni simili a quelle di Fish

Fish fornisce un’evidenziazione della sintassi e autosuggestioni molto potenti. Per usarli entrambi in Zsh, puoi installare zsh-syntax-highlighting, zsh-autosuggestions, e, infine, generare uno o entrambi gli script forniti dal tuo zshrc:

source /usr/share/zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zshsource /usr/share/zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

Il gestore del “comando non trovato”

Tango-go-next.pngQuesto articolo o sezione è candidato a essere spostato in #Tips and tricks.Tango-go-next.png

Note: La funzione personalizzata che usa pacman -F non è una “estensione di terze parti”. Solo la roba del pkgfile appartiene a questa sezione. (Discutere in Talk:Zsh#)

pacman -F “command not found” handler

pacman include funzionalità per cercare pacchetti contenenti un file. Il seguente gestore command-not-found userà direttamente pacman per cercare i pacchetti corrispondenti quando viene eseguito un comando sconosciuto.

~/.zshrc
command_not_found_handler() {local pkgs cmd="$1" files=()printf 'zsh: comando non trovato: %s' "$cmd" # stampa il comando non trovato subito, poi cerca i pacchettifiles=(${(f)"$(pacman -F --machinereadable -- "/usr/bin/${cmd}")"})if (( ${#files} )); thenprintf '\r%s può essere trovato nei seguenti pacchetti:\n' "$cmd "local res=() repo pacchetto versione filefor file in "$files"; dores=("${(0)file}")repo="$res "pacchetto="$res "versione="$res "file="$res "printf ' %s/%s %s: /%s\n' "$repo" "$package" "$version" "$file "doneelseprintf '\n'fireturn 127}
Nota: Il database dei file di pacman è separato dal normale database di sincronizzazione e deve essere recuperato usando pacman -Fy. Vedere pacman#Search for a package that contains a specific file per i dettagli.

pkgfile “command not found” handler

pkgfile include un file script Zsh che fornisce una funzione command_not_found_handler che cercherà automaticamente il database di pkgfile quando si inserisce un comando non riconosciuto.

È necessario generare lo script per attivarlo. Per esempio:

~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Nota: Il database di pkgfile potrebbe aver bisogno di essere aggiornato prima che questo funzioni. Vedere pkgfile#Installazione per i dettagli.

Disinstallazione

Cambiare la shell di default prima di rimuovere il pacchetto zsh.

Attenzione: Se non si segue la seguente procedura, gli utenti potrebbero non avere più accesso a una shell funzionante.

Eseguire il seguente comando:

$ chsh -s /bin/bash user

Usarlo per ogni utente con zsh impostato come shell di login (incluso root se necessario). Una volta completato, il pacchetto zsh può essere rimosso.

In alternativa, cambiare la shell predefinita in Bash modificando /etc/passwd come root.

Attenzione: Si raccomanda vivamente di usare vipw(8) quando si modifica /etc/passwd in quanto aiuta a prevenire voci non valide e/o errori di sintassi.

Per esempio, cambiare quanto segue:

username:x:1000:1000:Full Name,,,:/home/username:/usr/bin/zsh

in questo:

username:x:1000:1000:Full Name,,,:/home/username:/bin/bash

Vedi anche

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.