     [file docstyle.texi not included]

SES: Simple Emacs Spreadsheet
*****************************

     SES est mode majeur de GNU Emacs pour éditer des fichiers
     tableur, c-à-d. des fichiers contenant une grille rectangulaire de
     cellules. Les valeurs des cellules sont spécifiés par des formules
     pouvant se référer aux valeurs d’autres cellules.

Pour les rapport d’anomalie, utiliser M-x report-emacs-bug.

Ce fichier documente SES: le tableur simple d’Emacs (Simple Emacs Spreadsheet).

Copyright © 2002--2023 Free Software Foundation, Inc.

     Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.3 or any later version published by the Free Software Foundation; with no Invariant Sections, with the Front-Cover Texts being ``A GNU Manual,'' and with the Back-Cover Texts as in (a) below.  A copy of the license is included in the section entitled ``GNU Free Documentation License.''

     (a) The FSF's Back-Cover Text is: ``You have the freedom to copy and modify this GNU manual.''

Boniment
********

  -- Créer et éditer des feuilles de calcul avec un minimum de tracas.

  -- Prise en charge complète du Défaire/Refaire/Sauvegarde auto.

  -- Protection contre les virus enfouis dans les feuilles de calcul.

  -- Les formules de cellule sont directement du code Emacs Lisp.

  -- Fonctions d’impression pour contrôler l’apparence des cellules.

  -- Raccourcis clavier intuitifs: C-o = insérer une ligne, M-o = insérer une colonne, etc.

  -- « Débordement » des valeurs de cellule longues dans les cellules vides suivantes.

  -- La ligne d’en-tête montre les lettres désignant les colonnes.

  -- Autocomplétion pour la saisie des symboles de cellules nommées lors de la saisie des formules.

  -- Couper, copier et coller peut transferer les formules et les fonction d’impression.

  -- Import and export de valeur séparées par des tabulation, ou de formules séparés par des tabulations.

  -- Format de fichier en texte, facile à bidouiller.

Tuto
****

Si vous désirez être rapidement lancé et pensez que vous savez ce que vous attendez d’un tableur simple, alors ce chapitre peut être tout ce dont vous avez besoin.

Premièrment, visitez un nouveau fichier avec pour extension de nom de fichier .ses.  Emacs vous présente alors une feuille de calcul vide contenant une seule cellule.

Commencez pas saisir une ligne d’en-tête: "RevenuRET.  Le guillemet double " indique que vous saisissez une cellule textuelle, il ne fait pas partie de la valeur de la cellule, et aucun guillemet de fermeture n'est nécessaire.

Pour insérer votre première valeur de revenu, vous devez d’abord redimensionner la feuille. Appuyer sur la touche TAB pour ajouter une nouvelle cellule et revenez à elle en remontant. Saisissez un nombre, tel que 2.23.  Puis continuer pour ajouter quelques valeurs supplémentaires de revenu, par ex. :

     A
      Revenu
        2.23
        0.02
       15.76
       -4.00

Pour additionner les valeurs entre elles, saisissez une expression Lisp:

     (+ A2 A3 A4 A5)

Peut-être désirez vous ajouter une cellule à la droite de la cellule A4 pour expliquer pourquoi vous avez une valeur négative.  En appuyant sur TAB dans cette cellule vous ajouter entièrement une nouvelle colonne B où vous pourrez ajouter une telle note.

La colonne est assez étroite par défaut, mais en appyant sur w vous pouvez la redimensionner selon vos besoins.  Faites la de 22 caractères de large.  Vous pouvez maintenant ajoutez des notes déscriptive pour chacune des cases, par ex. :

     A       B
      Revenu
        2.23  Frais de consultation
        0.02       Opinion informée
       15.76         Stand limonade
          -4          Prêt à Joseph
       14.01                  Total

Par défault, l’impression des valeurs de cellule se fait aligné à droite, c’est la raison d’un tel alignement pour les notes dans la colonne B.  Pour changer cela, vous pouvez saisir une fonction d’impression pour la colonne entière, en utilisant par ex. M-p ("%s"). Le fait que "%s" soit contenu dans une liste indique à SES que l’alignement est à faire à gauche.  Vous pouvez l’emporter sur la fonction d’impression de colonne pour l’une quelconque de ses cellules en donnant une fonction d’impression par cellule avec p.

Vous pouvez nommer une fonction d’impression, et utiliser le nom de la fonction à la place de sa définition, de sorte à faciliter la modification de l’impression de toutes les cellules utilisant cette fonction. Par exemple tapez M-x ses-define-local-printerret, puis noteret, puis ("%s") pour définir une fonction d’impression nommée note dont la définition est ("%s"), puis sur la colonne B tapez M-p noteret

     A       B
      Revenu
        2.23 Frais de consultation
        0.02 Opinion informée
       15.76 Stand limonade
          -4 Prêt à Joseph
       14.01 Total

Si maintenant vous redéfinissez note avec pour nouvelle définition ("*%s") qui ajoute une astérisque * devant le texte, la zone d’impression est modifiée ainsi:

     A       B
      Revenu
        2.23 *Frais de consultation
        0.02 *Opinion informée
       15.76 *Stand limonade
          -4 *Prêt à Joseph
       14.01 *Total

Notez, que la cellule B1 reste vide est n'est pas affichée comme *. C’Est parce que la valeur de la cellule est nil, et que la fonction d’impression ("%s") échoue sur cette valeur, et donc une fonction de repli est utilisée à la place.

Si mainteneant Joseph rembourse son prêt, vous pourriez effacer cette case; par e. en positionant le curseur sur la cellule A5 et en appuyant sur C-d.  Si vous faites celle le total imprimé dans la cellule A6 affichera ######.  La raison de cela est la valeur dans une cellule vide est typiquement nil et que l’opérateur + ordinaire échoue à gérer une telle valeur. Au lieu de vider la cellule, vous pourriez littéralement saisir 0, ou supprimer entièrement la ligne en tlisant C-k.  Une alterative est d’utiliser la fonction spéciale ses+ au lieu du + ordinaire :

     (ses+ A2 A3 A4 A5)

Pour rendre une formule robuste au changement de géométrie de la feuille, vous pouvez utiliser la macro ses-range pour faire référence à une plage de cellules par ses extrémités, par ex. :

     (apply 'ses+ (ses-range A2 A5))

(Le apply est nécessaire parce que ses-range produite une liste de valeurs, ce qui ouvre des possibilités plus complexes).

Alternativement vous pouvez utiliser le modificateur ! de ses-range pour retirer les cellules vides de la liste renvoyée, ce qui permet d’utiliser + au lieu de ses+:

     (apply '+ (ses-range A2 A5 !))

Les bases
*********

Pour créer une nouveau tableur, visitez un fichier inexistant dont le nomre se termine en .ses.  Par exemple, C-x C-f essai.ses ret.

Un identificateur de cellule est un symbole avec une lettre de colonne et un numéro de ligne.  La cellule B7 est la 2e column de la 7e ligne.  Pour les feuille très larges, il ya deux lettre de colonne : la cellule AB7 les la 28e colonne de la 7e ligne. Les feuilles encore plus large ont AAA1, etc.  On se déplace avec les commandes ordinaire de déplacement d’Emacs.

j
     Déplace le point vers la cellule spécifiée par identificateur (ses-jump). À moins que la cellule soit une cellule renommée, l’identificateur est insensible à la casse. UN argument préfixe n déplace vers la cellule de coordonnées (n\div R, n \% C) pour une feuille de R ligne et C colonnes, et A1 étant aux coordonnées (0,0). La façon dont l’identificateur ou l’argument préfixe de commande sont interprété peut être personnalisée via les variables ses-jump-cell-name-function et ses-jump-prefix-function.

Le Point est toujours sur le bord de gauche d’une cellule, ou à la fin de ligne vide. Quand la marque est inactive, la cellule courante est soulignée.  Quand la marque est active, la plage est le rectangle de cellules mis en vedette (SES utilise toujours le mode de marque transitoire).  Faire glisser la souris de A1 à A3 crée la plage A1-A2.  Beaucoup de commandes SES opèrent seulement sur une seule cellule, et non sur une plage.

C-SPC
C-@
     Règle la marque au point (set-marque-command).

C-g
     Désactive la marque (keyboard-quit).

M-h
     Met en vedette la ligne courante (ses-marque-row).

S-M-h
     Met en vedette la colonne courante (ses-marque-colonne).

C-x h
     Mettre en vedette toutes les cellules (marque-whole-buffer).

Formules de cellule
===================

Pour insérer une valeur dans une cellule, tapez juste une expression numérique, un "texte entre guillemets anglais", ou une expression Lisp.

0..9
     Auto-insérer un nombre (ses-read-cell).

-
     Auto-inserter un nombre négatif (ses-read-cell).

.
     Auto-insérer un nombre décimal (ses-read-cell).

"
     Auto-insérer une chaîne de caractères.  Le guillemet anglais de terminaison est inséré automatiquement (ses-read-cell).

(
     Auto-insérer une expression.  La parenthèse de droite est insérée automatiquement (ses-read-cell).  Pour accéder à la valeur d’une autre cellule, il suffit d’utiliser son identificateur dans votre expression.  Dès que l’autre cellule change, la formule de cette cellule-ci est réévaluée.  En tapant l’expression, vous pouvez utiliser les raccourcis clavier suivants :

     M-TAB
          pour compléter les noms de symboles, et

     C-h C-n
          pour lister les symboles de cellules renommées dans un tampon d’aide.

' (apostrophe)
     Entrer un symbole (ses-read-symbol).  SES se souvient de tous les symboles qui ont été utilisés comme formules, de sorte que vous pouvez taper juste le début d’un symbole et utiliser SPC, TAB, et ? pour le compléter.

To enter something else (e.g., a vector), begin with a digit, then erase the digit and type whatever you want.

RET
     Édite la formule existante dans la cellule courante (ses-edit-cell).

C-c C-c
     Force le  recalcul de la  cellule ou plage courante (ses-recalculate-cell).

C-c C-l
     Recalcule la feuille entière (ses-recalculate-all).

Redimensionner la feuille
=========================

Commande de base :

C-o
     (ses-insert-row)

M-o
     (ses-insert-column)

C-k
     (ses-delete-row)

M-k
     (ses-delete-column)

w
     (ses-set-column-width)

TAB
     Déplace le point sur la prochaine cellule vers la droite, ou insère une nouvelle colonne si on est déjà sur la dernière cellule de la line, ou insère une nouvelle ligne si on est sur la ligne de terminaison (ses-forward-or-insert).

C-j
     Insère une nouvelle ligne sous la ligne courante et va à la colonne A de cette ligne (ses-append-row-jump-first-column).

En redimensionnant la feuille (à moins que vous ne fassiez que changer la largeur d’une colonne) les références de cellule au sein des formules sont toutes relocalisées de sorte à contiuner à faire référence au mêmes cellules.  Si une formule mentionne B1 et que vous insérer une nouvelle première ligne, alors la formule mentionera B2.

Si vous supprimez une cellule à laquelle une formule fait référence, le symbole de cellule est supprimé de la formule, de sorte que (+ A1 B1 C1) après suppression de la troisième colonne devient (+ A1 B1).  Au cas où cela ne serait pas ce que vous désiriez :

C-_
C-x u
     Défait l’action action précédente ((undo)).

Fonctions d’impression
======================

Les fonctions d’impression convertissent des valeurs binaires de cellule en formes d’impression qu'Emacs affiche à l’écran.

Différents types de fonctions d’impression
------------------------------------------

Lorsque on configure quelle fonction d’impression s’applique (see Configuring what printer function applies), on peut saisir une fonction d’impression comme l’une des possibilités suivantes :

  * Une chaîne de formatage, telle que "$%.2f".  la chaîne formatée résultante est alignée à droite au sein de la cellule d’impression. Pour obtenir un alignement à gauche, utilisez des parenthèses : ("$%.2f").

  * Une fonction d’impression peut aussi être une fonction à un argument dont la valeur renvoyée est une chaîne (pour obtenir un alignement à droite) ou une liste d’une chaîne (pour obtenir un alignement à gauche). Une telle fonction peut à son tour être configurée comme :

       * Une expression lambda, par exemple :

               (lambda (x)
                 (cond
                    ((null x) "")
                    ((numberp x) (format "%.2f" x))
                    (t (ses-center-span x ?# 'ses-prin1))))

          Pendant la saisie d’une lambda, vous pouvez utiliser M-TAB pour completer les noms de symboles.

       * Un symbole faisant référence à une fonction d’impression standarde (see Standard printer functions).

       * Un symbole faisant référence à une fonction d’impression locale (see Local printer functions).

Configurer quelle fonction d’impression s’applique
--------------------------------------------------

Chaque cellule a une fonction d’impression.  Si c’est nil, alors la fonction d’impression de la colonne de cette cellule est utilisée. Et si cela est aussi nil, alors la fonction d’impression par défaut de la feuille est utilisée.

p
     Saisit une fonction d’impression pour la cellule ou plage courante (ses-read-cell-printer).

M-p
     Saisit une fonction d’impression pour la colonne courante (ses-read-column-printer).

C-c C-p
     Saisit la fonction d’impression par défaut de la feuille (ses-read-default-printer).

Les commandes ses-read-XXX-printer permettent les commandes suivantes pendant l’édition:

arrow-up
arrow-down
     Pour parcourir l’historique : les commandes ses-read-XXX-printer ont leur propre historique de mini-tampon, il est préchargé avec l’ensemble de toutes les fonctions d’impression utilisées dans cette feuille, plus les fonctions d’impression standardes (see Standard printer functions) et les fonctions d’impression locales (see Local printer functions).

TAB
     Pour compléter les symboles de fonctions d’impression locales, et

C-h C-p
     Pour lister les fonctions d’impression locales dans un tampon d’aide.

Les fonctions d’impression standardes
-------------------------------------

Mise à part ses-prin1, les autres fonctions d’impression standardes ne conviennent que pour les cellules, et non pour les colonnes ou comme fonction d’impression par défaut de la feuille, parce qu'elle formatent la valeur en utilisant la fonction d’impression de colonne (ou par défaut si nil) et ensuite post-traite le résultat, par ex. le centre :

ses-center
     Centre juste.

ses-center-span
     Centrer en débordant sur les cellules vides suivantes.

ses-dashfill
     Centrer en utilisant des tirets (-) au lieu d’espaces.

ses-dashfill-span
     Centrer avec tirets et débordement.

ses-tildefill-span
     Centrer avec tildes (~) et débordement.

ses-prin1
     C’est la fonction d’impression de repli, utilisée quand l’appel à la fonction d’impression configurée envoie une erreur.

Les fonctions d’impression locales
----------------------------------

Vous pouvez définir une fonction d’impression locale à la feuille avec la commande ses-define-local-printer.  Par exemple, définissez une fonction d’impression toto à "%.2f", et ensuite utilisez le symbole toto comme fonction d’impression.  Ensuite, si vous rappelez ses-define-local-printer sur toto pour le redéfinir comme "%.3f", alors toutes les cellules utilisant la fonction d’impression toto seront re-imprimées conformément.

Il peut arriver que vous désiriez définir ou redéfinir certaines fonctions d’impression à chaque fois que vous ouvrez une feuille. Par exemple, imaginez que vous désiriez définir/re-définir automatiquement une fonction d’impression locale euro pour afficher un nombre comme une somme en euros, par exemple le nombre 3.1 serait affiché comme 3.10€. Pour faire cela dans tout tampon SES qui n'est pas en lecture seule, vous pouvez ajouter ce genre de code à votre fichier d’init .emacs :

     (defun my-ses-mode-hook ()
       (unless buffer-read-only
         (ses-define-local-printer
          'euro
          (lambda (x)
            (cond
             ((null x) "")
             ((numberp x) (format "%.2f€" x))
             (t (ses-center-span x ?# 'ses-prin1)))))))
     (add-hook 'ses-mode-hook 'my-ses-mode-hook)

Si vous remplacez la commande ses-define-local-printer par la fonction ses-define-if-new-local-printer la définition ne se produira que si aucune fonction d’impression de même nom n'est déjà définie.

Écrire une fonctions d’impression lambda
----------------------------------------

Vous pouvez écrire une fonction d’impression avec une expression lambda prenant un seul argument en deux cas :

  * quand vous configurez la fonction d’impression s’appliquant à une cellule ou colonne, ou

  * quand vous définissez une fonction d’impression avec la commande ses-define-local-printer.

En faisant cela, prenez garde à ce que la valeur retournée soit une chaîne, ou une liste contenant une chaîne, même quand l’argument d’entrée a une valeur inattendue. Voici un exemple :

     (lambda (val)
        (cond
           ((null val) "")
           ((and (numberp val) (>= val 0)) (format "%.1f" val))
           (t (ses-center-span val ?# 'ses-prin1))))

Cet exemple fait ceci :

  * Quand la cellule est vide (c-à-d. quand val est nil), imprime une chaîne vide ""

  * Quand la valeur de cellule est un nombre positif ou nul, formate la valeur en notation à virgule fixe avec une decimale après la virgule

  * Sinon, gère la valeur comme erronnée en l’imprimant comme une s-expression (avec ses-prin1), centrée et entourée de croisillons # de bourrage.

Un autre précaution à prendre est d’éviter un débordement de pile à cause d’une fonction d’impression se rappelant elle-même sans fin. Cette erreur peut se produire quand vous utilisez une fonction d’impression locale comme fonction d’impression de colonne, et que cette fonction d’impression locale appelle implicitement la fonction d’impression de colonne courante, ainsi elle se rappelle elle-même récursivement. Imaginez par exemple que vous désirez créer une fonction d’impression locale =bourre qui centre le contenu imprimé d’une cellule et l’entoure de signes égal =, et que vous le faites (erronnément) comme cela :

     ;; CODE ERRONÉ
     (lambda (x)
       (cond
        ((null x) "")
        (t (ses-center x 0 ?=))))

Comme =bourre utilise la fonction d’impression standarde ses-center mais sans lui passer exemplicitement une fonction d’impression, ses-center appelle la fonction d’impression de colonne courante s’il y en a une, ou la fonction d’impression par défaut de la feuille sinon. Aussi, utiliser =bourre comme fonction d’impression de colonne aura pour résultat de causer un débordement de pile dans cette colonne.  SES ne vérifie pas cela ; il vous faut donc faire attention.  Par exemple, reécrivez =bourre ainsi :

     (lambda (x)
       (cond
        ((null x) "")
        ((stringp x) (ses-center x 0 ?= " %s "))
        (t (ses-center-span x ?# 'ses-prin1))))

Le code ci-dessus applique le bourrage de = seulement aux chaînes ; et aussi il entoure la chaîne par un espace de chaque côté avant de bourrer avec des signes =.  Ainsi la chaîne Ula s’affichera comme === Ula === dans une colonne large de 11 caractères.  Toute valeur autre que nil (c-à-d. une cellule vide) ou une non-chaîne est affichée comme une erreur par l’usage de bourrage par des croisillons #.

Effacer des cellules
====================

Ces commandes règlent à la fois la formule et la fonction d’impression à nil:

DEL
     Se deplace à gauche et efface la cellule (ses-clear-cell-backward).

C-d
     Efface la cellule et se déplace à droite (ses-clear-cell-forward).

Copier, couper, et coller
=========================

Les fonctions de copie opèrent sur des regions rectangulaires de cellules.  Vous pouvez coller les copies dans des tampons non-SES pour exporter le texte d’impression.

M-w
[copy]
[C-insert]
     Copie les cellules en vedette vers l’anneau presse-papier et le presse-papier primaire (kill-ring-save).

[drag-mouse-1]
     Marque une region et la copie vers l’anneau presse-papier et le presse-papier primaire (mouse-set-region).

[M-drag-mouse-1]
     Marque une region et la copie vers l’anneau presse-papier et le presse-papier secondaire (mouse-set-secondary).

C-w
[cut]
[S-delete]
     Les fonctions couper ne suppriment pas en fait de lignes ou de colonnes --- elles les copient et puis les effacent (ses-kill-override).

C-y
[S-insert]
     Colle à partir de l’anneau presse-papier (yank).  Les fonctions coller se comportent différemment selon le format du texte qu'elles insèrent :

       * Quand on colle des cellules qui ont été coupées ou copiées à partir d’un tampon SES, le texte d’impression est ignoré et seulement la formule et fonction d’impression jointes sont insérées ; les références de cellule de la formule sont relocalisées à moins que vous n'utilisiez C-u.

       * Le texte collé écrase un rectangle de cellules dont le coin haut gauche est la cellule courante.  Si une partie du rectangle est au-délà des bords de la feuille, vous devez confirmer l’augmentation de la taille de la feuille.

       * Du texte Non-SES est d’ordinaire inséré comme formule de remplacement pour la cellule courante.  Si la formule serait un symbole, elle est traitée comme une chaîne à moins que vous n'utilisiez C-u.  Les formules collées comprenant des erreurs de syntaxe sont toujours traitées comme des chaînes.

[paste]
     Colle à partir du presse-papier primaire ou de l’anneau presse-papier (clipboard-yank).

[mouse-2]
     Règle le point et colle à partir du presse-papier primaire (mouse-yank-at-click).

[M-mouse-2]
     Règle le point et colle à partir du presse-papier secondaire (mouse-yank-secondary).

M-y
     Immédiatement après un coller, vous pouvez remplacer le texte avec un élément précédent à partir de l’anneau presse-papier (ses-yank-pop).  Contrairement au yank-pop standard d’Emacs, la version de SES utilise undo pour supprimer l’ancien collage.  Est-ce que cela ne fait aucune différence ?

Personnaliser SES
=================

Par défaut, une feuille venant d’être créée a 1 ligne et 1 colonne. La largeur de colonne est 7 et la fonction d’impression par défaut est "%.7g".  Chacune de ces choses peut être personnalisée.  Allez voir dans le groupe « ses ».

Après avoir saisi une valeur de cellule, normalement forward-char est appelé, ce qui déplace le point vers la cellule suivante à droite, ou à la première cellule à gauche de la ligne suivante si la cellule courante est la plus à droite de la feuille.  Vous pouvez personnaliser ses-after-entry-functions pour que le déplacement soit vers la gauche ou le haut ou le bas. Pour un mouvement diagonal, selectionnez deux fonctions de la liste.

ses-jump-cell-name-function est une variable personnalisable réglée par déaut à la fonction upcase. Cette fonction est appelée quand vous passez un nom de cellule à la commande ses-jump (j), et que ce nom n'est pas le nom d’une cellule renommée. Elle change le nom de cellule saisi en celui de la cellule vers laquelle sauter. Le réglage par défaut upcase vous permet de saisir le nom de cellule en bas de casse. Un autre usage de ses-jump-cell-name-function pourrait être une internationalisation pour convertir des caractères non latin en équivalents latin pour nommer la cellule. Au lieu d’un nom de cellule, la fonction peut renvoyer des coordonnées de cellule sous la forme d’un cons, par exemple (0 . 0) pour la cellule A1, (1 . 0) pour la cellule A2, etc.

ses-jump-prefix-function est une variable personnalisable réglée par défaut à la fonction ses-jump-prefix. Cette fonction est appelée quand vous donnez un argument préfixe à la commande ses-jump (j). Elle renvoie un nom de cellule ou des coordonnées de cellule correspondant à l’argument préfixe. Les coordonnées de cellule sont sous la forme d’un cons, par exemple (1 . 0) pour la cellule A2. Le réglage par défaut ses-jump-prefix numérote les cellules de gauche à droite et puis de haut en bas, de sorte que si on suppose une feuille 4×3, l’argument préfixe 0 saute à la cellule A1, l’argument préfixe 2 saute à C1, l’argument préfixe 3 saute à A2, etc.

ses-mode-hook est un crochet de mode normal (une liste de fonctions qui s’exécutent quand le mode SES démarre sur un tampon).

La variable safe-functions est une liste de fonctions potentiellement risquées à traiter comme si elles étaient sûres lors de l’analyse des formules et fonctions d’impression.  See Virus protection.  Avant de personnaliser safe-functions, réfléchissez à quel point vous faites confiance à la personne qui vous suggère cette modification.  La valeur t désactive toute protection anti-virus.  Une valeur donnant une liste-de-fonctions peut rendre une feuille « trop bien », mais elle crée aussi des portes dérobées dans votre armure anti-virus.  Pour que votre protection contre les virus fonctionne, vous devez toujours appuyer sur n quand un avertissement contre un virus vous est présenté, à moins que vous compreniez ce que le code en question essaie de faire. N'écoutez pas ceux qui vous racontent de personnaliser enable-local-eval --- cette variable est pour les gens qui ne portent pas de ceinture de sécurité !

Fonctions avancées
******************

C-c M-C-h
     (ses-set-header-row). La ligne d’en-tête au sommet de la fenêtre SES affiche normalement la ligne de colonne pour chaque colonne. Vous pouvez la régler pour afficher une copie de l’une des lignes, tell que qu'une ligne de titres de colonnes, ainsi cette ligne sera toujours visible. Par défaut la commande règle la ligne courante comme en-tête ; utiliser C-u pour une invite à désigner la ligne d’en-têre.  Régler la ligne d’en-tête à la ligne 0 pour afficher les lettres de colonne de nouveau.

[header-line mouse-3]
     Affiche un menu pour régler la ligne courante comme en-tête, ou revenir à des lettres de colonne.

M-x ses-rename-cell
     Renomme une cellule pour passer d'un nom standard du genre de A1 à toute chaîne pouvant être un nom valide pour une variable locale (Voir aussi Nonrelocatable references).

M-x ses-repair-cell-reference-all
     Quand vous interrompez la mise à jour d’une formule de cellule en tapant C-g, alors cela peut casser le lien de référence de cellule, ce qui compromet la mise à jour automatique de cellule quand toute autre cellule dont elle dépend est modifiée. Pour réparer cela utilisez la fonction ses-repair-cell-reference-all

La zone d’impression
====================

Un fichier SES consiste en une zone d’impression et une zone de données.  Normalement le tampon est réduit de sorte à n'afficher que la zone d’impression. La zone d’impression est en lecture seule, hormis pour les commandes spéciales de SES ; elle contient les valeurs de cellule formatées par les fonctions d’impression.  La zone de données enregistre les formules, fonctions d’impression, etc.

C-x n w
     Affiche à la fois les zones d’impression et de données (widen).

C-c C-n
     Affiche seulement la zone d’impression (ses-renarrow-buffer).

S-C-l
M-C-l
     Recrée la zone d’impression en réévaluant pour toutes les cellules sa fonction d’impression (ses-reprint-all).

Plages dans les formules
========================

Une formule du genre de :

     (+ A1 A2 A3)

est la somme de trois cellules spécifiques.  Si vous insérez une nouvelle deuxième ligne, la formule devient

     (+ A1 A3 A4)

et la nouvelle ligne n'est pas incluse dans la somme.

La macro (ses-range DE À) s’évalue en une liste des valeurs dans un rectangle de cellules.  Si votre formule est

     (apply '+ (ses-range A1 A3))

et que vous insérez une nouvelle deuxième ligne, elle devient

     (apply '+ (ses-range A1 A4))

et la nouvelle ligne est incluse dans la somme.

Alors que vous saisissez ou éditez une formule dans le minitampon, vous pouvez sélectionner une plage dans la feuille (en utilisant la souris ou le clavier), et injecter une représentation de cette plage dans votre formule. Supposez que vous sélectionnez A1-C1 :

[S-mouse-3]
     Insère A1 B1 C1 (ses-insert-range-click)

C-c C-r
     Version clavier (ses-insert-range).

[C-S-mouse-3]
     Insère (ses-range A1 C1) (ses-insert-ses-range-click).

C-c C-s
     Version clavier (ses-insert-ses-range).

Si vous supprimez la cellule DE ou À d’une plage, la cellule la plus proche toujours existante est utilisée à la place.  Si vous supprimez l’entière plage, le relocalisateur de formule supprime le ses-range de la formule.

Si vous insérez une nouvelle ligne juste au delà de la fin d’une plage à une colonne, ou une nouvelle colonne juste au delà d’une plage à une ligne, la nouvelle cellule est incluses dans la plage.  Les nouvelles cellules insérées juste avant une plage ne sont pas incluses.

Des fanions peuvent être ajoutés à ses-range immédiatement après la cellule À .

!
     Les cellules vides de la plage peuvent être enlevées en ajoutant le fanion !. Une cellule vide est une cellule dont la valeur est l’un des symboles nil ou *skip*. Par exemple (ses-range A1 A4 !) fait la même chose que (list A1 A3) quand les cellules A2 et A4 sont vides.

_
     Les valeurs de cellules vides sont remplacées par l’argument suivant le fanion _, ou 0 quand le fanion _ est le dernier dans la liste d’arguments. Par exemple (ses-range A1 A4 _ "vide") fera la même chose que (list A1 "vide" A3 "vide") quand les cellules A2 et A4 sont vides. Similairement, (ses-range A1 A4 _ ) fera la même chose que (list A1 0 A3 0).

>v
     Quand l’ordre a de l’importance, liste les cellules en lisant les cellules ligne par ligne de la cellule en haut à gauche vers la cellule en bas à droite. Ce fanion est fourni pour être complet car c’est déjà l’ordre par défaut.

<v
     Liste les cellules en lisant les cellules ligne par ligne de la cellule en haut à droite vers la cellule en bas à gauche.

v>
     Liste les cellules en lisant les cellules colonne par colonne de la cellule en haut à gauche vers la cellule en bas à droite.

v<
     Liste les cellules en lisant les cellules colonne par colonne de la cellule en haut à droite vers la cellule en bas à gauche.

v
     Un raccourci pour v>.

^
     Un raccourci pour ^>.

>
     Un raccourci pour >v.

<
     Un raccourci pour >^.

*
     Au lieu de lister les cellules, en fait un vecteur ou une matrice Calc (see GNU Emacs Calc Manual). Si la plage contient seulement une ligne ou une colonne un vecteur est fait, sinon une matrice est faite.

*2
     Idem que * à ceci près qu'une matrice est toujours faite même quand il y a une seul ligne ou colonne dans la plage.

*1
     Idem que * à ceci près qu'un vecteur est toujours fait même quand il n'y a qu'une ligne ou colonne dans la plage, c-à-d. que la matrice correspondante est aplatie.

Trier par colonne
=================

C-c M-C-s
     Trie les cellules d’une plage en utilisant l’une des colonnes (ses-sort-column).  Les lignes (ou lignes partielles si la plage n'inclut pas toutes les colonnes) sont réarrangées de sorte que la colonne choisie soit ordonnée.

[header-line mouse-2]
     La façon la plus facile de trier est de cliquer sur mouse-2 sur la ligne d’en-tête de colonne (ses-sort-column-click).

La comparaison du tri utilise string<, ce qui fonctionne bien pour des nombres alignés à droite ou des chaînes alignées à gauche.

Avec un argument préfixe, trie dans l’ordre descendant.

Les lignes sont déplacées une à la fois, avec relocalisation des formules. Ceci fonctionne bien si les formules font référence à d’autres cellules dans leur ligne, mais non pas si bien pour des formules qui font référence à d’autres lignes dans la plage ou à des cellules hors de la plage.

Fonctions de formule standardes
===============================

Souvent on désire qu'un calcul exclue les cellules vides.  Voici quelques fonctions utiles à appeler dans vos formules :

(ses-delete-blanks &rest ARGS)
     Renvoie une liste dont toutes les cellules vides (dont la valeur est soit nil ou '*skip*) ont été supprimées. L’ordre des arguments est inversé. Prière de noter que ses-range a un modificateur ! qui permet de supprimer les cellules vides, ainsi il est possible d’écrire :

          (ses-range A1 A5 !)

     au lieu de

          (apply 'ses-delete-blanks (ses-range A1 A5 <))

(ses+ &rest ARGS)
     Somme des arguments non vides pris en ordre inverse.

(ses-average LISTE)
     Moyenne des éléments non vides de LISTE.  Ici la liste est passé comme un seul argument, vu que typiquement on la forme avec ses-range.

Plus sur l’impression de cellule
================================

Valeurs spéciales de cellule :

  * nil s’imprime typiquement de la même façon que "", mais permet que la cellule précédente déborde dessus.

  * '*skip* remplace nil quand la cellule précédente déborde effectivement ; rien n'est donc imprimée pour cette cellule.

  * '*error* indique que la formule a signalé une erreur au lieu de produire une valeur : la cellule imprimée est remplie de croisillons (#).

Lorsque la fonction d’impression est définie par une chaîne de formatage, par ex. "%.3f", SES imprime automatiquement nil comme une chaîne vide, mais si la fonction d’impression est définie par une expression lambda, vous devez définir explicitement comment nil est traité, par ex. :

     (lambda (x)
       (cond
        ((null x) "")
        ((stringp x) (list x))
        ((numberp x) (format "%.3f" x))
        (t (ses-prin1 x)))

imprime nil comme une chaîne vide, aligne à gauche la valeur si c’est une chaîne, et si c’est un nombre l’aligne à droite en l’imprimant avec trois décimales.

Il n'est pas nécessaire par contre que vous vous souciez de '*skip* dans la définition d’une fonction d’impression, en effet aucune fonction d’impression n'est appelée sur '*skip*.

Si le résultat de la fonction d’impression est trop large pour la cellule et que la cellule suivante est nil, le résultat débordera sur la cellule suivante. Les résultats très larges peuvent déborder sur plusieurs cellules.  Si le résultat est trop large pour l’espace disponible (jusqu'à la fin de la ligne ou la prochaine cellule non-nil), le résultat est tronqué si la valeur de cellule est une chaîne, ou remplacé par des croisillons (#) sinon.

SES pourrait être perturbé par des résultats de fonction d'impression contenant des sauts de ligne ou des tabulations, aussi ces caractères sont remplacés par des points d'interrogation.

t
     Confine une cellule à sa propre colonne (ses-truncate-cell). Ceci vous permet de déplacer le point sur la cellule de droite qui sinon serait couverte par un débordement. Si vous ne modifiez pas la cellule de droite, la cellule confinée débordera de nouveau la prochaine fois qu'elle sera imprimée.

c
     Appliquée à une seule cellule, cette commande affiche dans la zone d’écho toute erreur de formule ou erreur d’impression survenue pendant le recalcul/la réimpression (ses-recalculate-cell).  Vous pouvez utiliser cela pour défaire l’effet de t.

Quand une fonction d’impression signale une erreur, la fonction d’impression de repli ses-prin1 lui est substitué.  Ceci est utile quand votre fonction d’impression de colonne est seulement numérique et que vous utilisez une chaîne comme valeur de cellule.  Notez que la fonction d’impression par défaut standarde est "%.7g" qui est numérique seulement.  c sur de telles cellules affiche « Format specifier doesn't match argument type ».

Import et export
================

x t
     Exporte une plage de cellules comme des valeurs séparées par des tabulations (ses-export-tsv).

x T
     Exporte une plage de cellules comme des formules séparées par des tabulations (ses-export-tsf).

Le texte exporté va dans l’anneau presse-papier ; vous pouvez le coller dans un autre tampon.  Les colonnes sont séparées par des tabulations, les lignes par des sauts de lignes.

Pour importer du texte, utilisez n'importe laquelle des commandes coller où le texte à coller contient des tabulations et/ou des sauts de lignes.  Les formules importées ne sont pas relocalisées.

Protection contre les virus
===========================

À chaque fois une formule ou fonction d’impression est lue d’un fichier ou est collé dans la feuille, il est marqué comme « nécessitant une vérification de sécurité ».  Plus tard, quand la formule ou la fonction d’impression est évaluée pour la première fois, elle est vérifiée comme sûre en utilisant le prédicat unsafep ; si elle s’avère « potentiellement risquée », la formule ou fonction d’impression en question est affichée et vous devez appuyer Y pour l’approuver ou N pour utiliser un substitut. Le substitut signale toujours une erreur.

Les formules ou fonctions d’impression que vous tapez sont immédiatement vérifiées pour leur sûreté. Si elles s’avèrent potentiellement risquées et que vous appuyez N pour refuser, l’action est annulée et l’ancienne formule ou fonction d’impression demeure.

En plus des virus (qui tentent de se recopier dans d’autres fichiers), unsafep peut aussi détecter toutes sortes de chevaux de Troie, tels que des feuilles de calcul qui effacent les fichiers, envoient des courriels, inondent des sites Web, corrompent vos réglages d’Emacs, etc.

Généralement, les formules et fonctions d’impression de feuilles sont des choses simples qui n'ont pas besoin de faire des traitements exotiques, aussi toute partie potentiellement dangereuse de l’environnement Emacs Lisp peut être exclus sans entraver votre style comme écrivain de formule.  Lisez la documentation dans unsafep.el pour plus d’information sur la façon dont les formes Lisp sont classifiées comme sûres ou risquées.

Feuilles avec détails et synthèse
=================================

Une organisation usuelle pour une feuille de calcul est d’avoir un tas de lignes de « détail », chacune décrivant possiblement une transaction, et ensuite un ensemble de lignes de « synthèse » qui affichent chacune des données condensées pour un certain sous-ensemble des détails.  SES prend en charge ce type d’organisation via la fonction ses-select.

(ses-select DE-PLAGE TEST À-PLAGE)
     Renvoie une sous-ensemble de À-PLAGE.  Pour chaque membre dans DE-PLAGE qui est égal à TEST, le membre correspondant de À-PLAGE est inclus dans le résultat.

Exemple d’utilisation:

     (ses-average (ses-select (ses-range A1 A5) 'Bidochon (ses-range B1 B5)))

Ceci calcule la moyenne des valeurs de la colonne B pour les lignes dont la valeur dans la colonne A est le symbole 'Bidochon.

Vous vous demandez peut-être pourquoi les arguments de ses-select ne consistent pas au lieu de À-PLAGE de décalages DÉCALAGE-À-LA-LIGNE et DÉCALAGE-À-LA-COLONNE relativement à DE-PLAGE : spécifier À-PLAGE explicitement assure que la formule est recalculée si l’une quelconque des cellules de cette plage est modifiée.

Le fichier etc/ses-example.el dans la distribution Emacs est un exemple d’une feuille organisée en détails-et-synthèse.

Pour les gourous
****************

Mises à jour différées
======================

Pour épargner du temps de calcul redondant, les cellules dont le recalcul est rendu nécessaire par des changements dans d’autres cellules sont ajoutées à un ensemble.  À la fin de la commande, chaque cellule de cet ensemble est recalculée une fois.  Ceci peut créer un nouvel ensemble de cellules nécessitant un recalcul.  Ce processus est répété jusqu'à ce que l’ensemble soit vide ou que des références circulaires soient détectées.  Dans les cas extrêmes, et notamment si une référence circulaire est en cours de détection, vous pourriez voir des messages de progression de la forme « Recalculating... (NNN cells left) ».  Si vous interrompez le calcul avec C-g, la feuille demeurera dans un état incohérent, utilisez alors C-_ ou C-c C-l pour réparer cela.

Pour épargner encore plus de temps en évitant les écritures redondantes, les cellules qui sont modifiées sont ajoutées à un ensemble au lieu d’être immédiatement écrites dans la zone de données. Chaque cellule de cet ensemble est écrite une fois à la fin de la commande.  Si vous modifiez un grand nombre de cellules, vous pourriez voir un message de progression de la forme « Writing... (NNN cells left) ».  Ces écritures différées de cellules ne peuvent pas être interrompues par C-g, alors il vous faudra juste attendre.

SES utilise run-with-idle-timer pour déplacer le souligné de cellule quand Emacs fait défiler le tampon à la fin d’une commande, et aussi pour réduire et souligner après visiter un fichier.  Ceci peut être visible par une perturbation transitoire après visiter un fichier et certaines commandes de défilement.  Vous pouvez continuer à taper sans vous inquiéter de cette perturbation.

Références non relocalisables
=============================

C-y relocalise toutes les références de cellule dans une formule collée, alors que C-u C-y n'en relocalise aucune.  Et pour les cas mélangés ?

La meilleure approche est de renommer les cellules que vous ne voulez pas être relocalisables en utilisant ses-rename-cell. Les cellules qui non pas un style de nom du genre de A1 ne sont pas relocalisées au collage. En utilisant cette méthode, les cellules concernées relocalisées quelle que soit la formule où elles apparaissent. Prière toutefois de noter que dans une formule contenant quelque plage (ses-range CELL1 CELL2) alors dans la formule collée chacune des bornes CELL1 et CELL2 de la plage est relocalisée, ou non, indépendemment, selon qu'elle est nommée du genre de A1 ou renommée.

Un méthode alternative est d’utiliser

     (symbol-value 'B3)

pour faire une référence absolue.  Le relocalisateur de formule saute par dessus tout ce qui est sous un quote, aussi cela ne sera pas relocalisé quand on le colle ou quand des lignes/colonnes sont insérées/supprimées.  Toutefois, B3 ne sera pas enregistrée comme une dépendance de cette cellule, et donc cette cellule ne sera pas mise à jour automatiquement quand B3 est modifié, c’est pourquoi l’usage de ses-rename-cell est la plupart du temps préférable.

Les variables row et col sont liées dynamiquement pendant l’évaluation d’une formule de cellule. Vous pouvez utiliser

     (ses-cell-value row 0)

pour obtenir la valeur de la colonne la plus à gauche de la ligne courante. Ce type de dépendance n’est pas non plus enregistré.

La zone de données
==================

Commence avec un caractère saut de page (de code ASCII 014 en octal), suivi par un ensemble de macros de définition de cellule pour chaque ligne, suivi par l’ensemble des définitions de fonctions d’impression locales, suivi par les largeurs de colonnes, fonctions d’impression de colonne, fonction d’impression par défaut, et ligne d’en-tête. Ensuite il y a les paramètres globaux (ID de format fichier, nombre de lignes, nombre de colonnes, nombre de fonctions d’impression locales) et les variables locales (spécification du mode SES pour le tampon, etc.).

Quand un fichier SES est chargé, tout d’abord les paramètres globaux sont chargés, puis l’ensemble de la zone de données est evaluée, et finalement les variables locales sont traitées.

Vous pouvez éditer la zone de données, mais n’insérez pas ni supprimez de sauts de ligne, hormis dans la partie des variables locales, en effet SES localise les choses en comptable les sauts de ligne. Utilisez C-x C-e à la fin d’une ligne pour installer ce que vous avez édité dans les structures de données de la feuille (ceci ne met pas à jour la zone d’impression, utilisez, par ex., C-c C-l pour cela).

La zone de données est maintenue comme une image des structures de données de la feuille stockée dans des variables locales tampon au moment du chargement initial de la zone. Si le contenu de la zone de données se trouve corrompu par la suite, vous pouvez essayer de reconstruire la zone de données à partir des structures de données avec :

C-c M-C-l
     (ses-reconstruct-all).

Les variables locales-tampon dans les feuilles de calcul
========================================================

Vous pouvez ajouter des variables locales supplémentaires à la liste au bas de la zone de données, telles que des constantes cachées auxquelles vous désirez faire référence dans vos formules.

Vous pouvez initialiser la variable ses--symbolic-formulas pour être une liste de symboles (comme une suite de chaînes entre parenthèses) à proposer comme complétions pour la commande '. Cette liste initiale de complétions sera utilisée à la place de l’ensemble effectif des symboles-comme-formules de la feuille.

Pour un exemple de ceci, voir le fichier etc/ses-example.ses.

Si (pour une raison quelconque) vous désirez que vos formules ou fonctions d’impression sauvegardent des données dans des variables, vous devez déclarez ces variables comme locales tampon pour éviter un avertissement de virus.

Vous pouvez définir des fonction en en faisant des valeurs pour la fausse variable locale eval.  De telles fonctions peuvent ensuite être utilisées dans les formules et comme fonctions d’impression, mais d’ordinaire chaque eval est présenté à l’utilisateur pendant le chargement du fichier comme un virus potentiel.  Et cela peut devenir gênant.

Vous pouvez définir des fonctions dans votre fichier .emacs. Toute personne pourra encore lire la zone d’impression de votre feuille, mais ne pourra pas recalculer ou réimprimer quoi que ce soit qui dépende de vos fonctions.  Pour éviter des avertissement contre les virus, chaque fonction utilisée dans une formule nécessite

     (put 'le-nom-de-votre-fonction 'safe-function t)

Utilisation de advice-add dans SES
==================================

copy-region-as-kill
     Quand on copie de la zone d’impression d’une feuille, traite la région comme un rectangle et joint pour chaque cellule sa formule et sa fonction d’impression comme des propriétés 'ses.

yank
     Quand on colle dans la zone d’impression d’une feuille de calcul, essaie de coller comme des cellules (si le texte à coller a des propriétés 'ses), ensuite comme des formules séparées par des tabulations, ensuite (si tout le reste a échoué) comme une seule formule pour la cellule courante.

Remerciements
*************

Codé par :

     Jonathan Yavner, Stefan Monnier, Shigeru Fukaya, Vincent Belaïche

Manuel Texinfo de :

     Jonathan Yavner, Brad Collins, Vincent Belaïche

Idées de :

     Christoph Conrad, CyberBob, Syver Enstad, Ami Fischman, Thomas Gehrlein, Chris F.A. Johnson, Yusong Li, Juri Linkov, Harald Maier, Alan Nash, François Pinard, Pedro Pinto, Stefan Reichör, Oliver Scholz, Richard M. Stallman, Luc Teirlinck, J. Otto Tennant, Jean-Philippe Theberge, Andrés Ramírez

GNU Free Documentation License
******************************

     [file doclicense.texi not included]