9
my $app_name = basename( $0 );
12
my $todo_dir = "~/.todo";
14
my $display_section = "IMMEDIATE";
15
my $display_headers = 0;
20
# parse command line opts
21
Getopt::Long::Configure( 'gnu_getopt' );
23
'a|all' => \$display_all,
24
'e|edit' => \$mode_edit,
25
'h|headers' => \$display_headers,
26
'section=s' => \$display_section,
27
'help' => \$mode_help,
28
'version' => \$mode_version,
30
print "Try `$app_name --help' for more information.\n";
36
print "todo - display your todo file\n\n".
37
"Usage: $app_name [OPTIONS]\n\n".
39
" -a, --all display all sections\n".
40
" -e, --edit edit your todo file\n".
41
" -h, --headers show setion headers\n".
42
" -s, --section=SECTION display this named section\n".
43
" --help display this help and exit\n".
44
" --version output version information and exit\n";
51
"Copyright (C) 2011 Tim Marston.\n";
55
#_______________________________________________________________________________
58
# check we have bazaar installed
59
my $output = `which bzr`;
61
$output eq "" and die "Bazaar is not installed";
64
$todo_dir = glob( $todo_dir );
65
( -f $todo_dir ) and die "$todo_dir exists and is a file";
70
# create the todo directory, as necessary
71
if( ! -d $todo_dir ) {
72
mkdir $todo_dir or die "couldn't create todo directory";
73
`bzr init --no-aliases -q "$todo_dir"`;
74
$? == 0 or die "couldn't init bzr repo";
76
$? == 0 or die "couldn't create initial todo file";
77
`bzr add --no-aliases -q "$todo_dir/todo"`;
78
$? == 0 or die "couldn't add todo file to bzr repo";
81
# determine editor from environment, default to "emacs -nw"
82
my $editor = $ENV{ 'EDITOR' };
83
defined $editor or $editor = 'emacs -nw';
84
my @exec_array = split( / +/, $editor );
85
push( @exec_array, "$todo_dir/todo" );
87
# detect emacs and try to use markdown-mode
88
$exec_array[ 0 ] eq "emacs" and push( @exec_array, '--funcall=markdown-mode' );
91
system( @exec_array );
92
$? == 0 or die "unable to exec editor";
94
# check for changes and commit it
95
$output = `bzr status --no-aliases "$todo_dir/todo"`;
96
$? == 0 or die "couldn't check bzr rerpo status";
99
`bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
100
$? == 0 or die "couldn't commit to bzr repo";
108
my $next_section = '';
110
my $old_section = '';
111
open FILE, "<$todo_dir/todo" or die "can't open todo file";
115
# detect the line after section headings, and thus sections
116
if( /^[-=]{2,}/ && $next_section ne '' ) {
117
$section = $next_section;
120
# detect section headings
121
elsif( /^[A-Z]+$/ ) {
123
chomp( $next_section );
125
# we have neither a section heading nor the line after
130
if( $section eq $display_section ||
133
# detect section change
134
if( $section ne $old_section ) {
135
$old_section = $section;
137
# display section heading
138
if( $display_headers ||
141
my $heading = 'TODO';
142
$heading .= ' ('.lc( $section ).')' if $section ne "IMMEDIATE";
144
( "=" x length( $heading ) )."\n";
148
# replace tabs with 4 spaces