Configuration de projet
Lancez lazyshell dans un dossier contenant un lazyshell.yml et il
démarre les sessions que ce fichier déclare — chacune dans son répertoire, avec son environnement
et sa commande — au lieu de s'ouvrir vide.
Principe
lazyshell init écrit un point de départ commenté dans le répertoire courant. Les
sessions démarrent dans l'ordre du fichier, et la première est sélectionnée. Une entrée qui ne
valide pas (name vide ou dupliqué, cwd manquant) est ignorée et
signalée dans la barre d'état — les autres démarrent quand même.
Exemple
# ./lazyshell.yml
# Optionnel : surcharge le shell de la config utilisateur, pour ce projet seulement.
shell: /bin/zsh
# Optionnel : fichiers .env chargés pour toutes les sessions ci-dessous, dans
# l'ordre — un fichier plus loin surcharge une clé posée par un précédent.
env_files:
- .env
- .env.local
# Optionnel : déclare les groupes utilisés par ce projet et — la seule raison
# d'écrire ce bloc — l'ordre de leurs en-têtes dans le panneau des sessions.
groups:
- name: services
- name: agents
sessions:
- name: api
# Optionnel : le groupe de démarrage. Modifiable ensuite avec « g ».
group: services
# Relatif à *ce fichier*, pas au dossier depuis lequel vous avez lancé
# lazyshell. « ~ » est développé. Absent, il vaut le dossier de ce fichier.
cwd: ./services/api
# Tapée dans le shell une fois qu'il est prêt, pas exécutée à sa place :
# quand la commande se termine (ou que vous faites Ctrl-C), le shell est
# toujours là.
command: make dev
env:
PORT: "3000"
# Optionnel : en plus des env_files ci-dessus, pour cette session seulement.
env_files:
- .env.api
# Optionnel : notifie quand une ligne correspond. « v » en arme un à la volée.
watch:
- pattern: "ERR!"
notify: true
# Optionnel : never (défaut) | on-failure | always. Redémarre le shell
# automatiquement quand la commande se termine, avec un délai qui double
# à chaque tentative consécutive (1s, 2s, 4s... plafonné à 60s) et se
# réinitialise dès qu'un redémarrage tient 10s. « R » (ou « W » pour le
# groupe) redémarre tout de suite, sans attendre.
restart: on-failure
# Optionnel, faux par défaut. Quand la commande se termine avec un code non
# nul, tue la session directement au lieu de laisser le shell ouvert en
# dessous — l'inverse du comportement par défaut ci-dessus. Sans effet
# sans commande : il n'y a rien à surveiller.
stop_on_failure: false
# Optionnel. Une session qui déclare une `command:` démarre *verrouillée* —
# vous voyez sa sortie, vos touches ne lui parviennent pas, donc un Ctrl-C
# parti de travers ne peut pas la tuer. À déclarer pour surcharger :
# `false` pour pouvoir y taper tout de suite, `true` pour verrouiller un
# simple shell.
locked: false
- name: web
group: services
cwd: ./web
command: npm run dev
- name: shell # sans groupe : affichée sous « sans groupe », en bas
Une session qui déclare une command: démarre verrouillée, sauf si
elle dit locked: false. Verrouillée veut dire que le panneau de sortie l'affiche mais
ne lui transmet pas vos frappes : on peut défiler, chercher et copier, et un q mal
tapé ou un Ctrl-C destiné à autre chose ne peut pas tuer la commande.
i ou Entrée reprend le clavier, la touche préfixe (Ctrl-O)
ou Échap Échap le rend — et lazyshell mémorise, par session, le dernier
choix, si bien que parcourir la liste avec j/k vous dépose dans l'état
où chaque session a été laissée. Un simple shell ne déclare pas de commande : il démarre donc
prêt à la saisie.
Les groupes sont un regroupement d'affichage — voir
Groupes. En déclarer un ici est facultatif et ne fixe que
l'ordre des en-têtes : une session peut citer un groupe absent de ce bloc, il se place simplement
après les groupes déclarés. Une mauvaise entrée de groups: (name vide ou
dupliqué) est écartée et signalée comme une mauvaise session, et les autres s'appliquent quand
même.
Référence des champs
| Clé | Type | Défaut | Effet |
|---|---|---|---|
shell | string | "" | Surcharge le shell de la config utilisateur, pour ce projet seulement. |
env_files | []string | [] | Fichiers .env chargés, dans l'ordre, pour toutes les sessions déclarées par ce projet — avant les env_files propres à chaque session, et avant son env inline. |
no_default_env | bool | false | Désactive la recherche automatique de <cwd de la session>/.env pour toutes les sessions déclarées, sauf si une session la réactive elle-même. |
groups | liste de {name} | [] | Déclare les groupes de ce projet et l'ordre de leurs en-têtes dans le panneau des sessions. Une session peut citer un groupe absent d'ici ; il se place simplement après les groupes déclarés. |
sessions | liste d'entrées de session | [] | Démarrées dans l'ordre du fichier ; la première est sélectionnée. |
sessions[].name | string, requis | — | Doit être non vide et unique ; une entrée invalide est ignorée et signalée, les autres démarrent quand même. |
sessions[].group | string | "" (sans groupe) | Pas besoin d'être déclaré dans groups:. |
sessions[].cwd | string | le dossier de ce fichier | Résolu relativement à ce fichier, pas à l'endroit d'où lazyshell a été lancé. ~ est développé. |
sessions[].command | string | "" (simple shell) | Tapée dans le shell une fois qu'il est prêt, pas exécutée à sa place : à sa fin (ou après un Ctrl-C), le shell reste ouvert. |
sessions[].env | map[string]string | {} | Gagne toujours, sur toutes les couches de fichier .env (voir plus bas). |
sessions[].env_files | []string | [] | En plus des env_files du projet, pour cette session seulement. |
sessions[].no_default_env | bool | hérite du réglage du projet | Le surcharge pour cette session seulement, dans un sens comme dans l'autre. |
sessions[].watch | liste de {pattern, notify} | [] | Un motif regex évalué sur chaque ligne de sortie, et s'il notifie en cas de correspondance. v en arme un à la volée. |
sessions[].restart | never | on-failure | always | never | Redémarre le shell automatiquement quand la commande se termine, avec un délai qui double à chaque tentative (1s, 2s, 4s… plafonné à 60s), réinitialisé dès qu'un redémarrage tient 10s. R (ou W pour le groupe) redémarre tout de suite, sans attendre. |
sessions[].stop_on_failure | bool | false | Tue la session dès que command: sort en erreur, au lieu de laisser le shell ouvert dessous. Un arrêt explicite l'emporte toujours sur un restart: en attente. Sans effet sans command:, signalé sur stderr si déclaré ainsi. |
sessions[].locked | bool | true si command: est déclaré, sinon false | Une valeur explicite l'emporte toujours sur l'heuristique. |
Ce qui est lu, ce qui ne l'est pas
Seuls shell, env_files, no_default_env,
groups et sessions sont lus dans un fichier de projet. theme,
keybindings, prefix_key et le reste restent sous votre seul
contrôle : un dépôt que vous avez cloné ne doit pas pouvoir remapper votre clavier. Les autres
clés sont ignorées, avec un avertissement sur la sortie d'erreur.
Un groupe déclare un nom et rien d'autre — pas de couleur, pas de glyphe, pas de touche. Même
règle : un dépôt dit ce qui existe, pas à quoi ressemble votre interface. Les entrées
watch: d'une session la suivent aussi : un motif et s'il notifie, rien sur la
façon dont une correspondance s'affiche. restart: aussi : une politique et rien
d'autre, pas de réglage du délai ni de plafond de tentatives par politique.
stop_on_failure: est la seule exception au « le shell est toujours là » documenté
plus haut : combiné à restart:, un arrêt explicite l'emporte toujours sur un
redémarrage automatique en attente — la même règle que systemctl stop face à
Restart=on-failure.
locked: est la seule clé qui touche à l'interface, et elle est admise parce que ce
qu'elle protège est le processus déclaré lui-même : le pire qu'un fichier cloné puisse en faire
est de vous obliger à appuyer sur i.
Fichiers .env
Toute session — déclarée dans un fichier de projet ou non — charge automatiquement un
.env depuis son propre répertoire de travail, s'il y en a un. Par-dessus, chaque
couche surcharge celle d'avant :
<cwd de la session>/.env, automatique, sauf désactivation (voir plus bas)--env-file <chemin>(répétable, s'applique à toutes les sessions démarrées par ce lancement)- les
env_files:du projet (toutes les sessions déclarées) - les
env_files:d'une session (cette session seulement) - la table
env:de cette session — elle gagne toujours, sur tous les fichiers
Pour couper la recherche automatique de <cwd>/.env :
--no-env-file— toutes les sessions démarrées par ce lancement ;no_default_env: trueen tête d'un fichier de projet — toutes les sessions qu'il déclare ;- ou sur une seule entrée de session — cette session seulement, ce qui surcharge le réglage du projet dans un sens comme dans l'autre.
Quel fichier est utilisé
--config-file <fichier>(-f)$LAZYSHELL_PROJECT_CONFIG./lazyshell.yml./.lazyshell.yml
Seul le répertoire courant est fouillé — pas de remontée jusqu'à la racine du dépôt, de sorte que le fichier qui s'exécute est toujours celui que vous voyez.
Approuver un fichier de projet
Un lazyshell.yml est versionné dans un dépôt : sans garde-fou, il exécuterait des
commandes arbitraires à la seconde où vous entrez dans un clone. lazyshell demande donc une fois,
avant l'ouverture de l'interface, et retient la réponse par fichier — puis redemande dès que le
contenu du fichier change.
$ lazyshell allow # approuve le fichier du dossier courant, sans rien lancer
$ lazyshell allow ./x.yml # approuve un fichier précis
$ lazyshell --no-autostart # ouvre l'interface sans rien démarrer
$ lazyshell --env-file .env.prod # fichier .env supplémentaire, pour ce lancement
$ lazyshell --no-env-file # ignore le « <cwd>/.env » automatique
Les approbations vivent dans un trust.yml à côté de votre configuration
utilisateur. Quand l'entrée standard n'est pas un terminal, l'approbation est
refusée plutôt que supposée.
Persistance de la disposition
À la fermeture, lazyshell enregistre pour le répertoire courant le nom, le groupe, le répertoire de
travail et la commande de lancement de chaque session dans
~/.config/lazyshell/state/<hash-du-répertoire>.yml — pas ce qui se passe en
direct dans le shell, seulement la recette avec laquelle il a démarré. Relancez depuis ce même
répertoire sans lazyshell.yml présent, et lazyshell propose de restaurer cette
disposition à la place de l'unique session par défaut habituelle.
restore_layout contrôle ce que « propose »
veut dire : ask (défaut) affiche une popup de confirmation nommant les sessions qui
seraient recréées ; always les restaure sans la montrer ; never ne la
propose jamais, mais la disposition continue d'être enregistrée quand même — repasser à
ask/always plus tard la retrouve donc intacte. Refuser la popup laisse la
liste de sessions vide, exactement là où vous laisse --no-autostart, avec
n à portée de main pour en démarrer une à la main.
Un lazyshell.yml présent dans le répertoire l'emporte toujours : ce sont ses sessions
déclarées qui démarrent, et la disposition enregistrée n'est même pas lue — seulement tenue à jour
au cas où le fichier serait retiré plus tard.