# [TIP] Shell-reminder + EBUILD + WIKI

## alctraz

24/10/2005: Installation d'un wiki sur http://shell-reminder.be/

Contribuez en partageant vos tips/mémos (creez vous une page si vous le souhaitez) et/ou en participant a l'élaboration d'un fichier rdb sur un thème particulier qui vous interesse.

Merci!

===

=== UPDATE 16/04/05

===

Voici un ebuild.

Les dernieres sources.

Nouveautés: voir le README (il y a par exemple une page de man, certains chemins d'installation ont étés modifié, etc...)

Installation:

```
# mkdir -p /usr/local/portage/app-misc/shell-reminder/

# cd /usr/local/portage/app-misc/shell-reminder/

# wget http://www.shell-reminder.be/download/source/shell-reminder-20050416.ebuild

# ebuild shell-reminder-20050416.ebuild digest

# emerge -va shell-reminder

```

Un petit conseil: Pour une installation propre, avant d'emerger le paquet, supprimez les tous fichiers que vous avez installé a la main. En prenant soin de mettre votre rdb de coté evidemment, pour la recopier ensuite.

Tout commentaire/suggestion est le bienvenu

===

===

===

Salut,

Avec un ami, j'ai commencé a écrire un script perl (lien) qui permet d'afficher des 'reminders' dans le shell quand on a un trou de 

mémoire au sujet d'une commande, d'un fichier de config ou tout ce que l'on veut (qq'un avait deja proposé cette idée qq part sur 

le forum). Le but étant de se créer sa propre base de donnée de 'tips', et ainsi trouver ce que l'on cherche trés rapidement, sans 

devoir fouiller dans les pages de man ou info.

Voila qqs illustrations de l'utilisation du script: illustration1 illustration2 illustration3

Le principe est très simple. L'utilisateur alimente un fichier 'base de donnée' avec tout les trucs qu'il est susceptible d'oublier 

ou simplement n'importe quelle information qu'il souhaite répertorier pour y avoir facilement accès ensuite. Ensuite vous utilisez 

la commande 'remind-me' pour faire une recherche dans la ou les "bases de donnée".

Les fichiers "base de donnée" (.rdb pour 'reminder data base'  :Wink: ) possèdent la structure suivante:

```
[Compress/extract archive - tar - gzip - bzip]

  Extract foo.tar to directory DIR

     tar -xvvf foo.tar -C DIR

  Extract gzipped foo.tar.gz

     tar -xvvzf foo.tar.gz

  Extract bzipped foo.tar.bz2

     tar -xvvjf foo.tar.bz2

  Tar contents of folder foo in foo.tar

     tar -cvvf foo.tar foo/

[end-of-item]

[En-tête]

  contenu du reminder...

[end-of-item]
```

Donc chaque reminder possède une en-tête qui peut contenir une liste de mots clé ou un petit descriptif.

Voici par exemple mon fichier .rdb, un peu bordélique: reminders.rdb

J'y conserve par exemple certains 'one-liner' bash qui m'ont été utiles et qui pourraient reservir etc...

On peut evidemment utiliser plusieurs rdb, par exemple pour classer les reminders en différentes catégories ou bien pour pouvoir importer facilement les rdb d'autres utilisateurs. On les place simplement dans le répertoire ~/.reminder. Ce repertoire contient aussi un fichier de config pour paramétrer le comportement par defaut du script. On peut evidemment changer ce comportement en passant des options directement sur la ligne de commande. Ainsi, on peut effectuer des recherches de type 'or' ou bien 'and' sur plusieurs mots clé, dans les en-têtes uniquement ou dans le fichier complet, etc... Consultez le fichier de config et l'aide pour une liste des options (remind-me -h).

D'autre part, si vous souhaitez un fichier rdb commun à tous les utilisateurs, placez le simplement dans /etc ou bien configurez un 

répertoire supplémentaire dans le fichier de config.

OK, pour l'utiliser:

```
$ cd

$ wget http://www.shell-reminder.be/dev/shell-reminder-20050411.tar.bz2

$ tar -xvvjf shell-reminder-20050411.tar.bz2

$ mkdir .reminder

$ su

# mv reminder/remind-me /usr/local/bin

# mv reminder/reminders.rdb /etc

# mv reminder/reminder.conf .reminder/

# rm -rf reminder
```

On espère simplement que ca pourra être utile a d'autres, personellement on l'utilise quotidiennement maintenant.

Une remarque pour terminer: on est pas des pro du Perl, donc le code est probablement loin d'être parfait. Merci, de nous signaler les bug ainsi que toute suggestion d'amélioration.Last edited by alctraz on Fri Mar 24, 2006 9:37 am; edited 9 times in total

----------

## titix

Je trouve que c'est une excelente idée  :Cool: 

Plus besoin de cerveau pour utiliser linux... plus d'excuse donc !

Quoi qu'il en soit bravo à vous.

----------

## bosozoku

Très bonne idée ! C'est dur de trouver des idées profitables aujourd'hui (tout à été inventé ^^). Enfin la preuve que non parce que ton script est super ! Voila il est adopté  :Very Happy: 

Un grand merci à toi.

----------

## alctraz

Merci, ca fait plaisir  :Smile: 

On est evidemment ouvert a toute suggestion, donc si une idée ou une requéte vous passe par la tête, n'hésitez pas.

D'autre part ca pourrait etre sympa de partager ses 'reminders' si vous pensez que ca peut etre utile au autres.

On avait comme projet, qd le script serait au point, de proposer au téléchargement des rdb sur différents sujets (gentoo/portage, les commandes shell, etc...). Les utilisateurs pourraient les placer dans leur répertoire et ya deja une option de recherche qui permet de chercher dans sa rdb perso (~/.reminders.rdb) uniquement ou bien dans tte les rdb qu'on a installé.Last edited by alctraz on Mon Apr 11, 2005 11:41 am; edited 1 time in total

----------

## kernelsensei

On peu proposer une idee de feature ?

Moi je verrais bien un argument pour rajouter un memo de maniere 'rapide', genre :

```
remind-me --add  <la_db_ou_on_veut_ajouter>    <[en-tete]>  <le_memo>
```

ou encore simplement

```
remind-me --add  <la_db_ou_on_veut_ajouter>
```

qui edite le fichier via l'editeur favorit de l'utilisateur, ou a la limite un truc plus simple avec une commande du style :

```
cat >> /chemin/reminders.rdb << EOF
```

enfin c'est des idees comme ca hein ...  :Smile: 

----------

## alctraz

 *kernel_sensei wrote:*   

> On peu proposer une idee de feature ?
> 
> Moi je verrais bien un argument pour rajouter un memo de maniere 'rapide', genre :
> 
> ```
> ...

 

Oui, c'est une bonne idée (vu qu'on y avait aussi pensé  :Wink: ) mais en fait c'est pas très facile d'implementer un truc qui offre assez de flexibilité pour pouvoir remplacer un éditeur classique.

Par exemple ta premiere suggestion est très facile a mettre en place mais, a mon sens pas pratique du tout, car les memo prennent souvent plusieurs lignes, qu'on souhaite indenter d'une certaine manière pour que la lecture soit facile qd on utilise remind-me, etc... Donc entrer un memo sur une ligne c'est pas si pratique. Mais si bcp trouvent ca utile ca me dérange pas de l'implementer.

C'est un peu pareil pour la 3e idée dans la mesure ou une fois que tu as entré une ligne tu ne sais plus l'éditer.

En attendant de créer des fonctions qui permettent d'éditer les rdb 'intelligement', le mieux serait peut etre ta 2e suggestion.

Par exemple, l'utilisateur entre la commande:

```
remind-me --add  <la_db_ou_on_veut_ajouter>
```

Et le script ajoute deja les balises vides dans le fichier, genre:

```
[  ]

[end-of-item]
```

et ensuite lance l'editeur definit par la variable $EDITOR, pour que l'utilisateur remplisse les blanc.

Tu en penses quoi?

----------

## kernelsensei

ben c'est clair que si on veut faire propre, autant passer par un vrai editeur .. donc ouais, ca serait pas mal comme ca ..

----------

## yoyo

Excellente idée ce ch'ti script ...  :Very Happy: 

 *kernel_sensei wrote:*   

> ben c'est clair que si on veut faire propre, autant passer par un vrai editeur ...

 Tu veux bien sûr parler de VI ???   :Mr. Green: 

OK -> []

----------

## bosozoku

Mais non pourquoi tu sors ? Il voulait bien sur parler de VI (m)  :Smile: 

----------

## blasserre

nous sommes tous bien d'accord qu'emacs n'est pas à mettre entre toutes les mains

----------

## yoyo

 *blasserre wrote:*   

> nous sommes tous bien d'accord qu'emacs n'est pas à mettre entre toutes les mains

 Qui a dit aucune ???  :Laughing:   :Laughing:   :Laughing: 

----------

## bosozoku

Je me déconce, c'est moi  :Twisted Evil: 

Faut pas dégénérer dans ce troll ancestral sinon y'en à qui risquent de se facher alors qu'on est bien d'accord que ça reste sur le ton de la plaisanterie. 

----------

## alctraz

Ce script a été écrit avec  emacs.

 :Wink: 

----------

## kernelsensei

 *alctraz wrote:*   

> Ce script a été écrit avec  emacs.
> 
> 

 

ouais ben dans ce cas t'aurais au moins pu l'ecrire en LISP  :Razz: 

----------

## alctraz

 *kernel_sensei wrote:*   

>  *alctraz wrote:*   Ce script a été écrit avec  emacs.
> 
>  
> 
> ouais ben dans ce cas t'aurais au moins pu l'ecrire en LISP 

 

Je vais faire un port LISP rien que pour toi ^^

Mais tu vas devoir installer emacs pour l'interpreter...

Plus serieusement, rien ne surpasse Perl qd il s'agit de jouer avec des chaines de caractéres et regex.

----------

## kernelsensei

 *alctraz wrote:*   

>  *kernel_sensei wrote:*    *alctraz wrote:*   Ce script a été écrit avec  emacs.
> 
>  
> 
> ouais ben dans ce cas t'aurais au moins pu l'ecrire en LISP  
> ...

 

ben c'est pas pour rien qu'a la base Vim c'est scriptable en perl  :Razz: 

----------

## alctraz

 *kernel_sensei wrote:*   

> 
> 
> ben c'est pas pour rien qu'a la base Vim c'est scriptable en perl 

 

hmm... dans la mesure ou je peux lancer n'importe quelle commande dans emacs, on dira que emacs c'est scriptable dans n'importe quel language :p

----------

## kernelsensei

 *alctraz wrote:*   

>  *kernel_sensei wrote:*   
> 
> ben c'est pas pour rien qu'a la base Vim c'est scriptable en perl  
> 
> hmm... dans la mesure ou je peux lancer n'importe quelle commande dans emacs, on dira que emacs c'est scriptable dans n'importe quel language :p

 

ah ben ca aussi je peux le faire sous vim .. c trop facile  :Razz: 

Bon on va arreter la hein  :Smile: 

----------

## sireyessire

Vim +1

ben oui quoi vous croyez quand même pas que je vais pas passer par là???

 :Razz: 

----------

## alctraz

ok, donc maintenant vous pouvez utiliser les commandes:     (shell-reminder-20050411)

```
remind-me -A [base de donnée a éditer]
```

Pour lancer votre éditeur favorit et compléter les balises tout juste insérées,

ou simplement:

```
remind-me -A
```

pout éditer la base de donnée personelle ~/.reminder/reminders.rdb directement.Last edited by alctraz on Mon Apr 11, 2005 10:02 pm; edited 2 times in total

----------

## kernelsensei

autre suggestion : faire un tar qui ne se detarre pas dans .reminder/* mais plutot dans reminder/* ca permet de ne pas ecraser sa db si on detarre dans le home  :Razz: 

EDIT: et je la vois pas l'option -A ..  :Sad: 

```
boris@electron ~ $ diff remind-me .reminder/remind-me

boris@electron ~ $

```

tu te serais pas plante en faisant le tar ?

----------

## alctraz

 *kernel_sensei wrote:*   

> autre suggestion : faire un tar qui ne se detarre pas dans .reminder/* mais plutot dans reminder/* ca permet de ne pas ecraser sa db si on detarre dans le home 
> 
> EDIT: et je la vois pas l'option -A .. 
> 
> ```
> ...

 

arf oui, en effet, c'est corrigé, ainsi que le nom de rep

merci

----------

## alctraz

Je planche sur un ebuild, mais je suis pas certain de faire ca correctement, alors un petit coup de main d'un expert serait le bienvenu  :Wink: 

Le tarball contiendra normalement 6 fichiers:

```
remind-me  reminders.rdb  reminder.conf  README  Changelog  remind-me.1
```

J'ai simplement repris un autre ebuild, et l'ai un peu adapté.

```
# Copyright 1999-2005 Gentoo Foundation

# Distributed under the terms of the GNU General Public License v2

# $Header: $

DESCRIPTION="Display reminders in your shell"

HOMEPAGE="http://www.groulala.net/shell-reminder/"

SRC_URI="http://www.groulala.net/shell-reminder/dev/${P}.tar.bz2"

LICENSE="GPL-2"

SLOT="0"

KEYWORDS="~alpha ~amd64 ~arm ~hppa ~ia64 ~mips ~ppc ~ppc64 ~s390 ~sparc ~x86"

IUSE=""

RDEPEND=">=dev-lang/perl-5.8.0-r12"

#src_unpack() {

#        unpack ${A}

#        cd ${S}

#}

src_install() {

        dobin remind-me || die

        dodoc README Changelog

        doman remind-me.1

        dodir /etc/reminder

        dodir ~/.reminder  # le faire pour chaque utilisateur?

        # installer reminders.rdb et reminder.conf 

        # dans /etc/reminder et dans tous les home?

}

pkg_postinst() {

        einfo

        einfo "If you plan to use the -A option to add reminders to your"

        einfo "databases, be sure that the $EDITOR environment variable is"

        einfo "set or that you specified a valid editor path in the config"

        einfo "file."

        einfo

        ebeep 5

        epause 3

}
```

Installer le script, la page de man et les doc c'est simple. Mais, en plus, je dois creer un rep /etc/reminder et des .reminder/ dans les home et y placer reminder.conf et reminders.rdb. Mais je n'ai pas vu dans "l'ebuild howto" de fonction qui installe des fichiers dans /etc ou dans les home. Donc je me demande si je dois y aller a coup de 'cp' 'chmod' etc... et, dans ce cas, si ca va pas ecraser les config deja existantes?

Ya probablement un moyen plus propre de procéder

----------

## yoyo

Bon je suis très (très) loin d'être un expert en ebuild, mais il me semblait que toute l'install doit se faire dans le répertoire "/var/tmp/portage/nom_ebuild" puis tout est installé dans le bon répertoire par la suite (ce qui permet l'utilisation du CONFIG_PROTECT et évite l'écrasement des fichiers de config).

À confirmer par un vrai DEV ...   :Embarassed: 

Sinon, des docs Gentoo (donc sûrement de qualité) sont dispos pour le dev d'ebuild.

C'est en anglais et c'est ici : http://www.gentoo.org/proj/en/devrel/handbook/handbook.xml?part=2&chap=0

----------

## sireyessire

 *yoyo wrote:*   

> Bon je suis très (très) loin d'être un expert en ebuild, mais il me semblait que toute l'install doit se faire dans le répertoire "/var/tmp/portage/nom_ebuild" puis tout est installé dans le bon répertoire par la suite (ce qui permet l'utilisation du CONFIG_PROTECT et évite l'écrasement des fichiers de config).
> 
> À confirmer par un vrai DEV ...  
> 
> Sinon, des docs Gentoo (donc sûrement de qualité) sont dispos pour le dev d'ebuild.
> ...

 

mouais je suis pas un vrai dev, mais l'install en sand box est faite dans /var/tmp/portage/nom_package/image/ qui devient une racine virtuelle. donc si tu veux mettre un truc dans /etc, c'est dans /var/tmp/portage/nom_package/image/etc/ qui faut le mettre.

à noter que la compilation et l'extract des tarball se font par défaut dans /var/tmp/portage/nom_package/work/ et qu'il s'attend à trouver un configure.sh dans ce répertoire, si c'est pas le cas, il faut lui faire changer de rep à la main dans l'ebuild. idem pour make.

Voilà en espérant que j'ai pas dit trop de conneries (se lever super tôt c'est pas bon pour le cerveau...)

[edit] package c'est le nom de l'ebuild (enfin presque, c'est le $P quoi, ie nom de l'ebuild sans le .ebuild)

----------

## alctraz

Un ebuild est maintenant disponible  :Cool: 

Consultez l'update du premier post pour les instruction d'installation.

----------

## tfh

Oula ca m'a l'air tres bien ce script. 

Je vais de ce pas l'essayer. 

Au niveau des features ou suggestion, je pense que pouvoir interfacer avec une db sql pour socker les memos peut etre interessant. Je jetterai un oeil a ca demain .

Bonne idee sinon car je suppose que tout le monde garde des petits memo papier a cote pour se rappeller des differentes commandes ( tar viens a l'esprit  :Smile:  )

----------

## kernelsensei

une db sql je trouve ca un peu disproportionné, surtout que la methode actuelle est tres convenable et rend l'ajout de memos tres simple ..

----------

## alctraz

 *kernel_sensei wrote:*   

> une db sql je trouve ca un peu disproportionné, surtout que la methode actuelle est tres convenable et rend l'ajout de memos tres simple ..

 

oui, je suis d'accord avec toi.

On a essayé d'avoir des fichiers db facilement éditables a la main et aussi d'avoir le moins de dépendances possibles. Ce serait un peu bête d'être obligé d'installer des dép liées a sql par exemple.

Par contre la chose a laquelle on a pensé, c'est organiser les mémos dans des fichiers XML. Ca permettrait d'avoir du code plus lisible je pense et puis si les info qu'on reuni dans ces db sont intéressantes d'autres pourraient les utiliser facilement dans d'autres scripts par exemple.

Le seul petit désavantage serait que les db xml seraient un peu plus "difficile" a éditer par l'utilisateur. Mais ca c'est pour un peu plus tard de tte facon.

Vous en pensez quoi?

----------

## blasserre

 *alctraz wrote:*   

> Par contre la chose a laquelle on a pensé, c'est organiser les mémos dans des fichiers XML.
> 
> Vous en pensez quoi?

 

à fond POUR

c'est vrai qu'on perd en éditabilité, mais après les "gens qui savent" peuvent faire ce qu'ils veulent

----------

## kernelsensei

franchement je trouve que les balises simples [Description] ... [end-of-item] conviennent parfaitement ...

----------

## alctraz

Oui, je crois que ca fonctionne bien comme ca pour le moment. Peut etre que dans un avenir plus lointain (qd on aura plus de temps), on envisagera ce genre de changements.

Et si jamais on passe a des fichiers xml, on fera un browser/éditeur de mémo avec ncurses :p

----------

## tfh

En fait je parlais de base sql, par souci de standardisation, pour pouvoir faire plein de differentes applis  pour editer / voir ses memos. Genre un site en php avec une form pour rajouter des mémos.  Ca permettrais de faire une tres belle db de Tips and Tricks.

Mais  je n'avais pas pense a la solution du fichier xml, qui remplis parfaitement cette fonction.

 Donc je plussoie pour l'utilisation d'xml pour le stockage des mémos.

----------

## Thesee

C'est extraordinaire!

Je suis en train de reprendre tous mes fichiers pouilleux de mon repertoire "notes" et de les mettre au format .rdb.

C'est reellement une excellente idee que ce programme. Il faudrait le proposer a d'autres que sur le forum French... enfin, c'est mon avis  :Smile: 

----------

## alctraz

 *Thesee wrote:*   

> C'est extraordinaire!
> 
> Je suis en train de reprendre tous mes fichiers pouilleux de mon repertoire "notes" et de les mettre au format .rdb.
> 
> C'est reellement une excellente idee que ce programme. Il faudrait le proposer a d'autres que sur le forum French... enfin, c'est mon avis 

 

oh, merci bcp  :Smile: 

Vraiment content que cela puisse te servir.

Maintenant que le script a été testé par qq personnes, je vais suivre ton conseil et poster qq chose sur le forum tip&tricks demain.

merci

----------

## alctraz

Slt, je cherche a collecter des mémos propres a gentoo pour créer un fichier gentoo.rdb qui viendrait avec le shell-reminder.

J'attends vos suggestions, je mettrai la liste a jour au fur et à mesure.

Voici l'état actuel du fichier:

```
[gentoo files]

   Main settings: /etc/make.conf

   World file: /var/lib/portage/world

[end-of-item]

[repair world file]

   regenworld

[end-of-item]

[emerge - dependency tree]

   emerge -vpet <package>

[end-of-item]

[genlop - building, compiling time]

   Specific package:

      genlop -t <package>

   Current merging package:

      genlop --current

[end-of-item]

[rescue]

   nano /usr/portage/sys-apps/portage/files/README.RESCUE

[end-of-item]

[emerge - clean config files - purge package]

   CONFIG_PROTECT=-* emerge <package>

[end-of-item]

[To avoid problems after gcc 3.3.5 update]

   fix_libtool_files.sh 3.3.4

[end-of-item]

[emerge - howto update]

   emerge sync

   emerge -vatDu world

   emerge -va depclean

   revdep-rebuild -va

   dispatch-conf

[end-of-item]

[ccache]

   To set a maximum cache size of 2GB

      ccache -M 2G

   Ccache statistics:

      ccache -s

[end-of-item]

[prelink]

   prelink -amfR

[end-of-item]

[esearch - find package]

   First time:     eupdatedb

   Next, to sync:  esync

   To search:      esearch [-S] <package>

[end-of-item]

[g-cpan.pl - install CPAN-provided Perl modules using Gentoo's Portage]

   g-cpan.pl <module-name>

[end-of-item]

[overlay]

   Edit /etc/make.conf:

      PORTDIR_OVERLAY="/usr/local/portage"

   Install ebuild:

      mkdir -p /usr/local/portage/<category>/<app-name>/<ebuild>

      ebuild /usr/local/portage/<category>/<app-name>/<ebuild> digest

   Emerge application:

      emerge -va <app-name>

[end-of-item]

[init scripts]

   Managing scripts:

      Add:    rc-update add <script> <runlevels>

      Remove: rc-update del <script> [runlevels]

      Show:   rc-update show [runlevels]

   Stop/start/restart script:

      /etc/init.d/<script> start,stop,restart

   Get status:

      /etc/init.d/<script> status

   Set status to 'stopped' (usefull when service has crashed):

      /etc/init.d/<script> zap

[end-of-item]

[System profile update]

   rm /etc/make.profile

   ln -s ../usr/portage/profiles/default-linux/x86/2005.0 /etc/make.profile

[end-of-item]
```

----------

## Thesee

Salut alctraz!

J'ai du récemment réinstaller ma Gentoo pour des problème de disque dur de ma partition root, et j'ai vu que ton shell-reminder n'était pas dans le tree  :Sad: . Ils n'en n'ont pas voulu? 

Enfin, tu me diras que ce n'est pas trop grave, il suffit de revenir sur le forum et de suivre la procédure mais bon, c'est plus qu'un chouette outil et plus que mériterait d'être dans le tree...

C'était "my two cents"  :Very Happy: 

----------

## boozo

'alute

 *Thesee wrote:*   

> c'est plus qu'un chouette outil et plus que mériterait d'être dans le tree... 
> 
> 

 

/me je profite de l'occas. 

je souscris avec une grande force à cette remarque... ton truc est : TERRRRRIBLE ! Je ne m'en passe plus ! 

mais au fait... comment je faisais avant... ha ben vi... je faisais pas !  :Laughing: 

Encore un grand merci   :Wink: 

----------

## fribadeau

Super,

merci

 :Very Happy: 

----------

## alctraz

Ca fait plaisir de constater que c'est utile a d'autre.

J'avais un peu mis ca de coté, je vais peut etre m'y remettre et preparer qqs rdb avec les commandes/trucs les plus communs.

Si vous avez des mémos a me soumettre, ca m'interesse :)

@Thesee: en fait j'ai jamais pris la peine de soumettre l'ebuild. Je suis pas certain que le script soit assez 'abouti' pour ca. ;)

----------

## alctraz

Slt,

Je tenais simplement a faire part du fait que j'ai installé un wiki a la place de la page qui se trouvait sur http://shell-reminder.org.

Ca serait sympa que les qqs utilisateurs du script partagent leurs tips/mémos ou bien contribuent a l'élaboration d'un fichier rdb sur un thème qui les interessent.

Creez les pages que vous souhaitez (dans le namespace 'reminders' pour les mémos/fichiers rdb).

J'espère que ca profitera a d'autres ;)

Merci

----------

## truz

 *Thesee wrote:*   

> c'est plus qu'un chouette outil et plus que mériterait d'être dans le tree...

 Entièrement d'accord, tu devrais soumettre ton ebuild, au pire tu saura pourquoi il est refusé et tu pourras l'améliorer en conséquence. C'est tellement simple et puissant comme outil que l'accoutumance survient dès qu'on lit sa description  :Very Happy: 

Juste une suggestion: et s'il y avait la possibilité d'utiliser (en lecture seulement) des rdb distants, quitte à synchroniser les fichiers de temps en temps ? Ca pourrait servir de référence "d'autorité" en quelque sorte pour certains trucs (genre ah mince je viens d'installer le dernier gcc mais là ça marche plus, j'ai vu passer un post y'a 2 semaines, mais je retrouve plus. Là on pourrait avoir les retours d'expérience des autres) voire aussi pour certaines applis (imaginez une sorte de 'man' super concis et plus concret mis à jour en permanence par l'auteur ou une communauté)...

Je m'emballe peut-être, mais c'est un super script, merci !

----------

## LaMs

Simply .... The Best Overall!!! Vraiment bien comme truc  :Smile: 

Portage serait content de l'avoir  :Very Happy: 

----------

## boozo

 *truz wrote:*   

> Juste une suggestion: et s'il y avait la possibilité d'utiliser (en lecture seulement) des rdb distants, quitte à synchroniser les fichiers de temps en temps ? Ca pourrait servir de référence "d'autorité" en quelque sorte pour certains trucs (genre ah mince je viens d'installer le dernier gcc mais là ça marche plus, j'ai vu passer un post y'a 2 semaines, mais je retrouve plus. Là on pourrait avoir les retours d'expérience des autres) voire aussi pour certaines applis (imaginez une sorte de 'man' super concis et plus concret mis à jour en permanence par l'auteur ou une communauté)...

 

 :Shocked:   whowww ! En voilà une excellente idée... sait pas trop comment le mettre en oeuvre mais c'est une question à creuser je pense car bien que le man fonctionne très bien il n'existe que peu d'évolutions le concernant   :Confused: 

Complexe certes mais l'idée est séduisante en tout cas   :Wink:   faudrait voir si des projets existent ou si d'autres on  déjà travaillé sur cette problématique... m'en vais googler tiens   :Smile: 

----------

## Grobalo

Vraiment dsl de déterrer ce sujet...

Je cherche une personne qui aurait encore une copie de ce script que j'ai perdu après un crash de mon HD. Il est impossible à retrouver sur le net.

D'avance merci.

----------

## boozo

'alute

il y a belle lurettte que alctraz n'est plus passé ici et je ne sais pas si son profil est à jour - cependant tu peux toujours essayer par pm ; d'autant plus honorable si tu comptes reprendre/étendre/maintenir le bidule  :Wink: 

En attendant pour la cause - see below -

```

#!/usr/bin/perl -w                                 

#                                                  

#    Shell-reminder is a small Perl script aimed at displaying

#    reminders in your shell when you need it.                

#    Shell-reminder-20050416 Copyright (C) 2005               

#       E. Theeten <etheeten /<At>" gmail "<D0T>" com>,                      

#       S. Wernerus <s.wernerus /<At>" gmail "<D0T>" gmail.com>.                   

#                                                             

#    This program is free software; you can redistribute it and/or

#    modify it under the terms of the GNU General Public License as

#    published by the Free Software Foundation; either version 2 of

#    the License, or (at your option) any later version.           

#                                                                  

#    This program is distributed in the hope that it will be useful,

#    but WITHOUT ANY WARRANTY; without even the implied warranty of 

#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  

#    GNU General Public License for more details.                   

#                                                                   

#    You should have received a copy of the GNU General Public License

#    along with this program; if not, write to the                    

#        Free Software Foundation, Inc.                               

#        59 Temple Place Suite 330 Boston MA  02111-1307  USA         

use strict;

use Term::ANSIColor;

use Tie::File;      

# DECLARE

# environment

my $version = '20050416';

my $prog_name = eval {my @table = split (/\//, $0); pop @table;};

my $home= $ENV{HOME} || $ENV{LOGDIR} || (getpwuid($<))[7];       

#my $pager = $ENV{PAGER} || "(less || more)";                    

# directories, files

my $config_dir = '/etc/reminder';

my $home_db_dir = $home.'/.reminder';

my $personnal_db = $home_db_dir.'/reminders.rdb';

my @config_files = ($home_db_dir.'/reminder.conf', $config_dir.'/reminder.conf');

my @db_dirs = ('/etc/reminder', $home_db_dir);                                   

my @db_files;                                                                    

my @user_db_selection;                                                           

my $db_file_to_edit = '';                                                        

# parse vars

my ($index_found, $version_found, $help_found, $file_found, $add_reminder_found);

my %options = ( 'OR_SEARCH'       => '0',                                        

                'HEADER_SEARCH'   => '0',                                        

                'PERSO_SEARCH'    => '0',                                        

                'DB_DIRS'         => '' ,                                        

                'VERBOSE'         => '0',                                        

                'DISP_COLORS'     => '1',                                        

                'EDITOR'          => '' );                                       

my @regex;                                                                       

my %colors = ( 'blue'  => 'bold blue',

               'green' => 'bold green',

               'red'   => 'bold red' );

# SUB

sub help () {

    # display help information and exit

    print                              

    "Usage: ", colorise("$prog_name ", $colors{'blue'}),

    "[", colorise("options", $colors{'green'}), "] [",  

    colorise("-f ", $colors{'green'}), "database_file] [",

    colorise("words_to_match", $colors{'green'}), "]\n\n",

    colorise("Options:\n", $colors{'green'}),

    colorise(" none  ", $colors{'green'}),   

    "display a list of available database files for selection\n",

    colorise("  -h   ", $colors{'green'}),                       

    "display this help message\n",                               

    colorise("  -v   ", $colors{'green'}),                       

    "display the version\n",                                     

    colorise("  -H   ", $colors{'green'}),                       

    "perform a header search only\n",                            

    colorise("  -F   ", $colors{'green'}),                       

    "perform a full search, namely headers+content\n",           

    colorise("  -a   ", $colors{'green'}),                       

    "AND search\n",                                              

    colorise("  -o   ", $colors{'green'}),                       

    "OR search\n",                                               

    colorise("  -p   ", $colors{'green'}),                       

    "performs a search in the personal db only\n",               

    colorise("  -c   ", $colors{'green'}),                       

    "performs a complete search (all available db's)\n",         

    colorise("  -k   ", $colors{'green'}),                       

    "use colors in output\n",                                    

    colorise("  -n   ", $colors{'green'}),                       

    "don't use colors in output\n",                              

    colorise("  -i   ", $colors{'green'}),                       

    "display an index of all the headers\n",                     

    colorise("  -A   ", $colors{'green'}),                       

    "[database_file] Add a reminder using the editor defined by \$EDITOR\n",

    colorise("\nNote:\n", $colors{'green'}),

    "Notice that the default behaviour is configurable in the config file reminder.conf\n";

    exit 0;                                                                                

}                                                                                          

sub version () {

    # display version information and exit

    print "Shell-reminder-$version Copyright (C) 2005, E. Theeten, S. Wernerus.\n",

    "Distributed under the GPL v2.\n";                                             

    exit 0;                                                                        

}                                                                                  

sub colorise {

    # in: a string we want to print

    # out: this string colorised or unmodified, depending on user's choice

    my $string = shift;                                                   

    my $color = shift;                                                    

    if ($options{'DISP_COLORS'}) {

        return colored($string, $color);

    } else {                            

        return ($string || 0);          

    }                                   

}                                       

#my $colorise;

#if ($options{'DISP_COLORS'}) { 

#    $colorise = sub {return (colored($_[0], $_[1]) || $_[0] || 0)};

#} else {                                                           

#    $colorise = sub {return ($_[0] || 0)};                         

#}                                                                  

#sub colorise {

#    return &$colorise($_[0], $_[1]);

#}                                   

sub open_file {

    # in: reference to a file handle

    # check if the specified file is readable and a text file, then open it

    my ($fh, $file) = @_;                                                  

    unless (-r $file) {                                                    

        print "Could not read $file... \n"; return 0;                      

    }                                                                      

    unless (-T $file) {                                                    

        print "Not a text file: $file... \n"; return 0;                    

    }                                                                      

    unless (open($$fh, "< $file")) {                                       

        print "Could not open $file: $!\n"; return 0;                      

    }                                                                      

    return 1;                                                              

}                                                                          

sub ls_db_files {

    # in: list of directories

    # out: the @table of .rdb files contained in the passed list of directories

    my @dir_list = @_;                                                         

    my @returned_list;                                                         

  DIR:                                                                         

    foreach my $dir (@dir_list) {                                              

        #unless (opendir(DH, $dir)) {print "Not fatal: could not open directory $dir: $!\n"; next DIR};

        unless (opendir(DH, $dir)) {                                                                   

            next DIR;                                                                                  

        }                                                                                              

        my @ls = readdir DH;                                                                           

        closedir DH or print "Not fatal: could not close directory $dir: $!\n";                        

        @ls = grep(/\.rdb$/, @ls);                                                                     

        map {$_ = $dir.'/'.$_} @ls;                                                                    

        push @returned_list, @ls;                                                                      

    }                                                                                                  

    die "No database found ! Please supply at least one database..." unless (@returned_list);          

    return @returned_list;                                                                             

}                                                                                                      

sub print_db_list() {

    # print a list of the available database files for selection and exit

    # print help info                                                    

    print 'To get help: ', colorise($prog_name, $colors{'blue'}),        

    colorise(' -h', $colors{'green'}), ' or ',                           

    colorise($prog_name, $colors{'blue'}),                               

    colorise(' remind-me', $colors{'green'}), "\n\n",                    

    'Available database files to search in:', "\n";                      

    #colorise('Available database files to search in:', $colors{'green'}), "\n";

    # print file list

    my $i = 1;       

    foreach (ls_db_files(@db_dirs)) {

        print colorise("$i. $_", $colors{'green'}), "\n";

        $i++;                                            

    }                                                    

    # print file list usage

    print "\nUsage: ", colorise("$prog_name ", $colors{'blue'}),

    colorise(":1-3,5,7 words_to_match\n", $colors{'green'});    

    exit 0;                                                     

}                                                               

sub add_template {

    unless (-e $db_file_to_edit) {

        print "The file $db_file_to_edit does not exist...\n";

        #"Use 'remind-me -A' to edit your personnal data base $personnal_db\n";

        exit 0;                                                                

    }                                                                          

    my @lines;                                                                 

    tie @lines, 'Tie::File', $db_file_to_edit or die "Could not open $db_file_to_edit: $!\n";

    unshift @lines, "[  ]\n\n[end-of-item]\n\n";                                             

    untie @lines;                                                                            

}                                                                                            

sub add_reminder {

    if ($options{'EDITOR'}  && -e $options{'EDITOR'}) {

        add_template;                                  

        exec "$options{'EDITOR'} $db_file_to_edit";    

    } elsif ($ENV{'EDITOR'}  && -e $ENV{'EDITOR'}) {   

        add_template;                                  

        exec "$ENV{'EDITOR'} $db_file_to_edit";        

    } else {                                           

        die 'Please specify an editor either through the $EDITOR environment variable ',

        "or in the config file\n";                                                      

    }                                                                                   

}                                                                                       

sub parse_config {

    # parse the right config file

    my $FH;

    my $config_file;

    #    foreach $config_file (@config_files) {

    #   if (-e $config_file) {print "$config_file\n"; last}

    #    }                                                 

    # use the config file from home directory if available 

    foreach (@config_files) {                              

        $config_file = $_;                                 

        if (-e $config_file) {last}                        

    }                                                      

    unless (open_file(\$FH, $config_file)) {               

        print "Using default config.\n";                   

        return 0;                                          

    }                                                      

    while (<$FH>) {                                        

        my $option = $_;                                   

        #if ($option =~ /(\w*)\s*=\s*"(.*?)"/ && $` !~ /#/) {

        if ($option =~ /^\s*(\w*)\s*=\s*"(.*?)"/) {          

            $options{$1} = $2;                               

        }                                                    

    }                                                        

    close($FH) || print "Could not close $config_file\n";    

    if ($options{'DB_DIRS'}) {                               

        my @splited = split (/\s+/, $options{'DB_DIRS'});    

        push @db_dirs, @splited;                             

    }                                                        

    # uncomment for debugging the regex...                   

    #while ( my ($key, $value) = each %options) {            

    #print "$key = $value\n";                                

    #}                                                       

    #exit 0;                                                 

}                                                            

sub parse_arg ($) {

    # parse command line arguments

    my $arg = $_[0];              

    if ($arg =~ /^-(.*)/) {       

        $arg = $1;                

        while ($arg) {            

            my $opt = chop($arg); 

          OPT: {                  

                $help_found = 1, last OPT if ($opt eq "h");

                $version_found = 1, last OPT if ($opt eq "v");

                $index_found = 1, last OPT if ($opt eq "i");  

                $options{'HEADER_SEARCH'} = 1, last OPT if ($opt eq "H");

                $options{'HEADER_SEARCH'} = 0, last OPT if ($opt eq "F");

                $options{'OR_SEARCH'} = 1, last OPT if ($opt eq "o");    

                $options{'OR_SEARCH'} = 0, last OPT if ($opt eq "a");    

                $options{'PERSO_SEARCH'} = 1, last OPT if ($opt eq "p"); 

                $options{'PERSO_SEARCH'} = 0, last OPT if ($opt eq "c"); 

                $options{'DISP_COLORS'} = 1, last OPT if ($opt eq "k");  

                $options{'DISP_COLORS'} = 0, last OPT if ($opt eq "n");  

                if ($opt eq "f") {                                       

                    if (!$ARGV[0]) {                                     

                        print colorise("No database file specified!", $colors{'red'}), "\n";

                        exit -1;                                                            

                    }                                                                       

                    if (!-r $ARGV[0]) {                                                     

                        print colorise("Database file ".$ARGV[0]." not readable or not found.",

                                       $colors{'red'}), "\n";                                  

                        exit -1;                                                               

                    }                                                                          

                    #print "Using database file $ARGV[0] \n";                                  

                    #unshift @db_files, shift @ARGV;                                           

                    #@db_files = shift @ARGV;                                                  

                    $file_found = shift @ARGV;                                                 

                    last OPT;                                                                  

                }                                                                              

                if ($opt eq "A") {                                                             

                    if ($ARGV[0]) {                                                            

                        $db_file_to_edit = $ARGV[0];                                           

                    } else {                                                                   

                        $db_file_to_edit = $personnal_db;                                      

                    }                                                                          

                    $add_reminder_found = 1;                                                   

                    last OPT;                                                                  

                }                                                                              

                print colorise("Unknown option: -$opt", $colors{'red'}), "\n";                 

                help ();                                                                       

            }                                                                                  

        }                                                                                      

    } elsif ($arg =~ /^:(.*)/) {                                                               

        my @splitted_arg = split (/,/, $1);                                                    

        foreach (@splitted_arg) {                                                              

            if (/^(\d+)(?:-(\d+))?$/) {                                                        

                push @user_db_selection, $1..($2 || $1);                                       

            } else {                                                                           

                print colorise("Please supply a well formed request!\n\n", $colors{'red'});    

                print_db_list();                                                               

            }                                                                                  

        }                                                                                      

        # grep only non-repeted items                                                          

        my %seen;                                                                              

        @user_db_selection = grep {!$seen{$_}++} @user_db_selection;                           

        return 1;                                                                              

    } else {                                                                                   

        push @regex, $arg;                                                                     

        return 1;                                                                              

    }                                                                                          

}                                                                                              

# MAIN

# parse config file

parse_config;      

# display list of available db files if no argument at all

print_db_list() if (!$ARGV[0]);                           

# then, parse arguments

parse_arg(shift @ARGV) while ($ARGV[0]);

# display help/version if help/version requested

help() if ($help_found);                        

version() if ($version_found);                  

# add a reminder ?

add_reminder if ($add_reminder_found);

# display help if no patern to match and no index requested

help() if (!$regex[0] && !$index_found);                   

# take only the files corresponding to the user selection

DB_FILES: {                                              

    @db_files = ($home_db_dir.'/reminders.rdb'), last DB_FILES if ($options{'PERSO_SEARCH'});

    @db_files = $file_found, last DB_FILES if ($file_found);                                 

    if (@user_db_selection) {                                                                

        my @all_dbs = ls_db_files(@db_dirs);                                                 

        foreach (@user_db_selection) {                                                       

            if (($_-1) <= $#all_dbs) {                                                       

                push @db_files, $all_dbs[$_-1];                                              

            } else {                                                                         

                print colorise("Value out of range!\n", $colors{'red'});                     

                print_db_list();                                                             

            }                                                                                

        }                                                                                    

        last DB_FILES;                                                                       

    }                                                                                        

    push @db_files, ls_db_files(@db_dirs);                                                   

}                                                                                            

# modify regex table depending on the header/full search type

REGEX: {                                                     

    # Index                                                  

    if ($index_found) {                                      

        print colorise("Index:\n", $colors{'green'}); last REGEX;

    }                                                            

    # Header search...                                           

    if ($options{'HEADER_SEARCH'}) {                             

        print colorise("Header search:", $colors{'green'}), "\n";

        #map {$_ = "^\\\[.*$_.*\\\]"} @regex;                    

        map {$_ = qr/^\[.*$_.*\]/i} @regex;                      

        last REGEX;                                              

    }                                                            

    # Full search...                                             

    print colorise("Full search:", $colors{'green'}), "\n";      

    map {$_ = qr/$_/i} @regex;                                   

}                                                                

# compile frequently used regexes

my $header_regex = qr/^\[.*\]$/;     # used to match headers with //m

my $not_header_regex = qr/^[^\[].*/; # used to match item content lines

# patern for OR search                                                 

my $string = join('|', @regex);                                        

my $patern = qr/$string/;                                              

# MAIN LOOPS

$/ = "[end-of-item]";           # read file by item

my $FH;                                            

FILE:                                              

foreach my $db_file (@db_files) {                  

    open_file(\$FH, $db_file) || next FILE;        

    print colorise("\n$db_file\n", $colors{'green'}) if ($options{'VERBOSE'});

  LOOP:                                                                       

    while (<$FH>) {                                                           

        chomp;                                                                

        my $item = $_;                                                        

        $item =~ s/\s*//;       # remove the leading spaces                   

        if ($index_found) {

            # print headers only...

            #if ($item =~ /(^\[.*\]$)/m) {

            if ($item =~ /($header_regex)/m) {

                print colorise("$1\n", $colors{'blue'});

            }

            next LOOP;

        }

        if (!$options{'OR_SEARCH'}) {

            # AND search...

            foreach $patern (@regex) {

                #if ($item =~ /$patern/i) {

                if ($item =~ /$patern/) {

                    # patern in red in item content

                    $item =~ s/($not_header_regex)($patern)/$1.colorise($2, $colors{'red'})/egm;

                } else {

                    next LOOP;

                }

            }

            # header in blue

            $item =~ s/($header_regex)/colorise($1, $colors{'blue'})/em;

            print "\n$item";

        } else {

            # OR search...

            #if ($item =~ /$patern/i) {

            if ($item =~ /$patern/) {

                # patern in red in item content

                $item =~ s/($not_header_regex)($patern)/$1.colorise($2, $colors{'red'})/egm;

                # header in blue

                $item =~ s/($header_regex)/colorise($1, $colors{'blue'})/em;

                print "\n$item";

            }

        }

    }

    close($FH) or die "Could not close $db_file: $!";

}

undef $/;

```

----------

## Grobalo

Merci infiniment boozo!

----------

