Suite à un de mes vieux billets sur un topic très sympa (
./viewtopic.php?pid=3758609#p3758609 ) j'ai amélioré la script de todoList...
Voici la version avec
YAD (bien plus puissant que zenity) et Zenity :
#!/bin/bash
# Créé par Nordinatueur
#
rouge='\e[31m'; vert='\e[32m'; jaune='\e[33m'; bleu='\e[34m'; rose='\e[35m'; cyan='\e[36m'; gris='\e[37m'; NC='\e[0m';
todoDir="${HOME}";
todoList="${todoDir}/.todo.list";
cd "${todoDir}";
#cp "${todoList}" "${todoList}.$(date '+%y.+%j')";
Erreur ()
{
echo "${1}" >&2;
}
Init ()
{
if [[ ! -e "${todoList}" ]]; then
echo "Ligne 1" > "${todoList}";
else
Erreur "${todoList} existe...";
fi;
}
Init;
Usage ()
{
sed -nr 's/[[:space:]]+(-[^\)]*)\) #/\t\1\t/pg' ${0};
#sed -rn 's/[[:space:]]+(-[^\)]*)\)#/\t\t/pg' ${0};
exit;
}
SupprimerLigne ()
{
i=${1:-$};
sed -i "${1}d" "${todoList}";
}
AjouterLigne ()
{
i=$((${1}-1));
ligne="${2:-Ligne ${1}}";
if [ ${i} -eq 0 ]; then
sed -i "1i${2}" "${todoList}";
else
sed -i "${i}a${2}" "${todoList}";
fi;
}
DeplacerLigne ()
{
ligne=$(sed -n "${1}p" "${todoList}" );
if [ ${1} -lt ${2} ]; then
sed -i "${1}d;${2}a${ligne}" "${todoList}";
elif [ ${1} -gt ${2} ]; then
sed -i "${1}d;${2}i${ligne}" "${todoList}";
fi;
}
ModifierLigne ()
{
i=${1:-1};
ligne=${2:-Ligne ${i}};
sed -i "${i}c${ligne}" "${todoList}";
}
EchangerLigne ()
{
i=${1:-1}; j=${2:-2};
ligne1=$(sed -n "${i}p" "${todoList}" );
ligne2=$(sed -n "${j}p" "${todoList}" );
Erreur "lignes ${i} et ${j}";
Erreur "lignes ${ligne1} et ${ligne2}";
ModifierLigne "${i}" "${ligne1}";
ModifierLigne "${j}" "${ligne2}";
}
if which yad; then
GUI ()
{
while true; do
choix="ajouter une tâche"\!"supprimer une tâche"\!"deplacer une tâche"\!"modifier une tâche"\!"echanger des tâches"\!"afficher/éditer les tâches";
action=$( yad --on-top --center --title="Gui ToDoList" --text="" --form --field="":CB "${choix}" ) || break;
continuer=true;
maxLigne=$(grep -v '^ *$' "${todoList}" | wc -l );
listeNombresYad=1;
for i in $(seq 2 ${maxLigne} ); do
listeNombresYad=${listeNombresYad}\!${i};
done;
listeLignesYad="$( cat -n "${todoList}" | sed -e 's/^[[:space:]]*//g;:boucle;N;$!b boucle;s/\n/\!/g;s/[[:space:]]\+/ /g;s/! /!/g' )";
case ${action,,} in
ajouter*)
((maxLigne++)); listeNombresYad=${listeNombresYad}\!${maxLigne};
retourYad=$( yad --on-top --center --title="Ajout" --text="Ajout" --form --field=Ligne:CB "${listeNombresYad}" --field="Tâche :" "" ) || continue;
ligne=${retourYad%%|*};
contenu="${retourYad%|}"; contenu="${contenu#*|}";
echo "${ligne} - ${contenu}" > error.log
AjouterLigne ${ligne} "${contenu}";
;;
supprimer*)
retourYad=$( yad --on-top --center --title="Suppression" --text="Suppression" --form --field=Ligne:CB "${listeLignesYad}" ) || continue;
ligne=${retourYad%%[^0-9]*};
SupprimerLigne ${ligne};
;;
deplacer*)
retourYad=$( yad --on-top --center --title="Déplacement" --text="Déplacement" --form --field=de:CB "${listeLignesYad}" --field="à la ligne ":CB "${listeNombresYad}" ) || continue;
Erreur "retour:${retourYad}";
debut=${retourYad%%|*}; Ndebut=${debut%%[^0-9]*};
fin=${retourYad%|}; fin=${fin#*|}; Nfin=${fin%%[^0-9]*};
Erreur "${Ndebut} et ${Nfin}";
DeplacerLigne ${Ndebut} ${Nfin};
;;
modifier*)
retourYad=$( yad --on-top --center --title="Modification" --text="Modification" --form --field=Ligne:CB "${listeLignesYad}" --field="Tâche :" "..." ) || continue;
ligne=${retourYad%%[^0-9]*};
contenu="${retourYad%|}"; contenu="${contenu#*|}";
ModifierLigne ${ligne} "${contenu}";
;;
echanger*)
notify-send "${0##*/}" "L'action ${action} n'est pas valide.";
continue;
retourYad=$( yad --on-top --center --title="Échange" --text="Échange" --form --field=de:CB "${listeLignesYad}" --field=à:CB "${listeLignesYad}" ) || continue;
debut=${retourYad%%|*}; Ndebut=${debut%%[^0-9]*};
fin=${retourYad%|}; fin=${fin#*|}; Nfin=${fin%%[^0-9]*};
Erreur "${Ndebut} et ${Nfin}";
EchangerLigne ${Ndebut} ${Nfin};
;;
afficher*)
tmpFile="/tmp/.${0##*/}.tmp";
>${tmpFile} yad --on-top --center --title="Afficher" --text-info --editable --show-uri --filename="${todoList}" --height="350" --width="300" && cp -f "${tmpFile}" "${todoList}" || continue;
echo >> "${todoList}";
;;
*)
notify-send "${0##*/}" "L'action ${action} n'est pas valide.";
;;
esac;
${continuer} || break;
done;
}
elif which zenity; then
GUI ()
{
while true; do
choix="ajouter une tâche
supprimer une tâche
deplacer une tâche
modifier une tâche
echanger des tâches
afficher/éditer les tâches
";
action=$( zenity --list --title="Gui ToDoList" --column="Action" <<<"${choix}" ) || break;
continuer=true;
maxLigne=$(grep -v '^ *$' "${todoList}" | wc -l );
case ${action,,} in
ajouter*)
((maxLigne++));
ligne=$( { cat -n "${todoList}"; printf "\t${maxLigne} Fin"; } | zenity --title="Ajout" --text="Quelle position ?" --list --column="Ligne ?" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
contenu=$( zenity --title="Ajout" --text="Ajout" --entry --entry-text="Tâche n°${ligne}" ) || continue;
echo "${ligne} - ${contenu}" > error.log
AjouterLigne ${ligne} "${contenu}";
;;
supprimer*)
ligne=$( cat -n "${todoList}" | zenity --title="Supprimer" --text="Quelle ligne ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue ;
SupprimerLigne ${ligne};
;;
deplacer*)
debut=$( cat -n "${todoList}" | zenity --title="Déplacer" --text="Quelle ligne ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
fin=$( cat -n "${todoList}" | zenity --title="Déplacer" --text="Vers quelle position ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
Ndebut=${debut%%[^0-9]*};
Nfin=${fin%%[^0-9]*};
DeplacerLigne ${Ndebut} ${Nfin};
;;
modifier*)
ligne=$( cat -n "${todoList}" | zenity --title="Déplacer" --text="Quelle ligne ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
contenu=$(sed -n "${ligne}p" ${todoList} );
contenu=$( zenity --title="Ajout" --text="Ajout" --entry --entry-text="${contenu}" ) || continue;
ModifierLigne ${ligne} "${contenu}";
;;
echanger*)
notify-send "${0##*/}" "L'action ${action} n'est pas valide.";
continue;
debut=$( cat -n "${todoList}" | zenity --title="Déplacer" --text="Quelle ligne ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
fin=$( cat -n "${todoList}" | zenity --title="Déplacer" --text="Vers quelle position ?" --list --column="Lignes" | sed -n 's/^\(\t*\| *\)\([0-9]\+\).*$/\2/gp' ) || continue;
Erreur "${Ndebut} et ${Nfin}";
EchangerLigne ${Ndebut} ${Nfin};
;;
afficher*)
tmpFile="/tmp/.${0##*/}.tmp";
>${tmpFile} zenity --title="Afficher" --text-info --editable --filename="${todoList}" --height="350" --width="300" && cp -f "${tmpFile}" "${todoList}" || continue;
echo >> "${todoList}";
;;
*)
notify-send "${0##*/}" "L'action ${action} n'est pas valide.";
;;
esac;
${continuer} || break;
done;
}
else
GUI()
{
notify-send "${0##*/}" "Erreut : ni Yad ni Zenity n'est installé.";
}
fi;
if [ ! -e "${todoList}" ]; then
exit ;
fi;
while (( $# )); do
case ${1} in
-h) # Affiche cette aide
Usage ;;
-e) # Éditer ce script
vim ${0}; exit;;
-v) # Édite e script avec vim
vim "${todoList}"; exit;;
-a) # <ligne> <contenu> : Ajouter une ligne avec du contenu
shift;
AjouterLigne "${1}" "${2}"; shift;
;;
-s) # <ligne> : Supprimer une ligne
shift;
SupprimerLigne "${1}";
;;
-m) # <ligne> <contenu> : Modifier une ligne
shift;
ModifierLigne "${1}" "${2}"; shift;
;;
-d) # <ligne 1> <ligne 2> : Déplacer les lignes
shift;
DeplacerLigne "${1}" "${2}"; shift;
;;
#-x) # <ligne1> <ligne2> : Échanger les lignes en argument
#shift;
#EchangerLigne "${1}" "${2}"; shift;
#;;
-g) # Interface graphique avec YAD ou Zenity
shift;
Erreur ${1};
GUI ${1};
;;
-*) Erreur "«${1}» option inconnue" >&2;;
*)
echo ;;
esac;
shift;
done;
sed -i '/^ *$/d' "${todoList}";
#grep -v '^ *$' "${todoList}" | cat -n
cat -b "${todoList}";
Si vous préférez la ligne de commande, le script gère ça aussi !
En plus, il y a ce script pipe pour OpenBox qui va bien avec :
#!/bin/bash
#Par Nordinatueur
#Liste les fichiers du dossier ~/.todo
dossierTodo="${HOME}/.todo";
todoList="${HOME}/.todo.list";
scriptTodo="${HOME}/Public/scripts/todolist.cli.sh ";
Init ()
{
cat <<EOF
<item label=". Gui ToDo List .">
<action name="Execute">
<execute> ${HOME}/Public/scripts/todolist.cli.sh -g </execute>
</action>
</item>
EOF
}
#LigneExecute <nom> <commande>
LigneExecute ()
{
cat <<EOF
<item label="${1}">
<action name="Execute">
<execute>
${2}
</execute>
</action>
</item>
EOF
}
#Crée un pipemenu
#LigneMenu <nom> <commande>
LigneMenu ()
{
cat <<EOF
<menu execute="${2}" id="todo-${1// /-}-${2##* }" label="${1}" />
EOF
}
# scripTodo -a <ligne> <contenu>
echo '<openbox_pipe_menu>';
case ${1} in
[0-9])
LigneExecute "Ajouter à cet endroit (${1})" "${0} ajouter ${1}";
LigneExecute "Supprimer cette tâche" "${scriptTodo} -s ${1}";
LigneMenu "Déplacer cette tâche vers ..." "${0} deplacer ${1}";
LigneExecute "Modifier cette tâche" "${0} modifier ${1} '${2}'";
#LigneMenu "Échanger cette tâche avec ..." "${0} echanger ${1}";
;;
ajouter)
shift;
texte="$( yad --center --on-top --entry )" &&\
${scriptTodo} -a ${1} "${texte}";
;;
modifier)
shift;
texte="$( yad --center --on-top --entry --entry-text="${2}" )" &&\
${scriptTodo} -m ${1} "${texte}";
;;
deplacer)
shift;
i=1;
while read ligne ; do
LigneExecute "${i} - ${ligne}" "${scriptTodo} -d ${1} ${i}";
((i++));
done < "${todoList}";
;;
echanger)
shift;
i=1;
while read ligne ; do
LigneExecute "${i} - ${ligne}" "${scriptTodo} -x ${1} ${i}";
((i++));
done < "${todoList}";
;;
*)
Init;
i=1;
while read ligne ; do
#LigneMenu "${ligne}" "${0} ${i} '${ligne}'";
LigneMenu "${ligne}" "${0} ${i}";
((i++));
done < "${todoList}";
LigneExecute "Ajouter à cet endroit (${i})" "${0} ajouter ${i}";
esac;
echo "</openbox_pipe_menu>";
N'hésitez pas à me faire part de vos avis.
Edit : Autre chose !
Le conky devient simplement :
${if_existing /home/nordine/.todo.list }${font size=14}ToDo List (${execpi 5 wc -l < /home/nordine/.todo.list })${font}
${offset 1}${font size=10}${color0}${exec cat -b /home/nordine/.todo.list }${color}${font}${endif}
où vous devez remplacer « /home/nordine » par votre dossier utilisateur.