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";
77
# create a default todo file, as necessary
78
if( ! -f "$todo_dir/todo" ) {
79
open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
80
my $content = <<"EOT";
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";
81
84
<!-- This file uses Markdown syntax. For more info about Markdown
82
85
syntax, see http://daringfireball.net/projects/markdown/syntax.
95
98
print FILE $content or die "couldn't write default todo file";
97
`bzr add --no-aliases -q "$todo_dir/todo"`;
98
$? == 0 or die "couldn't add todo file to bzr repo";
100
`bzr add --no-aliases -q "$todo_dir/todo"`;
101
$? == 0 or die "couldn't add todo file to bzr repo";
101
104
# determine editor from environment, default to "emacs -nw"
102
105
my $editor = $ENV{ 'EDITOR' };
104
107
my @exec_array = split( / +/, $editor );
105
108
push( @exec_array, "$todo_dir/todo" );
107
# detect emacs and try to use markdown-mode
108
$exec_array[ 0 ] eq "emacs" and
109
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' );
112
115
system( @exec_array );
113
$? == 0 or die "unable to exec editor";
115
# check for changes and commit it
116
$output = `bzr status --no-aliases "$todo_dir/todo"`;
117
$? == 0 or die "couldn't check bzr rerpo status";
119
if( $output ne "" ) {
120
`bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
121
$? == 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";
124
# after editing, exit
149
# replace tabs with 4 spaces
128
157
# scan through file
129
my $next_section = '';
158
my $candidate_section = '';
130
159
my $section = '';
131
my $old_section = '';
132
161
open FILE, "<$todo_dir/todo" or die "can't open todo file";
136
164
# detect the line after section headings, and thus sections
137
if( /^[-=]{2,}/ && $next_section ne '' ) {
138
$section = $next_section;
165
if( /^[-=]{2,}/ && $candidate_section ne '' ) {
166
$section = $candidate_section;
167
$candidate_section = '';
141
172
# detect section headings
142
elsif( /^[A-Z]+$/ ) {
144
chomp( $next_section );
146
# we have neither a section heading nor the line after
173
if( /^[-_\.A-Za-z0-9 ]+$/ ) {
174
$candidate_section = $_;
175
chomp $candidate_section;
151
if( ( $section eq $display_section ) ||
152
( $section && $display_all ) )
154
# detect section change
155
if( $section ne $old_section ) {
156
$old_section = $section;
158
# display section heading
159
if( $display_headers ||
163
( "=" x length( $section ) )."\n";
167
# 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 '' );