Как я могу использовать уведомление - отправляют команду в сочетании с календарем Calcurse?

Я использую календарь и приложение планирования calcurse. Это - прекрасная программа командной строки.

Например, с calcurse -a можно отобразить события в течение дня.

Как я могу отправить эту информацию в notify-send, показать уведомление на рабочем столе?

$ calcurse -a | notify-send

не будет работать...

5
задан 29 December 2015 в 10:53

3 ответа

О Calcurse

Как часто, возвращаясь к (очень) основному, но тем не менее полная функциональность чувствует себя странной, но в некотором роде обновляющей. Не уверенный, если я использовал бы его все же.

Хотя нижняя часть окна Calcurse предлагает опцию передать по каналу, и упоминания веб-сайта Calcurse "настраиваемая пользователем система уведомления", я не мог найти способ использовать его для автоматических запланированных уведомлений обо всех событиях.

enter image description here

В то же время: действительно такая функциональность напоминания была бы полезным дополнением. Сценарий ниже может использоваться в качестве разъема - в для calcurse показать напоминания. Я надеюсь, что Вы находите это полезным.

Это чрезвычайно просто в использовании; просто запустите скрипт в фоновом режиме. Все, что это делает, проверить события на сегодняшний день (обновленный дважды в минуту) и выполнить уведомления в произвольный момент времени перед истечением.

Что необходимо для создания напоминаний

Вывод команды:

calcurse -a 

похож:

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

Сразу происходит, что запланированные объекты запускаются с "-", в то время как объекты для весь день запускаются с "*". То, что мы должны сделать, создают две группы (списки) объектов:

  • запланированные
  • незапланированные

Из первой категории мы должны проанализировать время, преобразовать ее в формат, с которым мы можем вычислить, таким образом, мы можем показать напоминание в n- за минуты до истечения.

Впоследствии, мы должны "следить за часами", сравнить время набора (события) к текущему времени. Если отрезок времени между этими двумя вводит время предупреждения набора, просто покажите уведомление.
Наконец, для предотвращения повторенного уведомления мы должны добавить объект к "сделанному" списку.

Кроме того, сценарий очищает "сделанный" список; если объект больше не происходит в сегодняшних объектах (или если Вы удалили его или день, переключенный во время Вашей сессии), объекты удалены автоматически.

Результат

На запуске (входят в систему)

  • сценарий показывает все сегодняшние объекты по очереди:

    enter image description here enter image description here

На произвольном моменте времени перед истечением (в этом случае 15 минут)

  • сценарии напоминают Вам в уведомлении:

    enter image description here

Сценарий

#!/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)

Как использовать

  • Скопируйте сценарий в пустой файл, сохраните его как run_ccursereminders.py
  • Тестовый прогон это со временем требуется быть предупрежденными (перед временем истечения срока в минутах) как аргумент. Пример, для выполнения напоминаний за 30 минут до назначения:

    python3 /path/to/run_ccursereminders.py 30
    
  • Если это работает, как Вы желаете, добавьте его для Запущения Приложений: выберите Dash> Startup Applications> Add. Добавьте команду

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

    где последнее 30 число минут для предупреждения Вас, прежде чем назначение истечет

2
ответ дан 23 November 2019 в 10:27

Я смог сделать его работающий с заменой команды:

notify-send "calcurse notification header" "$(calcurse -n)"
1
ответ дан 23 November 2019 в 10:27

Я не, это старо, но если кому-либо все еще интересно, следующая работа настроек для меня в моем ~/.calcurse/conf файл:

notification.command=calcurse --next | xargs -0 notify-send "Appointment"
daemon.enable=yes
notification.warning=300
0
ответ дан 23 November 2019 в 10:27

Другие вопросы по тегам:

Похожие вопросы: