Blocs (.lnb)

Un lot de Blocs est un dossier dont le nom se termine par .lnb, traité comme un élément unique dans l'arborescence (double-clic pour ouvrir). Chaque bloc est un fichier réel sur le disque ; l'ordre vit dans un blocks.json à la racine du lot. Cela fonctionne comme un carnet : des cellules empilées de code ou de texte. Un notebook Jupyter entre par ici : clic droit sur un .ipynb dans l'arborescence, puis Importer comme Blocs (.lnb). Chaque cellule devient un fichier réel — versionnable et lu par la recherche —, et le .ipynb reste où il était, car importer n'est pas convertir. Les sorties enregistrées dans le notebook ne viennent pas : exécuter la cellule ici produit le vrai résultat, avec l'instant et la commande. Si le blocks.json est illisible (un conflit Git ou une écriture interrompue), le carnet prévient et ne le réécrit pas : l'ordre, la connexion et la session ne sont de nouveau enregistrés qu'une fois le fichier corrigé.

Cellules, barre du carnet et raccourcis

Chaque cellule a un nom, un bouton de type (markdown, python, javascript, sql, shell, powershell, bat, r, julia, http, ia, mermaid, latex et les types texte) et des boutons pour copier, insérer (clic : en dessous ; la flèche : au-dessus et dupliquer), supprimer, déplacer vers le haut et le bas et exécuter (la flèche propose Exécuter jusqu'ici). La nouvelle cellule hérite du type de sa voisine. Le bouton de droite replie la cellule, ne laissant que sa première ligne dans l'en-tête, et le compteur [n] indique l'ordre d'exécution des cellules dans cette session. Créez un carnet depuis l'arborescence (Nouveau) ou via Fichier → Nouveau.

La barre du carnet, en haut, agit sur tout le carnet : Tout exécuter lance les cellules de code dans l'ordre ; Arrêter interrompt celle en cours et vide la file (l'exécution va dans l'historique avec le code -1) ; Effacer les sorties ferme les panneaux sans rien supprimer ; le menu Plus exporte le carnet et supprime l'historique. La clé timeoutSec du blocks.json fixe une limite de temps par cellule (0, la valeur par défaut, signifie sans limite).

Raccourcis, avec le focus dans la cellule : Ctrl+Entrée exécute et reste ; Shift+Entrée exécute et passe à la suivante (sur la dernière, en crée une nouvelle) ; Alt+Entrée exécute et insère une cellule juste en dessous. Dans une cellule de texte, exécuter signifie rendre : elle s'ouvre rendue quand elle a du contenu, et un double-clic (ou Entrée dessus) revient à l'édition.

Résultat enregistré, pièces jointes et historique

Le résultat est enregistré (comme dans un cahier de laboratoire) : à la fin, chaque exécution devient un fichier .md dans saida/<cellule>/, dans le lot lui-même — avec l'instant, le code de sortie, la durée, la commande et la sortie elle-même. Comme c'est du Markdown, on peut le lire dans n'importe quel éditeur, le versionner dans Git avec le carnet et le retrouver par la recherche dans les notes. Rouvrir le lot ramène la bande Dernière exécution au-dessus du panneau : cliquez dessus pour voir le résultat sans réexécuter.

Pièces jointes : chaque exécution reçoit un dossier à elle, à côté du .md, et son chemin parvient au programme dans la variable d'environnement LN_RUN_DIR. Ce que la cellule y écrit — un graphique matplotlib, un CSV — apparaît sous la sortie (les images dessinées, le reste en lien vers le dossier) et est listé dans le fichier de l'historique. Une sortie qui est déjà du Markdown (la table d'un SELECT, la réponse de l'IA, un diagramme) s'ouvre rendue ; le bouton Texte/Rendre de la bande bascule.

Historique : le bouton Historique à côté de cette bande liste les exécutions précédentes de cette cellule (instant et code de sortie) — utile pour comparer ce que la même cellule a renvoyé au fil du temps. Nous gardons les 10 plus récentes par cellule ; pour changer, modifiez la clé historyLimit dans le blocks.json du lot (0 désactive l'enregistrement, et avec lui les pièces jointes). Une sortie très grande est tronquée (le fichier dit truncated: true). Renommer la cellule ou changer son type emporte l'historique ; supprimer la cellule envoie l'historique à la Corbeille.

Session persistante

Par défaut chaque cellule est un nouveau processus : ce que l'une définit, la suivante ne le voit pas. Avec la session persistante activée (bouton Session de la barre ; la clé session du blocks.json), les cellules Python, JavaScript, shell et PowerShell s'exécutent dans un processus qui reste vivant entre les exécutions — variables, fonctions et importations d'une cellule valent dans les suivantes, comme dans Jupyter. En Python, les figures matplotlib ouvertes à la fin de la cellule sont enregistrées d'elles-mêmes dans le dossier des pièces jointes. Redémarrer la session oublie tout ; Arrêter aussi, car interrompre signifie terminer le processus. En JavaScript, déclarez avec var (ou sans déclaration) : let, const et class au niveau supérieur ne peuvent pas être redéclarés — pas même en relançant la même cellule.

Cellules SQL

Sans connexion désignée, la cellule sql s'exécute dans le DuckDB du carnet lui-même (en mémoire) : les tables créées dans une cellule valent dans les suivantes, et read_csv('donnees/ventes.csv') lit les fichiers du dossier du carnet — rangez les données dans un sous-dossier, car chaque fichier isolé dans le dossier du carnet est une cellule. Pour une vraie base, pointez le carnet vers une connexion .lnc depuis la bande de connexion (elle liste les connexions de l'espace de travail) : les cellules s'exécutent alors dans la base, par la même connexion que le panneau Connexions — mot de passe mémorisé, tunnel SSH, relecture du .lnc et la confirmation de production avant toute écriture. Le résultat d'un SELECT devient une table dans le fichier de sortie ; INSERT/UPDATE et consorts indiquent combien de lignes ont changé, et une erreur interrompt le script et enregistre l'instruction qui a échoué. Nous ramenons jusqu'à 100 lignes par requête (sqlMaxRows dans le blocks.json ; le fichier prévient quand il y en a plus).

@set nom = valeur définit une variable à portée de carnet, et :nom (ou ?) est un paramètre demandé à l'exécution, comme dans l'éditeur SQL. Le dernier SELECT écrit aussi resultado.csv dans le dossier des pièces jointes (les mêmes lignes que la table, jusqu'à sqlMaxRows), et les cellules suivantes reçoivent son chemin dans LN_LAST_SQL — en Python, pd.read_csv(os.environ["LN_LAST_SQL"]). La connexion vit dans le blocks.json comme chemin relatif ; un .lnc gardé dans le lot compte comme configuration, pas comme cellule.

HTTP, IA, Mermaid et LaTeX

Quatre types s'exécutent dans LightNote lui-même, sans interpréteur : la cellule http est un test .lnh exécuté par le même exécuteur que le testeur d'API (le rapport va dans l'historique ; l'environnement est celui de la clé httpEnv du blocks.json, et un fichier que la requête envoie doit se trouver dans l'espace de travail) ; la cellule ai envoie le prompt à l'assistant par défaut avec le contexte du carnet — le code des cellules précédentes et la dernière sortie de chacune, sauf les cellules http, qui peuvent contenir des identifiants —, et la réponse arrive rendue ; les cellules mermaid et latex dessinent le diagramme ou la formule dans une image des pièces jointes. Arrêter annule les deux premières.

Exporter le carnet

Le menu Plus de la barre exporte le carnet entier : en Markdown (les cellules de texte en ligne, le code dans des clôtures avec le langage, la dernière sortie juste en dessous et les images liées) ou en notebook Jupyter (.ipynb, avec la dernière sortie de chaque cellule et les images intégrées ; une cellule d'un autre langage porte la marque que VS Code lit). C'est une copie à partager — le carnet reste le dossier.

Index

Édition

Outils

Automatisation (IA / scripts)

Référence