web-dev-qa-db-fra.com

Comment utiliser la commande notify-send avec le calendrier Calcurse?

J'utilise le calendrier et l'application de planification calcurse. C'est un bon programme en ligne de commande.

Par exemple, avec calcurse -a, vous pouvez afficher les événements de la journée.

Comment je peux envoyer cette information à notify-send, pour afficher une notification sur le bureau?

$ calcurse -a | notify-send

ne fonctionnera pas ...

5
Dino

À propos de Calcurse

Comme souvent, le retour à une fonctionnalité (très) basique, mais néanmoins complète, semble bizarre, mais rafraîchissant. Je ne sais pas si je l'utiliserais bien.

Bien que le bas de la fenêtre de Calcurse suggère une option pour pipe , et site Web de Calcurse mentionne " système de notification configurable par l’utilisateur "Je n’ai pas trouvé le moyen de l’utiliser pour les notifications automatiques planifiées de all événements.

enter image description here

Dans le même temps: une telle fonctionnalité de rappel serait un ajout utile. Le script ci-dessous peut être utilisé comme plug-in pour calcurse afin d'afficher des rappels. J'espère que tu trouves cela utile.

Il est extrêmement facile à utiliser; exécutez simplement le script en arrière-plan. Tout ce qu'il fait est de vérifier les événements d'aujourd'hui (mis à jour deux fois par minute) et d'exécuter les notifications à un moment quelconque avant l'expiration.

Ce qui est nécessaire pour créer des rappels

Le résultat de la commande:

calcurse -a 

ressemble à:

12/29/15:
 * Free today!
 - 12:00 -> ..:..
    See if this script does its job :)

Il apparaît immédiatement que les éléments planifiés commencent par un "-", tandis que les éléments pour toute la journée commence par "*". Ce que nous devons faire, c'est créer deux groupes (listes) d'éléments:

  • les programmés
  • les imprévus

Dans la première catégorie, nous devons analyser le temps, le convertir en un format avec lequel nous pouvons calculer, afin que nous puissions afficher un rappel à n- minutes avant l'expiration.

Par la suite, nous devons "garder un œil sur l'horloge" pour comparer l'heure réglée (de l'événement) à l'heure actuelle. Si l'intervalle de temps entre les deux entre l'heure d'avertissement définie, affichez simplement la notification.
Enfin, pour éviter les notifications répétées, nous devons ajouter l’élément à une liste "terminé".

En outre, le script nettoie la liste "terminé"; si un élément ne figure plus dans les éléments du jour (que vous l'ayez supprimé ou le jour changé au cours de votre session), les éléments sont automatiquement supprimés.

Le résultat

Au démarrage (se connecter)

  • le script affiche tous les éléments du jour, successivement:

    enter image description hereenter image description here

À un moment quelconque avant l'expiration (dans ce cas, 15 minutes)

  • les scripts vous rappelle dans une notification:

    enter image description here

Le scénario

#!/usr/bin/env python3
import subprocess
import time
import sys

warn = int(sys.argv[1])

def get(command):
    return subprocess.check_output(command).decode("utf-8")

def convert(t):
    # convert set time into a calculate- able time
    return [int(n) for n in t.split(":")]

def calc_diff(t_curr, t_event):
    # calculate time span
    diff_hr = (t_event[0] - t_curr[0])*60
    diff_m = t_event[1] - t_curr[1]
    return diff_hr + diff_m

def cleanup(done, newlist):
    # clean up "done" -lists
    for item in done:
        if not item in newlist:
            done.remove(item)
    return done

def show_time(event, s = ""):
    # show scheduled event
    hrs = str(event[0][0]); mnts = str(event[0][1])
    mnts = "0"+mnts if len(mnts) != 2 else mnts
    subprocess.call(["notify-send", s, "At "+hrs+":"+mnts+" - "+event[1]])

startups = []; times = []

while True:
    currtime = convert(time.strftime("%H:%M"))
    events = [l.strip() for l in get(["calcurse", "-a"]).splitlines()][1:]
    # arrange event data:
    groups = []; sub = []
    for l in events:
        if l.startswith("* "):
            groups.append([l.replace("* ", "")])
        Elif l.startswith("- "):
            sub.append(convert(l.split("->")[0].replace("-", "").strip()))
        else:
            groups.append(sub+[l])
            sub = []
    # run notifications
    for item in groups:
        # on startup:
        if not item in startups:
            # all- day events
            if len(item) == 1:
                subprocess.call(["notify-send", "Today - "+item[0]])
            # time- specific events
            Elif len(item) == 2:
                show_time(item, "Appointment")
            startups.append(item)
        # as a reminder:
        if all([len(item) == 2, not item in times]):
            span = calc_diff(currtime, item[0])
            if span <= warn:
                show_time(item, "[Reminder]")
                times.append(item)     
    # clean up events
    startups = cleanup(startups, groups); times = cleanup(times, groups)
    time.sleep(30)

Comment utiliser

  • Copiez le script dans un fichier vide, enregistrez-le sous le nom run_ccursereminders.py
  • Testez-le avec le temps que vous souhaitez être averti (avant l'heure d'expiration, en minutes) comme argument. Un exemple, pour exécuter des rappels 30 minutes avant votre rendez-vous:

    python3 /path/to/run_ccursereminders.py 30
    
  • Si cela fonctionne comme vous le souhaitez, ajoutez-le aux applications de démarrage: choisissez Tableau de bord> Applications de démarrage> Ajouter. Ajouter la commande

    /bin/bash -c "sleep 30 && python3 /path/to/run_ccursereminders.py 30"
    

    où le dernier 30 est le nombre de minutes pour vous avertir avant l'expiration d'un rendez-vous

2
Jacob Vlijm

J'ai pu le faire fonctionner avec la substitution de commande:

notify-send "calcurse notification header" "$(calcurse -n)"
1
user2344634

Je non, c'est vieux, mais si quelqu'un est toujours intéressé, les paramètres suivants fonctionnent pour moi dans mon fichier ~/.calcurse/conf:

notification.command=calcurse --next | xargs -0 notify-send "Appointment"
daemon.enable=yes
notification.warning=300
0
coachshea