38
36
print "todo - display your todo file\n\n".
39
#01234567890123456789012345678901234567890123456789012345678901234567890123456789
40
"Usage: $app_name [OPTIONS]\n\n".
42
" -a, --all display all sections\n".
43
" -e, --edit edit your todo file\n".
44
" -h, --headers show setion headers\n".
45
" -s, --section=SECTION display sections matching the regular expression\n".
46
" --help display this help and exit\n".
47
" --version output version information and exit\n".
49
"Running without any options is the same as running with --section=TODO and\n".
50
"lists the default section of the todo file.\n".
52
"The environment variables EDITOR is used.\n".
54
"Please report bugs to Tim Marston <tim\@ed.am>.\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";
59
49
if( $mode_version ) {
61
"Copyright (C) 2011, 2012 Tim Marston.\n".
62
"http://ed.am/software/todo\n";
51
"Copyright (C) 2011 Tim Marston.\n";
81
70
# create the todo directory, as necessary
82
if( ! -d $todo_dir ) {
83
mkdir $todo_dir or die "couldn't create todo directory";
84
`bzr init --no-aliases -q "$todo_dir"`;
85
$? == 0 or die "couldn't init bzr repo";
88
# create a default todo file, as necessary
89
if( ! -f "$todo_dir/todo" ) {
90
open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
91
my $content = <<"EOT";
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";
92
81
<!-- This file uses Markdown syntax. For more info about Markdown
93
82
syntax, see http://daringfireball.net/projects/markdown/syntax.
106
95
print FILE $content or die "couldn't write default todo file";
108
`bzr add --no-aliases -q "$todo_dir/todo"`;
109
$? == 0 or die "couldn't add todo file to bzr repo";
97
`bzr add --no-aliases -q "$todo_dir/todo"`;
98
$? == 0 or die "couldn't add todo file to bzr repo";
112
101
# determine editor from environment, default to "emacs -nw"
114
$editor = $ENV{ 'EDITOR' };
115
defined $editor or $editor = 'emacs -nw';
102
my $editor = $ENV{ 'EDITOR' };
103
defined $editor or $editor = 'emacs -nw';
116
104
my @exec_array = split( / +/, $editor );
117
105
push( @exec_array, "$todo_dir/todo" );
119
# detect emacs and try to use markdown-mode
120
$exec_array[ 0 ] eq "emacs" and
121
push( @exec_array, '--funcall=markdown-mode' );
107
# detect emacs and try to use markdown-mode
108
$exec_array[ 0 ] eq "emacs" and
109
push( @exec_array, '--funcall=markdown-mode' );
124
112
system( @exec_array );
126
die "can't start editor, check EDITOR envionment variable";
128
# check for changes and commit it
129
$output = `bzr status --no-aliases "$todo_dir/todo"`;
130
$? == 0 or die "couldn't check bzr rerpo status";
132
if( $output ne "" ) {
133
`bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
134
$? == 0 or die "couldn't commit to bzr repo";
137
# after editing, exit
141
# function to display a line
144
my ( $line, $section ) = @_;
145
state $old_section = '';
147
# detect section change
148
if( $section ne $old_section ) {
149
$old_section = $section;
151
# display section heading
152
if( $display_headers || $display_all ) {
154
( "=" x length( $section ) )."\n";
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";
158
# replace tabs with 4 spaces
124
# after editing, exit
166
128
# scan through file
167
my $candidate_section = '';
129
my $next_section = '';
168
130
my $section = '';
131
my $old_section = '';
170
132
open FILE, "<$todo_dir/todo" or die "can't open todo file";
173
136
# detect the line after section headings, and thus sections
174
if( /^[-=]{2,}/ && $candidate_section ne '' ) {
175
$section = $candidate_section;
176
$candidate_section = '';
137
if( /^[-=]{2,}/ && $next_section ne '' ) {
138
$section = $next_section;
181
141
# detect section headings
182
if( /^[-_\.A-Za-z0-9 ]+$/ ) {
183
$candidate_section = $_;
184
chomp $candidate_section;
142
elsif( /^[A-Z]+$/ ) {
144
chomp( $next_section );
146
# we have neither a section heading nor the line after
187
$candidate_section = '';
191
display_line( $last_line, $section ) if( $last_line ne '' );
194
if( ( lc( $section ) eq lc( $display_section ) ) ||
195
( $section && $display_all ) )
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
203
display_line( $last_line, $section ) if( $last_line ne '' );