Plugin Geany
Par Cédric Tabin le lundi 20.07.2009, 08:00 - C/C++ - Lien permanent
Sous ma Gentoo, j'utilise beaucoup l'éditeur de texte Geany qui est très léger et que je trouve vraiment bien fait. Dernièrement je me suis amusé à faire un plugin en C et je me suis heurté à quelques problèmes...
Dans ma distribution, lorsqu'on installe un package (via emerge), les sources sont téléchargées puis compilées. Elles se trouvent généralement dans le répertoire /usr/include/, et plus précisément dans le répertoire /usr/include/geany/.
La documentation de geany pour créer un plugin est plutôt light... Elle donne la base, mais ne permet pas de résoudre certains problèmes basiques comme la création d'une librairie en utilisant une librairie externe.
Donc mon but était de faire un bout de code C qui permette de faire du "XML Pretty Printing" (formatter un XML proprement en un click). Celui-ci n'étant pas terminé, je mets juste la partie du code qui permet de vérifier que le document est bien un XML :
//fichier Plugin.c #define MALLOC_ERROR -1 #include <stdlib.h> #include <stdio.h> #include <geany.h> #include <ui_utils.h> #include <plugindata.h> #include <editor.h> #include <document.h> #include <geanyfunctions.h> #include <Scintilla.h> #include <libxml/parser.h> #include <libxml/tree.h> static void item_activate_cb(GtkMenuItem *menuitem, gpointer gdata) { //retrieves the current document GeanyDocument* doc = document_get_current(); GeanyEditor* editor = doc->editor; ScintillaObject* sco = editor->sci; //allocate a new pointer int length = sci_get_length(sco)+1; char* buffer = (char*)malloc(length*sizeof(char)); if (buffer == NULL) { exit(MALLOC_ERROR); } //malloc error //retrieves the text sci_get_text(sco, length, buffer); //checks if the data is an XML format xmlDoc* xmlDoc = xmlParseDoc((unsigned char*)buffer); if(xmlDoc == NULL) { dialogs_show_msgbox(GTK_MESSAGE_ERROR, "Unable to parse the content as XML."); return; } xmlFreeDoc(xmlDoc); //process Pretty Printing }
Le premier problème à régler est celui de la compilation. Le fait de connaître le dossier contenant les librairies ne suffit pas pour compiler :
gcc -std=c99 -o "Plugin.o" -Wall -c "Plugin.c" -I/usr/include/geany
L'exécution de la commande ci-dessus donne droit à un beau pavé d'erreurs, pour la plupart indiquant que des objets sont inexistants. C'est simplement qu'il faut indiquer toutes les librairies utilisées par geany (et aussi par libxml2). Et pour cela, il y a la commande salvatrice pkg-config :
gcc -std=c99 -o "Plugin.o" -Wall -c "Plugin.c" `pkg-config --cflags geany libxml-2.0`
Et tout compile proprement !
Vient ensuite le problème de l'intégration du plugin. Geany a besoin d'un fichier so (dynamic shared library) pour pouvoir l'utiliser (plus d'infos). Pour compiler le plugin et créer la librairie, les deux lignes de commandes suivantes mènent à bon port :
gcc -std=c99 -o "Plugin.o" -Wall -c -fpic "Plugin.c" `pkg-config --cflags geany libxml-2.0` gcc -shared -o "Plugin.so" "Plugin.o" `pkg-config --libs geany libxml-2.0`
Pour terminer l'installation, il suffit de copier le fichier Plugin.so dans le répertoire ~/.config/geany/plugins puis de relancer geany. Le plugin devrait ensuite apparaître dans le menu Tools (cela dépend du code) !
J'ai mis en pièce jointe tout le code ainsi que le script de compilation et d'exécution pour ceux qui aimeraient tester
Commentaires
Bonsoir, cela fait depuis la semaine dernière que je blocs sur le fait que mon plugin "titi.so" n'est pas afficher dans le gestionnaire de plugin de mon geany.
bien sur j'ai fait exactement ce qu'il disent http://www.geany.org/manual/referen...
je prend ton code et regarde le fichier compile et install (relativement court comparer au makefile a coter des plugin officier de geany totalement incompréhensible).
J’exécute donc tes deux script, et paf! Je vois ton plugin dans la liste.
Je me dit c'est pas possible, mois aussi j'ai fait pareille, j'ai mis mon .so dans le même dossier, tout comme il faut, et j'ai bien sure penser bien avant au : "chmod 777 titi.so" pour être sur de sur que ce n'est pas sa.
Je recommence donc avec ton code script... et sa ne marche toujours pas.
Le problème ne peux donc plus qu’être dans le fichier .c
Je decide donc de comparer ton ficher avec le mien, et je vois:
PLUGIN_VERSION_CHECK(130)// dans ton fichier
PLUGIN_VERSION_CHECK(211)// dans le code exemple de la doc de geany
Et la c'est le drame! Tout ce temps perdu car mon geany venant des paquet ubuntu est a la version 0.18 et que ce fichu code exemple ne peut qu'etre accepter par un geany de version minimum... a la dernier version de geany. comme si on pouvait pas metre dans un menu un "hello world" avant!
Et tout sans sans message d'erreur de geany genre "paquet non accepter"
Et voila un week-end perdu pour rien... mais maintenant je vais pouvoir commencer a m’amuser!!!
En tout cas merci pour cette article, j'ai chercher tout le week-end un simple plugin tout petit et compréhensible avec surtout une install a la main et pas un config - make - make install ou en .deb
Je tenait donc a te remercier pour ton code.
Allez, je vais de ce pas écrire un plugin qui puisse afficher "erreur chargement plugin, plugin trop recent" dans une jolie fenetre