36
40
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";
41
#01234567890123456789012345678901234567890123456789012345678901234567890123456789
42
"Usage: $app_name [OPTIONS]\n\n".
44
" -a, --all display all sections\n".
45
" -e, --edit edit your todo file\n".
46
" -h, --headers show setion headers\n".
47
" -l, --list show the list in your pager (see notes)\n".
48
" -s, --section=SECTION display sections matching the regular expression\n".
49
" --help display this help and exit\n".
50
" --version output version information and exit\n".
52
"Running without any options is the same as running with --section=TODO and\n".
53
"lists the default section of the todo file.\n".
55
"The advantage of using '--list' is that the pager is run as if the\n".
56
"todo list were being edited. This means that if you decide to spawn an\n".
57
"editor from you pager and edit the list, these changes get noticed.\n".
59
"The environment variables EDITOR and PAGER are used.\n".
61
"Please report bugs to Tim Marston <tim\@ed.am>.\n";
49
66
if( $mode_version ) {
51
"Copyright (C) 2011 Tim Marston.\n";
68
"Copyright (C) 2011, 2012 Tim Marston.\n".
69
"http://ed.am/software/todo\n";
64
82
$todo_dir = glob( $todo_dir );
65
83
( -f $todo_dir ) and die "$todo_dir exists and is a file";
88
( ! -f "$todo_dir/todo" ) && die "no todo file";
70
95
# 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";
96
if( ! -d $todo_dir ) {
97
mkdir $todo_dir or die "couldn't create todo directory";
98
`bzr init --no-aliases -q "$todo_dir"`;
99
$? == 0 or die "couldn't init bzr repo";
102
# create a default todo file, as necessary
103
if( ! -f "$todo_dir/todo" ) {
104
open FILE, ">$todo_dir/todo" or die "couldn't create default todo file";
105
my $content = <<"EOT";
81
106
<!-- This file uses Markdown syntax. For more info about Markdown
82
107
syntax, see http://daringfireball.net/projects/markdown/syntax.
95
120
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";
122
`bzr add --no-aliases -q "$todo_dir/todo"`;
123
$? == 0 or die "couldn't add todo file to bzr repo";
101
126
# determine editor from environment, default to "emacs -nw"
102
my $editor = $ENV{ 'EDITOR' };
103
defined $editor or $editor = 'emacs -nw';
129
$editor = $ENV{ 'PAGER' };
130
defined $editor or $editor = 'less';
133
$editor = $ENV{ 'EDITOR' };
134
defined $editor or $editor = 'emacs -nw';
104
136
my @exec_array = split( / +/, $editor );
105
137
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' );
139
# detect emacs and try to use markdown-mode
140
$exec_array[ 0 ] eq "emacs" and
141
push( @exec_array, '--funcall=markdown-mode' );
112
144
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";
146
die "can't start editor, check EDITOR envionment variable";
148
# check for changes and commit it
149
$output = `bzr status --no-aliases "$todo_dir/todo"`;
150
$? == 0 or die "couldn't check bzr rerpo status";
152
if( $output ne "" ) {
153
`bzr commit --no-aliases -q -m - "$todo_dir/todo"`;
154
$? == 0 or die "couldn't commit to bzr repo";
157
# after editing, exit
161
# function to display a line
164
my ( $line, $section ) = @_;
165
state $old_section = '';
167
# detect section change
168
if( $section ne $old_section ) {
169
$old_section = $section;
171
# display section heading
172
if( $display_headers || $display_all ) {
174
( "=" x length( $section ) )."\n";
124
# after editing, exit
178
# replace tabs with 4 spaces
128
186
# scan through file
129
my $next_section = '';
187
my $candidate_section = '';
130
188
my $section = '';
131
my $old_section = '';
132
190
open FILE, "<$todo_dir/todo" or die "can't open todo file";
136
193
# detect the line after section headings, and thus sections
137
if( /^[-=]{2,}/ && $next_section ne '' ) {
138
$section = $next_section;
194
if( /^[-=]{2,}/ && $candidate_section ne '' ) {
195
$section = $candidate_section;
196
$candidate_section = '';
141
201
# detect section headings
142
elsif( /^[A-Z]+$/ ) {
144
chomp( $next_section );
146
# we have neither a section heading nor the line after
202
if( /^[-_\.A-Za-z0-9 ]+$/ ) {
203
$candidate_section = $_;
204
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
207
$candidate_section = '';
211
display_line( $last_line, $section ) if( $last_line ne '' );
214
if( ( lc( $section ) eq lc( $display_section ) ) ||
215
( $section && $display_all ) )
223
display_line( $last_line, $section ) if( $last_line ne '' );