Como posso usar o comando notify-send em combinação com o calendário Calcurse?

5

Eu uso o calendário e o agendamento de aplicativos. Este é um bom programa de linha de comando.

Por exemplo, com calcurse -a , você pode exibir os eventos do dia.

Como posso enviar essa informação para notify-send , para mostrar uma notificação na área de trabalho?

$ calcurse -a | notify-send

não funcionará ...

    
por Dino 27.12.2015 / 10:09

3 respostas

2

Sobre o Calcurse

Como sempre, reverter para uma funcionalidade (muito) básica, mas ainda assim completa, parece estranho, mas de certa forma refrescante. Não tenho certeza se eu usaria isso.

Embora a parte inferior da janela do Calcurse sugira uma opção para o pipe , e o site do Calcurse mencione " usuário -configurable notification system "Não consegui encontrar uma maneira de usá-lo para notificações agendadas automáticas de todos eventos.

Aomesmotempo:naverdade,essafuncionalidadedelembreteseriaumaadiçãoútil.Oscriptabaixopodeserusadocomoumplug-inparacalcurseparamostrarlembretes.Esperoquevocêacheútil.

Éextremamentefácildeusar;simplesmenteexecuteoscriptemsegundoplano.Tudooqueelefazéverificaroseventosdehoje(atualizadosduasvezesporminuto)eexecutarnotificaçõesemumtempoarbitrárioantesdaexpiração.

Oqueénecessárioparacriarlembretes

Asaídadocomando:

calcurse-a

parece:

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

Ocorre imediatamente que os itens agendados começam com um "-", enquanto os itens para todo o dia começam com "*". O que precisamos fazer é criar dois grupos (listas) de itens:

  • os agendados
  • os não agendados

Da primeira categoria, precisamos analisar o tempo, convertê-lo em um formato com o qual possamos calcular, para que possamos mostrar o lembrete em n - minutos antes da expiração.

Posteriormente, precisamos "ficar de olho no relógio", para comparar o tempo definido (do evento) com o horário atual. Se o intervalo de tempo entre os dois entrar no tempo de aviso definido, simplesmente mostre a notificação.
Finalmente, para evitar notificações repetidas, precisamos adicionar o item a uma lista "concluída".

Além disso, o script limpa a lista "concluída"; se um item não ocorrer mais nos itens de hoje (seja se você o removeu ou o dia mudou durante a sessão), os itens serão removidos automaticamente.

O resultado

Na inicialização (log in)

  • o script mostra todos itens de hoje, em sucessão:

Emumtempoarbitrárioantesdaexpiração(nestecaso,15minutos)

  • osscriptslembramvocêemumanotificação:

Oscript

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

Como usar

  • Copie o script em um arquivo vazio, salve-o como run_ccursereminders.py
  • Teste- execute-o com o tempo que você gostaria de ser avisado (antes do tempo de expiração, em minutos) como argumento. Um exemplo, para executar lembretes 30 minutos antes da sua consulta:

    python3 /path/to/run_ccursereminders.py 30
    
  • Se funcionar como você deseja, adicione-o a Startup Applications: escolha Dash > Aplicativos de inicialização > Adicionar. Adicione o comando

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

    em que o último 30 é o número de minutos para avisá-lo antes de um compromisso expirar

por Jacob Vlijm 29.12.2015 / 12:01
0

Consegui fazê-lo funcionar com a substituição de comandos:

notify-send "calcurse notification header" "$(calcurse -n)"
    
por user2344634 04.03.2016 / 09:55
0

Eu não, isso é antigo, mas se alguém ainda estiver interessado, as configurações a seguir funcionam para mim no meu arquivo ~/.calcurse/conf :

notification.command=calcurse --next | xargs -0 notify-send "Appointment"
daemon.enable=yes
notification.warning=300
    
por coachshea 06.01.2017 / 14:55