36
38
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";
39
"Usage: $app_name [OPTIONS]\n\n".
41
" -a, --all display all sections\n".
42
" -e, --edit edit your todo file\n".
43
" -h, --headers show setion headers\n".
44
" --section=SECTION display this named section\n".
45
" --help display this help and exit\n".
46
" --version output version information and exit\n";
49
51
if( $mode_version ) {
51
"Copyright (C) 2011 Tim Marston.\n";
53
"Copyright (C) 2011 Tim Marston.\n".
54
"http://ed.am/software/todo\n";
70
73
# 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";
74
if( ! -d $todo_dir ) {
75
mkdir $todo_dir or die "couldn't create todo directory";
76
`bzr init --no-aliases -q "$todo_dir"`;
77
$? == 0 or die "couldn't init bzr repo";
80
# create a default todo file, as necessary
81
if( ! -f "$todo_dir/todo" ) {
82
open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
83
my $content = <<"EOT";
84
<!-- This file uses Markdown syntax. For more info about Markdown
85
syntax, see http://daringfireball.net/projects/markdown/syntax.
87
There should be a main H1 header called "TODO" for the main todo
88
list section (one has been added for you below). You can also add
89
as many more sections as you like for other lists. And feel free
90
to delete this comment! -->
95
* make a list of things to do
98
print FILE $content or die "couldn't write default todo file";
100
`bzr add --no-aliases -q "$todo_dir/todo"`;
101
$? == 0 or die "couldn't add todo file to bzr repo";
81
104
# determine editor from environment, default to "emacs -nw"
82
105
my $editor = $ENV{ 'EDITOR' };
84
107
my @exec_array = split( / +/, $editor );
85
108
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' );
110
# detect emacs and try to use markdown-mode
111
$exec_array[ 0 ] eq "emacs" and
112
push( @exec_array, '--funcall=markdown-mode' );
91
115
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";
117
die "can't start editor, check EDITOR envionment variable";
119
# check for changes and commit it
120
$output = `bzr status --no-aliases "$todo_dir/todo"`;
121
$? == 0 or die "couldn't check bzr rerpo status";
123
if( $output ne "" ) {
124
`bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
125
$? == 0 or die "couldn't commit to bzr repo";
128
# after editing, exit
132
# function to display a line
135
my ( $line, $section ) = @_;
136
state $old_section = '';
138
# detect section change
139
if( $section ne $old_section ) {
140
$old_section = $section;
142
# display section heading
143
if( $display_headers || $display_all ) {
145
( "=" x length( $section ) )."\n";
149
# replace tabs with 4 spaces
107
157
# scan through file
108
my $next_section = '';
158
my $candidate_section = '';
109
159
my $section = '';
110
my $old_section = '';
111
161
open FILE, "<$todo_dir/todo" or die "can't open todo file";
115
164
# detect the line after section headings, and thus sections
116
if( /^[-=]{2,}/ && $next_section ne '' ) {
117
$section = $next_section;
165
if( /^[-=]{2,}/ && $candidate_section ne '' ) {
166
$section = $candidate_section;
167
$candidate_section = '';
120
172
# detect section headings
121
elsif( /^[A-Z]+$/ ) {
123
chomp( $next_section );
125
# we have neither a section heading nor the line after
173
if( /^[-_\.A-Za-z0-9 ]+$/ ) {
174
$candidate_section = $_;
175
chomp $candidate_section;
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
178
$candidate_section = '';
182
display_line( $last_line, $section ) if( $last_line ne '' );
185
if( ( $section eq $display_section ) ||
186
( $section && $display_all ) )
194
display_line( $last_line, $section ) if( $last_line ne '' );