Я использую календарь и приложение планирования calcurse. Это - прекрасная программа командной строки.
Например, с calcurse -a
можно отобразить события в течение дня.
Как я могу отправить эту информацию в notify-send
, показать уведомление на рабочем столе?
$ calcurse -a | notify-send
не будет работать...
Как часто, возвращаясь к (очень) основному, но тем не менее полная функциональность чувствует себя странной, но в некотором роде обновляющей. Не уверенный, если я использовал бы его все же.
Хотя нижняя часть окна Calcurse предлагает опцию передать по каналу, и упоминания веб-сайта Calcurse "настраиваемая пользователем система уведомления", я не мог найти способ использовать его для автоматических запланированных уведомлений обо всех событиях.
В то же время: действительно такая функциональность напоминания была бы полезным дополнением. Сценарий ниже может использоваться в качестве разъема - в для calcurse
показать напоминания. Я надеюсь, что Вы находите это полезным.
Это чрезвычайно просто в использовании; просто запустите скрипт в фоновом режиме. Все, что это делает, проверить события на сегодняшний день (обновленный дважды в минуту) и выполнить уведомления в произвольный момент времени перед истечением.
Вывод команды:
calcurse -a
похож:
12/29/15:
* Free today!
- 12:00 -> ..:..
See if this script does its job :)
Сразу происходит, что запланированные объекты запускаются с "-", в то время как объекты для весь день запускаются с "*". То, что мы должны сделать, создают две группы (списки) объектов:
Из первой категории мы должны проанализировать время, преобразовать ее в формат, с которым мы можем вычислить, таким образом, мы можем показать напоминание в n
- за минуты до истечения.
Впоследствии, мы должны "следить за часами", сравнить время набора (события) к текущему времени. Если отрезок времени между этими двумя вводит время предупреждения набора, просто покажите уведомление.
Наконец, для предотвращения повторенного уведомления мы должны добавить объект к "сделанному" списку.
Кроме того, сценарий очищает "сделанный" список; если объект больше не происходит в сегодняшних объектах (или если Вы удалили его или день, переключенный во время Вашей сессии), объекты удалены автоматически.
На запуске (входят в систему)
На произвольном моменте времени перед истечением (в этом случае 15 минут)
#!/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
число минут для предупреждения Вас, прежде чем назначение истечет
Я смог сделать его работающий с заменой команды:
notify-send "calcurse notification header" "$(calcurse -n)"
Я не, это старо, но если кому-либо все еще интересно, следующая работа настроек для меня в моем ~/.calcurse/conf
файл:
notification.command=calcurse --next | xargs -0 notify-send "Appointment"
daemon.enable=yes
notification.warning=300