lazyshell

Configuration

lazyshell config init écrit un fichier entièrement commenté au bon endroit, et lazyshell config show affiche la configuration réellement en vigueur — après que chaque couche a eu son mot à dire — avec les sources dont elle provient. Cette seconde commande est la réponse à « pourquoi mon réglage ne prend pas ».

lazyshell config edit ouvre ce fichier dans votre éditeur — $VISUAL, sinon $EDITOR, sinon le premier de nano, vim, vi qui est installé — en le créant à partir du modèle commenté s'il n'existe pas encore. À la sortie de l'éditeur, le fichier enregistré est relu et tout ce qui cloche (clé inconnue, valeur hors bornes, raccourci illisible) est signalé immédiatement plutôt qu'au prochain démarrage.

Où vit le fichier

lazyshell lit son fichier YAML au premier emplacement trouvé :

  1. $LAZYSHELL_CONFIG, s'il est défini
  2. $XDG_CONFIG_HOME/lazyshell/config.yml
  3. ~/.config/lazyshell/config.yml

Un fichier absent n'est pas une erreur : lazyshell tourne avec ses valeurs par défaut. Un fichier partiel n'a besoin de mentionner que les champs qu'il veut surcharger ; tout le reste garde sa valeur par défaut.

Précédence

valeurs par défaut  <  ~/.config/lazyshell/config.yml  <  lazyshell.yml du projet
                    <  variables d'environnement  <  options de ligne de commande

Rien dans un fichier de configuration ne peut empêcher lazyshell de démarrer. Une clé inconnue, une valeur hors bornes, un raccourci illisible ou une couleur inconnue sont signalés sur la sortie d'erreur avant l'ouverture de l'interface, et la valeur par défaut est utilisée à la place — jamais un silence, jamais un refus de démarrer.

Référence des options

CléTypeDéfautEffet
languagefr | enfrLangue de l'interface : raccourcis, popups, barre d'état, pieds de panneau et messages de session. La sortie CLI (lazyshell config …) reste en français.
shellchaîne""Commande lancée derrière le pty de chaque session. Vide signifie $SHELL, à défaut /bin/bash.
termchaînexterm-256colorTERM annoncé aux sessions. Le baisser fait volontairement dégrader les programmes.
scrollback_sizeentier ≥ 010000Lignes conservées par session une fois sorties de l'écran.
sessions_panel_widthentier ≥ 540Largeur de la liste des sessions, en colonnes, en mode paysage.
sessions_panel_heightentier ≥ 510Hauteur de la liste des sessions, en lignes, en mode portrait.
agents_panel_heightentier ≥ 36Hauteur du tableau de bord des agents, en lignes, sous la liste des sessions en mode paysage. Masqué automatiquement si aucune session d'agent IA n'est détectée, et en mode portrait.
portrait_max_widthentier84Le mode portrait s'applique à cette largeur de terminal ou en dessous…
portrait_min_heightentier45…et au-dessus de cette hauteur. Le portrait empile les panneaux au lieu de les juxtaposer.
refresh_interval_msentier, 10–100030Période de redessin. Un panneau inchangé n'est jamais poussé, donc le coût au repos reste proche de zéro quelle que soit la valeur.
kill_timeout_msentier ≥ 1002000Attente après SIGTERM avant d'escalader en SIGKILL, puis avant d'abandonner.
prefix_keyspéc. de toucheCtrl+OVerrouille le panneau : une pression, sortie du pass-through. Doit être une touche de contrôle, et elle ne peut plus être tapée dans une session. $LAZYSHELL_PREFIX le surcharge.
keybindingstablevoir plus basAssocie un identifiant d'action à une spécification de touche. Une action absente garde sa touche par défaut.
markers.bell0–1 caractère!Marqueur d'une session ayant sonné pendant qu'elle était masquée. "" le désactive.
markers.alt_screen0–1 caractère#Marqueur d'une session où tourne une application plein écran.
markers.activity0–1 caractèreMarqueur d'une session ayant produit de la sortie pendant qu'elle était masquée.
markers.broadcast0–1 caractère+Marqueur d'une session marquée pour recevoir les frappes diffusées.
markers.agent_idle0–1 caractèreMarqueur d'une session d'agent IA détectée, au repos.
markers.agent_working0–1 caractèreMarqueur d'une session d'agent IA en train de travailler.
markers.agent_blocked0–1 caractèreMarqueur d'une session d'agent IA qui vous attend.
markers.agent_done0–1 caractèreMarqueur d'une session d'agent IA ayant terminé son tour.
markers.agent_idle_colorcouleurgreenCouleur de markers.agent_idle.
markers.agent_working_colorcouleuryellowCouleur de markers.agent_working. Alterne entre pleine et faible luminosité (deux fois par seconde) tant que l'agent travaille — le seul des quatre états animé.
markers.agent_blocked_colorcouleurredCouleur de markers.agent_blocked.
markers.agent_done_colorcouleurblueCouleur de markers.agent_done.
markers.command_failed0–1 caractèreMarqueur (à côté de son code de sortie, dans les colonnes nom/état plutôt que dans la gouttière) pour une session sans agent dont la dernière commande — via l'intégration shell OSC 133 — a échoué.
markers.restart0–1 caractèreMarqueur (à côté de son compteur de tentatives, dans les colonnes nom/état plutôt que dans la gouttière) pour une session ayant eu besoin d'au moins un redémarrage automatique — voir restart:.
scroll.page_linesentier ≥ 00Lignes parcourues par PgUp/PgDn. 0 signifie une hauteur de panneau complète.
scroll.half_page_divisorentier ≥ 12Ctrl+U/Ctrl+D parcourent la hauteur du panneau divisée par cette valeur.
theme.active_border_colorcouleurgreenBordure du panneau ayant le focus.
theme.inactive_border_colorcouleurdefaultBordure de tous les autres panneaux.
theme.selected_bg_colorcouleurblueFond de la ligne sélectionnée dans la liste des sessions.
theme.locked_border_colorcouleurredBordure du panneau de sortie quand il est verrouillé (hors pass-through).
theme.tab_active_colorcouleurgreenOnglet sélectionné dans la barre d'onglets du panneau de sortie.
clipboard.fallback_commandchaîne""Commande exécutée avec le texte copié sur son entrée standard, à la place d'OSC 52, pour un terminal qui ne le gère pas. Il n'existe aucun moyen de détecter ce support : c'est un interrupteur manuel, vide signifie OSC 52 seul.
notify.fallback_commandchaîne""Commande exécutée avec le texte de la notification sur son entrée standard, à la place d'OSC 9/777, quand une session d'agent IA passe bloquée ou terminée. Vide signifie OSC seul.
window_title.enabledbooléentrueLe titre de fenêtre / d'onglet du terminal hôte suit la session ayant le focus (son nom, plus son titre OSC 0/2 vivant s'il y en a un), via OSC 0.
mouse.enabledbooléentrueClic, molette et glissé. L'activer coûte le pass-through de Shift+↑/Shift+↓ : gocui donne à ces touches et aux boutons de souris les mêmes valeurs, les deux ne peuvent pas coexister.
mouse.wheel_linesentier ≥ 13Lignes parcourues par un cran de molette dans le panneau de sortie.
mouse.forward_to_appbooléentrueUn programme dans une session peut recevoir la souris, et seulement une fois qu'il l'a demandée par un DECSET 9/1000/1002/1003 (vim avec set mouse=a, htop). Un shell ou une CLI d'agent ne la demande jamais.
perf.refresh_interval_ms0, ou entier ≥ 1005000Fréquence d'échantillonnage des process de chaque session pour l'onglet ressources. Tourne en arrière-plan que l'onglet soit ouvert ou non, en une seule passe pour toutes les sessions. 0 coupe l'échantillonnage : c'est le seul travail périodique qui lance un process.
env_tab.mask_secretsbooléentrueL'onglet environnement masque la valeur des variables dont le nom ressemble à un identifiant (TOKEN, SECRET, PASSWORD, AUTH, ..._KEY).
control.enabledbooléenfalseL'API de contrôle par les agents est ouverte — le socket que lazyshell ctl pilote. Désactivée par défaut ; lire la page sessions d'agents IA avant de l'activer, car elle permet à tout processus tournant sous votre compte de créer des sessions, d'y taper et de lire leur sortie.
agent_stats_commandchaîne""Exécutée pour la session d'agent IA sélectionnée, avec $LAZYSHELL_SESSION_ID dans son environnement ; sa première ligne de sortie est affichée à côté de la durée du tour. Vide la désactive.
restore_layoutask | always | neveraskCe que fait le lancement d'une disposition de sessions sauvegardée pour le répertoire courant (voir persistance de la disposition) quand il n'y a pas de lazyshell.yml : ask affiche une popup de confirmation, always restaure sans la montrer, never ne la propose jamais.

Spécifications de touches

Les spécifications suivent la syntaxe de gocui.Parse : un caractère nu (n), ou Ctrl+N, Alt+Space, Tab, Esc.

Les identifiants d'action remappables sont :

new_session, new_named_session, new_session_in_dir, kill_session, delete_session, rename_session, duplicate_session, restart_session, zoom, next_tab, prev_tab, filter_sessions, export_session, toggle_broadcast, jump_next_blocked, jump_prev_prompt, jump_next_prompt, copy_last_output, arm_watch, set_group, filter_group, broadcast_group, kill_group, restart_group, toggle_debug, select_next, select_prev, cycle_focus, help, quit.

Un identifiant hors de cette liste est signalé plutôt qu'ignoré.

Couleurs

Les couleurs acceptent l'une des trois formes :

Les deux jeux de noms se recouvrent et se contredisent : en CSS, blue vaut #0000FF, que le terminal montre comme du bleu vif. lazyshell résout d'abord les noms ANSI, donc blue vous donne le bleu ordinaire ; écrivez navy pour celui du CSS, ou brightblue pour l'emplacement vif du terminal.

Exemple complet

Voici ce qu'écrit lazyshell config init — chaque option à sa valeur par défaut, donc vous pouvez supprimer tout ce que vous ne changez pas.

# ~/.config/lazyshell/config.yml

language: fr
shell: ""
term: xterm-256color
scrollback_size: 10000

sessions_panel_width: 40
sessions_panel_height: 10
agents_panel_height: 6
portrait_max_width: 84
portrait_min_height: 45

refresh_interval_ms: 30
kill_timeout_ms: 2000

prefix_key: Ctrl+O

keybindings:
  new_session: "n"
  new_named_session: "N"
  new_session_in_dir: "M"
  kill_session: "x"
  delete_session: "D"
  rename_session: "r"
  duplicate_session: "c"
  restart_session: "R"
  zoom: "z"
  next_tab: "]"
  prev_tab: "["
  filter_sessions: "/"
  export_session: "w"
  toggle_broadcast: "b"
  jump_next_blocked: "B"
  jump_prev_prompt: "{"
  jump_next_prompt: "}"
  copy_last_output: "Y"
  arm_watch: "v"
  set_group: "g"
  filter_group: "G"
  broadcast_group: "A"
  kill_group: "X"
  restart_group: "W"
  toggle_debug: F12
  select_next: "j"
  select_prev: "k"
  cycle_focus: Tab
  help: "?"
  quit: "q"

markers:
  bell: "!"
  alt_screen: "#"
  activity: "●"
  broadcast: "+"
  agent_idle: "●"
  agent_working: "●"
  agent_blocked: "●"
  agent_done: "●"
  agent_idle_color: "green"
  agent_working_color: "yellow"
  agent_blocked_color: "red"
  agent_done_color: "blue"
  command_failed: "✗"
  restart: "↻"

scroll:
  page_lines: 0
  half_page_divisor: 2

theme:
  active_border_color: green
  inactive_border_color: default
  selected_bg_color: blue
  locked_border_color: red
  tab_active_color: green

clipboard:
  fallback_command: ""

notify:
  fallback_command: ""

window_title:
  enabled: true

mouse:
  enabled: true
  wheel_lines: 3
  forward_to_app: true

perf:
  refresh_interval_ms: 5000

env_tab:
  mask_secrets: true

control:
  enabled: false

agent_stats_command: ""

restore_layout: ask