Zsh

Zsh est un shell puissant qui fonctionne à la fois comme un shell interactif et comme un interpréteur de langage de script. Tout en étant compatible avec le POSIX sh (pas par défaut, seulement si l’on émet emulate sh), il offre des avantages tels que la complétion de tabulation et le globbing améliorés.

La FAQ Zsh offre plus de raisons d’utiliser Zsh.

Installation

Avant de commencer, les utilisateurs peuvent vouloir voir quel shell est actuellement utilisé :

$ echo $SHELL

Installer le paquet zsh. Pour des définitions de complétion supplémentaires, installez également le paquet zsh-completions.

Configuration initiale

Vérifiez que Zsh a été installé correctement en exécutant ce qui suit dans un terminal:

$ zsh

Vous devriez maintenant voir zsh-newuser-install, qui vous guidera à travers une configuration de base. Si vous voulez sauter cette étape, appuyez sur q. Si vous ne l’avez pas vu, vous pouvez l’invoquer manuellement avec :

$ autoload -Uz zsh-newuser-install$ zsh-newuser-install -f
Remarque : Assurez-vous que la taille de votre terminal est d’au moins 72×15 sinon zsh-newuser-install ne fonctionnera pas.

Faire de Zsh votre shell par défaut

Changez votre shell en /usr/bin/zsh. Voir Command-line shell#Changer votre shell par défaut.

Conseil : Si vous remplacez bash, les utilisateurs peuvent vouloir déplacer une partie du code de ~/.bashrc à ~/.zshrc (par exemple, l’invite et les alias) et de ~/.bash_profile à ~/.zprofile (par exemple, le code qui démarre le système X Window).

Fichiers de démarrage/arrêt

Conseil :

  • Voir Un guide de l’utilisateur du Z-Shell pour des explications sur les shells interactifs et de connexion, et ce qu’il faut mettre dans vos fichiers de démarrage.
  • Vous pourriez envisager de mettre en œuvre un chemin standard pour vos fichiers de configuration Zsh.
Note :

  • Si $ZDOTDIR n’est pas défini, $HOME est utilisé à la place.
  • Si l’option RCS n’est pas définie dans l’un des fichiers, aucun fichier de configuration ne sera lu après ce fichier.
  • Si l’option GLOBAL_RCS n’est pas définie dans l’un des fichiers, aucun fichier de configuration globale (/etc/zsh/*) ne sera lu après ce fichier.

Au démarrage, Zsh lira par défaut les commandes des fichiers suivants dans cet ordre, à condition qu’ils existent.

  • /etc/zsh/zshenv Utilisé pour définir les variables d’environnement pour tous les utilisateurs ; il ne doit pas contenir de commandes qui produisent une sortie ou supposent que le shell est attaché à un TTY. Lorsque ce fichier existe, il sera toujours lu, cela ne peut pas être remplacé.
  • $ZDOTDIR/.zshenv Utilisé pour définir les variables d’environnement de l’utilisateur ; il ne doit pas contenir de commandes qui produisent une sortie ou supposent que le shell est attaché à un TTY. Lorsque ce fichier existe, il sera toujours lu.
  • /etc/zsh/zprofile Utilisé pour exécuter des commandes au démarrage pour tous les utilisateurs, sera lu lors du démarrage en tant que shell de connexion. Veuillez noter que sur Arch Linux, il contient par défaut une ligne dont les sources /etc/profile. Voir l’avertissement ci-dessous avant de vouloir supprimer cela !
    • /etc/profile Ce fichier devrait être sourcé par tous les shells compatibles POSIX sh lors de la connexion : il configure $PATH et d’autres variables d’environnement et paramètres spécifiques à l’application (/etc/profile.d/*.sh) lors de la connexion.
  • $ZDOTDIR/.zprofile Utilisé pour exécuter les commandes de l’utilisateur au démarrage, sera lu lors du démarrage en tant que shell de connexion. Généralement utilisé pour démarrer automatiquement des sessions graphiques et pour définir des variables d’environnement à l’échelle de la session.
  • /etc/zsh/zshrc Utilisé pour définir la configuration du shell interactif et exécuter des commandes pour tous les utilisateurs, sera lu lors du démarrage en tant que shell interactif.
  • $ZDOTDIR/.zshrc Utilisé pour définir la configuration du shell interactif de l’utilisateur et exécuter des commandes, sera lu lors du démarrage en tant que shell interactif.
  • /etc/zsh/zlogin Utilisé pour exécuter des commandes pour tous les utilisateurs à la fin de la progression initiale, sera lu lors du démarrage comme un shell de connexion.
  • $ZDOTDIR/.zlogin Utilisé pour exécuter les commandes de l’utilisateur à la fin de la progression initiale, sera lu lors du démarrage comme un shell de connexion. Généralement utilisé pour démarrer automatiquement les utilitaires de ligne de commande. Ne devrait pas être utilisé pour démarrer automatiquement des sessions graphiques, car à ce stade, la session pourrait contenir une configuration destinée uniquement à un shell interactif.
  • $ZDOTDIR/.zlogout Utilisé pour exécuter les commandes lorsqu’un shell de connexion se termine.
  • /etc/zsh/zlogout Utilisé pour exécuter les commandes pour tous les utilisateurs lorsqu’un shell de connexion se termine.

Voir la représentation graphique.

Remarque :

  • $HOME/.profile ne fait pas partie des fichiers de démarrage de Zsh et n’est pas sourcé par Zsh à moins que Zsh soit invoqué en tant que sh ou ksh et démarré en tant que shell de connexion. Pour plus de détails sur les modes de compatibilité sh et ksh, reportez-vous à zsh(1) § COMPATIBILITÉ.
  • Les chemins utilisés dans le paquetage zsh d’Arch sont différents de ceux utilisés par défaut dans les pages de manuel (FS#48992).
Avertissement : Ne pas supprimer la ligne par défaut d’une ligne dans /etc/zsh/zprofile, sinon cela brisera l’intégrité d’autres paquets qui fournissent certains scripts dans /etc/profile.d/.

Configurer Zsh

Bien que Zsh soit utilisable hors de la boîte, il n’est presque certainement pas configuré de la façon dont la plupart des utilisateurs aimeraient l’utiliser. Mais en raison de la quantité même de personnalisation disponible dans Zsh, la configuration de Zsh peut être une expérience intimidante et longue.

Simple .zshrc

Inclus ci-dessous est un exemple de fichier de configuration. Il fournit un ensemble décent d’options par défaut ainsi que de donner des exemples de nombreuses façons que Zsh peut être personnalisé. Afin d’utiliser cette configuration, enregistrez-la dans un fichier nommé .zshrc.

Conseil : Appliquez les modifications sans avoir besoin de vous déconnecter puis de vous reconnecter en exécutant source ~/.zshrc.

Voici une simple .zshrc:

~/.zshrc
autoload -Uz compinit promptinitcompinitpromptinit# Ceci définira l'invite par défaut au thème waltersprompt walters

Voir #Thèmes d’invite pour plus de détails sur le système de thèmes d’invite.

Configuration de $PATH

Zsh lie la variable PATH à un tableau path. Ils sont automatiquement synchronisés. Cela nous permet de manipuler facilement PATH en modifiant simplement le tableau. Voir le Guide de l’utilisateur du Z-Shell pour plus de détails.

La ligne typeset -U PATH path, où le -U signifie unique, demande au shell d’éliminer les doublons à la fois de $PATH et de $path:

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

Command completion

Peut-être que la fonctionnalité la plus convaincante de Zsh est ses capacités avancées d’autocomplétion. Au minimum, activez l’autocomplétion dans .zshrc. Pour activer l’autocomplétion, ajoutez ce qui suit à votre ~/.zshrc:

~/.zshrc
autoload -Uz compinitcompinit

La configuration ci-dessus inclut la complétion des noms d’hôtes ssh/scp/sftp, mais pour que cette fonctionnalité fonctionne, les utilisateurs ne doivent pas activer le hachage des noms d’hôtes de ssh (i.c’est-à-dire l’option HashKnownHosts dans la configuration du client ssh).

Pour l’autocomplétion avec une interface pilotée par des touches fléchées, ajoutez ce qui suit à:

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

Pour activer le menu, appuyez deux fois sur Tab.

Pour l’autocomplétion des commutateurs de ligne de commande pour les alias, ajoutez ce qui suit à:

~/.zshrc
setopt COMPLETE_ALIASES

Pour activer l’autocomplétion des environnements privilégiés dans les commandes privilégiées (par ex.par exemple, si vous complétez une commande commençant par sudo, les scripts de complétion essaieront également de déterminer vos complétions avec sudo), incluez:

~/.zshrc
zstyle ':completion::complete:*' gain-privileges 1
Avertissement : Cela permettra aux scripts de complétion Zsh d’exécuter des commandes avec des privilèges sudo. Vous ne devriez pas activer ceci si vous utilisez des scripts d’autocomplétion non fiables.
Note : Ce type spécial de complétion contextuelle n’est disponible que pour un petit nombre de commandes.

Liés aux clés

Zsh n’utilise pas readline, à la place il utilise son propre et plus puissant éditeur de ligne Zsh (ZLE). Il ne lit pas /etc/inputrc ou ~/.inputrc. Lisez Un regard plus attentif sur l’éditeur de ligne zsh et la création de widgets personnalisés pour une introduction à la configuration de ZLE.

ZLE a un mode Emacs et un mode vi. Si l’une des variables d’environnement VISUAL ou EDITOR contient la chaîne vi, alors le mode vi sera utilisé ; sinon, il sera par défaut en mode Emacs. Définissez le mode explicitement avec bindkey -e ou bindkey -v respectivement pour le mode Emacs ou le mode vi.

Les liaisons de touches sont assignées en mappant une séquence d’échappement correspondant à une pression de touche à un widget ZLE. Les widgets disponibles, avec des descriptions de leurs actions et de leurs liaisons de touches par défaut, sont listés dans zshzle(1) § STANDARD WIDGETS et zshcontrib(1) § ZLE FUNCTIONS.

La façon recommandée de définir les liaisons de touches dans Zsh est d’utiliser les capacités de chaînes de terminfo(5). Par exemple :

~/.zshrc
# créer un hachage compatible zkbd;# pour ajouter d'autres clés à ce hachage, voir : 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}"# paramétrer la clé en conséquence}" ]] && bindkey -- "${key}" début de la ligne}" ]] && 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# Enfin, assurez-vous que le terminal est en mode application, lorsque zle est# actif. Ce n'est qu'à ce moment-là que les valeurs de $terminfo sont valides.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

Recherche d’historique

Vous devez configurer le tableau key et vous assurer que ZLE entre en mode application pour utiliser les instructions suivantes ; voir #Les liaisons de touches.

Pour activer la recherche d’historique, ajoutez ces lignes au .zshrcfichier:

~/.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

En faisant cela, seules les commandes passées correspondant à la ligne actuelle jusqu’à la position actuelle du curseur seront affichées lorsque les touches Up ou Down sont pressées.

Modificateurs Shift, Alt, Ctrl et Meta

Les terminaux compatibles xterm peuvent utiliser les définitions de touches étendues de user_caps(5). Ce sont des combinaisons de Shift, Alt, Ctrl et Meta avec Up, Down, Left, Right, PageUp, PageDown, Home, End ou Del. Reportez-vous à la source zkbd pour obtenir une liste des noms recommandés pour les touches de modification et les combinaisons de touches.

Par exemple, pour que Ctrl+Left se déplace au début du mot précédent et Ctrl+Right au début du mot suivant:

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

Prompts

Zsh offre les options d’utiliser un thème de prompt ou, pour les utilisateurs qui ne sont pas satisfaits des thèmes (ou qui veulent étendre leur utilité), la possibilité de construire un prompt personnalisé.

Thèmes de prompt

Les thèmes de prompt sont un moyen rapide et facile de configurer un prompt coloré dans Zsh. Voir zshcontrib(1) § PROMPT THEMES pour des informations sur les thèmes d’invite et comment écrire votre propre thème.

Pour utiliser un thème, assurez-vous que le système de thème d’invite est configuré pour autoload dans .zshrc. Cela peut être fait en ajoutant ces lignes à:

~/.zshrc
autoload -Uz promptinitpromptinit

Les thèmes d’invite disponibles sont listés en exécutant la commande :

$ prompt -l

Par exemple, pour utiliser le thème walters, entrez :

$ prompt walters

Pour avoir un aperçu de tous les thèmes disponibles, utilisez cette commande:

$ prompt -p
Installation manuelle de thèmes d’invite

Il est possible d’installer des thèmes manuellement, sans outils externes de gestionnaire de configuration. Pour une installation locale, créez d’abord un dossier et ajoutez-le au tableau fpath, par exemple:

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

Créez ensuite un lien symbolique de votre fichier de thème dans ce dossier :

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

Si au lieu de cela vous souhaitez installer un thème globalement, faites:

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

Maintenant vous devriez pouvoir l’activer en utilisant:

$ prompt mytheme

Si tout fonctionne, vous pouvez modifier votre .zshrc en conséquence.

Ajouter des thèmes d’invite sans un fichier séparé pour chacun

En plus d’ajouter un thème d’invite via son propre fichier, il est possible d’ajouter des thèmes à partir d’un autre fichier (comme votre .zshrc), par exemple:

~/.zshrc
# Charger promptinitautoload -Uz promptinit && promptinit# Définir le thèmeprompt_mytheme_setup() { PS1="%~%#"}# Ajouter le thème aux promptsysprompt_themes+=( mytheme )# Charger le themeprompt mytheme

Prompt personnalisé

Tango-view-fullscreen.pngCet article ou cette section nécessite une expansion.Tango-view-fullscreen.png

Raison : Ajouter un exemple simple sans couleur PROMPT. (Discuter dans Talk:Zsh#)

En plus d’un prompt primaire de gauche PS1 (PROMPT, prompt) qui est commun à tous les shells, Zsh supporte également un prompt de droite RPS1 (RPROMPT). Ces deux variables sont celles que vous voudrez définir à une valeur personnalisée.

Les autres invites à usage spécial, comme PS2 (PROMPT2), PS3 (PROMPT3), PS4 (PROMPT4), RPS1 (RPROMPT), RPS2 (RPROMPT2) et SPROMPT, sont expliquées dans zshparam(1) § PARAMÈTRES UTILISÉS PAR LE SHELL.

Toutes les invites peuvent être personnalisées avec des échappatoires d’invite. Les échappements d’invite disponibles sont listés dans zshmisc(1) § EXPANSION DES SEQUENCES D’INVITATION.

Couleurs

Zsh définit les couleurs différemment de Bash, vous n’avez pas besoin d’utiliser des séquences d’échappement ANSI alambiquées ou des capacités de terminal provenant de terminfo(5). Zsh fournit des échappements d’invite pratiques pour définir la couleur de premier plan, la couleur d’arrière-plan et d’autres effets visuels ; voir zshmisc(1) § Effets visuels pour une liste de ceux-ci et leurs descriptions.

Les couleurs peuvent être spécifiées en utilisant un entier décimal, le nom d’une des huit couleurs les plus largement supportées ou comme un # suivi d’un triplet RVB au format hexadécimal. Voir la description de fg=colour dans zshzle(1) § CHARACTER HIGHLIGHTING pour plus de détails.

La plupart des terminaux supportent les couleurs suivantes par leur nom :

.

Nom Numéro
black 0
red 1
green 2
yellow 3
blue 4
magenta 5
cyan 6
white 7

Les numéros de couleur 0-255 pour les émulateurs de terminaux compatibles avec xterm 256 couleurs peuvent être trouvés dans le xterm-.256color chart.

Avec une variable d’environnement TERM correctement définie, le nombre maximum de couleurs supportées par le terminal peut être trouvé à partir de la base de données terminfo(5) en utilisant echoti colors. Dans le cas de couleurs 24 bits, vérifiez également la variable d’environnement COLORTERM avec print $COLORTERM. Si elle renvoie 24bit ou truecolor, alors votre terminal prend en charge 16777216 (224) couleurs, même si terminfo indique un nombre inférieur.

Remarque :

  • Les couleurs 0-15 peuvent différer entre les émulateurs de terminaux et leurs schémas de couleurs utilisés.
  • De nombreux émulateurs de terminaux affichent le gras avec une couleur plus vive.
Astuce :

  • Les échappatoires d’invite peuvent être testées avec la commande print -P "prompt escapes", par exemple :
    $ print -P '%B%F{red}co%F{green}lo%F{blue}rs%f%b'
  • Si vous utilisez des couleurs 24 bits, vous pourriez vouloir charger le module zsh/nearcolor dans les terminaux qui ne les supportent pas. Par exemple :
    }" -eq '16777216' ]] || zmodload zsh/nearcolor

    Voir zshmodules(1) § LE MODULE ZSH/NEARCOLOR pour des détails sur le module zsh/nearcolor.

Exemple

Voici un exemple d’invite à deux côtés:

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

Et voici comment elle sera affichée :

username@host ~ %

Pour utiliser les couleurs de la gamme 16-255 et la couleur vraie 24 bits, vous pouvez utiliser le nombre de 0 à 255 attribué à la couleur voulue et son code couleur hexadécimal, respectivement:

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

Exemple .zshrc files

  • Pour obtenir la même configuration que les versions ISO mensuelles (qui utilisent Zsh par défaut), installez grml-zsh-config. Il inclut les nombreux ajustements et optimisations avancées de grml.
  • https://github.com/MrElendig/dotfiles-alice/blob/master/.zshrc – configuration de base, avec invite dynamique et titre de fenêtre/hardinfo.
  • https://github.com/slashbeast/conf-mgmt/blob/master/roles/home_files/files/DOTzshrc – zshrc avec de multiples fonctionnalités, assurez-vous de vérifier les commentaires à son sujet. Caractéristiques notables : fonction de confirmation pour s’assurer que l’utilisateur veut exécuter poweroff, reboot ou hibernation, support de GIT dans le prompt (fait sans vcsinfo), complétion de tabulation avec menu, impression de la commande exécutée actuelle dans la barre de titre de la fenêtre et plus.

Voir dotfiles#Dépôts utilisateurs pour plus.

Tips et astuces

Démarrage automatique de X à la connexion

Voir xinit#Démarrage automatique de X à la connexion.

Restaurer les paramètres du terminal après qu’un programme quitte anormalement

De nombreux programmes modifient l’état du terminal, et souvent ne restaurent pas les paramètres du terminal lors d’une sortie anormale (par exemple en cas de plantage ou de rencontre avec SIGINT).

Ce problème peut généralement être résolu en exécutant reset(1):

$ reset

Les sections suivantes décrivent des moyens d’éviter le besoin de réinitialiser manuellement le terminal.

La commande ttyctl

La commande ttyctl peut être utilisée pour « geler/dégeler » le terminal. Pour geler le shell interactif au lancement, utilisez ce qui suit:

~/.zshrc
ttyctl -f

Réinitialiser le terminal avec des séquences d’échappement

Les jeux de caractères alternatifs de dessin linéaire peuvent bousiller le terminal d’une manière que ttyctl ne peut pas empêcher.

Une solution simple consiste à sortir les séquences d’échappement qui réinitialisent le terminal à partir de la fonction hook precmd, de sorte qu’elles soient exécutées chaque fois avant que l’invite ne soit dessinée. Par exemple, utiliser la séquence d’échappement \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> pour revenir à un dossier visité. Utilisez l'autocomplétion après le tiret. Cela s'avère très pratique si vous utilisez le menu d'autocomplétion.

Remarque : Cela ne fonctionnera pas si vous avez plus d'une session zsh ouverte, et que vous tentez de cd, en raison d'un conflit dans les deux sessions écrivant sur le même fichier.

cdr

cdr vous permet de changer le répertoire de travail vers un répertoire de travail précédent à partir d'une liste maintenue automatiquement. Il stocke toutes les entrées dans des fichiers qui sont maintenus à travers les sessions et (par défaut) entre les émulateurs de terminal dans la session actuelle.

Voir zshcontrib(1) § RAPPEL DES RÉPERTOIRES RÉCENTS pour les instructions de configuration.

Commande d'aide

À la différence de Bash, Zsh n'active pas une commande help intégrée, à la place il fournit run-help. Par défaut, run-help est un alias de man, il peut être soit exécuté manuellement en le faisant précéder d'une commande, soit être invoqué pour la commande actuellement tapée avec les raccourcis clavier Alt+h ou Esc h.

Puisque par défaut c'est juste un alias de man, il ne fonctionnera que sur les commandes externes. Pour améliorer sa fonctionnalité, afin qu'il fonctionne sur les builtins et autres fonctionnalités de l'interpréteur de commandes, vous devez utiliser la fonction run-help. Voir zshcontrib(1) pour plus d'informations sur la fonction run-help et ses fonctions assistantes.

Chargez d'abord la fonction run-help, puis supprimez l'alias run-help existant. Par commodité, help peut être aliasé à run-help. Par exemple, ajoutez ce qui suit à votre zshrc:

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

Les fonctions auxiliaires doivent être activées séparément:

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

Par exemple, la commande run-help git commit ouvrira désormais la page de manuel git-commit(1) au lieu de git(1).

Réhash persistant

Typiquement, compinit ne trouvera pas automatiquement les nouveaux exécutables dans le $PATH. Par exemple, après avoir installé un nouveau paquet, les fichiers dans /usr/bin/ ne seraient pas immédiatement ou automatiquement inclus dans l'achèvement. Ainsi, pour que ces nouveaux exécutables soient inclus, il faudrait exécuter:

$ rehash

Ce 'rehash' peut être configuré pour se produire automatiquement. Il suffit d'inclure ce qui suit dans votre zshrc:

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

Rehash à la demande

Comme ci-dessus, cependant pacman peut être configuré avec des hooks pour demander automatiquement un rehash, ce qui n'entraîne pas la pénalité de performance du rehash constant comme ci-dessus. Pour activer ceci, créez le répertoire /etc/pacman.d/hooks, et un répertoire /var/cache/zsh, puis créez un fichier hook:

/etc/pacman.d/hooks/zsh.hook
Opération = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshWhen = PostTransactionExec = /usr/bin/install -Dm644 /dev/null /var/cache/zsh/pacman

Cela permet de garder la date de modification du fichier /var/cache/zsh/pacman cohérente avec la dernière fois qu'un paquet a été installé, mis à niveau ou supprimé. Ensuite, zsh doit être amadouée pour qu'elle remette en mémoire son propre cache de commandes lorsqu'il devient obsolète, en ajoutant à votre ~/.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

Si le hook precmd est déclenché avant que /var/cache/zsh/pacman ne soit mis à jour, l'achèvement peut ne pas fonctionner jusqu'à ce qu'une nouvelle invite soit lancée. L'exécution d'une commande vide, par exemple en appuyant sur enter, devrait être suffisante.

Alternative on-demand rehash using SIGUSR1

Comme ci-dessus, cependant le fichier hook ressemble à ceci:

/etc/pacman.d/hooks/zsh-rehash.hook
Opération = InstallOperation = UpgradeOperation = RemoveType = PathTarget = usr/bin/*Depends = zshDepends = procps-ngWhen = PostTransactionExec = /usr/bin/pkill zsh --signal=USR1
Avertissement : Ceci envoie SIGUSR1 à toutes les instances zsh en cours d'exécution. Notez que le comportement par défaut pour SIGUSR1 est terminate, donc lorsque vous configurez ceci pour la première fois, toutes les instances zsh en cours d'exécution de tous les utilisateurs (y compris les shells de connexion) se termineront si elles n'ont pas sourcé le piège ci-dessous.
~/.zshrc
TRAPUSR1() { rehash }

La fonction piège ci-dessus peut être remplacée par une liste piège trap 'rehash' USR1. Voir zshmisc(1) § Trap Functions pour les différences entre les types de pièges.

Cette méthode va instantanément rehash toutes les instances de zsh, supprimant le besoin d'appuyer sur entrée pour déclencher precmd.

Lier une touche à une application ncurses

Lier une application ncurses à une touche, mais elle n'acceptera pas d'interaction. Utilisez la variable BUFFER pour la faire fonctionner. L'exemple suivant permet aux utilisateurs d'ouvrir ncmpcpp en utilisant Alt+\:

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

\a. Par exemple:

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

définira le titre à

My xterm title

Une façon simple d’avoir un titre dynamique est de définir le titre dans les fonctions hook precmd et preexec. Voir zshmisc(1) § Fonctions de crochet pour une liste des fonctions de crochet disponibles et leurs descriptions.

En utilisant print -P, vous pouvez en plus profiter des échappatoires d’invite de Zsh.

Astuce :

  • L’impression du titre peut être divisée en plusieurs commandes tant qu’elles sont séquentielles.
  • GNU Screen envoie le titre xterm au hardstatus (%h). Si vous voulez utiliser les échappatoires de chaîne de Screen (par exemple, pour les couleurs), vous devez définir le hardstatus avec la séquence d’échappement \e_\e\. Sinon, si les échappements de chaîne sont utilisés dans \e]2;\a, l’émulateur de terminal obtiendra un titre brouillé en raison de son incapacité à interpréter les échappements de chaîne de Screen.
Note :

  • Ne pas utiliser l’option -P de print lors de l’impression de variables pour éviter qu’elles soient analysées comme des échappements d’invite.
  • Utilisez l’indicateur d’expansion de paramètre q lors de l’impression des variables pour les empêcher d’être analysées comme des séquences d’échappement.
~/.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{-} \005{B}%~\005{-}\e\\'}fonction 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_preexecfi

Titre de l’onglet de l’émulateur de terminal

Certains émulateurs de terminal et multiplexeurs prennent en charge la définition du titre de l’onglet. Les séquences d’échappement dépendent du terminal:

Terminal Séquences d’échappement Description
Écran GNU \ek\e\ Titre de fenêtre de l’écran (%t).
Konsole \e]30;\a Titre de l’onglet de la console.

Détection de l’environnement du shell

Voir un référentiel sur la détection de l’environnement du shell pour les tests de détection de l’environnement du shell. Cela inclut le shell de connexion/interactif, la session Xorg, le TTY et la session SSH.

Equivalent de /dev/tcp : ztcp

Utiliser le module zsh/net/tcp:

$ zmodload zsh/net/tcp

Vous pouvez maintenant établir des connexions TCP:

$ ztcp example.com 80

Court-circuit pour sortir du shell sur une ligne de commande partielle

Par défaut, Ctrl+d ne fermera pas votre shell si la ligne de commande est remplie, ceci le corrige:

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

Extensions tierces

Cadres de configuration

Note : Les cadres de travail introduisent un niveau d’abstraction et de complexité. Ils peuvent, et c’est souvent le cas, introduire un comportement non défini. En cas de rupture du shell, la première étape de débogage devrait être de revenir au shell ordinaire.
  • oh-my-zsh – Un framework populaire et communautaire pour gérer votre configuration Zsh. Il est livré avec une tonne de fonctions utiles, des aides, des plugins, des thèmes.

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

  • Prezto – Un framework de configuration pour Zsh. Il est livré avec des modules, enrichissant l’environnement de l’interface de ligne de commande avec des valeurs par défaut saines, des alias, des fonctions, la complétion automatique et des thèmes d’invite.

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

  • ZIM – Un framework de configuration avec une vitesse flamboyante et des extensions modulaires. Zim est très facile à personnaliser, et est livré avec un riche ensemble de modules et de fonctionnalités sans compromettre la vitesse ou la fonctionnalité.

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

Gestionnaires de plugins

  • Antibody – Un gestionnaire de plugins axé sur la performance, similaire à Antigen.

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

  • zinit (précédemment « zplugin ») – Gestionnaire de plugins Zsh flexible avec fpath propre, rapports, gestion de l’achèvement, mode turbo

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

  • Antigen – Un gestionnaire de plugins pour Zsh, inspiré par oh-my-zsh et vundle. ABANDONED

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

  • zgen – Un gestionnaire de plugins léger et simple pour Zsh. ABANDONED

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

  • zplug – Un gestionnaire de plugins de nouvelle génération pour Zsh. ABANDONED

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

La coloration syntaxique et les autosuggestions de type fish

Fish fournit une coloration syntaxique et des autosuggestions de shell très puissantes. Pour utiliser les deux dans Zsh, vous pouvez installer zsh-syntax-highlighting, zsh-autosuggestions, et enfin sourcer l’un ou les deux scripts fournis à partir de votre zshrc:

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

Le gestionnaire « commande non trouvée »

Tango-go-next.pngCet article ou cette section est un candidat pour être déplacé vers #Tips and tricks.Tango-go-next.png

Notes : La fonction personnalisée utilisant pacman -F n’est pas une « extension tierce ». Seuls les trucs de pkgfile ont leur place dans cette section. (Discutez dans Talk:Zsh#)

handler pacman -F « command not found »

pacman inclut une fonctionnalité pour rechercher les paquets contenant un fichier. Le gestionnaire de commande non trouvée suivant utilisera directement pacman pour rechercher les paquets correspondants lorsqu’une commande inconnue est exécutée.

~/.zshrc
command_not_found_handler() {local pkgs cmd="$1" files=()printf 'zsh : command not found : %s' "$cmd" # imprime la commande non trouvée dès que possible, puis recherche les paquetsfiles=(${(f) "$(pacman -F --machinereadable -- "/usr/bin/${cmd}")"})if (( ${#files} )) ; thenprintf '\r%s peut être trouvé dans les paquets suivants :\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\n' "$repo" "$package" "$version" "$file "doneelseprintf '\n'fireturn 127}
Note : La base de données des fichiers de pacman est séparée de la base de données sync normale et elle doit être récupérée en utilisant pacman -Fy. Voir pacman#Search for a package that contains a specific file pour plus de détails.

pkgfile « command not found » handler

pkgfile inclut un fichier script Zsh qui fournit une command_not_found_handler fonction qui recherchera automatiquement la base de données pkgfile lors de la saisie d’une commande non reconnue.

Vous devez sourcer le script pour l’activer. Par exemple :

~/.zshrc
source /usr/share/doc/pkgfile/command-not-found.zsh
Remarque : La base de données pkgfile peut avoir besoin d’être mise à jour avant que cela ne fonctionne. Voir pkgfile#Installation pour plus de détails.

Désinstallation

Changer le shell par défaut avant de supprimer le paquetage zsh.

Avertissement : Si la procédure ci-dessous n’est pas respectée, les utilisateurs risquent de ne plus avoir accès à un shell fonctionnel.

Exécutez la commande suivante :

$ chsh -s /bin/bash user

Utilisez-la pour chaque utilisateur avec zsh défini comme shell de connexion (y compris root si nécessaire). Une fois terminé, le paquet zsh peut être supprimé.

Alternativement, changez l’interpréteur de commandes par défaut pour revenir à Bash en éditant /etc/passwd en tant que root.

Avertissement : Il est fortement recommandé d’utiliser vipw(8) lors de l’édition de /etc/passwd car il aide à prévenir les entrées invalides et/ou les erreurs de syntaxe.

Par exemple, changez ce qui suit:

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

En ceci:

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

Voir également

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.