Thème Jannah La licence n'est pas validée, Rendez-vous sur la page des options du thème pour valider la licence, Vous avez besoin d'une seule licence pour chaque nom de domaine.

Comment faire en sorte que le terminal complète automatiquement les commandes pour les applications en ligne de commande

Comment ajouter la complétion de terminal aux applications de ligne de commande

Saisir manuellement des commandes dans Terminal peut être fastidieux, surtout avec les applications en ligne de commande nécessitant plusieurs options. De simples erreurs de frappe perturbent le processus et ralentissent le flux de travail. C'est là qu'intervient la fonctionnalité de saisie semi-automatique, qui vous fait gagner du temps et réduit les erreurs. L'activation de cette fonctionnalité vous permet d'exécuter les commandes plus rapidement, car Terminal suggère les options disponibles et les complète automatiquement d'une simple pression sur un bouton.

Comment faire en sorte que le terminal complète automatiquement les commandes pour les applications en ligne de commande

La saisie semi-automatique est un excellent moyen de rendre vos propres outils plus accessibles. Découvrez comment démarrer en créant un script de saisie semi-automatique simple avec Bash et ZSH.

Table des Matières

Comment fonctionne la saisie semi-automatique des onglets ?

La saisie semi-automatique, omniprésente, des applications de messagerie texte aux environnements de développement intégrés, peut sembler une innovation relativement récente, mais elle est présente dans divers systèmes Unix depuis le début des années 1980, voire avant. Les interfaces Linux, telles que bash et zsh, prennent en charge un système de saisie semi-automatique plus puissant qu'on pourrait le croire.

La saisie semi-automatique par tabulation est souvent utilisée avec les commandes et les noms de fichiers. Elle analyse la variable d'environnement PATH pour identifier les commandes disponibles commençant par les caractères saisis. La saisie semi-automatique par nom de fichier fournit le reste du chemin d'accès (absolu ou relatif) et vous aide à affiner vos options, dissipant ainsi toute ambiguïté lors de la saisie. Ces deux options vous font gagner beaucoup de temps et vous évitent la saisie manuelle.

Il existe un troisième type de complétion, peut-être moins courant, mais peut-être plus puissant que les types les plus courants. La complétion automatique des arguments s'applique à tout ce qui suit le nom de la commande, comme les options ou les sous-commandes.

Comment faire en sorte que le terminal complète automatiquement les commandes d'application en ligne de commande

Comment ajouter la complétion à vos scripts

Je vais d'abord expliquer comment ajouter une complétion personnalisée à zsh, puis décrire son équivalent dans bash.

Exemple de commande

Je vais vous montrer comment compléter des arguments de commande personnalisés à l'aide d'un script simple que j'utilise pour gérer ma liste de tâches. Le script complet n'est pas trop compliqué, mais cet extrait se concentre sur les parties les plus importantes :

#!/usr/bin/env zsh

FILE="$HOME/.local/state/todos/data"

if [ "$#" -eq "1" ] && [ "$1" = "edit" ] ; then
    "${EDITOR:-vi}" "$FILE"
elif [ "$#" -eq "1" ] && [ "$1" = "help" ] ; then
    echo "Usage: $(basename $0) [ edit | help ]"
else
    <"$FILE" grep -v ^~
fi

J'ai enregistré ce script dans un fichier nommé todos, donc les commandes suivantes fonctionnent désormais sur mon système :

  • todos : afficher le contenu du fichier de données, en ignorant les lignes commençant par ~
  • aide à tout : Afficher l'utilisation
  • todos edit : Ouvrir le fichier de données dans l'éditeur
Lisez aussi:  Les applications Linux performantes offrent une meilleure expérience utilisateur et sont toujours dignes de confiance.

C'est simple, même si le script complet effectue un travail supplémentaire pour maintenir un fichier JSON séparé lors de l'édition. Je n'ai pas de page de manuel pour ce script simple, et la sous-commande help est utile, mais j'aimerais ajouter la complétion des arguments afin de pouvoir détecter la sous-commande edit ou d'autres sous-commandes que j'ajouterai ultérieurement.

conseil
La fonction « todos » n'a pas d'importance dans cette démonstration. Vous pouvez créer un script vide portant ce nom. Tant qu'il est exécutable et dans votre chemin d'accès, les suggestions de saisie semi-automatique fonctionneront.

Script de complétion personnalisé

Un script de saisie semi-automatique nécessite deux choses : la configuration d'un système de saisie semi-automatique pour vos commandes à l'aide de la structure intégrée et la création de saisies semi-automatiques potentielles.

Dans zsh, l'opération de complétion la plus simple est très simple :

_complete_todos() {
    compadd help edit
}

autoload -Uz compinit
compinit
compdef _complete_todos todos

La fonction _complete_todos est un gestionnaire qui appelle la fonction compadd pour déterminer les suggestions. La fonction compadd appartient au module compinit de Zsh. Chaque mot passé en argument à compadd représente une complétion possible. Pour un script simple comme celui-ci, vous pouvez coder cette fonction en dur en l'appelant statiquement.

Après avoir défini la fonction, le script charge et exécute le module compinit avant d'appeler compdef pour lier la fonction _complete_todos à la commande todos.

Vous pouvez placer le script ci-dessus dans un fichier .zshrc ou tout autre fichier source. Vous pouvez également utiliser le système fpath de zsh pour le stocker dans un fichier commençant par un trait de soulignement, dans un répertoire approprié.

Lisez aussi:  Comment installer Linux sur M1 Mac en utilisant Apple Silicon

Pour le développement et les tests, vous pouvez simplement exécuter le code ci-dessus directement en ligne de commande. Une fois terminé, essayez de saisir « todos » et testez la saisie semi-automatique.

Différences entre Bash

Bash est très différent en termes de complétion. Zsh, en particulier, ne vous sera pas d'une grande aide. Alors que Zsh gère toutes les suggestions lui-même, Bash s'attend à ce que vous sélectionniez les suggestions appropriées en fonction de ce qui a été saisi et de l'endroit où la touche Tab a été enfoncée.

Considérez un équivalent simple du script Zsh ci-dessus :

_complete_todos_bash() {
    COMPREPLY=(help edit)
}

complete -F _complete_todos_bash todos

Bash fournit une commande complète au lieu d'une méthode de fonction Zsh ; il n'est donc pas nécessaire de charger ou d'initialiser quoi que ce soit. Le gestionnaire de complétion définit une variable connue, COMPREPLY, au lieu d'itérer sur les suggestions. Cette variable est un tableau Bash.

Si vous testez ce script dans Bash, vous verrez qu'il répertorie toutes les suggestions de sous-commandes comme prévu :

$ todos <TAB>
help edit

Le problème est que Bash s'appuie toujours sur votre processeur pour fournir toutes les suggestions pertinentes, sans appliquer sa propre logique. Ces résultats ne sont donc pas toujours utiles :

$ todos he<TAB>
help edit

Il est de votre responsabilité d'indiquer à Bash qu'il ne doit proposer que « aide » comme option de complétion possible. Pour ce faire, examinez quelques variables utiles fournies par Bash lorsque vous appuyez sur Tab :

  • COMP_WORDS est un tableau contenant la ligne de commande entière décomposée en mots individuels.
  • COMP_CWORD est un index dans COMP_WORDS qui pointe vers le mot dans lequel se trouve actuellement le curseur.

Grâce à ces données, vous pouvez déterminer le mot en cours de complétion et fournir des suggestions contextuelles. Bien qu'il existe des moyens de le faire manuellement, Bash propose une autre commande utile : compgen. Cette commande peut générer de nombreux types de suggestions en fonction de facteurs tels que les fonctions ou commandes disponibles et le mot saisi. L'option -W permet de rechercher dans une liste fixe de mots.

$ compgen -W "one two three" o
one
$ compgen -W "one two three" t
two
three

Vous pouvez donc insérer un appel à compgen dans le gestionnaire de suggestions et bénéficier de suggestions pertinentes et spécifiques au contexte avec un script très simple :

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "edit help" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

complete -F _complete_todos_bash todos

Assemblez tout

Pour vos propres scripts, vous les exécuterez probablement dans un environnement familier : Bash ou ZSH. Pour les scripts portables, que vous souhaitez partager avec d'autres ou utiliser sur plusieurs systèmes, vous devrez abstraire une partie de ce code.

Lisez aussi:  Comment utiliser et personnaliser un fichier .bashrc sous Linux pour améliorer votre expérience

Voici une copie complète du script de complétion qui fonctionne dans zsh ou Bash, en spécifiant l'environnement d'exécution dans lequel il s'exécute et en exécutant le code correspondant.

SUBCOMMANDS=(help edit halt)

_complete_todos_zsh() {
    compadd $SUBCOMMANDS
}

_complete_todos_bash() {
    COMPREPLY=( $( compgen -W "${SUBCOMMANDS[*]}" -- "${COMP_WORDS[$COMP_CWORD]}" ) )
}

if [ -n "${ZSH_VERSION:-}" ]; then
    autoload -Uz compinit
    compinit
    compdef _complete_todos_zsh todos
elif [ -n "${BASH_VERSION:-}" ]; then
    complete -F _complete_todos_bash todos
fi

Les variables d'environnement ZSH_VERSION et BASH_VERSION déclarent l'interface dans laquelle nous travaillons actuellement. N'oubliez pas que l'interface dans laquelle votre commande s'exécute n'est pas importante ; l'interface qui appelle le système de complétion, où l'utilisateur a appuyé sur la touche Tab, est importante ici.

Ce script stocke ses suggestions dans une variable SUBCOMMANDS accessible aux deux fonctions. Elles l'utilisent toutes deux pour spécifier les complétions prises en charge : zsh appelle la fonction compadd et Bash définit la variable COMPREPLY. Notez que Bash nécessite de nombreuses modifications syntaxiques des types pour effectuer des conversions entre tableaux et chaînes.

Vous pouvez enregistrer le script ci-dessus dans un seul fichier, tel que completion.sh, puis obtenir la source de ce fichier à partir de vos fichiers .bashrc et/ou .zshrc comme suit :

. /path/to/completion.sh

Prochaines étapes

Nous n'avons abordé que les bases de la complétion de commandes shell personnalisées. Ce script simple vous permet d'ajouter des complétions à un ensemble fixe de sous-commandes simples, mais l'exécution de programmes en ligne de commande offre bien d'autres possibilités.

Un script de complétion puissant doit prendre en compte l'intégralité de la ligne de commande, car d'autres arguments peuvent affecter celui que vous essayez de compléter.

L'ajout de la saisie semi-automatique des commandes au Terminal est une étape simple, mais elle améliore considérablement la simplicité d'utilisation des applications en ligne de commande. Une fois activée, vous constaterez une exécution des commandes plus rapide et plus précise, vous permettant de vous concentrer sur l'essentiel sans perdre de temps à corriger les erreurs ou à retaper les commandes.

Aller au bouton supérieur