App-orgdaemon
view release on metacpan or search on metacpan
bin/org-daemon view on Meta::CPAN
if ($lb_contents[$index+1]) {
$date = $lb_contents[$index+1];
} else {
return;
}
}
$lb->after(100, sub { show_date_in_emacs($date) }); # do it after the buttonrelease event
}
sub show_date_in_emacs {
my $date = shift;
my $file = $date->{file};
die "No file associated with given date" if !defined $file;
my @cmd;
if ($emacsclient_fmt_cmd) {
my $line = defined $date->{line} ? $date->{line} : 1;
my $cmd = $emacsclient_fmt_cmd;
$cmd =~ s{%l}{$line}g;
$cmd =~ s{%f}{$file}g;
system $cmd;
if ($? != 0) {
warn "Failed to run '$cmd'";
}
} else {
if ($use_emacsclient_eval) {
# XXX escape $file?
my $eval = qq{(progn (find-file "$file")};
if ($date->{line}) {
$eval .= " (goto-line $date->{line}) (org-show-entry)";
}
$eval .= qq{ (select-frame-set-input-focus (window-frame)) "Positioning in file $file at line $date->{line}" )};
@cmd = ('emacsclient', '--eval', $eval);
} else {
@cmd = ('emacsclient', '-n',
(defined $date->{line} ? '+'.$date->{line} : ()),
$file,
);
}
if (eval { require IPC::Run; 1 }) {
IPC::Run::run(\@cmd, '>', \my $ignore)
or warn "Failed to run '@cmd'";
} else {
system @cmd;
if ($? != 0) {
warn "Failed to run '@cmd'";
}
}
}
}
sub tk_do_one_iteration {
if (check_for_updates()) {
update_lb();
}
check_for_alarms();
colorize_entries();
}
sub update_lb {
if ($overview_widget eq 'listbox') {
$lb->delete(0, "end");
} else {
$lb->delete('all');
}
@lb_contents = ();
my @dates = map { @{ $_->{dates} } } values %org_files;
@dates = sort { $a->{epoch} <=> $b->{epoch} } @dates;
if (!@dates) {
if ($overview_widget eq 'listbox') {
$lb->insert("end", "<no dates>");
} else {
$lb->add(0, -text => '<no dates>');
}
} else {
my $now = time;
my($today_begin, $today_end);
{
my @l1 = localtime $now;
$today_begin = timelocal 0,0,0,@l1[3..5];
$today_end = timelocal 59,59,23,@l1[3..5];
}
my $tomorrow_end;
{
my @l2 = localtime $now+86400; # XXX which is not correct during DST switches, but well
$tomorrow_end = timelocal 59,59,23,@l2[3..5];
}
# XXX find a solution with less parsing here (i.e. $date
# should have more information available)
my @segmented_dates; # ([$dateobj, [$text, $tags, $scheduled, $orgdate]], ...)
for my $date (@dates) {
my $formatted_text = $date->formatted_text;
if ($formatted_text =~ s{(?:^|\s+)(<.*?>)}{}) {
my $orgdate = $1;
my($scheduled, $tags);
if ($formatted_text =~ s{(?:^|\s+)(SCHEDULED:)$}{}) {
$scheduled = $1;
}
if ($formatted_text =~ s{(?:^|\s+)(:\S+:)$}{}) {
$tags = $1;
}
my $text = $formatted_text;
push @segmented_dates, [$date, [$text, $tags, $scheduled, $orgdate]];
} else {
warn "Can't parse " . $date->formatted_text . "...\n";
push @segmented_dates, [$date];
}
}
# Maximum lengths for sprintf
my(@max);
for my $i (0..3) {
$max[$i] = max map {
my $text_segments = $_->[1];
if ($text_segments && defined $text_segments->[$i]) {
length $text_segments->[$i];
} else {
0;
}
} @segmented_dates;
( run in 1.796 second using v1.01-cache-2.11-cpan-39bf76dae61 )