Le 13/10/2014 15:25, Stéphane Mourey a écrit :
Bonjour,

Merci à tous pour votre aide, vos compliments, votre soutien !
J'ai essayé de prendre toutes vos remarques en considération, et voici
ce que cela donne.

On va voir ça :) (pour commencer, n'oublie pas de garder les messages sur la liste, c'est mieux).

La bonne forme est:
  Buffer & buffer = cur.buffer();
Erreur lors de la compilation :

    Text3.cpp:2396:32: error: invalid initialization of non-const
    reference of type ‘lyx::Buffer&’ from an rvalue of type ‘lyx::Buffer*’
        Buffer & buffer = cur.buffer();

C'est de ma faute, le résultat est en effet un pointeur. C'est très bien comme tu l'as fait.

Voilà ce que
donne mon code et là, il se compile bien, ce qui est déjà une petite
victoire:

         case LFUN_SERVER_GET_STATISTICS:
    {
             DocIterator from, to;
             if (cur.selection()) {
                 from = cur.selectionBegin();
                 to = cur.selectionEnd();
             } else {
                 from = doc_iterator_begin(cur.buffer());
                 to = doc_iterator_end(cur.buffer());
             }

             cur.buffer()->updateStatistics(from, to);
             string arg0 = cmd.getArg(0);

Style: chaque niveau d'indentation doit être une tabulation.

Style: quand on définit une variable qui ne sera pas modifiée ensuite, on ajoute "const" :
              string const arg0 = cmd.getArg(0);

             if (arg0 == "words") {
    cur.message(convert<docstring>(cur.buffer()->wordCount()));
             } else if (arg0 == "chars") {
    cur.message(convert<docstring>(cur.buffer()->charCount(false)));
             } else if (arg0 == "chars-space") {
    cur.message(convert<docstring>(cur.buffer()->charCount(true)));
             } else {
    cur.message(convert<docstring>(cur.buffer()->wordCount()) + " " +
    convert<docstring>(cur.buffer()->charCount(false)) + " " +
    convert<docstring>(cur.buffer()->charCount(true)));
             }
         }
             break;

Si tu ne veux pas avoir plein de cur.message, tu peux définir une variable
  string result;
et faire un
  cur.message(result);
à la fin. Par contre, c'est dur d'éviter les convert à répétition.

Reste plus qu'à tester pour de vrai. J'enlève le paquet LyX fournit par
Ubuntu, je fais "make install", je lance LyX en ligne de commande et
tout a l'air de bien se passer.

Ceci n'est pas nécessaire. LyX peut toujours être lancé depuis le répertoire de compilation en faisant src/lyx. Il trouvera automatiquement les fichiers nécessaires.

J'ouvre un document, no problemo.
Logiquement, je passe au test de ma fonction. Et là, je coince. Dans une
nouvelle console, histoire de voire ce que LyX afficherait sur la ligne
de commande où je l'ai lancé (il n'affichera rien de plus) :

    echo "LYXCMD:bro:server-get-statistics:" >~/.lyxpipe.in
    cat ~/.lyxpipe.out

Et là, j'ai été quelque peu surpris par le fonctionnement des fichiers
~/.lyxpipe.in et ~/.lyxpipe.out, à tel point que j'ai d'abord cru que
rien ne marchait.

Car si je lance "cat ~/.lyxpipe.out", il ne se passe rien, il ne me rend
pas la main, du moins jusqu'à ce que j'ai envoyé quelque chose sur
~/.lyxpipe.in... du coup j'en arrive à quelques acrobaties intéressantes :

Oui, je ne sais pas trop comment les pipes (tuyaux) marchent. Ce que je conseille est d'utiliser lyxclient (src/client/lyxclient), qui fait les trucs compliqués à ta place.

Qu'en pensez-vous ? Des améliorations à apporter ? Cela vaut-il la peine
de soumettre la contribution ? Si oui, comment s'y prendre ?

Ça a l'air très bien, et oui, ce serait une addition intéressante. Pour faire cela il faut faire un patch. Est-ce que tu travailles depuis git ou depuis le tar.gz de LyX ? Selon les cas, la méthode varie.

J'imagine que tu as travaillé depuis la version stable 2.1.x ? Il faudra qu'on commence par appliquer à la version développement 2.2, la version stable vient après. Normalement, il n'y aura pas besoin de trop adapter le code.

JMarc

Répondre à